|
40 | 40 | */
|
41 | 41 | package com.oracle.graal.python.runtime.interop;
|
42 | 42 |
|
| 43 | +import static com.oracle.graal.python.nodes.SpecialMethodNames.__CALL__; |
43 | 44 | import static com.oracle.graal.python.nodes.SpecialMethodNames.__DELITEM__;
|
44 | 45 | import static com.oracle.graal.python.nodes.SpecialMethodNames.__GETATTRIBUTE__;
|
45 | 46 | import static com.oracle.graal.python.nodes.SpecialMethodNames.__GETITEM__;
|
46 | 47 | import static com.oracle.graal.python.nodes.SpecialMethodNames.__SETITEM__;
|
47 | 48 |
|
48 | 49 | import java.util.Arrays;
|
49 | 50 |
|
50 |
| -import com.oracle.graal.python.PythonLanguage; |
51 | 51 | import com.oracle.graal.python.builtins.modules.BuiltinFunctions;
|
52 | 52 | import com.oracle.graal.python.builtins.modules.BuiltinFunctionsFactory;
|
53 | 53 | import com.oracle.graal.python.builtins.objects.PNone;
|
54 | 54 | import com.oracle.graal.python.builtins.objects.PythonAbstractObject;
|
55 | 55 | import com.oracle.graal.python.builtins.objects.cext.PythonNativeObject;
|
56 | 56 | import com.oracle.graal.python.builtins.objects.common.PHashingCollection;
|
| 57 | +import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; |
| 58 | +import com.oracle.graal.python.builtins.objects.function.PFunction; |
57 | 59 | import com.oracle.graal.python.builtins.objects.function.PKeyword;
|
58 | 60 | import com.oracle.graal.python.builtins.objects.list.PList;
|
| 61 | +import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod; |
| 62 | +import com.oracle.graal.python.builtins.objects.method.PMethod; |
59 | 63 | import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject;
|
60 | 64 | import com.oracle.graal.python.builtins.objects.object.PythonObject;
|
61 | 65 | import com.oracle.graal.python.builtins.objects.str.PString;
|
|
79 | 83 | import com.oracle.graal.python.nodes.subscript.DeleteItemNode;
|
80 | 84 | import com.oracle.graal.python.nodes.subscript.GetItemNode;
|
81 | 85 | import com.oracle.graal.python.nodes.subscript.SetItemNode;
|
82 |
| -import com.oracle.graal.python.runtime.PythonContext; |
83 |
| -import com.oracle.graal.python.runtime.PythonCore; |
84 | 86 | import com.oracle.graal.python.runtime.exception.PException;
|
85 |
| -import com.oracle.graal.python.runtime.exception.PythonErrorType; |
86 | 87 | import com.oracle.graal.python.runtime.interop.PythonMessageResolutionFactory.ArgumentsFromForeignNodeGen;
|
87 | 88 | import com.oracle.graal.python.runtime.object.PythonObjectFactory;
|
88 | 89 | import com.oracle.graal.python.runtime.sequence.PSequence;
|
89 | 90 | import com.oracle.truffle.api.CompilerDirectives;
|
90 |
| -import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; |
91 |
| -import com.oracle.truffle.api.TruffleLanguage.ContextReference; |
92 | 91 | import com.oracle.truffle.api.dsl.Cached;
|
93 | 92 | import com.oracle.truffle.api.dsl.Specialization;
|
94 | 93 | import com.oracle.truffle.api.interop.CanResolve;
|
@@ -272,26 +271,36 @@ Object[] cached(Object[] arguments) {
|
272 | 271 | public static final class ExecuteNode extends Node {
|
273 | 272 | @Child private PTypeToForeignNode toForeign = PTypeToForeignNodeGen.create();
|
274 | 273 | @Child private CallNode callNode = CallNode.create();
|
| 274 | + @Child private LookupInheritedAttributeNode callAttrGetterNode = LookupInheritedAttributeNode.create(__CALL__); |
275 | 275 | @Child private ArgumentsFromForeignNode convertArgsNode = ArgumentsFromForeignNodeGen.create();
|
276 |
| - final ConditionProfile errorProfile = ConditionProfile.createBinaryProfile(); |
277 |
| - @CompilationFinal private ContextReference<PythonContext> contextRef; |
| 276 | + |
| 277 | + public Object execute(PFunction receiver, Object[] arguments) { |
| 278 | + return doCall(receiver, arguments); |
| 279 | + } |
| 280 | + |
| 281 | + public Object execute(PBuiltinFunction receiver, Object[] arguments) { |
| 282 | + return doCall(receiver, arguments); |
| 283 | + } |
| 284 | + |
| 285 | + public Object execute(PMethod receiver, Object[] arguments) { |
| 286 | + return doCall(receiver, arguments); |
| 287 | + } |
| 288 | + |
| 289 | + public Object execute(PBuiltinMethod receiver, Object[] arguments) { |
| 290 | + return doCall(receiver, arguments); |
| 291 | + } |
278 | 292 |
|
279 | 293 | public Object execute(Object receiver, Object[] arguments) {
|
280 |
| - Object[] convertedArgs = convertArgsNode.execute(arguments); |
281 |
| - try { |
282 |
| - return toForeign.executeConvert(callNode.execute(null, receiver, convertedArgs, new PKeyword[0])); |
283 |
| - } catch (PException e) { |
284 |
| - e.expect(PythonErrorType.TypeError, getCore(), errorProfile); |
| 294 | + Object isCallable = callAttrGetterNode.execute(receiver); |
| 295 | + if (isCallable == PNone.NO_VALUE) { |
285 | 296 | throw UnsupportedMessageException.raise(Message.EXECUTE);
|
286 | 297 | }
|
| 298 | + return doCall(receiver, arguments); |
287 | 299 | }
|
288 | 300 |
|
289 |
| - private PythonCore getCore() { |
290 |
| - if (contextRef == null) { |
291 |
| - CompilerDirectives.transferToInterpreterAndInvalidate(); |
292 |
| - contextRef = PythonLanguage.getContextRef(); |
293 |
| - } |
294 |
| - return contextRef.get().getCore(); |
| 301 | + private Object doCall(Object receiver, Object[] arguments) { |
| 302 | + Object[] convertedArgs = convertArgsNode.execute(arguments); |
| 303 | + return toForeign.executeConvert(callNode.execute(null, receiver, convertedArgs, new PKeyword[0])); |
295 | 304 | }
|
296 | 305 | }
|
297 | 306 |
|
|
0 commit comments