Skip to content

Commit dce0412

Browse files
committed
[GR-17457] Convert nodes to DSL inlinable
PullRequest: truffleruby/4020
2 parents 6c4c2df + 86227ca commit dce0412

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+476
-391
lines changed

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ Object callWithCExtLockAndFrame(
206206
try {
207207
return InteropNodes.execute(this, receiver, args, receivers, translateInteropExceptionNode);
208208
} finally {
209-
runMarksNode.execute(extensionStack);
209+
runMarksNode.execute(this, extensionStack);
210210
if (!owned) {
211211
MutexOperations.unlockInternal(lock);
212212
}
@@ -215,7 +215,7 @@ Object callWithCExtLockAndFrame(
215215
try {
216216
return InteropNodes.execute(this, receiver, args, receivers, translateInteropExceptionNode);
217217
} finally {
218-
runMarksNode.execute(extensionStack);
218+
runMarksNode.execute(this, extensionStack);
219219
}
220220
}
221221

@@ -258,7 +258,7 @@ Object callWithCExtLockAndFrame(
258258
return unwrapNode.execute(this,
259259
InteropNodes.execute(this, receiver, args, receivers, translateInteropExceptionNode));
260260
} finally {
261-
runMarksNode.execute(extensionStack);
261+
runMarksNode.execute(this, extensionStack);
262262
if (!owned) {
263263
MutexOperations.unlockInternal(lock);
264264
}
@@ -268,7 +268,7 @@ Object callWithCExtLockAndFrame(
268268
return unwrapNode.execute(this,
269269
InteropNodes.execute(this, receiver, args, receivers, translateInteropExceptionNode));
270270
} finally {
271-
runMarksNode.execute(extensionStack);
271+
runMarksNode.execute(this, extensionStack);
272272
}
273273
}
274274

@@ -386,7 +386,7 @@ Object sendWithoutCExtLock(VirtualFrame frame, Object receiver, RubySymbol metho
386386
Object[] args = unwrapCArrayNode.execute(argv);
387387

388388
// Remove empty kwargs in the caller, so the callee does not need to care about this special case
389-
final RubyHash keywords = hashCastNode.execute(ArrayUtils.getLast(args));
389+
final RubyHash keywords = hashCastNode.execute(this, ArrayUtils.getLast(args));
390390
if (emptyProfile.profile(this, keywords.empty())) {
391391
args = LiteralCallNode.removeEmptyKeywordArguments(args);
392392
return sendWithoutCExtLock(frame, receiver, method, block, EmptyArgumentsDescriptor.INSTANCE, args,
@@ -424,7 +424,7 @@ Object sendWithoutCExtLock(VirtualFrame frame, Object receiver, RubySymbol metho
424424
Object[] args = unwrapCArrayNode.execute(argv);
425425

426426
// Remove empty kwargs in the caller, so the callee does not need to care about this special case
427-
final RubyHash keywords = hashCastNode.execute(ArrayUtils.getLast(args));
427+
final RubyHash keywords = hashCastNode.execute(this, ArrayUtils.getLast(args));
428428
if (emptyProfile.profile(this, keywords.empty())) {
429429
args = LiteralCallNode.removeEmptyKeywordArguments(args);
430430
return sendWithoutCExtLock(frame, receiver, method, block, EmptyArgumentsDescriptor.INSTANCE, args,
@@ -944,7 +944,7 @@ public abstract static class CheckFrozenNode extends CoreMethodArrayArgumentsNod
944944
@Specialization
945945
boolean rb_check_frozen(Object object,
946946
@Cached TypeNodes.CheckFrozenNode raiseIfFrozenNode) {
947-
raiseIfFrozenNode.execute(object);
947+
raiseIfFrozenNode.execute(this, object);
948948
return true;
949949
}
950950

@@ -1473,7 +1473,7 @@ Object captureException(RubyProc block,
14731473
@Cached InlinedBranchProfile noExceptionProfile,
14741474
@Cached CallBlockNode yieldNode) {
14751475
try {
1476-
yieldNode.yield(block);
1476+
yieldNode.yield(this, block);
14771477
noExceptionProfile.enter(this);
14781478
return nil;
14791479
} catch (Throwable e) {
@@ -1834,7 +1834,7 @@ Object addToMarkList(Object guardedObject,
18341834
ValueWrapper wrappedValue = toWrapperNode.execute(this, guardedObject);
18351835
if (wrappedValue != null) {
18361836
noExceptionProfile.enter(this);
1837-
keepAliveNode.execute(wrappedValue);
1837+
keepAliveNode.execute(this, wrappedValue);
18381838
}
18391839
return nil;
18401840
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ static void toNative(ValueWrapper wrapper,
108108
@Bind("$node") Node node) {
109109
if (!wrapper.isPointer()) {
110110
createHandleProfile.enter(node);
111-
createNativeHandleNode.execute(wrapper);
111+
createNativeHandleNode.execute(node, wrapper);
112112
}
113113
}
114114

@@ -123,7 +123,7 @@ static long asPointer(ValueWrapper wrapper,
123123
if (ValueWrapperManager.isTaggedObject(handle)) {
124124
taggedObjectProfile.enter(node);
125125

126-
keepAliveNode.execute(wrapper);
126+
keepAliveNode.execute(node, wrapper);
127127
}
128128

129129
return handle;

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

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
import java.util.concurrent.atomic.AtomicLong;
1717

1818
import com.oracle.truffle.api.dsl.Bind;
19+
import com.oracle.truffle.api.dsl.GenerateCached;
20+
import com.oracle.truffle.api.dsl.GenerateInline;
1921
import com.oracle.truffle.api.nodes.Node;
2022
import org.truffleruby.RubyContext;
2123
import org.truffleruby.RubyLanguage;
@@ -283,35 +285,39 @@ public static final class HandleBlockHolder {
283285
}
284286

285287
@GenerateUncached
288+
@GenerateInline
289+
@GenerateCached(false)
286290
public abstract static class AllocateHandleNode extends RubyBaseNode {
287291

288292
private static final Set<ValueWrapper> keepAlive = ConcurrentHashMap.newKeySet();
289293

290-
public abstract long execute(ValueWrapper wrapper);
294+
public abstract long execute(Node node, ValueWrapper wrapper);
291295

292296
@Specialization(guards = "!isSharedObject(wrapper)")
293-
long allocateHandleOnKnownThread(ValueWrapper wrapper) {
294-
if (getContext().getOptions().CEXTS_KEEP_HANDLES_ALIVE) {
297+
static long allocateHandleOnKnownThread(Node node, ValueWrapper wrapper) {
298+
if (getContext(node).getOptions().CEXTS_KEEP_HANDLES_ALIVE) {
295299
keepAlive(wrapper);
296300
}
297301
return allocateHandle(
302+
node,
298303
wrapper,
299-
getContext(),
300-
getLanguage(),
301-
getBlockHolder(getContext(), getLanguage()),
304+
getContext(node),
305+
getLanguage(node),
306+
getBlockHolder(getContext(node), getLanguage(node)),
302307
false);
303308
}
304309

305310
@Specialization(guards = "isSharedObject(wrapper)")
306-
long allocateSharedHandleOnKnownThread(ValueWrapper wrapper) {
307-
if (getContext().getOptions().CEXTS_KEEP_HANDLES_ALIVE) {
311+
static long allocateSharedHandleOnKnownThread(Node node, ValueWrapper wrapper) {
312+
if (getContext(node).getOptions().CEXTS_KEEP_HANDLES_ALIVE) {
308313
keepAlive(wrapper);
309314
}
310315
return allocateHandle(
316+
node,
311317
wrapper,
312-
getContext(),
313-
getLanguage(),
314-
getBlockHolder(getContext(), getLanguage()),
318+
getContext(node),
319+
getLanguage(node),
320+
getBlockHolder(getContext(node), getLanguage(node)),
315321
true);
316322
}
317323

@@ -320,8 +326,8 @@ protected static void keepAlive(ValueWrapper wrapper) {
320326
keepAlive.add(wrapper);
321327
}
322328

323-
protected long allocateHandle(ValueWrapper wrapper, RubyContext context, RubyLanguage language,
324-
HandleBlockHolder holder, boolean shared) {
329+
protected static long allocateHandle(Node node, ValueWrapper wrapper, RubyContext context,
330+
RubyLanguage language, HandleBlockHolder holder, boolean shared) {
325331
HandleBlock block;
326332
if (shared) {
327333
block = holder.sharedHandleBlock;
@@ -334,7 +340,7 @@ protected long allocateHandle(ValueWrapper wrapper, RubyContext context, RubyLan
334340
}
335341

336342
if (context.getOptions().BACKTRACE_ON_TO_NATIVE) {
337-
context.getDefaultBacktraceFormatter().printBacktraceOnEnvStderr("ValueWrapper#toNative: ", this);
343+
context.getDefaultBacktraceFormatter().printBacktraceOnEnvStderr("ValueWrapper#toNative: ", node);
338344
}
339345

340346
if (block == null || block.isFull()) {

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import java.util.ArrayList;
1313

14+
import org.truffleruby.annotations.SuppressFBWarnings;
1415
import org.truffleruby.cext.CapturedException;
1516
import org.truffleruby.cext.ValueWrapper;
1617
import org.truffleruby.core.array.ArrayUtils;
@@ -43,7 +44,7 @@ protected static final class ExtensionCallStackEntry {
4344

4445
private final ExtensionCallStackEntry previous;
4546
ValueWrapper preservedObject;
46-
ArrayList<ValueWrapper> preservedObjects;
47+
@SuppressFBWarnings("UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR") ArrayList<ValueWrapper> preservedObjectList;
4748
private final boolean keywordsGiven;
4849
private Object specialVariables;
4950
private final Object block;
@@ -79,7 +80,11 @@ public boolean hasKeptObjects() {
7980
}
8081

8182
public boolean hasSingleKeptObject() {
82-
return current.preservedObject != null && current.preservedObjects == null;
83+
return current.preservedObject != null && current.preservedObjectList == null;
84+
}
85+
86+
public boolean isPreservedObjectListInitialized() {
87+
return current.preservedObjectList != null;
8388
}
8489

8590
public void markOnExitObject(ValueWrapper value) {

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

Lines changed: 36 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,11 @@
99
*/
1010
package org.truffleruby.core;
1111

12+
import com.oracle.truffle.api.dsl.GenerateCached;
13+
import com.oracle.truffle.api.dsl.GenerateInline;
1214
import com.oracle.truffle.api.dsl.NeverDefault;
15+
import com.oracle.truffle.api.dsl.NonIdempotent;
16+
import com.oracle.truffle.api.nodes.Node;
1317
import com.oracle.truffle.api.profiles.InlinedConditionProfile;
1418
import org.truffleruby.cext.ValueWrapper;
1519
import org.truffleruby.core.MarkingService.ExtensionCallStack;
@@ -28,42 +32,47 @@
2832
public abstract class MarkingServiceNodes {
2933

3034
@GenerateUncached
35+
@GenerateCached(false)
36+
@GenerateInline
3137
public abstract static class KeepAliveNode extends RubyBaseNode {
3238

33-
public abstract void execute(ValueWrapper object);
39+
public abstract void execute(Node node, ValueWrapper object);
3440

3541
@Specialization(guards = "!stack.hasKeptObjects()")
36-
void keepFirstObject(ValueWrapper object,
37-
@Bind("getStack(object)") ExtensionCallStack stack) {
42+
static void keepFirstObject(Node node, ValueWrapper object,
43+
@Bind("getStack(node)") ExtensionCallStack stack) {
3844
stack.current.preservedObject = object;
3945
}
4046

4147
@Specialization(guards = "stack.hasSingleKeptObject()")
42-
void keepCreatingList(ValueWrapper object,
43-
@Bind("getStack(object)") ExtensionCallStack stack,
48+
static void keepCreatingList(Node node, ValueWrapper object,
49+
@Bind("getStack(node)") ExtensionCallStack stack,
4450
@Cached InlinedConditionProfile sameObjectProfile) {
45-
if (sameObjectProfile.profile(this, object != stack.current.preservedObject)) {
51+
if (sameObjectProfile.profile(node, object != stack.current.preservedObject)) {
4652
createKeptList(object, stack);
4753
}
4854
}
4955

50-
@Specialization(guards = { "stack.hasKeptObjects()", "!stack.hasSingleKeptObject()" })
56+
@Specialization(guards = {
57+
"stack.isPreservedObjectListInitialized()",
58+
"stack.hasKeptObjects()",
59+
"!stack.hasSingleKeptObject()" })
5160
@TruffleBoundary
52-
void keepAddingToList(ValueWrapper object,
53-
@Bind("getStack(object)") ExtensionCallStack stack) {
54-
stack.current.preservedObjects.add(object);
61+
static void keepAddingToList(Node node, ValueWrapper object,
62+
@Bind("getStack(node)") ExtensionCallStack stack) {
63+
stack.current.preservedObjectList.add(object);
5564
}
5665

5766
@TruffleBoundary
58-
private void createKeptList(ValueWrapper object, ExtensionCallStack stack) {
59-
stack.current.preservedObjects = new ArrayList<>();
60-
stack.current.preservedObjects.add(stack.current.preservedObject);
61-
stack.current.preservedObjects.add(object);
67+
private static void createKeptList(ValueWrapper object, ExtensionCallStack stack) {
68+
stack.current.preservedObjectList = new ArrayList<>();
69+
stack.current.preservedObjectList.add(stack.current.preservedObject);
70+
stack.current.preservedObjectList.add(object);
6271
}
6372

64-
// We take a parameter so that the bind isn't considered cacheable.
65-
protected ExtensionCallStack getStack(ValueWrapper object) {
66-
return getLanguage().getCurrentThread().getCurrentFiber().extensionCallStack;
73+
@NonIdempotent
74+
protected static ExtensionCallStack getStack(Node node) {
75+
return getLanguage(node).getCurrentThread().getCurrentFiber().extensionCallStack;
6776
}
6877
}
6978

@@ -83,26 +92,28 @@ protected void addToList(ExtensionCallStack stack, ValueWrapper object) {
8392
}
8493
}
8594

95+
@GenerateInline
96+
@GenerateCached(false)
8697
public abstract static class RunMarkOnExitNode extends RubyBaseNode {
8798

88-
public abstract void execute(ExtensionCallStack stack);
99+
public abstract void execute(Node node, ExtensionCallStack stack);
89100

90101
@Specialization(guards = "!stack.hasMarkObjects()")
91-
void nothingToMark(ExtensionCallStack stack) {
102+
static void nothingToMark(ExtensionCallStack stack) {
92103
// Do nothing.
93104
}
94105

95106
@Specialization(guards = "stack.hasSingleMarkObject()")
96-
void markSingleObject(ExtensionCallStack stack,
97-
@Cached @Shared DispatchNode callNode) {
107+
static void markSingleObject(Node node, ExtensionCallStack stack,
108+
@Cached(inline = false) @Shared DispatchNode callNode) {
98109
ValueWrapper value = stack.getSingleMarkObject();
99-
callNode.call(getContext().getCoreLibrary().truffleCExtModule, "run_marker", value.getObject());
110+
callNode.call(getContext(node).getCoreLibrary().truffleCExtModule, "run_marker", value.getObject());
100111
}
101112

102113
@TruffleBoundary
103114
@Specialization(guards = { "stack.hasMarkObjects()", "!stack.hasSingleMarkObject()" })
104-
void marksToRun(ExtensionCallStack stack,
105-
@Cached @Shared DispatchNode callNode) {
115+
static void marksToRun(Node node, ExtensionCallStack stack,
116+
@Cached(inline = false) @Shared DispatchNode callNode) {
106117
// Run the markers...
107118
var valuesForMarking = stack.getMarkOnExitObjects();
108119
// Push a new stack frame because we should
@@ -111,17 +122,11 @@ void marksToRun(ExtensionCallStack stack,
111122
stack.push(false, nil, nil);
112123
try {
113124
for (var value : valuesForMarking) {
114-
callNode.call(getContext().getCoreLibrary().truffleCExtModule, "run_marker", value.getObject());
125+
callNode.call(getContext(node).getCoreLibrary().truffleCExtModule, "run_marker", value.getObject());
115126
}
116127
} finally {
117128
stack.pop();
118129
}
119130
}
120-
121-
122-
@NeverDefault
123-
public static RunMarkOnExitNode create() {
124-
return MarkingServiceNodesFactory.RunMarkOnExitNodeGen.create();
125-
}
126131
}
127132
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ Object doCatch(Object tag, RubyProc block,
118118
@Cached ReferenceEqualNode referenceEqualNode,
119119
@Cached CallBlockNode yieldNode) {
120120
try {
121-
return yieldNode.yield(block, tag);
121+
return yieldNode.yield(this, block, tag);
122122
} catch (ThrowException e) {
123123
catchProfile.enter(this);
124124
if (matchProfile.profile(this, referenceEqualNode.execute(this, e.getTag(), tag))) {
@@ -154,7 +154,7 @@ Object vmExtendedModules(Object object, RubyProc block,
154154

155155
if (isSingletonProfile.profile(this, metaClass.isSingleton)) {
156156
for (RubyModule included : metaClass.fields.prependedAndIncludedModules()) {
157-
yieldNode.yield(block, included);
157+
yieldNode.yield(this, block, included);
158158
}
159159
}
160160

@@ -420,7 +420,7 @@ Object getSection(Object section, RubyProc block,
420420
.getNativeConfiguration()
421421
.getSection(RubyGuards.getJavaString(section))) {
422422
final RubyString key = createString(fromJavaStringNode, entry.getKey(), Encodings.UTF_8); // CR_7BIT
423-
yieldNode.yield(block, key, entry.getValue());
423+
yieldNode.yield(this, block, key, entry.getValue());
424424
}
425425

426426
return nil;

0 commit comments

Comments
 (0)