> 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

Reply via email to