> 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
[email protected]
https://lists.mozilla.org/listinfo/dev-platform

