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();
|