Skip to content

Commit 2858c4d

Browse files
committed
Tidy up of marking service and nodes.
1 parent 49f40fa commit 2858c4d

File tree

3 files changed

+36
-34
lines changed

3 files changed

+36
-34
lines changed

src/main/java/org/truffleruby/cext/ValueWrapper.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ protected static long asPointer(ValueWrapper wrapper,
118118

119119
if (ValueWrapperManager.isTaggedObject(handle)) {
120120
taggedObjectProfile.enter();
121+
121122
keepAliveNode.execute(wrapper);
122123
}
123124

src/main/java/org/truffleruby/core/MarkingService.java

Lines changed: 1 addition & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -82,32 +82,6 @@ public boolean hasSingleKeptObject() {
8282
return current.preservedObject != null && current.preservedObjects == null;
8383
}
8484

85-
public void keepObject(ValueWrapper value) {
86-
if (current.preservedObject == null) {
87-
current.preservedObject = value;
88-
} else if (current.preservedObject != value) {
89-
keepObjectOnList(value);
90-
}
91-
}
92-
93-
@TruffleBoundary
94-
private void keepObjectOnList(ValueWrapper value) {
95-
if (current.preservedObjects == null) {
96-
current.preservedObjects = new ArrayList<>();
97-
current.preservedObjects.add(current.preservedObject);
98-
}
99-
current.preservedObjects.add(value);
100-
}
101-
102-
public ArrayList<ValueWrapper> getKeptObjects() {
103-
assert current.previous != null;
104-
105-
if (current.preservedObjects == null) {
106-
current.preservedObjects = new ArrayList<>();
107-
}
108-
return current.preservedObjects;
109-
}
110-
11185
public void markOnExitObject(ValueWrapper value) {
11286
if (current.markOnExitObject == null) {
11387
current.markOnExitObject = value;
@@ -127,10 +101,8 @@ private void markOnExitObjectOnList(ValueWrapper value) {
127101

128102
public ArrayList<ValueWrapper> getMarkOnExitObjects() {
129103
assert current.previous != null;
104+
assert current.markOnExitObjects != null;
130105

131-
if (current.markOnExitObjects == null) {
132-
current.markOnExitObjects = new ArrayList<>();
133-
}
134106
return current.markOnExitObjects;
135107
}
136108

src/main/java/org/truffleruby/core/MarkingServiceNodes.java

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,14 @@
1414
import org.truffleruby.language.RubyBaseNode;
1515
import org.truffleruby.language.dispatch.DispatchNode;
1616

17+
import java.util.ArrayList;
18+
1719
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
20+
import com.oracle.truffle.api.dsl.Bind;
1821
import com.oracle.truffle.api.dsl.Cached;
1922
import com.oracle.truffle.api.dsl.GenerateUncached;
2023
import com.oracle.truffle.api.dsl.Specialization;
24+
import com.oracle.truffle.api.profiles.ConditionProfile;
2125

2226
public class MarkingServiceNodes {
2327

@@ -26,13 +30,38 @@ public abstract static class KeepAliveNode extends RubyBaseNode {
2630

2731
public abstract void execute(ValueWrapper object);
2832

29-
@Specialization
30-
protected void executeAddToList(ValueWrapper object) {
31-
addToList(getLanguage().getCurrentThread().getCurrentFiber().extensionCallStack, object);
33+
@Specialization(guards = "!stack.hasKeptObjects()")
34+
protected void keepFirstObject(ValueWrapper object,
35+
@Bind("getStack(object)") ExtensionCallStack stack) {
36+
stack.current.preservedObject = object;
3237
}
3338

34-
protected void addToList(ExtensionCallStack stack, ValueWrapper object) {
35-
stack.keepObject(object);
39+
@Specialization(guards = "stack.hasSingleKeptObject()")
40+
protected void keepCreatingList(ValueWrapper object,
41+
@Bind("getStack(object)") ExtensionCallStack stack,
42+
@Cached ConditionProfile sameObjectProfile) {
43+
if (sameObjectProfile.profile(object != stack.current.preservedObject)) {
44+
createKeptList(object, stack);
45+
}
46+
}
47+
48+
@Specialization(guards = { "stack.hasKeptObjects()", "!stack.hasSingleKeptObject()" })
49+
@TruffleBoundary
50+
protected void keepAddingToList(ValueWrapper object,
51+
@Bind("getStack(object)") ExtensionCallStack stack) {
52+
stack.current.preservedObjects.add(object);
53+
}
54+
55+
@TruffleBoundary
56+
private void createKeptList(ValueWrapper object, ExtensionCallStack stack) {
57+
stack.current.preservedObjects = new ArrayList<>();
58+
stack.current.preservedObjects.add(stack.current.preservedObject);
59+
stack.current.preservedObjects.add(object);
60+
}
61+
62+
// We take a parameter so that the bind isn't considered cacheable.
63+
protected ExtensionCallStack getStack(ValueWrapper object) {
64+
return getLanguage().getCurrentThread().getCurrentFiber().extensionCallStack;
3665
}
3766
}
3867

0 commit comments

Comments
 (0)