Skip to content

Commit 48f382a

Browse files
committed
add IsCallableNode
1 parent 763bc1c commit 48f382a

File tree

1 file changed

+97
-0
lines changed
  • graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/datamodel

1 file changed

+97
-0
lines changed
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
/*
2+
* Copyright (c) 2018, Oracle and/or its affiliates.
3+
*
4+
* The Universal Permissive License (UPL), Version 1.0
5+
*
6+
* Subject to the condition set forth below, permission is hereby granted to any
7+
* person obtaining a copy of this software, associated documentation and/or data
8+
* (collectively the "Software"), free of charge and under any and all copyright
9+
* rights in the Software, and any and all patent rights owned or freely
10+
* licensable by each licensor hereunder covering either (i) the unmodified
11+
* Software as contributed to or provided by such licensor, or (ii) the Larger
12+
* Works (as defined below), to deal in both
13+
*
14+
* (a) the Software, and
15+
* (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
16+
* one is included with the Software (each a "Larger Work" to which the
17+
* Software is contributed by such licensors),
18+
*
19+
* without restriction, including without limitation the rights to copy, create
20+
* derivative works of, display, perform, and distribute the Software and make,
21+
* use, sell, offer for sale, import, export, have made, and have sold the
22+
* Software and the Larger Work(s), and to sublicense the foregoing rights on
23+
* either these or other terms.
24+
*
25+
* This license is subject to the following condition:
26+
*
27+
* The above copyright notice and either this complete permission notice or at a
28+
* minimum a reference to the UPL must be included in all copies or substantial
29+
* portions of the Software.
30+
*
31+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
32+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
33+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
34+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
35+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
36+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
37+
* SOFTWARE.
38+
*/
39+
package com.oracle.graal.python.nodes.datamodel;
40+
41+
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
42+
import com.oracle.graal.python.builtins.objects.function.PFunction;
43+
import com.oracle.graal.python.builtins.objects.function.PythonCallable;
44+
import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod;
45+
import com.oracle.graal.python.builtins.objects.method.PMethod;
46+
import com.oracle.graal.python.nodes.PBaseNode;
47+
import com.oracle.graal.python.nodes.PGuards;
48+
import com.oracle.graal.python.nodes.SpecialMethodNames;
49+
import com.oracle.graal.python.nodes.attributes.LookupInheritedAttributeNode;
50+
import com.oracle.graal.python.nodes.truffle.PythonTypes;
51+
import com.oracle.truffle.api.dsl.ImportStatic;
52+
import com.oracle.truffle.api.dsl.Specialization;
53+
import com.oracle.truffle.api.dsl.TypeSystemReference;
54+
55+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__CALL__;
56+
57+
@TypeSystemReference(PythonTypes.class)
58+
@ImportStatic({PGuards.class, SpecialMethodNames.class})
59+
public abstract class IsCallableNode extends PBaseNode {
60+
@Child private LookupInheritedAttributeNode callAttrGetterNode = LookupInheritedAttributeNode.create();
61+
62+
public abstract boolean execute(Object callableObject);
63+
64+
protected static boolean isNoCallable(Object callee) {
65+
return !(callee instanceof PythonCallable);
66+
}
67+
68+
@Specialization(guards = {"isNoCallable(callable) || isClass(callable)"})
69+
protected boolean isSpecialCallable(Object callable) {
70+
Object call = callAttrGetterNode.execute(callable, __CALL__);
71+
return !isNoCallable(call);
72+
}
73+
74+
@Specialization
75+
protected boolean isMethod(PMethod callable) {
76+
return true;
77+
}
78+
79+
@Specialization
80+
protected boolean isBuiltinMethod(PBuiltinMethod callable) {
81+
return true;
82+
}
83+
84+
@Specialization
85+
protected boolean isFunctionCall(PFunction callable) {
86+
return true;
87+
}
88+
89+
@Specialization
90+
protected boolean isBuiltinFunctionCall(PBuiltinFunction callable) {
91+
return true;
92+
}
93+
94+
public static IsCallableNode create() {
95+
return IsCallableNodeGen.create();
96+
}
97+
}

0 commit comments

Comments
 (0)