Skip to content

Commit 0f4ff48

Browse files
committed
Also accept non-class meta objects for identity comparison
1 parent 9f5a0c6 commit 0f4ff48

File tree

1 file changed

+14
-5
lines changed

1 file changed

+14
-5
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/classes/AbstractObjectIsSubclassNode.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ public final boolean execute(Object derived, Object cls) {
7575
return execute(null, derived, cls);
7676
}
7777

78-
@Specialization(guards = "isSameTypeNode.execute(derived, cls)", limit = "1")
78+
@Specialization(guards = "isSameMetaObject(isSameTypeNode, derived, cls)", limit = "1")
7979
@SuppressWarnings("unused")
8080
static boolean doSameClass(Object derived, Object cls,
8181
@Shared("isSameType") @Cached IsSameTypeNode isSameTypeNode) {
@@ -88,11 +88,12 @@ protected static int[] observedSize() {
8888
return ary;
8989
}
9090

91-
@Specialization(guards = {"derived != cls", "derived == cachedDerived", "cls == cachedCls"}, limit = "getCallSiteInlineCacheMaxDepth()")
91+
@Specialization(guards = {"!isSameMetaObject(isSameTypeNode, derived, cls)", "derived == cachedDerived", "cls == cachedCls"}, limit = "getCallSiteInlineCacheMaxDepth()")
9292
static boolean doSubclass(VirtualFrame frame, @SuppressWarnings("unused") Object derived, @SuppressWarnings("unused") Object cls,
9393
@Cached(value = "observedSize()", dimensions = 1) int[] observedSizeArray,
9494
@Cached("derived") Object cachedDerived,
9595
@Cached("cls") Object cachedCls,
96+
@Cached @SuppressWarnings("unused") IsSameTypeNode isSameTypeNode,
9697
@Cached SequenceStorageNodes.LenNode lenNode,
9798
@Cached AbstractObjectGetBasesNode getBasesNode,
9899
@Cached AbstractObjectIsSubclassNode isSubclassNode,
@@ -118,7 +119,7 @@ static boolean doSubclass(VirtualFrame frame, @SuppressWarnings("unused") Object
118119
return loopUnexploded(frame, cachedCls, isSubclassNode, basesAry);
119120
}
120121

121-
private static final boolean loopUnexploded(VirtualFrame frame, Object cachedCls, AbstractObjectIsSubclassNode isSubclassNode, Object[] basesAry) {
122+
private static boolean loopUnexploded(VirtualFrame frame, Object cachedCls, AbstractObjectIsSubclassNode isSubclassNode, Object[] basesAry) {
122123
for (Object baseCls : basesAry) {
123124
if (isSubclassNode.execute(frame, baseCls, cachedCls)) {
124125
return true;
@@ -128,7 +129,7 @@ private static final boolean loopUnexploded(VirtualFrame frame, Object cachedCls
128129
}
129130

130131
@ExplodeLoop
131-
private static final boolean loopBases(VirtualFrame frame, Object cachedCls, Object[] bases, AbstractObjectIsSubclassNode isSubclassNode) {
132+
private static boolean loopBases(VirtualFrame frame, Object cachedCls, Object[] bases, AbstractObjectIsSubclassNode isSubclassNode) {
132133
for (int i = 0; i < bases.length; i++) {
133134
if (isSubclassNode.execute(frame, bases[i], cachedCls)) {
134135
return true;
@@ -144,7 +145,7 @@ static boolean doGeneric(VirtualFrame frame, Object derived, Object cls,
144145
@Cached AbstractObjectIsSubclassNode isSubclassNode,
145146
@Shared("isSameType") @Cached IsSameTypeNode isSameTypeNode,
146147
@Cached GetObjectArrayNode getObjectArrayNode) {
147-
if (isSameTypeNode.execute(derived, cls)) {
148+
if (isSameMetaObject(isSameTypeNode, derived, cls)) {
148149
return true;
149150
}
150151

@@ -164,4 +165,12 @@ static boolean doGeneric(VirtualFrame frame, Object derived, Object cls,
164165
private static boolean isEmpty(PTuple bases, SequenceStorageNodes.LenNode lenNode) {
165166
return lenNode.execute(bases.getSequenceStorage()) == 0;
166167
}
168+
169+
/**
170+
* Tests if the two meta objects {@code derived} and {@code cls} are the same. This differs from
171+
* {@link IsSameTypeNode} because it will also accept meta objects that are not classes.
172+
*/
173+
static boolean isSameMetaObject(IsSameTypeNode isSameTypeNode, Object derived, Object cls) {
174+
return derived == cls || isSameTypeNode.execute(derived, cls);
175+
}
167176
}

0 commit comments

Comments
 (0)