Skip to content

Commit 94c15e8

Browse files
committed
[GR-13219] Use an identity Set for walking the object graph
PullRequest: truffleruby/512
2 parents 57e7eea + bef4bbb commit 94c15e8

File tree

2 files changed

+12
-6
lines changed

2 files changed

+12
-6
lines changed

src/main/java/org/truffleruby/core/module/ModuleFields.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.truffleruby.language.control.RaiseException;
2929
import org.truffleruby.language.methods.InternalMethod;
3030
import org.truffleruby.language.objects.IsFrozenNode;
31+
import org.truffleruby.language.objects.ObjectGraph;
3132
import org.truffleruby.language.objects.ObjectGraphNode;
3233
import org.truffleruby.language.objects.ObjectIDOperations;
3334
import org.truffleruby.language.objects.shared.SharedObjects;
@@ -364,7 +365,7 @@ public void addMethod(RubyContext context, Node currentNode, InternalMethod meth
364365
checkFrozen(context, currentNode);
365366

366367
if (SharedObjects.isShared(context, rubyModuleObject)) {
367-
Set<DynamicObject> adjacent = new HashSet<>();
368+
Set<DynamicObject> adjacent = ObjectGraph.newRubyObjectSet();
368369
method.getAdjacentObjects(adjacent);
369370
for (DynamicObject object : adjacent) {
370371
SharedObjects.writeBarrier(context, object);

src/main/java/org/truffleruby/language/objects/ObjectGraph.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,20 @@
2626

2727
import java.util.ArrayDeque;
2828
import java.util.Collection;
29+
import java.util.Collections;
2930
import java.util.Deque;
30-
import java.util.HashSet;
31+
import java.util.IdentityHashMap;
3132
import java.util.Set;
3233

3334
public abstract class ObjectGraph {
3435

36+
public static Set<DynamicObject> newRubyObjectSet() {
37+
return Collections.newSetFromMap(new IdentityHashMap<>());
38+
}
39+
3540
@TruffleBoundary
3641
public static Set<DynamicObject> stopAndGetAllObjects(Node currentNode, final RubyContext context) {
37-
final Set<DynamicObject> visited = new HashSet<>();
42+
final Set<DynamicObject> visited = newRubyObjectSet();
3843

3944
final Thread initiatingJavaThread = Thread.currentThread();
4045

@@ -71,7 +76,7 @@ public static Set<DynamicObject> stopAndGetAllObjects(Node currentNode, final Ru
7176

7277
@TruffleBoundary
7378
public static Set<DynamicObject> stopAndGetRootObjects(Node currentNode, final RubyContext context) {
74-
final Set<DynamicObject> visited = new HashSet<>();
79+
final Set<DynamicObject> visited = newRubyObjectSet();
7580

7681
final Thread initiatingJavaThread = Thread.currentThread();
7782

@@ -96,7 +101,7 @@ public static void visitContextRoots(RubyContext context, Collection<DynamicObje
96101
}
97102

98103
public static Set<DynamicObject> getAdjacentObjects(DynamicObject object) {
99-
final Set<DynamicObject> reachable = new HashSet<>();
104+
final Set<DynamicObject> reachable = newRubyObjectSet();
100105

101106
if (Layouts.BASIC_OBJECT.isBasicObject(object)) {
102107
reachable.add(Layouts.BASIC_OBJECT.getLogicalClass(object));
@@ -157,7 +162,7 @@ public static Set<DynamicObject> getAdjacentObjects(DynamicObject object) {
157162
}
158163

159164
public static Set<DynamicObject> getObjectsInFrame(Frame frame) {
160-
final Set<DynamicObject> objects = new HashSet<>();
165+
final Set<DynamicObject> objects = newRubyObjectSet();
161166

162167
final Frame lexicalParentFrame = RubyArguments.tryGetDeclarationFrame(frame);
163168
if (lexicalParentFrame != null) {

0 commit comments

Comments
 (0)