|
1 | 1 | package trufflesom.primitives.reflection;
|
2 | 2 |
|
| 3 | +import com.oracle.truffle.api.CallTarget; |
| 4 | +import com.oracle.truffle.api.Truffle; |
| 5 | +import com.oracle.truffle.api.dsl.Cached; |
3 | 6 | import com.oracle.truffle.api.dsl.GenerateNodeFactory;
|
4 | 7 | import com.oracle.truffle.api.dsl.NodeChild;
|
5 | 8 | import com.oracle.truffle.api.dsl.Specialization;
|
6 | 9 | import com.oracle.truffle.api.frame.VirtualFrame;
|
| 10 | +import com.oracle.truffle.api.nodes.DirectCallNode; |
| 11 | +import com.oracle.truffle.api.nodes.IndirectCallNode; |
7 | 12 |
|
8 | 13 | import bd.primitives.Primitive;
|
9 | 14 | import trufflesom.interpreter.nodes.ExpressionNode;
|
10 |
| -import trufflesom.interpreter.nodes.dispatch.InvokeOnCache; |
| 15 | +import trufflesom.interpreter.nodes.dispatch.AbstractDispatchNode; |
11 | 16 | import trufflesom.interpreter.nodes.nary.EagerlySpecializableNode;
|
12 | 17 | import trufflesom.interpreter.nodes.nary.UnaryExpressionNode;
|
13 | 18 | import trufflesom.primitives.arrays.ToArgumentsArrayNode;
|
@@ -51,22 +56,40 @@ public final SAbstractObject doSMethod(final SInvokable receiver) {
|
51 | 56 | executeWith = {"somArr", "target"})
|
52 | 57 | @Primitive(selector = "invokeOn:with:", extraChild = ToArgumentsArrayNodeFactory.class)
|
53 | 58 | public abstract static class InvokeOnPrim extends EagerlySpecializableNode {
|
54 |
| - @Child private InvokeOnCache callNode = InvokeOnCache.create(); |
55 | 59 |
|
56 | 60 | public abstract Object executeEvaluated(VirtualFrame frame, SInvokable receiver,
|
57 | 61 | Object target, SArray somArr);
|
58 | 62 |
|
| 63 | + public static DirectCallNode create(final CallTarget ct) { |
| 64 | + return Truffle.getRuntime().createDirectCallNode(ct); |
| 65 | + } |
| 66 | + |
| 67 | + public static IndirectCallNode createIndirect() { |
| 68 | + return Truffle.getRuntime().createIndirectCallNode(); |
| 69 | + } |
| 70 | + |
59 | 71 | @Override
|
60 | 72 | public final Object doPreEvaluated(final VirtualFrame frame,
|
61 | 73 | final Object[] args) {
|
62 | 74 | return executeEvaluated(frame, (SInvokable) args[0], args[1], (SArray) args[2]);
|
63 | 75 | }
|
64 | 76 |
|
65 |
| - @Specialization |
66 |
| - public final Object doInvoke(final VirtualFrame frame, |
| 77 | + @Specialization(guards = "receiver == cachedReceiver", |
| 78 | + limit = "" + AbstractDispatchNode.INLINE_CACHE_SIZE) |
| 79 | + public final Object doCached( |
| 80 | + final SInvokable receiver, final Object target, final SArray somArr, |
| 81 | + final Object[] argArr, |
| 82 | + @Cached("receiver") final SInvokable cachedReceiver, |
| 83 | + @Cached("create(receiver.getCallTarget())") final DirectCallNode callNode) { |
| 84 | + return callNode.call(argArr); |
| 85 | + } |
| 86 | + |
| 87 | + @Specialization(replaces = "doCached") |
| 88 | + public final Object doUncached( |
67 | 89 | final SInvokable receiver, final Object target, final SArray somArr,
|
68 |
| - final Object[] argArr) { |
69 |
| - return callNode.executeDispatch(frame, receiver, argArr); |
| 90 | + final Object[] argArr, |
| 91 | + @Cached("createIndirect()") final IndirectCallNode callNode) { |
| 92 | + return callNode.call(receiver.getCallTarget(), argArr); |
70 | 93 | }
|
71 | 94 | }
|
72 | 95 | }
|
0 commit comments