Skip to content

Commit 657bbab

Browse files
committed
Re-add specializations in 'Call*MethodNode' for methods.
1 parent 03bdeab commit 657bbab

File tree

4 files changed

+154
-8
lines changed

4 files changed

+154
-8
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/CallBinaryMethodNode.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,10 @@
4242

4343
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
4444
import com.oracle.graal.python.builtins.objects.function.PKeyword;
45+
import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod;
4546
import com.oracle.graal.python.nodes.call.CallNode;
4647
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
48+
import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
4749
import com.oracle.truffle.api.RootCallTarget;
4850
import com.oracle.truffle.api.dsl.Cached;
4951
import com.oracle.truffle.api.dsl.Specialization;
@@ -191,6 +193,36 @@ Object callObject(@SuppressWarnings("unused") PBuiltinFunction func, Object arg1
191193
return builtinNode.execute(arg1, arg2);
192194
}
193195

196+
@Specialization(guards = {"func == cachedFunc", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", assumptions = "singleContextAssumption()")
197+
Object callMethodSingleContext(@SuppressWarnings("unused") PBuiltinMethod func, Object arg1, Object arg2,
198+
@SuppressWarnings("unused") @Cached("func") PBuiltinMethod cachedFunc,
199+
@Cached("getBinary(func.getFunction())") PythonBinaryBuiltinNode builtinNode) {
200+
return builtinNode.execute(arg1, arg2);
201+
}
202+
203+
@Specialization(guards = {"func == cachedFunc", "builtinNode != null", "isFixed"}, limit = "getCallSiteInlineCacheMaxDepth()", assumptions = "singleContextAssumption()")
204+
Object callSelfMethodSingleContext(@SuppressWarnings("unused") PBuiltinMethod func, Object arg1, Object arg2,
205+
@SuppressWarnings("unused") @Cached("func") PBuiltinMethod cachedFunc,
206+
@SuppressWarnings("unused") @Cached("takesFixedNumOfPositionalArgs(func)") boolean isFixed,
207+
@Cached("getTernary(func.getFunction())") PythonTernaryBuiltinNode builtinNode) {
208+
return builtinNode.execute(func.getSelf(), arg1, arg2);
209+
}
210+
211+
@Specialization(guards = {"builtinNode != null", "getCallTarget(func) == ct"}, limit = "getCallSiteInlineCacheMaxDepth()")
212+
Object callMethod(@SuppressWarnings("unused") PBuiltinMethod func, Object arg1, Object arg2,
213+
@SuppressWarnings("unused") @Cached("getCallTarget(func)") RootCallTarget ct,
214+
@Cached("getBinary(func.getFunction())") PythonBinaryBuiltinNode builtinNode) {
215+
return builtinNode.execute(arg1, arg2);
216+
}
217+
218+
@Specialization(guards = {"builtinNode != null", "getCallTarget(func) == ct", "isFixed"}, limit = "getCallSiteInlineCacheMaxDepth()")
219+
Object callSelfMethod(@SuppressWarnings("unused") PBuiltinMethod func, Object arg1, Object arg2,
220+
@SuppressWarnings("unused") @Cached("getCallTarget(func)") RootCallTarget ct,
221+
@SuppressWarnings("unused") @Cached("takesFixedNumOfPositionalArgs(func)") boolean isFixed,
222+
@Cached("getTernary(func.getFunction())") PythonTernaryBuiltinNode builtinNode) {
223+
return builtinNode.execute(func.getSelf(), arg1, arg2);
224+
}
225+
194226
@Specialization
195227
Object call(Object func, Object arg1, Object arg2,
196228
@Cached("create()") CallNode callNode) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/CallSpecialMethodNode.java

Lines changed: 61 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,11 @@
4141
package com.oracle.graal.python.nodes.call.special;
4242

4343
import com.oracle.graal.python.PythonLanguage;
44+
import com.oracle.graal.python.builtins.objects.function.Arity;
4445
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
46+
import com.oracle.graal.python.builtins.objects.function.PFunction;
47+
import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod;
48+
import com.oracle.graal.python.builtins.objects.method.PMethod;
4549
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
4650
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
4751
import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
@@ -50,6 +54,7 @@
5054
import com.oracle.graal.python.nodes.truffle.PythonTypes;
5155
import com.oracle.graal.python.runtime.PythonOptions;
5256
import com.oracle.truffle.api.Assumption;
57+
import com.oracle.truffle.api.RootCallTarget;
5358
import com.oracle.truffle.api.dsl.ImportStatic;
5459
import com.oracle.truffle.api.dsl.NodeFactory;
5560
import com.oracle.truffle.api.dsl.ReportPolymorphism;
@@ -81,19 +86,67 @@ protected Assumption singleContextAssumption() {
8186
return language.singleContextAssumption;
8287
}
8388

84-
protected static PythonUnaryBuiltinNode getUnary(PBuiltinFunction func) {
85-
return getBuiltin(func, PythonUnaryBuiltinNode.class);
89+
protected static PythonUnaryBuiltinNode getUnary(Object func) {
90+
if (func instanceof PBuiltinFunction) {
91+
return getBuiltin((PBuiltinFunction) func, PythonUnaryBuiltinNode.class);
92+
}
93+
return null;
94+
}
95+
96+
protected static PythonBinaryBuiltinNode getBinary(Object func) {
97+
if (func instanceof PBuiltinFunction) {
98+
return getBuiltin((PBuiltinFunction) func, PythonBinaryBuiltinNode.class);
99+
}
100+
return null;
101+
}
102+
103+
protected static PythonTernaryBuiltinNode getTernary(Object func) {
104+
if (func instanceof PBuiltinFunction) {
105+
return getBuiltin((PBuiltinFunction) func, PythonTernaryBuiltinNode.class);
106+
}
107+
return null;
108+
}
109+
110+
protected static PythonVarargsBuiltinNode getVarargs(Object func) {
111+
if (func instanceof PBuiltinFunction) {
112+
return getBuiltin((PBuiltinFunction) func, PythonVarargsBuiltinNode.class);
113+
}
114+
return null;
86115
}
87116

88-
protected static PythonBinaryBuiltinNode getBinary(PBuiltinFunction func) {
89-
return getBuiltin(func, PythonBinaryBuiltinNode.class);
117+
protected static boolean takesFixedNumOfPositionalArgs(PMethod func) {
118+
Arity arity = getArity(func.getFunction());
119+
return arity != null && arity.takesFixedNumOfPositionalArgs();
90120
}
91121

92-
protected static PythonTernaryBuiltinNode getTernary(PBuiltinFunction func) {
93-
return getBuiltin(func, PythonTernaryBuiltinNode.class);
122+
protected static boolean takesFixedNumOfPositionalArgs(PBuiltinMethod func) {
123+
Arity arity = getArity(func.getFunction());
124+
return arity != null && arity.takesFixedNumOfPositionalArgs();
94125
}
95126

96-
protected static PythonVarargsBuiltinNode getVarargs(PBuiltinFunction func) {
97-
return getBuiltin(func, PythonVarargsBuiltinNode.class);
127+
private static Arity getArity(Object func) {
128+
if (func instanceof PFunction) {
129+
return ((PFunction) func).getArity();
130+
} else if (func instanceof PBuiltinFunction) {
131+
return ((PBuiltinFunction) func).getArity();
132+
}
133+
return null;
134+
}
135+
136+
protected static RootCallTarget getCallTarget(PMethod meth) {
137+
return getCallTargetOfFunction(meth.getFunction());
138+
}
139+
140+
protected static RootCallTarget getCallTarget(PBuiltinMethod meth) {
141+
return getCallTargetOfFunction(meth.getFunction());
142+
}
143+
144+
private static RootCallTarget getCallTargetOfFunction(Object func) {
145+
if (func instanceof PFunction) {
146+
return ((PFunction) func).getCallTarget();
147+
} else if (func instanceof PBuiltinFunction) {
148+
return ((PBuiltinFunction) func).getCallTarget();
149+
}
150+
return null;
98151
}
99152
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/CallTernaryMethodNode.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242

4343
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
4444
import com.oracle.graal.python.builtins.objects.function.PKeyword;
45+
import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod;
4546
import com.oracle.graal.python.nodes.call.CallNode;
4647
import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
4748
import com.oracle.truffle.api.RootCallTarget;
@@ -85,6 +86,34 @@ Object call(@SuppressWarnings("unused") PBuiltinFunction func, Object arg1, Obje
8586
return builtinNode.execute(arg1, arg2, arg3);
8687
}
8788

89+
@Specialization(guards = {"func == cachedFunc", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()")
90+
Object call(@SuppressWarnings("unused") PBuiltinMethod func, Object arg1, int arg2, Object arg3,
91+
@SuppressWarnings("unused") @Cached("func") PBuiltinMethod cachedFunc,
92+
@Cached("getTernary(func.getFunction())") PythonTernaryBuiltinNode builtinNode) {
93+
return builtinNode.execute(arg1, arg2, arg3);
94+
}
95+
96+
@Specialization(guards = {"func == cachedFunc", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()")
97+
Object call(@SuppressWarnings("unused") PBuiltinMethod func, Object arg1, Object arg2, Object arg3,
98+
@SuppressWarnings("unused") @Cached("func") PBuiltinMethod cachedFunc,
99+
@Cached("getTernary(func.getFunction())") PythonTernaryBuiltinNode builtinNode) {
100+
return builtinNode.execute(arg1, arg2, arg3);
101+
}
102+
103+
@Specialization(guards = {"builtinNode != null", "getCallTarget(func) == ct"}, limit = "getCallSiteInlineCacheMaxDepth()", assumptions = "singleContextAssumption()")
104+
Object call(@SuppressWarnings("unused") PBuiltinMethod func, Object arg1, int arg2, Object arg3,
105+
@SuppressWarnings("unused") @Cached("getCallTarget(func)") RootCallTarget ct,
106+
@Cached("getTernary(func.getFunction())") PythonTernaryBuiltinNode builtinNode) {
107+
return builtinNode.execute(arg1, arg2, arg3);
108+
}
109+
110+
@Specialization(guards = {"builtinNode != null", "getCallTarget(func) == ct"}, limit = "getCallSiteInlineCacheMaxDepth()", assumptions = "singleContextAssumption()")
111+
Object call(@SuppressWarnings("unused") PBuiltinMethod func, Object arg1, Object arg2, Object arg3,
112+
@SuppressWarnings("unused") @Cached("getCallTarget(func)") RootCallTarget ct,
113+
@Cached("getTernary(func.getFunction())") PythonTernaryBuiltinNode builtinNode) {
114+
return builtinNode.execute(arg1, arg2, arg3);
115+
}
116+
88117
@Specialization
89118
Object call(Object func, Object arg1, Object arg2, Object arg3,
90119
@Cached("create()") CallNode callNode) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/CallUnaryMethodNode.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@
4242

4343
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
4444
import com.oracle.graal.python.builtins.objects.function.PKeyword;
45+
import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod;
4546
import com.oracle.graal.python.nodes.call.CallNode;
47+
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
4648
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
4749
import com.oracle.truffle.api.RootCallTarget;
4850
import com.oracle.truffle.api.dsl.Cached;
@@ -152,6 +154,36 @@ Object call(@SuppressWarnings("unused") PBuiltinFunction func, Object receiver,
152154
return builtinNode.execute(receiver);
153155
}
154156

157+
@Specialization(guards = {"func == cachedFunc", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", assumptions = "singleContextAssumption()")
158+
Object callMethodSingleContext(@SuppressWarnings("unused") PBuiltinMethod func, Object receiver,
159+
@SuppressWarnings("unused") @Cached("func") PBuiltinMethod cachedFunc,
160+
@Cached("getUnary(func.getFunction())") PythonUnaryBuiltinNode builtinNode) {
161+
return builtinNode.execute(receiver);
162+
}
163+
164+
@Specialization(guards = {"func == cachedFunc", "builtinNode != null", "isFixed"}, limit = "getCallSiteInlineCacheMaxDepth()", assumptions = "singleContextAssumption()")
165+
Object callSelfMethodSingleContext(@SuppressWarnings("unused") PBuiltinMethod func, Object arg,
166+
@SuppressWarnings("unused") @Cached("func") PBuiltinMethod cachedFunc,
167+
@SuppressWarnings("unused") @Cached("takesFixedNumOfPositionalArgs(func)") boolean isFixed,
168+
@Cached("getBinary(func.getFunction())") PythonBinaryBuiltinNode builtinNode) {
169+
return builtinNode.execute(func.getSelf(), arg);
170+
}
171+
172+
@Specialization(guards = {"builtinNode != null", "getCallTarget(func) == ct"}, limit = "getCallSiteInlineCacheMaxDepth()")
173+
Object callMethod(@SuppressWarnings("unused") PBuiltinMethod func, Object receiver,
174+
@SuppressWarnings("unused") @Cached("getCallTarget(func)") RootCallTarget ct,
175+
@Cached("getUnary(func.getFunction())") PythonUnaryBuiltinNode builtinNode) {
176+
return builtinNode.execute(receiver);
177+
}
178+
179+
@Specialization(guards = {"builtinNode != null", "getCallTarget(func) == ct", "isFixed"}, limit = "getCallSiteInlineCacheMaxDepth()")
180+
Object callSelfMethod(@SuppressWarnings("unused") PBuiltinMethod func, Object arg,
181+
@SuppressWarnings("unused") @Cached("getCallTarget(func)") RootCallTarget ct,
182+
@SuppressWarnings("unused") @Cached("takesFixedNumOfPositionalArgs(func)") boolean isFixed,
183+
@Cached("getBinary(func.getFunction())") PythonBinaryBuiltinNode builtinNode) {
184+
return builtinNode.execute(func.getSelf(), arg);
185+
}
186+
155187
@Specialization
156188
Object call(Object func, Object receiver,
157189
@Cached("create()") CallNode callNode) {

0 commit comments

Comments
 (0)