65
65
public abstract class CallTargetInvokeNode extends DirectInvokeNode {
66
66
@ Child private DirectCallNode callNode ;
67
67
@ Child private CallContext callContext ;
68
- // Needed only for generator functions, will be null for builtins and other callables that
69
- // cannot be generator functions
70
- private final PFunction callee ;
71
68
protected final boolean isBuiltin ;
72
69
73
- protected CallTargetInvokeNode (CallTarget callTarget , PFunction callee , boolean isBuiltin , boolean isGenerator ) {
70
+ protected CallTargetInvokeNode (CallTarget callTarget , boolean isBuiltin , boolean isGenerator ) {
74
71
this .callNode = Truffle .getRuntime ().createDirectCallNode (callTarget );
75
72
if (isBuiltin ) {
76
73
callNode .cloneCallTarget ();
77
74
}
78
75
if (isGenerator && shouldInlineGenerators ()) {
79
76
this .callNode .forceInlining ();
80
77
}
81
- this .callee = callee ;
82
78
this .callContext = CallContext .create ();
83
79
this .isBuiltin = isBuiltin ;
84
80
}
@@ -87,28 +83,28 @@ protected CallTargetInvokeNode(CallTarget callTarget, PFunction callee, boolean
87
83
public static CallTargetInvokeNode create (PFunction callee ) {
88
84
RootCallTarget callTarget = getCallTarget (callee );
89
85
boolean builtin = isBuiltin (callee );
90
- return CallTargetInvokeNodeGen .create (callTarget , callee , builtin , callee .isGeneratorFunction ());
86
+ return CallTargetInvokeNodeGen .create (callTarget , builtin , callee .isGeneratorFunction ());
91
87
}
92
88
93
89
@ TruffleBoundary
94
90
public static CallTargetInvokeNode create (PBuiltinFunction callee ) {
95
91
RootCallTarget callTarget = getCallTarget (callee );
96
92
boolean builtin = isBuiltin (callee );
97
- return CallTargetInvokeNodeGen .create (callTarget , null , builtin , false );
93
+ return CallTargetInvokeNodeGen .create (callTarget , builtin , false );
98
94
}
99
95
100
- public static CallTargetInvokeNode create (CallTarget callTarget , PFunction callee , boolean isBuiltin , boolean isGenerator ) {
101
- return CallTargetInvokeNodeGen .create (callTarget , callee , isBuiltin , isGenerator );
96
+ public static CallTargetInvokeNode create (CallTarget callTarget , boolean isBuiltin , boolean isGenerator ) {
97
+ return CallTargetInvokeNodeGen .create (callTarget , isBuiltin , isGenerator );
102
98
}
103
99
104
- public final Object execute ( VirtualFrame frame , Object [] arguments ) {
105
- return execute ( frame , null , null , arguments );
106
- }
107
-
108
- public abstract Object execute (VirtualFrame frame , PythonObject globals , PCell [] closure , Object [] arguments );
100
+ /**
101
+ * @param callee A PFunction if the callee is one, otherwise null. Used for generator functions
102
+ * only.
103
+ */
104
+ public abstract Object execute (VirtualFrame frame , PFunction callee , PythonObject globals , PCell [] closure , Object [] arguments );
109
105
110
106
@ Specialization (guards = {"globals == null" , "closure == null" })
111
- protected Object doNoClosure (VirtualFrame frame , @ SuppressWarnings ("unused" ) PythonObject globals , @ SuppressWarnings ("unused" ) PCell [] closure , Object [] arguments ,
107
+ protected Object doNoClosure (VirtualFrame frame , PFunction callee , @ SuppressWarnings ("unused" ) PythonObject globals , @ SuppressWarnings ("unused" ) PCell [] closure , Object [] arguments ,
112
108
@ Cached ("createBinaryProfile()" ) ConditionProfile classBodyProfile ,
113
109
@ Cached ("createBinaryProfile()" ) ConditionProfile generatorFunctionProfile ,
114
110
@ CachedContext (PythonLanguage .class ) PythonContext context ) {
@@ -134,13 +130,13 @@ protected Object doNoClosure(VirtualFrame frame, @SuppressWarnings("unused") Pyt
134
130
}
135
131
136
132
@ Specialization (replaces = "doNoClosure" )
137
- protected Object doGeneric (VirtualFrame frame , PythonObject globals , PCell [] closure , Object [] arguments ,
133
+ protected Object doGeneric (VirtualFrame frame , PFunction callee , PythonObject globals , PCell [] closure , Object [] arguments ,
138
134
@ Cached ("createBinaryProfile()" ) ConditionProfile classBodyProfile ,
139
135
@ Cached ("createBinaryProfile()" ) ConditionProfile generatorFunctionProfile ,
140
136
@ CachedContext (PythonLanguage .class ) PythonContext context ) {
141
137
PArguments .setGlobals (arguments , globals );
142
138
PArguments .setClosure (arguments , closure );
143
- return doNoClosure (frame , null , null , arguments , classBodyProfile , generatorFunctionProfile , context );
139
+ return doNoClosure (frame , callee , null , null , arguments , classBodyProfile , generatorFunctionProfile , context );
144
140
}
145
141
146
142
public final CallTarget getCallTarget () {
0 commit comments