# HG changeset patch # User allwin # Date 1374582757 -7200 # Node ID be9d053f2b07d651cada229eaf33b0322691bfba # Parent 55a61ceb2fe7cdcc94074937253b54976d54cf7b 8011888: sa.js: TypeError: [object JSAdapter] has no such function "__has__" Reviewed-by: duke diff --git a/agent/src/share/classes/sun/jvm/hotspot/utilities/soql/sa.js b/agent/src/share/classes/sun/jvm/hotspot/utilities/soql/sa.js --- a/agent/src/share/classes/sun/jvm/hotspot/utilities/soql/sa.js +++ b/agent/src/share/classes/sun/jvm/hotspot/utilities/soql/sa.js @@ -117,26 +117,27 @@ } if (so instanceof sapkg.utilities.soql.ScriptObject) { + var has = function(name) { + if (typeof(name) == 'number') { + return so["has(int)"](name); + } else { + if (name == '__wrapped__') { + return true; + } else if (so["has(java.lang.String)"](name)) { + return true; + } else if (name.equals('toString')) { + return true; + } else { + return false; + } + } + }; return new JSAdapter() { __getIds__: function() { return so.getIds(); }, - __has__ : function(name) { - if (typeof(name) == 'number') { - return so["has(int)"](name); - } else { - if (name == '__wrapped__') { - return true; - } else if (so["has(java.lang.String)"](name)) { - return true; - } else if (name.equals('toString')) { - return true; - } else { - return false; - } - } - }, + __has__ : has, __delete__ : function(name) { if (typeof(name) == 'number') { @@ -147,7 +148,7 @@ }, __get__ : function(name) { - if (! this.__has__(name)) { + if (! has(name)) { return undefined; } if (typeof(name) == 'number') { @@ -162,9 +163,9 @@ var args = prepareArgsArray(arguments); var r; try { - r = value.call(args); + r = value.call(Java.to(args)); } catch (e) { - println("call to " + name + " failed!"); + writeln("call to " + name + " failed!"); throw e; } return wrapScriptObject(r); @@ -205,7 +206,7 @@ // define "writeln" and "write" if not defined if (typeof(writeln) == 'undefined') { - writeln = println; + writeln = print; } if (typeof(write) == 'undefined') { @@ -522,7 +523,11 @@ // iterates Java heap for each Oop function forEachOop(callback) { - sa.objHeap.iterate(new sapkg.oops.HeapVisitor() { doObj: callback }); + sa.objHeap.iterate(new sapkg.oops.HeapVisitor() { + prologue: function() {}, + doObj: callback, + epilogue: function() {} + }); } // iterates Java heap for each Oop of given 'klass'. @@ -537,8 +542,13 @@ includeSubtypes = true; } sa.objHeap.iterateObjectsOfKlass( - new sapkg.oops.HeapVisitor() { doObj: callback }, - klass, includeSubtypes); + new sapkg.oops.HeapVisitor() { + prologue: function() {}, + doObj: callback, + epilogue: function() {} + }, + klass, + includeSubtypes); } // Java thread @@ -747,8 +757,10 @@ continue; } else { // some type names have ':'. replace to make it as a - // JavaScript identifier - tmp.name = tmp.name.replace(':', '_').replace('<', '_').replace('>', '_').replace('*', '_').replace(' ', '_'); + // JavaScript identifier. Add the name to an empty + // JavaScript string to make sure name is not + // java.lang.String + tmp.name = ("" + tmp.name).replace(/[:<>\*\ ]/g, "_"); eval("function read" + tmp.name + "(addr) {" + " return readVMType('" + tmp.name + "', addr);}"); eval("function print" + tmp.name + "(addr) {" +