agent/src/share/classes/sun/jvm/hotspot/utilities/soql/sa.js

Print this page
rev 4996 : 8011888: sa.js: TypeError: [object JSAdapter] has no such function "__has__"
Reviewed-by: duke


 100         var elem = array[a];
 101         elem = unwrapScriptObject(elem);
 102         if (typeof(elem) == 'function') {
 103           args[a] = new sapkg.utilities.soql.Callable() {
 104             call: function(myargs) {
 105               var tmp = new Array(myargs.length);
 106               for (var i = 0; i < myargs.length; i++) {
 107                 tmp[i] = wrapScriptObject(myargs[i]);
 108               }
 109               return elem.apply(this, tmp);
 110             }
 111           }
 112         } else {
 113           args[a] = elem;
 114         }
 115       }
 116       return args;
 117     }
 118 
 119     if (so instanceof sapkg.utilities.soql.ScriptObject) {
 120       return new JSAdapter() {
 121         __getIds__: function() {                  
 122           return so.getIds();         
 123         },
 124   
 125         __has__ : function(name) {
 126           if (typeof(name) == 'number') {
 127             return so["has(int)"](name);
 128           } else {
 129             if (name == '__wrapped__') {
 130               return true;
 131             } else if (so["has(java.lang.String)"](name)) {
 132               return true;
 133             } else if (name.equals('toString')) {
 134               return true;
 135             } else {
 136               return false;
 137             }
 138           }




 139         },
 140   


 141         __delete__ : function(name) {
 142           if (typeof(name) == 'number') {
 143             return so["delete(int)"](name);
 144           } else {
 145             return so["delete(java.lang.String)"](name);
 146           }
 147         },
 148   
 149         __get__ : function(name) {
 150           if (! this.__has__(name)) {
 151             return undefined;
 152           }
 153           if (typeof(name) == 'number') {
 154             return wrapScriptObject(so["get(int)"](name));
 155           } else {
 156             if (name == '__wrapped__') {
 157               return so;
 158             } else {
 159               var value = so["get(java.lang.String)"](name);
 160               if (value instanceof sapkg.utilities.soql.Callable) {
 161                 return function() {
 162                   var args = prepareArgsArray(arguments);
 163                   var r;
 164                   try {
 165                     r = value.call(args);
 166                   } catch (e) {
 167                     println("call to " + name + " failed!");
 168                     throw e;
 169                   }
 170                   return wrapScriptObject(r);
 171                 }
 172               } else if (name == 'toString') {
 173                 return function() { 
 174                   return so.toString();
 175                 }
 176               } else {
 177                 return wrapScriptObject(value);
 178               }
 179             }
 180           }
 181         }
 182       };
 183     } else {
 184       return so;
 185     }
 186   }
 187 
 188   // set "jvm" global variable that wraps a 
 189   // sun.jvm.hotspot.utilities.soql.JSJavaVM instance
 190   if (jvmarg != null) {
 191     jvm = wrapScriptObject(jvmarg);
 192     // expose "heap" global variable
 193     heap = jvm.heap;
 194   }
 195 
 196   // expose all "function" type properties of
 197   // sun.jvm.hotspot.utilitites.soql.JSJavaScriptEngine
 198   // as global functions here.
 199   globals = wrapScriptObject(globals);
 200   for (var prop in globals) {    
 201     if (typeof(globals[prop]) == 'function') {
 202       this[prop] = globals[prop];
 203     }    
 204   }
 205 
 206   // define "writeln" and "write" if not defined
 207   if (typeof(writeln) == 'undefined') {
 208     writeln = println;
 209   }
 210 
 211   if (typeof(write) == 'undefined') {
 212     write = print;
 213   }
 214 
 215   // "registerCommand" function is defined if we
 216   // are running as part of "CLHSDB" tool. CLHSDB
 217   // tool exposes Unix-style commands. 
 218 
 219   // if "registerCommand" function is defined
 220   // then register few global functions as "commands".
 221   if (typeof(registerCommand) == 'function') {
 222     this.jclass = function(name) {
 223       if (typeof(name) == "string") {
 224          var clazz = sapkg.utilities.SystemDictionaryHelper.findInstanceKlass(name);
 225          if (clazz) {
 226              writeln(clazz.getName().asString() + " @" + clazz.getAddress().toString());
 227          } else {
 228              writeln("class not found: " + name);


 505    var VisitorClass = sapkg.memory.SystemDictionary.ClassAndLoaderVisitor;
 506    sa.sysDict.primArrayClassesDo(new VisitorClass() { visit: callback });
 507 }
 508 
 509 // 'oop' to higher-level java object wrapper in which for(i in o) 
 510 // works by iterating java level fields and javaobject.javafield
 511 // syntax works.
 512 function oop2obj(oop) {
 513    return object(addr2str(oop.handle));
 514 }
 515 
 516 // higher level java object wrapper to oop
 517 function obj2oop(obj) {
 518    return addr2oop(str2addr(address(obj)));
 519 }
 520 
 521 // Java heap iteration
 522 
 523 // iterates Java heap for each Oop
 524 function forEachOop(callback) {
 525    sa.objHeap.iterate(new sapkg.oops.HeapVisitor() { doObj: callback });




 526 }
 527 
 528 // iterates Java heap for each Oop of given 'klass'.
 529 // 'includeSubtypes' tells whether to include objects 
 530 // of subtypes of 'klass' or not
 531 function forEachOopOfKlass(callback, klass, includeSubtypes) {
 532    if (klass == undefined) {
 533        klass = findInstanceKlass("java.lang.Object");
 534    }
 535 
 536    if (includeSubtypes == undefined) {
 537       includeSubtypes = true;
 538    }
 539    sa.objHeap.iterateObjectsOfKlass(
 540         new sapkg.oops.HeapVisitor() { doObj: callback },
 541         klass, includeSubtypes);





 542 }
 543 
 544 // Java thread
 545 
 546 // iterates each Thread
 547 function forEachJavaThread(callback) {
 548    var threads = sa.threads;
 549    var thread = threads.first();
 550    while (thread != null) {
 551       if (callback(thread) == false) return;
 552       thread = thread.next();
 553    }  
 554 }
 555 
 556 // iterate Frames of a given thread
 557 function forEachFrame(javaThread, callback) {
 558    var fr = javaThread.getLastFrameDbg();
 559    while (fr != null) { 
 560      if (callback(fr) == false) return;
 561      fr = fr.sender();


 730          }
 731       }
 732       type = type.superclass;  
 733    }
 734 }
 735 
 736 // define readXXX and printXXX functions for each VM struct/class Type
 737 tmp = new Object();
 738 tmp.itr = sa.typedb.types;
 739 while (tmp.itr.hasNext()) {
 740    tmp.type = tmp.itr.next();
 741    tmp.name = tmp.type.name;
 742    if (tmp.type.isPointerType() || tmp.type.isOopType() ||
 743       tmp.type.isCIntegerType() || tmp.type.isJavaPrimitiveType() ||
 744       tmp.name.equals('address') ||
 745       tmp.name.equals("<opaque>")) {
 746          // ignore;
 747          continue;
 748    } else {
 749       // some type names have ':'. replace to make it as a 
 750       // JavaScript identifier
 751       tmp.name = tmp.name.replace(':', '_').replace('<', '_').replace('>', '_').replace('*', '_').replace(' ', '_');


 752       eval("function read" + tmp.name + "(addr) {" +
 753            "   return readVMType('" + tmp.name + "', addr);}"); 
 754       eval("function print" + tmp.name + "(addr) {" + 
 755            "   printVMType('" + tmp.name + "', addr); }");
 756 
 757       /* FIXME: do we need this?
 758       if (typeof(registerCommand) != 'undefined') {
 759           var name = "print" + tmp.name;
 760           registerCommand(name, name + " [address]", name);
 761       }
 762       */
 763    }
 764 }
 765 //clean-up the temporary
 766 delete tmp;
 767 
 768 // VMObject factory
 769 
 770 // VM type to SA class map
 771 var  vmType2Class = new Object();




 100         var elem = array[a];
 101         elem = unwrapScriptObject(elem);
 102         if (typeof(elem) == 'function') {
 103           args[a] = new sapkg.utilities.soql.Callable() {
 104             call: function(myargs) {
 105               var tmp = new Array(myargs.length);
 106               for (var i = 0; i < myargs.length; i++) {
 107                 tmp[i] = wrapScriptObject(myargs[i]);
 108               }
 109               return elem.apply(this, tmp);
 110             }
 111           }
 112         } else {
 113           args[a] = elem;
 114         }
 115       }
 116       return args;
 117     }
 118 
 119     if (so instanceof sapkg.utilities.soql.ScriptObject) {
 120       var has = function(name) {





 121         if (typeof(name) == 'number') {
 122           return so["has(int)"](name);
 123         } else {
 124           if (name == '__wrapped__') {
 125             return true;
 126           } else if (so["has(java.lang.String)"](name)) {
 127             return true;
 128           } else if (name.equals('toString')) {
 129             return true;
 130           } else {
 131             return false;
 132           }
 133         }
 134       };
 135       return new JSAdapter() {
 136         __getIds__: function() {                  
 137           return so.getIds();         
 138         },
 139   
 140         __has__ : has,
 141   
 142         __delete__ : function(name) {
 143           if (typeof(name) == 'number') {
 144             return so["delete(int)"](name);
 145           } else {
 146             return so["delete(java.lang.String)"](name);
 147           }
 148         },
 149   
 150         __get__ : function(name) {
 151           if (! has(name)) {
 152             return undefined;
 153           }
 154           if (typeof(name) == 'number') {
 155             return wrapScriptObject(so["get(int)"](name));
 156           } else {
 157             if (name == '__wrapped__') {
 158               return so;
 159             } else {
 160               var value = so["get(java.lang.String)"](name);
 161               if (value instanceof sapkg.utilities.soql.Callable) {
 162                 return function() {
 163                   var args = prepareArgsArray(arguments);
 164                   var r;
 165                   try {
 166                     r = value.call(Java.to(args));
 167                   } catch (e) {
 168                     writeln("call to " + name + " failed!");
 169                     throw e;
 170                   }
 171                   return wrapScriptObject(r);
 172                 }
 173               } else if (name == 'toString') {
 174                 return function() { 
 175                   return so.toString();
 176                 }
 177               } else {
 178                 return wrapScriptObject(value);
 179               }
 180             }
 181           }
 182         }
 183       };
 184     } else {
 185       return so;
 186     }
 187   }
 188 
 189   // set "jvm" global variable that wraps a 
 190   // sun.jvm.hotspot.utilities.soql.JSJavaVM instance
 191   if (jvmarg != null) {
 192     jvm = wrapScriptObject(jvmarg);
 193     // expose "heap" global variable
 194     heap = jvm.heap;
 195   }
 196 
 197   // expose all "function" type properties of
 198   // sun.jvm.hotspot.utilitites.soql.JSJavaScriptEngine
 199   // as global functions here.
 200   globals = wrapScriptObject(globals);
 201   for (var prop in globals) {    
 202     if (typeof(globals[prop]) == 'function') {
 203       this[prop] = globals[prop];
 204     }    
 205   }
 206 
 207   // define "writeln" and "write" if not defined
 208   if (typeof(writeln) == 'undefined') {
 209     writeln = print;
 210   }
 211 
 212   if (typeof(write) == 'undefined') {
 213     write = print;
 214   }
 215 
 216   // "registerCommand" function is defined if we
 217   // are running as part of "CLHSDB" tool. CLHSDB
 218   // tool exposes Unix-style commands. 
 219 
 220   // if "registerCommand" function is defined
 221   // then register few global functions as "commands".
 222   if (typeof(registerCommand) == 'function') {
 223     this.jclass = function(name) {
 224       if (typeof(name) == "string") {
 225          var clazz = sapkg.utilities.SystemDictionaryHelper.findInstanceKlass(name);
 226          if (clazz) {
 227              writeln(clazz.getName().asString() + " @" + clazz.getAddress().toString());
 228          } else {
 229              writeln("class not found: " + name);


 506    var VisitorClass = sapkg.memory.SystemDictionary.ClassAndLoaderVisitor;
 507    sa.sysDict.primArrayClassesDo(new VisitorClass() { visit: callback });
 508 }
 509 
 510 // 'oop' to higher-level java object wrapper in which for(i in o) 
 511 // works by iterating java level fields and javaobject.javafield
 512 // syntax works.
 513 function oop2obj(oop) {
 514    return object(addr2str(oop.handle));
 515 }
 516 
 517 // higher level java object wrapper to oop
 518 function obj2oop(obj) {
 519    return addr2oop(str2addr(address(obj)));
 520 }
 521 
 522 // Java heap iteration
 523 
 524 // iterates Java heap for each Oop
 525 function forEachOop(callback) {
 526    sa.objHeap.iterate(new sapkg.oops.HeapVisitor() { 
 527     prologue: function() {},
 528     doObj: callback,
 529     epilogue: function() {}
 530   });
 531 }
 532 
 533 // iterates Java heap for each Oop of given 'klass'.
 534 // 'includeSubtypes' tells whether to include objects 
 535 // of subtypes of 'klass' or not
 536 function forEachOopOfKlass(callback, klass, includeSubtypes) {
 537    if (klass == undefined) {
 538        klass = findInstanceKlass("java.lang.Object");
 539    }
 540 
 541    if (includeSubtypes == undefined) {
 542       includeSubtypes = true;
 543    }
 544    sa.objHeap.iterateObjectsOfKlass(
 545         new sapkg.oops.HeapVisitor() { 
 546           prologue: function() {},
 547           doObj: callback,
 548           epilogue: function() {}
 549         },
 550         klass, 
 551         includeSubtypes);
 552 }
 553 
 554 // Java thread
 555 
 556 // iterates each Thread
 557 function forEachJavaThread(callback) {
 558    var threads = sa.threads;
 559    var thread = threads.first();
 560    while (thread != null) {
 561       if (callback(thread) == false) return;
 562       thread = thread.next();
 563    }  
 564 }
 565 
 566 // iterate Frames of a given thread
 567 function forEachFrame(javaThread, callback) {
 568    var fr = javaThread.getLastFrameDbg();
 569    while (fr != null) { 
 570      if (callback(fr) == false) return;
 571      fr = fr.sender();


 740          }
 741       }
 742       type = type.superclass;  
 743    }
 744 }
 745 
 746 // define readXXX and printXXX functions for each VM struct/class Type
 747 tmp = new Object();
 748 tmp.itr = sa.typedb.types;
 749 while (tmp.itr.hasNext()) {
 750    tmp.type = tmp.itr.next();
 751    tmp.name = tmp.type.name;
 752    if (tmp.type.isPointerType() || tmp.type.isOopType() ||
 753       tmp.type.isCIntegerType() || tmp.type.isJavaPrimitiveType() ||
 754       tmp.name.equals('address') ||
 755       tmp.name.equals("<opaque>")) {
 756          // ignore;
 757          continue;
 758    } else {
 759       // some type names have ':'. replace to make it as a 
 760       // JavaScript identifier. Add the name to an empty
 761       // JavaScript string to make sure name is not 
 762       // java.lang.String
 763       tmp.name = ("" + tmp.name).replace(/[:<>\*\ ]/g, "_");
 764       eval("function read" + tmp.name + "(addr) {" +
 765            "   return readVMType('" + tmp.name + "', addr);}"); 
 766       eval("function print" + tmp.name + "(addr) {" + 
 767            "   printVMType('" + tmp.name + "', addr); }");
 768 
 769       /* FIXME: do we need this?
 770       if (typeof(registerCommand) != 'undefined') {
 771           var name = "print" + tmp.name;
 772           registerCommand(name, name + " [address]", name);
 773       }
 774       */
 775    }
 776 }
 777 //clean-up the temporary
 778 delete tmp;
 779 
 780 // VMObject factory
 781 
 782 // VM type to SA class map
 783 var  vmType2Class = new Object();