@@ -75,7 +75,7 @@ public final boolean execute(Object derived, Object cls) {
75
75
return execute (null , derived , cls );
76
76
}
77
77
78
- @ Specialization (guards = "isSameTypeNode.execute( derived, cls)" , limit = "1" )
78
+ @ Specialization (guards = "isSameMetaObject(isSameTypeNode, derived, cls)" , limit = "1" )
79
79
@ SuppressWarnings ("unused" )
80
80
static boolean doSameClass (Object derived , Object cls ,
81
81
@ Shared ("isSameType" ) @ Cached IsSameTypeNode isSameTypeNode ) {
@@ -88,11 +88,12 @@ protected static int[] observedSize() {
88
88
return ary ;
89
89
}
90
90
91
- @ Specialization (guards = {"derived != cls" , "derived == cachedDerived" , "cls == cachedCls" }, limit = "getCallSiteInlineCacheMaxDepth()" )
91
+ @ Specialization (guards = {"!isSameMetaObject(isSameTypeNode, derived, cls) " , "derived == cachedDerived" , "cls == cachedCls" }, limit = "getCallSiteInlineCacheMaxDepth()" )
92
92
static boolean doSubclass (VirtualFrame frame , @ SuppressWarnings ("unused" ) Object derived , @ SuppressWarnings ("unused" ) Object cls ,
93
93
@ Cached (value = "observedSize()" , dimensions = 1 ) int [] observedSizeArray ,
94
94
@ Cached ("derived" ) Object cachedDerived ,
95
95
@ Cached ("cls" ) Object cachedCls ,
96
+ @ Cached @ SuppressWarnings ("unused" ) IsSameTypeNode isSameTypeNode ,
96
97
@ Cached SequenceStorageNodes .LenNode lenNode ,
97
98
@ Cached AbstractObjectGetBasesNode getBasesNode ,
98
99
@ Cached AbstractObjectIsSubclassNode isSubclassNode ,
@@ -118,7 +119,7 @@ static boolean doSubclass(VirtualFrame frame, @SuppressWarnings("unused") Object
118
119
return loopUnexploded (frame , cachedCls , isSubclassNode , basesAry );
119
120
}
120
121
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 ) {
122
123
for (Object baseCls : basesAry ) {
123
124
if (isSubclassNode .execute (frame , baseCls , cachedCls )) {
124
125
return true ;
@@ -128,7 +129,7 @@ private static final boolean loopUnexploded(VirtualFrame frame, Object cachedCls
128
129
}
129
130
130
131
@ 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 ) {
132
133
for (int i = 0 ; i < bases .length ; i ++) {
133
134
if (isSubclassNode .execute (frame , bases [i ], cachedCls )) {
134
135
return true ;
@@ -144,7 +145,7 @@ static boolean doGeneric(VirtualFrame frame, Object derived, Object cls,
144
145
@ Cached AbstractObjectIsSubclassNode isSubclassNode ,
145
146
@ Shared ("isSameType" ) @ Cached IsSameTypeNode isSameTypeNode ,
146
147
@ Cached GetObjectArrayNode getObjectArrayNode ) {
147
- if (isSameTypeNode . execute ( derived , cls )) {
148
+ if (isSameMetaObject ( isSameTypeNode , derived , cls )) {
148
149
return true ;
149
150
}
150
151
@@ -164,4 +165,12 @@ static boolean doGeneric(VirtualFrame frame, Object derived, Object cls,
164
165
private static boolean isEmpty (PTuple bases , SequenceStorageNodes .LenNode lenNode ) {
165
166
return lenNode .execute (bases .getSequenceStorage ()) == 0 ;
166
167
}
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
+ }
167
176
}
0 commit comments