|
9 | 9 | */
|
10 | 10 | package org.truffleruby.core;
|
11 | 11 |
|
| 12 | +import com.oracle.truffle.api.dsl.GenerateCached; |
| 13 | +import com.oracle.truffle.api.dsl.GenerateInline; |
12 | 14 | import com.oracle.truffle.api.dsl.NeverDefault;
|
| 15 | +import com.oracle.truffle.api.nodes.Node; |
13 | 16 | import com.oracle.truffle.api.profiles.InlinedConditionProfile;
|
14 | 17 | import org.truffleruby.cext.ValueWrapper;
|
15 | 18 | import org.truffleruby.core.MarkingService.ExtensionCallStack;
|
|
28 | 31 | public abstract class MarkingServiceNodes {
|
29 | 32 |
|
30 | 33 | @GenerateUncached
|
| 34 | + @GenerateCached(false) |
| 35 | + @GenerateInline |
31 | 36 | public abstract static class KeepAliveNode extends RubyBaseNode {
|
32 | 37 |
|
33 |
| - public abstract void execute(ValueWrapper object); |
| 38 | + public abstract void execute(Node node, ValueWrapper object); |
34 | 39 |
|
35 | 40 | @Specialization(guards = "!stack.hasKeptObjects()")
|
36 |
| - void keepFirstObject(ValueWrapper object, |
37 |
| - @Bind("getStack(object)") ExtensionCallStack stack) { |
| 41 | + static void keepFirstObject(Node node, ValueWrapper object, |
| 42 | + @Bind("getStack(node)") ExtensionCallStack stack) { |
38 | 43 | stack.current.preservedObject = object;
|
39 | 44 | }
|
40 | 45 |
|
41 | 46 | @Specialization(guards = "stack.hasSingleKeptObject()")
|
42 |
| - void keepCreatingList(ValueWrapper object, |
43 |
| - @Bind("getStack(object)") ExtensionCallStack stack, |
| 47 | + static void keepCreatingList(Node node, ValueWrapper object, |
| 48 | + @Bind("getStack(node)") ExtensionCallStack stack, |
44 | 49 | @Cached InlinedConditionProfile sameObjectProfile) {
|
45 |
| - if (sameObjectProfile.profile(this, object != stack.current.preservedObject)) { |
| 50 | + if (sameObjectProfile.profile(node, object != stack.current.preservedObject)) { |
46 | 51 | createKeptList(object, stack);
|
47 | 52 | }
|
48 | 53 | }
|
49 | 54 |
|
50 | 55 | @Specialization(guards = { "stack.hasKeptObjects()", "!stack.hasSingleKeptObject()" })
|
51 | 56 | @TruffleBoundary
|
52 |
| - void keepAddingToList(ValueWrapper object, |
53 |
| - @Bind("getStack(object)") ExtensionCallStack stack) { |
| 57 | + static void keepAddingToList(Node node, ValueWrapper object, |
| 58 | + @Bind("getStack(node)") ExtensionCallStack stack) { |
54 | 59 | stack.current.preservedObjects.add(object);
|
55 | 60 | }
|
56 | 61 |
|
57 | 62 | @TruffleBoundary
|
58 |
| - private void createKeptList(ValueWrapper object, ExtensionCallStack stack) { |
| 63 | + private static void createKeptList(ValueWrapper object, ExtensionCallStack stack) { |
59 | 64 | stack.current.preservedObjects = new ArrayList<>();
|
60 | 65 | stack.current.preservedObjects.add(stack.current.preservedObject);
|
61 | 66 | stack.current.preservedObjects.add(object);
|
62 | 67 | }
|
63 | 68 |
|
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; |
| 69 | + protected static ExtensionCallStack getStack(Node node) { |
| 70 | + return getLanguage(node).getCurrentThread().getCurrentFiber().extensionCallStack; |
67 | 71 | }
|
68 | 72 | }
|
69 | 73 |
|
|
0 commit comments