Skip to content

Commit 45fd476

Browse files
committed
[GR-25616] Fix isinstance for non-types
PullRequest: graalpython/1201
2 parents aa8daca + bb9bb3a commit 45fd476

File tree

2 files changed

+17
-4
lines changed

2 files changed

+17
-4
lines changed

graalpython/com.oracle.graal.python.test/src/tests/test_type.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,3 +176,8 @@ class C:
176176

177177
assert dir(C) == sorted(dir(C))
178178
assert dir(C()) == sorted(dir(C()))
179+
180+
181+
def test_isinstance_non_type():
182+
import typing
183+
assert isinstance(1, typing.AbstractSet) is False

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

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@
195195
import com.oracle.truffle.api.profiles.BranchProfile;
196196
import com.oracle.truffle.api.profiles.ConditionProfile;
197197
import com.oracle.truffle.api.source.Source;
198+
import com.oracle.truffle.api.utilities.TriState;
198199

199200
@CoreFunctions(defineModule = BuiltinNames.BUILTINS)
200201
public final class BuiltinFunctions extends PythonBuiltins {
@@ -1142,9 +1143,12 @@ public static IsInstanceNode create() {
11421143
return BuiltinFunctionsFactory.IsInstanceNodeFactory.create();
11431144
}
11441145

1145-
private boolean isInstanceCheckInternal(VirtualFrame frame, Object instance, Object cls) {
1146+
private TriState isInstanceCheckInternal(VirtualFrame frame, Object instance, Object cls) {
11461147
Object instanceCheckResult = instanceCheckNode.executeObject(frame, cls, instance);
1147-
return instanceCheckResult != NOT_IMPLEMENTED && castToBooleanNode.executeBoolean(frame, instanceCheckResult);
1148+
if (instanceCheckResult == NOT_IMPLEMENTED) {
1149+
return TriState.UNDEFINED;
1150+
}
1151+
return TriState.valueOf(castToBooleanNode.executeBoolean(frame, instanceCheckResult));
11481152
}
11491153

11501154
public abstract boolean executeWith(VirtualFrame frame, Object instance, Object cls);
@@ -1154,7 +1158,7 @@ boolean isInstance(VirtualFrame frame, Object instance, Object cls,
11541158
@Cached TypeNodes.IsSameTypeNode isSameTypeNode,
11551159
@Cached IsSubtypeNode isSubtypeNode) {
11561160
Object instanceClass = getClassNode.execute(instance);
1157-
return isSameTypeNode.execute(instanceClass, cls) || isSubtypeNode.execute(frame, instanceClass, cls) || isInstanceCheckInternal(frame, instance, cls);
1161+
return isSameTypeNode.execute(instanceClass, cls) || isSubtypeNode.execute(frame, instanceClass, cls) || isInstanceCheckInternal(frame, instance, cls) == TriState.TRUE;
11581162
}
11591163

11601164
@Specialization(guards = "getLength(clsTuple) == cachedLen", limit = "getVariableArgumentInlineCacheLimit()")
@@ -1193,7 +1197,11 @@ boolean isInstance(VirtualFrame frame, Object instance, Object cls) {
11931197
return hostCls instanceof Class && ((Class<?>) hostCls).isAssignableFrom(hostInstance.getClass());
11941198
}
11951199
}
1196-
return isInstanceCheckInternal(frame, instance, cls) || typeInstanceCheckNode.executeWith(frame, cls, instance);
1200+
TriState check = isInstanceCheckInternal(frame, instance, cls);
1201+
if (check == TriState.UNDEFINED) {
1202+
return typeInstanceCheckNode.executeWith(frame, cls, instance);
1203+
}
1204+
return check == TriState.TRUE;
11971205
}
11981206

11991207
protected int getLength(PTuple t) {

0 commit comments

Comments
 (0)