ART: Make test 913-heaps more robust
Record the expected sizes of classes with GetObjectSize and replace
them with a serial to make the code robust to the Java runtime and
bitness used.
Bug: 65459070
Test: art/test/testrunner/testrunner.py -b --host -t 913
Change-Id: Iefcb7b896eee5e8b420b9b2a143c16ad15137306
diff --git a/test/913-heaps/expected.txt b/test/913-heaps/expected.txt
index 6144881..57c2dc6 100644
--- a/test/913-heaps/expected.txt
+++ b/test/913-heaps/expected.txt
@@ -5,43 +5,43 @@
root@root --(stack-local[id=1,tag=3000,depth=3,method=doFollowReferencesTest,vreg=1,location= 28])--> 3000@0 [size=136, length=-1]
root@root --(stack-local[id=1,tag=3000,depth=5,method=run,vreg=2,location= 0])--> 3000@0 [size=136, length=-1]
root@root --(thread)--> 3000@0 [size=136, length=-1]
-1001@0 --(superclass)--> 1000@0 [size=123, length=-1]
-1002@0 --(interface)--> 2001@0 [size=124, length=-1]
-1002@0 --(superclass)--> 1001@0 [size=123, length=-1]
-1@1000 --(class)--> 1000@0 [size=123, length=-1]
+1001@0 --(superclass)--> 1000@0 [size=123456780000, length=-1]
+1002@0 --(interface)--> 2001@0 [size=123456780004, length=-1]
+1002@0 --(superclass)--> 1001@0 [size=123456780001, length=-1]
+1@1000 --(class)--> 1000@0 [size=123456780000, length=-1]
1@1000 --(field@2)--> 2@1000 [size=16, length=-1]
1@1000 --(field@3)--> 3@1001 [size=24, length=-1]
-2001@0 --(interface)--> 2000@0 [size=124, length=-1]
-2@1000 --(class)--> 1000@0 [size=123, length=-1]
-3@1001 --(class)--> 1001@0 [size=123, length=-1]
+2001@0 --(interface)--> 2000@0 [size=123456780003, length=-1]
+2@1000 --(class)--> 1000@0 [size=123456780000, length=-1]
+3@1001 --(class)--> 1001@0 [size=123456780001, length=-1]
3@1001 --(field@4)--> 4@1000 [size=16, length=-1]
3@1001 --(field@5)--> 5@1002 [size=36, length=-1]
-4@1000 --(class)--> 1000@0 [size=123, length=-1]
+4@1000 --(class)--> 1000@0 [size=123456780000, length=-1]
500@0 --(array-element@1)--> 2@1000 [size=16, length=-1]
-5@1002 --(class)--> 1002@0 [size=123, length=-1]
+5@1002 --(class)--> 1002@0 [size=123456780002, length=-1]
5@1002 --(field@10)--> 1@1000 [size=16, length=-1]
5@1002 --(field@8)--> 500@0 [size=20, length=2]
5@1002 --(field@9)--> 6@1000 [size=16, length=-1]
-6@1000 --(class)--> 1000@0 [size=123, length=-1]
+6@1000 --(class)--> 1000@0 [size=123456780000, length=-1]
---
-1001@0 --(superclass)--> 1000@0 [size=123, length=-1]
-1002@0 --(interface)--> 2001@0 [size=124, length=-1]
-1002@0 --(superclass)--> 1001@0 [size=123, length=-1]
-1@1000 --(class)--> 1000@0 [size=123, length=-1]
+1001@0 --(superclass)--> 1000@0 [size=123456780000, length=-1]
+1002@0 --(interface)--> 2001@0 [size=123456780004, length=-1]
+1002@0 --(superclass)--> 1001@0 [size=123456780001, length=-1]
+1@1000 --(class)--> 1000@0 [size=123456780000, length=-1]
1@1000 --(field@2)--> 2@1000 [size=16, length=-1]
1@1000 --(field@3)--> 3@1001 [size=24, length=-1]
-2001@0 --(interface)--> 2000@0 [size=124, length=-1]
-2@1000 --(class)--> 1000@0 [size=123, length=-1]
-3@1001 --(class)--> 1001@0 [size=123, length=-1]
+2001@0 --(interface)--> 2000@0 [size=123456780003, length=-1]
+2@1000 --(class)--> 1000@0 [size=123456780000, length=-1]
+3@1001 --(class)--> 1001@0 [size=123456780001, length=-1]
3@1001 --(field@4)--> 4@1000 [size=16, length=-1]
3@1001 --(field@5)--> 5@1002 [size=36, length=-1]
-4@1000 --(class)--> 1000@0 [size=123, length=-1]
+4@1000 --(class)--> 1000@0 [size=123456780000, length=-1]
500@0 --(array-element@1)--> 2@1000 [size=16, length=-1]
-5@1002 --(class)--> 1002@0 [size=123, length=-1]
+5@1002 --(class)--> 1002@0 [size=123456780002, length=-1]
5@1002 --(field@10)--> 1@1000 [size=16, length=-1]
5@1002 --(field@8)--> 500@0 [size=20, length=2]
5@1002 --(field@9)--> 6@1000 [size=16, length=-1]
-6@1000 --(class)--> 1000@0 [size=123, length=-1]
+6@1000 --(class)--> 1000@0 [size=123456780000, length=-1]
---
root@root --(jni-global)--> 1@1000 [size=16, length=-1]
root@root --(jni-local[id=1,tag=3000,depth=0,method=followReferences])--> 1@1000 [size=16, length=-1]
@@ -52,51 +52,51 @@
root@root --(stack-local[id=1,tag=3000,depth=5,method=run,vreg=2,location= 0])--> 3000@0 [size=136, length=-1]
root@root --(thread)--> 1@1000 [size=16, length=-1]
root@root --(thread)--> 3000@0 [size=136, length=-1]
-1001@0 --(superclass)--> 1000@0 [size=123, length=-1]
-1002@0 --(interface)--> 2001@0 [size=124, length=-1]
-1002@0 --(superclass)--> 1001@0 [size=123, length=-1]
-1@1000 --(class)--> 1000@0 [size=123, length=-1]
+1001@0 --(superclass)--> 1000@0 [size=123456780005, length=-1]
+1002@0 --(interface)--> 2001@0 [size=123456780009, length=-1]
+1002@0 --(superclass)--> 1001@0 [size=123456780006, length=-1]
+1@1000 --(class)--> 1000@0 [size=123456780005, length=-1]
1@1000 --(field@2)--> 2@1000 [size=16, length=-1]
1@1000 --(field@3)--> 3@1001 [size=24, length=-1]
-2001@0 --(interface)--> 2000@0 [size=124, length=-1]
-2@1000 --(class)--> 1000@0 [size=123, length=-1]
-3@1001 --(class)--> 1001@0 [size=123, length=-1]
+2001@0 --(interface)--> 2000@0 [size=123456780008, length=-1]
+2@1000 --(class)--> 1000@0 [size=123456780005, length=-1]
+3@1001 --(class)--> 1001@0 [size=123456780006, length=-1]
3@1001 --(field@4)--> 4@1000 [size=16, length=-1]
3@1001 --(field@5)--> 5@1002 [size=36, length=-1]
-4@1000 --(class)--> 1000@0 [size=123, length=-1]
+4@1000 --(class)--> 1000@0 [size=123456780005, length=-1]
500@0 --(array-element@1)--> 2@1000 [size=16, length=-1]
-5@1002 --(class)--> 1002@0 [size=123, length=-1]
+5@1002 --(class)--> 1002@0 [size=123456780007, length=-1]
5@1002 --(field@10)--> 1@1000 [size=16, length=-1]
5@1002 --(field@8)--> 500@0 [size=20, length=2]
5@1002 --(field@9)--> 6@1000 [size=16, length=-1]
-6@1000 --(class)--> 1000@0 [size=123, length=-1]
+6@1000 --(class)--> 1000@0 [size=123456780005, length=-1]
---
-1001@0 --(superclass)--> 1000@0 [size=123, length=-1]
-1002@0 --(interface)--> 2001@0 [size=124, length=-1]
-1002@0 --(superclass)--> 1001@0 [size=123, length=-1]
-1@1000 --(class)--> 1000@0 [size=123, length=-1]
+1001@0 --(superclass)--> 1000@0 [size=123456780005, length=-1]
+1002@0 --(interface)--> 2001@0 [size=123456780009, length=-1]
+1002@0 --(superclass)--> 1001@0 [size=123456780006, length=-1]
+1@1000 --(class)--> 1000@0 [size=123456780005, length=-1]
1@1000 --(field@2)--> 2@1000 [size=16, length=-1]
1@1000 --(field@3)--> 3@1001 [size=24, length=-1]
-2001@0 --(interface)--> 2000@0 [size=124, length=-1]
-2@1000 --(class)--> 1000@0 [size=123, length=-1]
-3@1001 --(class)--> 1001@0 [size=123, length=-1]
+2001@0 --(interface)--> 2000@0 [size=123456780008, length=-1]
+2@1000 --(class)--> 1000@0 [size=123456780005, length=-1]
+3@1001 --(class)--> 1001@0 [size=123456780006, length=-1]
3@1001 --(field@4)--> 4@1000 [size=16, length=-1]
3@1001 --(field@5)--> 5@1002 [size=36, length=-1]
-4@1000 --(class)--> 1000@0 [size=123, length=-1]
+4@1000 --(class)--> 1000@0 [size=123456780005, length=-1]
500@0 --(array-element@1)--> 2@1000 [size=16, length=-1]
-5@1002 --(class)--> 1002@0 [size=123, length=-1]
+5@1002 --(class)--> 1002@0 [size=123456780007, length=-1]
5@1002 --(field@10)--> 1@1000 [size=16, length=-1]
5@1002 --(field@8)--> 500@0 [size=20, length=2]
5@1002 --(field@9)--> 6@1000 [size=16, length=-1]
-6@1000 --(class)--> 1000@0 [size=123, length=-1]
+6@1000 --(class)--> 1000@0 [size=123456780005, length=-1]
---
root@root --(thread)--> 3000@0 [size=136, length=-1]
---
-3@1001 --(class)--> 1001@0 [size=123, length=-1]
+3@1001 --(class)--> 1001@0 [size=123456780011, length=-1]
---
root@root --(thread)--> 3000@0 [size=136, length=-1]
---
-3@1001 --(class)--> 1001@0 [size=123, length=-1]
+3@1001 --(class)--> 1001@0 [size=123456780016, length=-1]
---
root@root --(jni-local[id=1,tag=3000,depth=0,method=followReferences])--> 3000@0 [size=136, length=-1]
root@root --(stack-local[id=1,tag=3000,depth=2,method=doFollowReferencesTestNonRoot,vreg=13,location= 30])--> 1@1000 [size=16, length=-1]
@@ -104,8 +104,8 @@
root@root --(stack-local[id=1,tag=3000,depth=5,method=run,vreg=2,location= 0])--> 3000@0 [size=136, length=-1]
root@root --(thread)--> 3000@0 [size=136, length=-1]
---
-1001@0 --(superclass)--> 1000@0 [size=123, length=-1]
-3@1001 --(class)--> 1001@0 [size=123, length=-1]
+1001@0 --(superclass)--> 1000@0 [size=123456780020, length=-1]
+3@1001 --(class)--> 1001@0 [size=123456780021, length=-1]
3@1001 --(field@4)--> 4@1000 [size=16, length=-1]
3@1001 --(field@5)--> 5@1002 [size=36, length=-1]
---
@@ -119,8 +119,8 @@
root@root --(thread)--> 1@1000 [size=16, length=-1]
root@root --(thread)--> 3000@0 [size=136, length=-1]
---
-1001@0 --(superclass)--> 1000@0 [size=123, length=-1]
-3@1001 --(class)--> 1001@0 [size=123, length=-1]
+1001@0 --(superclass)--> 1000@0 [size=123456780025, length=-1]
+3@1001 --(class)--> 1001@0 [size=123456780026, length=-1]
3@1001 --(field@4)--> 4@1000 [size=16, length=-1]
3@1001 --(field@5)--> 5@1002 [size=36, length=-1]
---
@@ -202,43 +202,43 @@
root@root --(stack-local[id=1,tag=3000,depth=3,method=doFollowReferencesTest,vreg=1,location= 28])--> 3000@0 [size=136, length=-1]
root@root --(stack-local[id=1,tag=3000,depth=5,method=run,vreg=2,location= 0])--> 3000@0 [size=136, length=-1]
root@root --(thread)--> 3000@0 [size=136, length=-1]
-1001@0 --(superclass)--> 1000@0 [size=123, length=-1]
-1002@0 --(interface)--> 2001@0 [size=124, length=-1]
-1002@0 --(superclass)--> 1001@0 [size=123, length=-1]
-1@1000 --(class)--> 1000@0 [size=123, length=-1]
+1001@0 --(superclass)--> 1000@0 [size=123456780050, length=-1]
+1002@0 --(interface)--> 2001@0 [size=123456780054, length=-1]
+1002@0 --(superclass)--> 1001@0 [size=123456780051, length=-1]
+1@1000 --(class)--> 1000@0 [size=123456780050, length=-1]
1@1000 --(field@2)--> 2@1000 [size=16, length=-1]
1@1000 --(field@3)--> 3@1001 [size=24, length=-1]
-2001@0 --(interface)--> 2000@0 [size=124, length=-1]
-2@1000 --(class)--> 1000@0 [size=123, length=-1]
-3@1001 --(class)--> 1001@0 [size=123, length=-1]
+2001@0 --(interface)--> 2000@0 [size=123456780053, length=-1]
+2@1000 --(class)--> 1000@0 [size=123456780050, length=-1]
+3@1001 --(class)--> 1001@0 [size=123456780051, length=-1]
3@1001 --(field@4)--> 4@1000 [size=16, length=-1]
3@1001 --(field@5)--> 5@1002 [size=36, length=-1]
-4@1000 --(class)--> 1000@0 [size=123, length=-1]
+4@1000 --(class)--> 1000@0 [size=123456780050, length=-1]
500@0 --(array-element@1)--> 2@1000 [size=16, length=-1]
-5@1002 --(class)--> 1002@0 [size=123, length=-1]
+5@1002 --(class)--> 1002@0 [size=123456780052, length=-1]
5@1002 --(field@10)--> 1@1000 [size=16, length=-1]
5@1002 --(field@8)--> 500@0 [size=20, length=2]
5@1002 --(field@9)--> 6@1000 [size=16, length=-1]
-6@1000 --(class)--> 1000@0 [size=123, length=-1]
+6@1000 --(class)--> 1000@0 [size=123456780050, length=-1]
---
-1001@0 --(superclass)--> 1000@0 [size=123, length=-1]
-1002@0 --(interface)--> 2001@0 [size=124, length=-1]
-1002@0 --(superclass)--> 1001@0 [size=123, length=-1]
-1@1000 --(class)--> 1000@0 [size=123, length=-1]
+1001@0 --(superclass)--> 1000@0 [size=123456780050, length=-1]
+1002@0 --(interface)--> 2001@0 [size=123456780054, length=-1]
+1002@0 --(superclass)--> 1001@0 [size=123456780051, length=-1]
+1@1000 --(class)--> 1000@0 [size=123456780050, length=-1]
1@1000 --(field@2)--> 2@1000 [size=16, length=-1]
1@1000 --(field@3)--> 3@1001 [size=24, length=-1]
-2001@0 --(interface)--> 2000@0 [size=124, length=-1]
-2@1000 --(class)--> 1000@0 [size=123, length=-1]
-3@1001 --(class)--> 1001@0 [size=123, length=-1]
+2001@0 --(interface)--> 2000@0 [size=123456780053, length=-1]
+2@1000 --(class)--> 1000@0 [size=123456780050, length=-1]
+3@1001 --(class)--> 1001@0 [size=123456780051, length=-1]
3@1001 --(field@4)--> 4@1000 [size=16, length=-1]
3@1001 --(field@5)--> 5@1002 [size=36, length=-1]
-4@1000 --(class)--> 1000@0 [size=123, length=-1]
+4@1000 --(class)--> 1000@0 [size=123456780050, length=-1]
500@0 --(array-element@1)--> 2@1000 [size=16, length=-1]
-5@1002 --(class)--> 1002@0 [size=123, length=-1]
+5@1002 --(class)--> 1002@0 [size=123456780052, length=-1]
5@1002 --(field@10)--> 1@1000 [size=16, length=-1]
5@1002 --(field@8)--> 500@0 [size=20, length=2]
5@1002 --(field@9)--> 6@1000 [size=16, length=-1]
-6@1000 --(class)--> 1000@0 [size=123, length=-1]
+6@1000 --(class)--> 1000@0 [size=123456780050, length=-1]
---
root@root --(jni-global)--> 1@1000 [size=16, length=-1]
root@root --(jni-local[id=1,tag=3000,depth=0,method=followReferences])--> 1@1000 [size=16, length=-1]
@@ -249,99 +249,99 @@
root@root --(stack-local[id=1,tag=3000,depth=5,method=run,vreg=2,location= 0])--> 3000@0 [size=136, length=-1]
root@root --(thread)--> 1@1000 [size=16, length=-1]
root@root --(thread)--> 3000@0 [size=136, length=-1]
-1001@0 --(superclass)--> 1000@0 [size=123, length=-1]
-1002@0 --(interface)--> 2001@0 [size=124, length=-1]
-1002@0 --(superclass)--> 1001@0 [size=123, length=-1]
-1@1000 --(class)--> 1000@0 [size=123, length=-1]
+1001@0 --(superclass)--> 1000@0 [size=123456780055, length=-1]
+1002@0 --(interface)--> 2001@0 [size=123456780059, length=-1]
+1002@0 --(superclass)--> 1001@0 [size=123456780056, length=-1]
+1@1000 --(class)--> 1000@0 [size=123456780055, length=-1]
1@1000 --(field@2)--> 2@1000 [size=16, length=-1]
1@1000 --(field@3)--> 3@1001 [size=24, length=-1]
-2001@0 --(interface)--> 2000@0 [size=124, length=-1]
-2@1000 --(class)--> 1000@0 [size=123, length=-1]
-3@1001 --(class)--> 1001@0 [size=123, length=-1]
+2001@0 --(interface)--> 2000@0 [size=123456780058, length=-1]
+2@1000 --(class)--> 1000@0 [size=123456780055, length=-1]
+3@1001 --(class)--> 1001@0 [size=123456780056, length=-1]
3@1001 --(field@4)--> 4@1000 [size=16, length=-1]
3@1001 --(field@5)--> 5@1002 [size=36, length=-1]
-4@1000 --(class)--> 1000@0 [size=123, length=-1]
+4@1000 --(class)--> 1000@0 [size=123456780055, length=-1]
500@0 --(array-element@1)--> 2@1000 [size=16, length=-1]
-5@1002 --(class)--> 1002@0 [size=123, length=-1]
+5@1002 --(class)--> 1002@0 [size=123456780057, length=-1]
5@1002 --(field@10)--> 1@1000 [size=16, length=-1]
5@1002 --(field@8)--> 500@0 [size=20, length=2]
5@1002 --(field@9)--> 6@1000 [size=16, length=-1]
-6@1000 --(class)--> 1000@0 [size=123, length=-1]
+6@1000 --(class)--> 1000@0 [size=123456780055, length=-1]
---
-1001@0 --(superclass)--> 1000@0 [size=123, length=-1]
-1002@0 --(interface)--> 2001@0 [size=124, length=-1]
-1002@0 --(superclass)--> 1001@0 [size=123, length=-1]
-1@1000 --(class)--> 1000@0 [size=123, length=-1]
+1001@0 --(superclass)--> 1000@0 [size=123456780055, length=-1]
+1002@0 --(interface)--> 2001@0 [size=123456780059, length=-1]
+1002@0 --(superclass)--> 1001@0 [size=123456780056, length=-1]
+1@1000 --(class)--> 1000@0 [size=123456780055, length=-1]
1@1000 --(field@2)--> 2@1000 [size=16, length=-1]
1@1000 --(field@3)--> 3@1001 [size=24, length=-1]
-2001@0 --(interface)--> 2000@0 [size=124, length=-1]
-2@1000 --(class)--> 1000@0 [size=123, length=-1]
-3@1001 --(class)--> 1001@0 [size=123, length=-1]
+2001@0 --(interface)--> 2000@0 [size=123456780058, length=-1]
+2@1000 --(class)--> 1000@0 [size=123456780055, length=-1]
+3@1001 --(class)--> 1001@0 [size=123456780056, length=-1]
3@1001 --(field@4)--> 4@1000 [size=16, length=-1]
3@1001 --(field@5)--> 5@1002 [size=36, length=-1]
-4@1000 --(class)--> 1000@0 [size=123, length=-1]
+4@1000 --(class)--> 1000@0 [size=123456780055, length=-1]
500@0 --(array-element@1)--> 2@1000 [size=16, length=-1]
-5@1002 --(class)--> 1002@0 [size=123, length=-1]
+5@1002 --(class)--> 1002@0 [size=123456780057, length=-1]
5@1002 --(field@10)--> 1@1000 [size=16, length=-1]
5@1002 --(field@8)--> 500@0 [size=20, length=2]
5@1002 --(field@9)--> 6@1000 [size=16, length=-1]
-6@1000 --(class)--> 1000@0 [size=123, length=-1]
+6@1000 --(class)--> 1000@0 [size=123456780055, length=-1]
---
---- tagged classes
root@root --(jni-local[id=1,tag=3000,depth=0,method=followReferences])--> 3000@0 [size=136, length=-1]
root@root --(stack-local[id=1,tag=3000,depth=3,method=doFollowReferencesTest,vreg=1,location= 28])--> 3000@0 [size=136, length=-1]
root@root --(stack-local[id=1,tag=3000,depth=5,method=run,vreg=2,location= 0])--> 3000@0 [size=136, length=-1]
root@root --(thread)--> 3000@0 [size=136, length=-1]
-1001@0 --(superclass)--> 1000@0 [size=123, length=-1]
-1002@0 --(interface)--> 2001@0 [size=124, length=-1]
-1002@0 --(superclass)--> 1001@0 [size=123, length=-1]
-1@1000 --(class)--> 1000@0 [size=123, length=-1]
-2001@0 --(interface)--> 2000@0 [size=124, length=-1]
-2@1000 --(class)--> 1000@0 [size=123, length=-1]
-3@1001 --(class)--> 1001@0 [size=123, length=-1]
-4@1000 --(class)--> 1000@0 [size=123, length=-1]
-5@1002 --(class)--> 1002@0 [size=123, length=-1]
+1001@0 --(superclass)--> 1000@0 [size=123456780060, length=-1]
+1002@0 --(interface)--> 2001@0 [size=123456780064, length=-1]
+1002@0 --(superclass)--> 1001@0 [size=123456780061, length=-1]
+1@1000 --(class)--> 1000@0 [size=123456780060, length=-1]
+2001@0 --(interface)--> 2000@0 [size=123456780063, length=-1]
+2@1000 --(class)--> 1000@0 [size=123456780060, length=-1]
+3@1001 --(class)--> 1001@0 [size=123456780061, length=-1]
+4@1000 --(class)--> 1000@0 [size=123456780060, length=-1]
+5@1002 --(class)--> 1002@0 [size=123456780062, length=-1]
5@1002 --(field@8)--> 500@0 [size=20, length=2]
-6@1000 --(class)--> 1000@0 [size=123, length=-1]
+6@1000 --(class)--> 1000@0 [size=123456780060, length=-1]
---
-1001@0 --(superclass)--> 1000@0 [size=123, length=-1]
-1002@0 --(interface)--> 2001@0 [size=124, length=-1]
-1002@0 --(superclass)--> 1001@0 [size=123, length=-1]
-1@1000 --(class)--> 1000@0 [size=123, length=-1]
-2001@0 --(interface)--> 2000@0 [size=124, length=-1]
-2@1000 --(class)--> 1000@0 [size=123, length=-1]
-3@1001 --(class)--> 1001@0 [size=123, length=-1]
-4@1000 --(class)--> 1000@0 [size=123, length=-1]
-5@1002 --(class)--> 1002@0 [size=123, length=-1]
+1001@0 --(superclass)--> 1000@0 [size=123456780060, length=-1]
+1002@0 --(interface)--> 2001@0 [size=123456780064, length=-1]
+1002@0 --(superclass)--> 1001@0 [size=123456780061, length=-1]
+1@1000 --(class)--> 1000@0 [size=123456780060, length=-1]
+2001@0 --(interface)--> 2000@0 [size=123456780063, length=-1]
+2@1000 --(class)--> 1000@0 [size=123456780060, length=-1]
+3@1001 --(class)--> 1001@0 [size=123456780061, length=-1]
+4@1000 --(class)--> 1000@0 [size=123456780060, length=-1]
+5@1002 --(class)--> 1002@0 [size=123456780062, length=-1]
5@1002 --(field@8)--> 500@0 [size=20, length=2]
-6@1000 --(class)--> 1000@0 [size=123, length=-1]
+6@1000 --(class)--> 1000@0 [size=123456780060, length=-1]
---
root@root --(jni-local[id=1,tag=3000,depth=0,method=followReferences])--> 3000@0 [size=136, length=-1]
root@root --(stack-local[id=1,tag=3000,depth=5,method=run,vreg=2,location= 0])--> 3000@0 [size=136, length=-1]
root@root --(thread)--> 3000@0 [size=136, length=-1]
-1001@0 --(superclass)--> 1000@0 [size=123, length=-1]
-1002@0 --(interface)--> 2001@0 [size=124, length=-1]
-1002@0 --(superclass)--> 1001@0 [size=123, length=-1]
-1@1000 --(class)--> 1000@0 [size=123, length=-1]
-2001@0 --(interface)--> 2000@0 [size=124, length=-1]
-2@1000 --(class)--> 1000@0 [size=123, length=-1]
-3@1001 --(class)--> 1001@0 [size=123, length=-1]
-4@1000 --(class)--> 1000@0 [size=123, length=-1]
-5@1002 --(class)--> 1002@0 [size=123, length=-1]
+1001@0 --(superclass)--> 1000@0 [size=123456780065, length=-1]
+1002@0 --(interface)--> 2001@0 [size=123456780069, length=-1]
+1002@0 --(superclass)--> 1001@0 [size=123456780066, length=-1]
+1@1000 --(class)--> 1000@0 [size=123456780065, length=-1]
+2001@0 --(interface)--> 2000@0 [size=123456780068, length=-1]
+2@1000 --(class)--> 1000@0 [size=123456780065, length=-1]
+3@1001 --(class)--> 1001@0 [size=123456780066, length=-1]
+4@1000 --(class)--> 1000@0 [size=123456780065, length=-1]
+5@1002 --(class)--> 1002@0 [size=123456780067, length=-1]
5@1002 --(field@8)--> 500@0 [size=20, length=2]
-6@1000 --(class)--> 1000@0 [size=123, length=-1]
+6@1000 --(class)--> 1000@0 [size=123456780065, length=-1]
---
-1001@0 --(superclass)--> 1000@0 [size=123, length=-1]
-1002@0 --(interface)--> 2001@0 [size=124, length=-1]
-1002@0 --(superclass)--> 1001@0 [size=123, length=-1]
-1@1000 --(class)--> 1000@0 [size=123, length=-1]
-2001@0 --(interface)--> 2000@0 [size=124, length=-1]
-2@1000 --(class)--> 1000@0 [size=123, length=-1]
-3@1001 --(class)--> 1001@0 [size=123, length=-1]
-4@1000 --(class)--> 1000@0 [size=123, length=-1]
-5@1002 --(class)--> 1002@0 [size=123, length=-1]
+1001@0 --(superclass)--> 1000@0 [size=123456780065, length=-1]
+1002@0 --(interface)--> 2001@0 [size=123456780069, length=-1]
+1002@0 --(superclass)--> 1001@0 [size=123456780066, length=-1]
+1@1000 --(class)--> 1000@0 [size=123456780065, length=-1]
+2001@0 --(interface)--> 2000@0 [size=123456780068, length=-1]
+2@1000 --(class)--> 1000@0 [size=123456780065, length=-1]
+3@1001 --(class)--> 1001@0 [size=123456780066, length=-1]
+4@1000 --(class)--> 1000@0 [size=123456780065, length=-1]
+5@1002 --(class)--> 1002@0 [size=123456780067, length=-1]
5@1002 --(field@8)--> 500@0 [size=20, length=2]
-6@1000 --(class)--> 1000@0 [size=123, length=-1]
+6@1000 --(class)--> 1000@0 [size=123456780065, length=-1]
---
---- untagged classes
root@root --(stack-local[id=1,tag=3000,depth=2,method=doFollowReferencesTestNonRoot,vreg=13,location= 30])--> 1@1000 [size=16, length=-1]
diff --git a/test/913-heaps/heaps.cc b/test/913-heaps/heaps.cc
index f7862c7..00a7ea7 100644
--- a/test/913-heaps/heaps.cc
+++ b/test/913-heaps/heaps.cc
@@ -19,6 +19,7 @@
#include <cstdio>
#include <cstring>
#include <iostream>
+#include <map>
#include <sstream>
#include <vector>
@@ -50,6 +51,36 @@
JvmtiErrorToException(env, jvmti_env, ret);
}
+// Collect sizes of objects (classes) ahead of time, to be able to normalize.
+struct ClassData {
+ jlong size; // Size as reported by GetObjectSize.
+ jlong serial; // Computed serial that should be printed instead of the size.
+};
+
+// Stores a map from tags to ClassData.
+static std::map<jlong, ClassData> sClassData;
+static size_t sClassDataSerial = 0;
+// Large enough number that a collision with a test object is unlikely.
+static constexpr jlong kClassDataSerialBase = 123456780000;
+
+// Register a class (or general object) in the class-data map. The serial number is determined by
+// the order of calls to this function (so stable Java code leads to stable numbering).
+extern "C" JNIEXPORT void JNICALL Java_art_Test913_registerClass(
+ JNIEnv* env, jclass klass ATTRIBUTE_UNUSED, jlong tag, jobject obj) {
+ ClassData data;
+ if (JvmtiErrorToException(env, jvmti_env, jvmti_env->GetObjectSize(obj, &data.size))) {
+ return;
+ }
+ data.serial = kClassDataSerialBase + sClassDataSerial++;
+ // Remove old element, if it exists.
+ auto old = sClassData.find(tag);
+ if (old != sClassData.end()) {
+ sClassData.erase(old);
+ }
+ // Now insert the new mapping.
+ sClassData.insert(std::pair<jlong, ClassData>(tag, data));
+}
+
class IterationConfig {
public:
IterationConfig() {}
@@ -195,11 +226,17 @@
}
jlong adapted_size = size;
- if (*tag_ptr >= 1000) {
+ if (*tag_ptr != 0) {
// This is a class or interface, the size of which will be dependent on the architecture.
// Do not print the size, but detect known values and "normalize" for the golden file.
- if ((sizeof(void*) == 4 && size == 172) || (sizeof(void*) == 8 && size == 224)) {
- adapted_size = 123;
+ auto it = sClassData.find(*tag_ptr);
+ if (it != sClassData.end()) {
+ const ClassData& class_data = it->second;
+ if (class_data.size == size) {
+ adapted_size = class_data.serial;
+ } else {
+ adapted_size = 0xDEADDEAD;
+ }
}
}
diff --git a/test/913-heaps/src/art/Test913.java b/test/913-heaps/src/art/Test913.java
index b999001..4fffa88 100644
--- a/test/913-heaps/src/art/Test913.java
+++ b/test/913-heaps/src/art/Test913.java
@@ -404,17 +404,22 @@
private static void tagClasses(Verifier v) {
setTag(A.class, 1000);
+ registerClass(1000, A.class);
setTag(B.class, 1001);
+ registerClass(1001, B.class);
v.add("1001@0", "1000@0"); // B.class --(superclass)--> A.class.
setTag(C.class, 1002);
+ registerClass(1002, C.class);
v.add("1002@0", "1001@0"); // C.class --(superclass)--> B.class.
v.add("1002@0", "2001@0"); // C.class --(interface)--> I2.class.
setTag(I1.class, 2000);
+ registerClass(2000, I1.class);
setTag(I2.class, 2001);
+ registerClass(2001, I2.class);
v.add("2001@0", "2000@0"); // I2.class --(interface)--> I1.class.
}
@@ -751,4 +756,6 @@
public static native String followReferencesPrimitiveFields(Object initialObject);
private static native void iterateThroughHeapExt();
+
+ private static native void registerClass(long tag, Object obj);
}