@@ -52,6 +52,7 @@ var FieldValue = Java.type("org.graalvm.visualvm.lib.jfluid.heap.FieldValue");
52
52
var GCRoot = Java . type ( "org.graalvm.visualvm.lib.jfluid.heap.GCRoot" ) ;
53
53
54
54
var snapshot ;
55
+ var classWrapperCache ;
55
56
56
57
/**
57
58
* This is JavaScript interface for heap analysis using HAT
@@ -315,7 +316,11 @@ function javaObject(jobject) {
315
316
// print(jobject.getClass());
316
317
if ( jobject instanceof JavaClass ) {
317
318
// print("wrapping as Class");
318
- return new JavaClassWrapper ( jobject ) ;
319
+ var classId = jobject . getJavaClassId ( ) ;
320
+ if ( classWrapperCache [ classId ] === undefined ) {
321
+ classWrapperCache [ classId ] = new JavaClassWrapper ( jobject ) ;
322
+ }
323
+ return classWrapperCache [ classId ] ;
319
324
} else if ( jobject instanceof ObjectArrayInstance ) {
320
325
// print("wrapping as ObjectArray");
321
326
return new JavaObjectArrayWrapper ( jobject ) ;
@@ -333,24 +338,33 @@ function javaObject(jobject) {
333
338
334
339
// returns wrapper for Java instances
335
340
function JavaObjectWrapper ( instance ) {
336
- var things = instance . fieldValues ;
341
+ var things ;
337
342
var fldValueCache = new Array ( ) ;
338
343
339
344
// instance fields can be accessed in natural syntax
340
345
return new JSAdapter ( ) {
341
346
__getIds__ : function ( ) {
347
+ if ( things === undefined ) {
348
+ things = instance . getJavaClass ( ) . getFields ( ) ;
349
+ }
342
350
var res = new Array ( things . size ( ) ) ;
343
351
for ( var j = 0 ; j < things . size ( ) ; j ++ ) {
344
- res [ j ] = things . get ( j ) . field . name ;
352
+ res [ j ] = things . get ( j ) . getName ( ) ;
345
353
}
346
354
return res ;
347
355
} ,
348
356
__has__ : function ( name ) {
357
+ if ( name === 'clazz' || name === 'toString' ||
358
+ name === 'id' || name === 'wrapped-object' || name === 'statics' ) {
359
+ return true ;
360
+ }
361
+ if ( things === undefined ) {
362
+ things = instance . getJavaClass ( ) . getFields ( ) ;
363
+ }
349
364
for ( var i = 0 ; i < things . size ( ) ; i ++ ) {
350
- if ( name === things . get ( i ) . field . name ) return true ;
365
+ if ( name == things . get ( i ) . getName ( ) ) return true ;
351
366
}
352
- return name === 'clazz' || name === 'toString' ||
353
- name === 'id' || name === 'wrapped-object' || name === 'statics' ;
367
+ return false ;
354
368
} ,
355
369
__get__ : function ( name ) {
356
370
if ( name === 'clazz' ) {
@@ -662,6 +676,7 @@ function wrapHeapSnapshot(heap) {
662
676
}
663
677
664
678
snapshot = heap ;
679
+ classWrapperCache = new Array ( ) ;
665
680
666
681
// return heap as a script object with useful methods.
667
682
return {
0 commit comments