Skip to content

Commit 6ed922d

Browse files
committed
add java.instanceof builtin (for foreign object)
1 parent c0f779b commit 6ed922d

File tree

2 files changed

+34
-1
lines changed

2 files changed

+34
-1
lines changed

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

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,15 @@
4747
import com.oracle.graal.python.builtins.PythonBuiltins;
4848
import com.oracle.graal.python.builtins.objects.str.PString;
4949
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
50+
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
5051
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
5152
import com.oracle.graal.python.runtime.exception.PythonErrorType;
5253
import com.oracle.truffle.api.TruffleLanguage.Env;
54+
import com.oracle.truffle.api.dsl.Fallback;
5355
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
5456
import com.oracle.truffle.api.dsl.NodeFactory;
5557
import com.oracle.truffle.api.dsl.Specialization;
58+
import com.oracle.truffle.api.interop.TruffleObject;
5659

5760
@CoreFunctions(defineModule = "java")
5861
public class JavaModuleBuiltins extends PythonBuiltins {
@@ -122,4 +125,34 @@ boolean check(Object object) {
122125
return env.isHostSymbol(object);
123126
}
124127
}
128+
129+
@Builtin(name = "instanceof", fixedNumOfPositionalArgs = 2)
130+
@GenerateNodeFactory
131+
abstract static class InstanceOfNode extends PythonBinaryBuiltinNode {
132+
@Specialization(guards = {"!isForeignObject(object)", "isForeignObject(klass)"})
133+
boolean check(Object object, TruffleObject klass) {
134+
Env env = getContext().getEnv();
135+
Object hostKlass = env.asHostObject(klass);
136+
if (hostKlass instanceof Class<?>) {
137+
return ((Class<?>) hostKlass).isInstance(object);
138+
}
139+
return false;
140+
}
141+
142+
@Specialization(guards = {"isForeignObject(object)", "isForeignObject(klass)"})
143+
boolean checkForeign(Object object, TruffleObject klass) {
144+
Env env = getContext().getEnv();
145+
Object hostObject = env.asHostObject(object);
146+
Object hostKlass = env.asHostObject(klass);
147+
if (hostKlass instanceof Class<?>) {
148+
return ((Class<?>) hostKlass).isInstance(hostObject);
149+
}
150+
return false;
151+
}
152+
153+
@Fallback
154+
boolean fallback(Object object, Object klass) {
155+
throw raise(PythonErrorType.TypeError, "unsupported instanceof(%p, %p)", object, klass);
156+
}
157+
}
125158
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/foreign/TruffleObjectBuiltins.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -769,7 +769,7 @@ Object doForeignMapping(TruffleObject mapping,
769769

770770
@Fallback
771771
Object doGeneric(@SuppressWarnings("unused") Object o) {
772-
return PNone.NO_VALUE;
772+
return PNone.NONE;
773773
}
774774

775775
}

0 commit comments

Comments
 (0)