Skip to content

Commit 3df0bf5

Browse files
committed
Try to optimise marking for common cases.
1 parent 38df5e7 commit 3df0bf5

File tree

2 files changed

+61
-12
lines changed

2 files changed

+61
-12
lines changed

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

Lines changed: 51 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,14 @@ public static interface MarkerAction {
4242
protected static class ExtensionCallStackEntry {
4343

4444
protected final ExtensionCallStackEntry previous;
45+
protected ValueWrapper preservedObject;
4546
protected ArrayList<ValueWrapper> preservedObjects;
4647
protected final boolean keywordsGiven;
4748
protected Object specialVariables;
4849
protected final Object block;
4950
protected CapturedException capturedException;
50-
protected ArrayList<ValueWrapper> forMarking;
51+
protected ValueWrapper markOnExitObject;
52+
protected ArrayList<ValueWrapper> markOnExitObjects;
5153
protected Object[] marks;
5254
protected int marksIndex = 0;
5355

@@ -73,7 +75,24 @@ public ExtensionCallStack(Object specialVariables, Object block) {
7375
}
7476

7577
public boolean hasKeptObjects() {
76-
return current.preservedObjects != null;
78+
return current.preservedObject != null;
79+
}
80+
81+
public void keepObject(ValueWrapper value) {
82+
if (current.preservedObject == null) {
83+
current.preservedObject = value;
84+
} else {
85+
keepObjectOnList(value);
86+
}
87+
}
88+
89+
@TruffleBoundary
90+
private void keepObjectOnList(ValueWrapper value) {
91+
if (current.preservedObjects == null) {
92+
current.preservedObjects = new ArrayList<>();
93+
current.preservedObjects.add(current.preservedObject);
94+
}
95+
current.preservedObjects.add(value);
7796
}
7897

7998
public ArrayList<ValueWrapper> getKeptObjects() {
@@ -85,17 +104,42 @@ public ArrayList<ValueWrapper> getKeptObjects() {
85104
return current.preservedObjects;
86105
}
87106

107+
public void markOnExitObject(ValueWrapper value) {
108+
if (current.markOnExitObject == null) {
109+
current.markOnExitObject = value;
110+
} else {
111+
markOnExitObjectOnList(value);
112+
}
113+
}
114+
115+
@TruffleBoundary
116+
private void markOnExitObjectOnList(ValueWrapper value) {
117+
if (current.markOnExitObjects == null) {
118+
current.markOnExitObjects = new ArrayList<>();
119+
current.markOnExitObjects.add(current.markOnExitObject);
120+
}
121+
current.markOnExitObjects.add(value);
122+
}
123+
88124
public ArrayList<ValueWrapper> getMarkOnExitObjects() {
89125
assert current.previous != null;
90126

91-
if (current.forMarking == null) {
92-
current.forMarking = new ArrayList<>();
127+
if (current.markOnExitObjects == null) {
128+
current.markOnExitObjects = new ArrayList<>();
93129
}
94-
return current.forMarking;
130+
return current.markOnExitObjects;
95131
}
96132

97133
public boolean hasMarkObjects() {
98-
return current.forMarking != null;
134+
return current.markOnExitObject != null;
135+
}
136+
137+
public boolean hasSingleMarkObject() {
138+
return current.markOnExitObject != null && current.markOnExitObjects == null;
139+
}
140+
141+
public ValueWrapper getSingleMarkObject() {
142+
return current.markOnExitObject;
99143
}
100144

101145
public void pop() {
@@ -135,7 +179,7 @@ public void startMarking(ExtensionCallStack stack, Object[] oldMarks) {
135179
if (oldMarks == null) {
136180
stack.current.marks = ArrayUtils.EMPTY_ARRAY;
137181
} else {
138-
stack.current.marks = new Object[oldMarks.length];
182+
stack.current.marks = oldMarks;
139183
}
140184
stack.current.marksIndex = 0;
141185
}

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

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,8 @@ public void execute(ValueWrapper object) {
2626
addToList(getLanguage().getCurrentThread().getCurrentFiber().extensionCallStack, object);
2727
}
2828

29-
@TruffleBoundary
3029
protected void addToList(ExtensionCallStack stack, ValueWrapper object) {
31-
stack.getKeptObjects().add(object);
30+
stack.keepObject(object);
3231
}
3332

3433
public static KeepAliveNode create() {
@@ -46,9 +45,8 @@ public void execute(ValueWrapper object) {
4645
addToList(getLanguage().getCurrentThread().getCurrentFiber().extensionCallStack, object);
4746
}
4847

49-
@TruffleBoundary
5048
protected void addToList(ExtensionCallStack stack, ValueWrapper object) {
51-
stack.getMarkOnExitObjects().add(object);
49+
stack.markOnExitObject(object);
5250
}
5351

5452
public static QueueForMarkOnExitNode create() {
@@ -65,8 +63,15 @@ protected void nothingToMark(ExtensionCallStack stack) {
6563
// Do nothing.
6664
}
6765

66+
@Specialization(guards = "stack.hasSingleMarkObject()")
67+
protected void markSingleObject(ExtensionCallStack stack,
68+
@Cached DispatchNode callNode) {
69+
ValueWrapper value = stack.getSingleMarkObject();
70+
callNode.call(getContext().getCoreLibrary().truffleCExtModule, "run_marker", value.getObject());
71+
}
72+
6873
@TruffleBoundary
69-
@Specialization(guards = "stack.hasMarkObjects()")
74+
@Specialization(guards = { "stack.hasMarkObjects()", "!stack.hasSingleMarkObject()" })
7075
protected void marksToRun(ExtensionCallStack stack,
7176
@Cached DispatchNode callNode) {
7277
// Run the markers...

0 commit comments

Comments
 (0)