Skip to content

Commit 00f3601

Browse files
committed
refactor InvokeNodes to use leaf nodes for invocation and "InvokeNode" as the public abstract class
1 parent 001f12b commit 00f3601

File tree

6 files changed

+159
-110
lines changed

6 files changed

+159
-110
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/PythonCextBuiltins.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@
161161
import com.oracle.graal.python.nodes.attributes.WriteAttributeToDynamicObjectNode;
162162
import com.oracle.graal.python.nodes.attributes.WriteAttributeToObjectNode;
163163
import com.oracle.graal.python.nodes.call.CallNode;
164-
import com.oracle.graal.python.nodes.call.InvokeNode;
164+
import com.oracle.graal.python.nodes.call.FunctionInvokeNode;
165165
import com.oracle.graal.python.nodes.call.PythonCallNode;
166166
import com.oracle.graal.python.nodes.call.special.LookupAndCallBinaryNode;
167167
import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode;
@@ -1612,7 +1612,7 @@ Object call(Object self, PBuiltinFunction function) {
16121612
}
16131613

16141614
abstract static class MethodDescriptorRoot extends PRootNode {
1615-
@Child protected InvokeNode invokeNode;
1615+
@Child protected FunctionInvokeNode invokeNode;
16161616
@Child protected ReadIndexedArgumentNode readSelfNode;
16171617
@Child private CalleeContext calleeContext = CalleeContext.create();
16181618

@@ -1625,7 +1625,7 @@ protected MethodDescriptorRoot(PythonLanguage language, PythonObjectFactory fact
16251625
this.factory = factory;
16261626
this.readSelfNode = ReadIndexedArgumentNode.create(0);
16271627
assert builtinFunction.getCallTarget().getRootNode() instanceof ExternalFunctionNode;
1628-
this.invokeNode = InvokeNode.create(builtinFunction);
1628+
this.invokeNode = FunctionInvokeNode.create(builtinFunction);
16291629
}
16301630

16311631
@Override

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/CExtNodes.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@
9595
import com.oracle.graal.python.nodes.argument.ReadVarArgsNode;
9696
import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode;
9797
import com.oracle.graal.python.nodes.call.CallNode;
98-
import com.oracle.graal.python.nodes.call.InvokeNode;
98+
import com.oracle.graal.python.nodes.call.FunctionInvokeNode;
9999
import com.oracle.graal.python.nodes.call.special.CallBinaryMethodNode;
100100
import com.oracle.graal.python.nodes.call.special.CallTernaryMethodNode;
101101
import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode;
@@ -1841,7 +1841,7 @@ public List<Class<? extends Node>> getExecutionSignature() {
18411841
@Builtin(minNumOfPositionalArgs = 1)
18421842
public abstract static class MayRaiseUnaryNode extends PythonUnaryBuiltinNode {
18431843
@Child private CreateArgumentsNode createArgsNode;
1844-
@Child private InvokeNode invokeNode;
1844+
@Child private FunctionInvokeNode invokeNode;
18451845
@Child private TransformExceptionToNativeNode transformExceptionToNativeNode;
18461846
@CompilationFinal private ConditionProfile frameProfile;
18471847

@@ -1851,7 +1851,7 @@ public abstract static class MayRaiseUnaryNode extends PythonUnaryBuiltinNode {
18511851
public MayRaiseUnaryNode(PFunction func, Object errorResult) {
18521852
this.createArgsNode = CreateArgumentsNode.create();
18531853
this.func = func;
1854-
this.invokeNode = InvokeNode.create(func);
1854+
this.invokeNode = FunctionInvokeNode.create(func);
18551855
this.errorResult = errorResult;
18561856
}
18571857

@@ -1880,7 +1880,7 @@ private TransformExceptionToNativeNode ensureTransformExceptionToNativeNode() {
18801880
@Builtin(minNumOfPositionalArgs = 2)
18811881
public abstract static class MayRaiseBinaryNode extends PythonBinaryBuiltinNode {
18821882
@Child private CreateArgumentsNode createArgsNode;
1883-
@Child private InvokeNode invokeNode;
1883+
@Child private FunctionInvokeNode invokeNode;
18841884
@Child private TransformExceptionToNativeNode transformExceptionToNativeNode;
18851885
@CompilationFinal private ConditionProfile frameProfile;
18861886

@@ -1890,7 +1890,7 @@ public abstract static class MayRaiseBinaryNode extends PythonBinaryBuiltinNode
18901890
public MayRaiseBinaryNode(PFunction func, Object errorResult) {
18911891
this.createArgsNode = CreateArgumentsNode.create();
18921892
this.func = func;
1893-
this.invokeNode = InvokeNode.create(func);
1893+
this.invokeNode = FunctionInvokeNode.create(func);
18941894
this.errorResult = errorResult;
18951895
}
18961896

@@ -1919,7 +1919,7 @@ private TransformExceptionToNativeNode ensureTransformExceptionToNativeNode() {
19191919
@Builtin(minNumOfPositionalArgs = 3)
19201920
public abstract static class MayRaiseTernaryNode extends PythonTernaryBuiltinNode {
19211921
@Child private CreateArgumentsNode createArgsNode;
1922-
@Child private InvokeNode invokeNode;
1922+
@Child private FunctionInvokeNode invokeNode;
19231923
@Child private TransformExceptionToNativeNode transformExceptionToNativeNode;
19241924
@CompilationFinal private ConditionProfile frameProfile;
19251925

@@ -1929,7 +1929,7 @@ public abstract static class MayRaiseTernaryNode extends PythonTernaryBuiltinNod
19291929
public MayRaiseTernaryNode(PFunction func, Object errorResult) {
19301930
this.createArgsNode = CreateArgumentsNode.create();
19311931
this.func = func;
1932-
this.invokeNode = InvokeNode.create(func);
1932+
this.invokeNode = FunctionInvokeNode.create(func);
19331933
this.errorResult = errorResult;
19341934
}
19351935

@@ -1957,7 +1957,7 @@ private TransformExceptionToNativeNode ensureTransformExceptionToNativeNode() {
19571957
// -----------------------------------------------------------------------------------------------------------------
19581958
@Builtin(takesVarArgs = true)
19591959
public static class MayRaiseNode extends PythonBuiltinNode {
1960-
@Child private InvokeNode invokeNode;
1960+
@Child private FunctionInvokeNode invokeNode;
19611961
@Child private ReadVarArgsNode readVarargsNode;
19621962
@Child private CreateArgumentsNode createArgsNode;
19631963
@Child private TransformExceptionToNativeNode transformExceptionToNativeNode;
@@ -1970,7 +1970,7 @@ public MayRaiseNode(PFunction callable, Object errorResult) {
19701970
this.readVarargsNode = ReadVarArgsNode.create(0, true);
19711971
this.createArgsNode = CreateArgumentsNode.create();
19721972
this.func = callable;
1973-
this.invokeNode = InvokeNode.create(callable);
1973+
this.invokeNode = FunctionInvokeNode.create(callable);
19741974
this.errorResult = errorResult;
19751975
}
19761976

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/CallDispatchNode.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,12 @@
4747
@GenerateUncached
4848
public abstract class CallDispatchNode extends Node {
4949

50-
protected static InvokeNode createInvokeNode(PFunction callee) {
51-
return InvokeNode.create(callee);
50+
protected static FunctionInvokeNode createInvokeNode(PFunction callee) {
51+
return FunctionInvokeNode.create(callee);
5252
}
5353

54-
protected static InvokeNode createInvokeNode(PBuiltinFunction callee) {
55-
return InvokeNode.create(callee);
54+
protected static FunctionInvokeNode createInvokeNode(PBuiltinFunction callee) {
55+
return FunctionInvokeNode.create(callee);
5656
}
5757

5858
protected static CallTargetInvokeNode createCtInvokeNode(PFunction callee) {
@@ -91,7 +91,7 @@ public final Object executeCall(VirtualFrame frame, PBuiltinFunction callee, Obj
9191
@Specialization(guards = {"callee == cachedCallee"}, limit = "getCallSiteInlineCacheMaxDepth()", assumptions = {"singleContextAssumption()", "cachedCallee.getCodeStableAssumption()"})
9292
protected Object callFunctionCached(VirtualFrame frame, @SuppressWarnings("unused") PFunction callee, Object[] arguments,
9393
@SuppressWarnings("unused") @Cached("callee") PFunction cachedCallee,
94-
@Cached("createInvokeNode(cachedCallee)") InvokeNode invoke) {
94+
@Cached("createInvokeNode(cachedCallee)") FunctionInvokeNode invoke) {
9595
return invoke.execute(frame, arguments);
9696
}
9797

@@ -106,7 +106,7 @@ protected Object callFunctionCachedCode(VirtualFrame frame, @SuppressWarnings("u
106106
@SuppressWarnings("unused") @Cached("callee") PFunction cachedCallee,
107107
@SuppressWarnings("unused") @Cached("create()") GetFunctionCodeNode getFunctionCodeNode,
108108
@SuppressWarnings("unused") @Cached("getCode(getFunctionCodeNode, callee)") PCode cachedCode,
109-
@Cached("createInvokeNode(cachedCallee)") InvokeNode invoke) {
109+
@Cached("createInvokeNode(cachedCallee)") FunctionInvokeNode invoke) {
110110
return invoke.execute(frame, arguments);
111111
}
112112

@@ -121,7 +121,7 @@ protected Object callFunctionCachedCt(VirtualFrame frame, PFunction callee, Obje
121121
@Specialization(guards = {"callee == cachedCallee"}, limit = "getCallSiteInlineCacheMaxDepth()", assumptions = "singleContextAssumption()")
122122
protected Object callBuiltinFunctionCached(VirtualFrame frame, @SuppressWarnings("unused") PBuiltinFunction callee, Object[] arguments,
123123
@SuppressWarnings("unused") @Cached("callee") PBuiltinFunction cachedCallee,
124-
@Cached("createInvokeNode(cachedCallee)") InvokeNode invoke) {
124+
@Cached("createInvokeNode(cachedCallee)") FunctionInvokeNode invoke) {
125125
return invoke.execute(frame, arguments);
126126
}
127127

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
/*
2+
* Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* The Universal Permissive License (UPL), Version 1.0
6+
*
7+
* Subject to the condition set forth below, permission is hereby granted to any
8+
* person obtaining a copy of this software, associated documentation and/or
9+
* data (collectively the "Software"), free of charge and under any and all
10+
* copyright rights in the Software, and any and all patent rights owned or
11+
* freely licensable by each licensor hereunder covering either (i) the
12+
* unmodified Software as contributed to or provided by such licensor, or (ii)
13+
* the Larger Works (as defined below), to deal in both
14+
*
15+
* (a) the Software, and
16+
*
17+
* (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
18+
* one is included with the Software each a "Larger Work" to which the Software
19+
* is contributed by such licensors),
20+
*
21+
* without restriction, including without limitation the rights to copy, create
22+
* derivative works of, display, perform, and distribute the Software and make,
23+
* use, sell, offer for sale, import, export, have made, and have sold the
24+
* Software and the Larger Work(s), and to sublicense the foregoing rights on
25+
* either these or other terms.
26+
*
27+
* This license is subject to the following condition:
28+
*
29+
* The above copyright notice and either this complete permission notice or at a
30+
* minimum a reference to the UPL must be included in all copies or substantial
31+
* portions of the Software.
32+
*
33+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
34+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
35+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
36+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
37+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
38+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
39+
* SOFTWARE.
40+
*/
41+
package com.oracle.graal.python.nodes.call;
42+
43+
import com.oracle.graal.python.PythonLanguage;
44+
import com.oracle.graal.python.builtins.objects.cell.PCell;
45+
import com.oracle.graal.python.builtins.objects.frame.PFrame;
46+
import com.oracle.graal.python.builtins.objects.function.PArguments;
47+
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
48+
import com.oracle.graal.python.builtins.objects.function.PFunction;
49+
import com.oracle.graal.python.builtins.objects.object.PythonObject;
50+
import com.oracle.graal.python.runtime.ExecutionContext.CallContext;
51+
import com.oracle.graal.python.runtime.ExecutionContext.IndirectCalleeContext;
52+
import com.oracle.graal.python.runtime.PythonContext;
53+
import com.oracle.graal.python.runtime.PythonOptions;
54+
import com.oracle.truffle.api.CallTarget;
55+
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
56+
import com.oracle.truffle.api.RootCallTarget;
57+
import com.oracle.truffle.api.Truffle;
58+
import com.oracle.truffle.api.dsl.Cached;
59+
import com.oracle.truffle.api.dsl.CachedContext;
60+
import com.oracle.truffle.api.dsl.Specialization;
61+
import com.oracle.truffle.api.frame.VirtualFrame;
62+
import com.oracle.truffle.api.nodes.DirectCallNode;
63+
import com.oracle.truffle.api.nodes.RootNode;
64+
import com.oracle.truffle.api.profiles.ConditionProfile;
65+
66+
public abstract class FunctionInvokeNode extends DirectInvokeNode {
67+
@Child private DirectCallNode callNode;
68+
@Child private CallContext callContext;
69+
70+
private final PythonObject globals;
71+
private final PCell[] closure;
72+
protected final boolean isBuiltin;
73+
74+
protected FunctionInvokeNode(CallTarget callTarget, PythonObject globals, PCell[] closure, boolean isBuiltin, boolean isGenerator) {
75+
this.callNode = Truffle.getRuntime().createDirectCallNode(callTarget);
76+
if (isBuiltin && PythonOptions.getEnableForcedSplits()) {
77+
callNode.cloneCallTarget();
78+
}
79+
if (isGenerator && shouldInlineGenerators()) {
80+
this.callNode.forceInlining();
81+
}
82+
this.globals = globals;
83+
this.closure = closure;
84+
this.isBuiltin = isBuiltin;
85+
this.callContext = CallContext.create();
86+
}
87+
88+
public abstract Object execute(VirtualFrame frame, Object[] arguments);
89+
90+
@Specialization
91+
protected Object doDirect(VirtualFrame frame, Object[] arguments,
92+
@CachedContext(PythonLanguage.class) PythonContext context,
93+
@Cached("createBinaryProfile()") ConditionProfile isClassBodyProfile) {
94+
PArguments.setGlobals(arguments, globals);
95+
PArguments.setClosure(arguments, closure);
96+
RootCallTarget ct = (RootCallTarget) callNode.getCurrentCallTarget();
97+
optionallySetClassBodySpecial(arguments, ct, isClassBodyProfile);
98+
if (profileIsNullFrame(frame == null)) {
99+
PFrame.Reference frameInfo = IndirectCalleeContext.enter(context, arguments, ct);
100+
try {
101+
return callNode.call(arguments);
102+
} finally {
103+
IndirectCalleeContext.exit(context, frameInfo);
104+
}
105+
} else {
106+
callContext.prepareCall(frame, arguments, ct, this);
107+
return callNode.call(arguments);
108+
}
109+
}
110+
111+
public final RootNode getCurrentRootNode() {
112+
return callNode.getCurrentRootNode();
113+
}
114+
115+
@TruffleBoundary
116+
public static FunctionInvokeNode create(PFunction callee) {
117+
RootCallTarget callTarget = getCallTarget(callee);
118+
boolean builtin = isBuiltin(callee);
119+
return FunctionInvokeNodeGen.create(callTarget, callee.getGlobals(), callee.getClosure(), builtin, callee.isGeneratorFunction());
120+
}
121+
122+
@TruffleBoundary
123+
public static FunctionInvokeNode create(PBuiltinFunction callee) {
124+
RootCallTarget callTarget = getCallTarget(callee);
125+
boolean builtin = isBuiltin(callee);
126+
return FunctionInvokeNodeGen.create(callTarget, null, null, builtin, false);
127+
}
128+
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/GenericInvokeNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060
import com.oracle.truffle.api.profiles.ConditionProfile;
6161

6262
@GenerateUncached
63-
public abstract class GenericInvokeNode extends AbstractInvokeNode {
63+
public abstract class GenericInvokeNode extends InvokeNode {
6464
public static GenericInvokeNode create() {
6565
return GenericInvokeNodeGen.create();
6666
}

0 commit comments

Comments
 (0)