26
26
27
27
import java .util .ArrayDeque ;
28
28
import java .util .Collection ;
29
+ import java .util .Collections ;
29
30
import java .util .Deque ;
30
- import java .util .HashSet ;
31
+ import java .util .IdentityHashMap ;
31
32
import java .util .Set ;
32
33
33
34
public abstract class ObjectGraph {
34
35
36
+ public static Set <DynamicObject > newRubyObjectSet () {
37
+ return Collections .newSetFromMap (new IdentityHashMap <>());
38
+ }
39
+
35
40
@ TruffleBoundary
36
41
public static Set <DynamicObject > stopAndGetAllObjects (Node currentNode , final RubyContext context ) {
37
- final Set <DynamicObject > visited = new HashSet <> ();
42
+ final Set <DynamicObject > visited = newRubyObjectSet ();
38
43
39
44
final Thread initiatingJavaThread = Thread .currentThread ();
40
45
@@ -71,7 +76,7 @@ public static Set<DynamicObject> stopAndGetAllObjects(Node currentNode, final Ru
71
76
72
77
@ TruffleBoundary
73
78
public static Set <DynamicObject > stopAndGetRootObjects (Node currentNode , final RubyContext context ) {
74
- final Set <DynamicObject > visited = new HashSet <> ();
79
+ final Set <DynamicObject > visited = newRubyObjectSet ();
75
80
76
81
final Thread initiatingJavaThread = Thread .currentThread ();
77
82
@@ -96,7 +101,7 @@ public static void visitContextRoots(RubyContext context, Collection<DynamicObje
96
101
}
97
102
98
103
public static Set <DynamicObject > getAdjacentObjects (DynamicObject object ) {
99
- final Set <DynamicObject > reachable = new HashSet <> ();
104
+ final Set <DynamicObject > reachable = newRubyObjectSet ();
100
105
101
106
if (Layouts .BASIC_OBJECT .isBasicObject (object )) {
102
107
reachable .add (Layouts .BASIC_OBJECT .getLogicalClass (object ));
@@ -157,7 +162,7 @@ public static Set<DynamicObject> getAdjacentObjects(DynamicObject object) {
157
162
}
158
163
159
164
public static Set <DynamicObject > getObjectsInFrame (Frame frame ) {
160
- final Set <DynamicObject > objects = new HashSet <> ();
165
+ final Set <DynamicObject > objects = newRubyObjectSet ();
161
166
162
167
final Frame lexicalParentFrame = RubyArguments .tryGetDeclarationFrame (frame );
163
168
if (lexicalParentFrame != null ) {
0 commit comments