> Hmm. It's possible that stack came back null if the call into the > binding wasn't actually from script. Add a null-check (this part > _should_ end up with an indented block and all that).
Well, I got my function working. Using immediate returns from the functions was not a good solution as it was breaking functions where some operations were performed after our code was inserted. Nested conditional statements made good job, by I designed the code by using a one-time loop covering the inserted code, which was broken when some conditions occur. I am pasting my current, fully working code, below. I have one more question regarding the URL of the current window. The code to obtain it works for getters and setters, but it does not work for methods. The reason is that not all the methods contain "obj", which is required by the following line of code: nsPIDOMWindow* cwindow = xpc::WindowGlobalOrNull(obj); Some of the methods have different parameters, which are called "proxy" or something else instead of "obj". So inserting the code causes compilation errors. Is there any way to see if the generated functions contain a parameter called "obj" and insert the code only if such a parameter exist? Here is the fully working code: cgThings.append(CGGeneric(' std::string mess = __TIMESTAMP__; \n')) cgThings.append(CGGeneric(' mess += " | "; \n')) if setter: cgThings.append(CGGeneric(' mess += "SETTER: [' + nativeMethodName + ']"; \n')) cgThings.append(CGGeneric(' \n')) cgThings.append(CGGeneric(' int loopActive = 1; \n')) cgThings.append(CGGeneric(' \n')) cgThings.append(CGGeneric(' while (loopActive) { \n')) cgThings.append(CGGeneric(' \n')) cgThings.append(CGGeneric(' JS::Rooted<JSObject*> stack(cx); \n')) cgThings.append(CGGeneric(' \n')) cgThings.append(CGGeneric(' if (!JS::CaptureCurrentStack(cx, &stack, 1)) { \n')) cgThings.append(CGGeneric(' loopActive = 0; \n')) cgThings.append(CGGeneric(' break; \n')) cgThings.append(CGGeneric(' } \n')) cgThings.append(CGGeneric(' \n')) cgThings.append(CGGeneric(' if (!stack) { \n')) cgThings.append(CGGeneric(' loopActive = 0; \n')) cgThings.append(CGGeneric(' break; \n')) cgThings.append(CGGeneric(' } \n')) cgThings.append(CGGeneric(' \n')) cgThings.append(CGGeneric(' JS::Rooted<JS::Value> source(cx); \n')) cgThings.append(CGGeneric(' \n')) cgThings.append(CGGeneric(' if (!JS_GetProperty(cx, stack, "source", &source)) { \n')) cgThings.append(CGGeneric(' loopActive = 0; \n')) cgThings.append(CGGeneric(' break; \n')) cgThings.append(CGGeneric(' } \n')) cgThings.append(CGGeneric(' \n')) cgThings.append(CGGeneric(' if (source.isString()) { \n')) cgThings.append(CGGeneric(' nsAutoJSString str; \n')) cgThings.append(CGGeneric(' if (!str.init(cx, source.toString())) { \n')) cgThings.append(CGGeneric(' loopActive = 0; \n')) cgThings.append(CGGeneric(' break; \n')) cgThings.append(CGGeneric(' } \n')) cgThings.append(CGGeneric(' mess += ", FILE: ["; \n')) cgThings.append(CGGeneric(' mess += NS_ConvertUTF16toUTF8(str).get(); \n')) cgThings.append(CGGeneric(' mess += "]"; \n')) cgThings.append(CGGeneric(' } \n')) cgThings.append(CGGeneric(' \n')) cgThings.append(CGGeneric(' break; \n')) cgThings.append(CGGeneric(' \n')) cgThings.append(CGGeneric(' } \n')) cgThings.append(CGGeneric(' \n')) cgThings.append(CGGeneric(' nsPIDOMWindow* cwindow = xpc::WindowGlobalOrNull(obj); \n')) cgThings.append(CGGeneric(' \n')) cgThings.append(CGGeneric(' nsIURI* oURI = 0; \n')) cgThings.append(CGGeneric(' \n')) cgThings.append(CGGeneric(' if (cwindow) { \n')) cgThings.append(CGGeneric(' oURI = cwindow->GetDocumentURI(); \n')) cgThings.append(CGGeneric(' } \n')) cgThings.append(CGGeneric(' \n')) cgThings.append(CGGeneric(' if (oURI) { \n')) cgThings.append(CGGeneric(' nsCString spec; \n')) cgThings.append(CGGeneric(' oURI->GetAsciiSpec(spec); \n')) cgThings.append(CGGeneric(' mess += ", WINDOW: ["; \n')) cgThings.append(CGGeneric(' mess += spec.get(); \n')) cgThings.append(CGGeneric(' mess += "]"; \n')) cgThings.append(CGGeneric(' } \n')) elif getter: cgThings.append(CGGeneric(' mess += "GETTER: [' + nativeMethodName + ']"; \n')) cgThings.append(CGGeneric(' \n')) cgThings.append(CGGeneric(' int loopActive = 1; \n')) cgThings.append(CGGeneric(' \n')) cgThings.append(CGGeneric(' while (loopActive) { \n')) cgThings.append(CGGeneric(' \n')) cgThings.append(CGGeneric(' JS::Rooted<JSObject*> stack(cx); \n')) cgThings.append(CGGeneric(' \n')) cgThings.append(CGGeneric(' if (!JS::CaptureCurrentStack(cx, &stack, 1)) { \n')) cgThings.append(CGGeneric(' loopActive = 0; \n')) cgThings.append(CGGeneric(' break; \n')) cgThings.append(CGGeneric(' } \n')) cgThings.append(CGGeneric(' \n')) cgThings.append(CGGeneric(' if (!stack) { \n')) cgThings.append(CGGeneric(' loopActive = 0; \n')) cgThings.append(CGGeneric(' break; \n')) cgThings.append(CGGeneric(' } \n')) cgThings.append(CGGeneric(' \n')) cgThings.append(CGGeneric(' JS::Rooted<JS::Value> source(cx); \n')) cgThings.append(CGGeneric(' \n')) cgThings.append(CGGeneric(' if (!JS_GetProperty(cx, stack, "source", &source)) { \n')) cgThings.append(CGGeneric(' loopActive = 0; \n')) cgThings.append(CGGeneric(' break; \n')) cgThings.append(CGGeneric(' } \n')) cgThings.append(CGGeneric(' \n')) cgThings.append(CGGeneric(' if (source.isString()) { \n')) cgThings.append(CGGeneric(' nsAutoJSString str; \n')) cgThings.append(CGGeneric(' if (!str.init(cx, source.toString())) { \n')) cgThings.append(CGGeneric(' loopActive = 0; \n')) cgThings.append(CGGeneric(' break; \n')) cgThings.append(CGGeneric(' } \n')) cgThings.append(CGGeneric(' mess += ", FILE: ["; \n')) cgThings.append(CGGeneric(' mess += NS_ConvertUTF16toUTF8(str).get(); \n')) cgThings.append(CGGeneric(' mess += "]"; \n')) cgThings.append(CGGeneric(' } \n')) cgThings.append(CGGeneric(' \n')) cgThings.append(CGGeneric(' break; \n')) cgThings.append(CGGeneric(' \n')) cgThings.append(CGGeneric(' } \n')) cgThings.append(CGGeneric(' \n')) cgThings.append(CGGeneric(' nsPIDOMWindow* cwindow = xpc::WindowGlobalOrNull(obj); \n')) cgThings.append(CGGeneric(' \n')) cgThings.append(CGGeneric(' nsIURI* oURI = 0; \n')) cgThings.append(CGGeneric(' \n')) cgThings.append(CGGeneric(' if (cwindow) { \n')) cgThings.append(CGGeneric(' oURI = cwindow->GetDocumentURI(); \n')) cgThings.append(CGGeneric(' } \n')) cgThings.append(CGGeneric(' \n')) cgThings.append(CGGeneric(' if (oURI) { \n')) cgThings.append(CGGeneric(' nsCString spec; \n')) cgThings.append(CGGeneric(' oURI->GetAsciiSpec(spec); \n')) cgThings.append(CGGeneric(' mess += ", WINDOW: ["; \n')) cgThings.append(CGGeneric(' mess += spec.get(); \n')) cgThings.append(CGGeneric(' mess += "]"; \n')) cgThings.append(CGGeneric(' } \n')) else: cgThings.append(CGGeneric(' mess += "METHOD: [' + nativeMethodName + ']"; \n')) cgThings.append(CGGeneric(' \n')) cgThings.append(CGGeneric(' int loopActive = 1; \n')) cgThings.append(CGGeneric(' \n')) cgThings.append(CGGeneric(' while (loopActive) { \n')) cgThings.append(CGGeneric(' \n')) cgThings.append(CGGeneric(' JS::Rooted<JSObject*> stack(cx); \n')) cgThings.append(CGGeneric(' \n')) cgThings.append(CGGeneric(' if (!JS::CaptureCurrentStack(cx, &stack, 1)) { \n')) cgThings.append(CGGeneric(' loopActive = 0; \n')) cgThings.append(CGGeneric(' break; \n')) cgThings.append(CGGeneric(' } \n')) cgThings.append(CGGeneric(' \n')) cgThings.append(CGGeneric(' if (!stack) { \n')) cgThings.append(CGGeneric(' loopActive = 0; \n')) cgThings.append(CGGeneric(' break; \n')) cgThings.append(CGGeneric(' } \n')) cgThings.append(CGGeneric(' \n')) cgThings.append(CGGeneric(' JS::Rooted<JS::Value> source(cx); \n')) cgThings.append(CGGeneric(' \n')) cgThings.append(CGGeneric(' if (!JS_GetProperty(cx, stack, "source", &source)) { \n')) cgThings.append(CGGeneric(' loopActive = 0; \n')) cgThings.append(CGGeneric(' break; \n')) cgThings.append(CGGeneric(' } \n')) cgThings.append(CGGeneric(' \n')) cgThings.append(CGGeneric(' if (source.isString()) { \n')) cgThings.append(CGGeneric(' nsAutoJSString str; \n')) cgThings.append(CGGeneric(' if (!str.init(cx, source.toString())) { \n')) cgThings.append(CGGeneric(' loopActive = 0; \n')) cgThings.append(CGGeneric(' break; \n')) cgThings.append(CGGeneric(' } \n')) cgThings.append(CGGeneric(' mess += ", FILE: ["; \n')) cgThings.append(CGGeneric(' mess += NS_ConvertUTF16toUTF8(str).get(); \n')) cgThings.append(CGGeneric(' mess += "]"; \n')) cgThings.append(CGGeneric(' } \n')) cgThings.append(CGGeneric(' \n')) cgThings.append(CGGeneric(' break; \n')) cgThings.append(CGGeneric(' \n')) cgThings.append(CGGeneric(' } \n')) cgThings.append(CGGeneric(' printf("%s\\n", mess.c_str()); \n')) _______________________________________________ dev-platform mailing list dev-platform@lists.mozilla.org https://lists.mozilla.org/listinfo/dev-platform