@@ -107,7 +107,7 @@ final static class PythonClassAssumptionPair {
107
107
public PythonClass cls ;
108
108
public Assumption assumption ;
109
109
110
- public PythonClassAssumptionPair (PythonClass cls , Assumption assumption ) {
110
+ PythonClassAssumptionPair (PythonClass cls , Assumption assumption ) {
111
111
this .cls = cls ;
112
112
this .assumption = assumption ;
113
113
}
@@ -117,15 +117,15 @@ protected PythonClassAssumptionPair findAttrClassAndAssumptionInMRO(PythonClass
117
117
PythonClass [] mro = klass .getMethodResolutionOrder ();
118
118
Assumption attrAssumption = null ;
119
119
for (int i = 0 ; i < mro .length ; i ++) {
120
- PythonClass kls = mro [i ];
120
+ PythonClass cls = mro [i ];
121
121
if (attrAssumption == null ) {
122
- attrAssumption = kls .createAttributeInMROFinalAssumption (key );
122
+ attrAssumption = cls .createAttributeInMROFinalAssumption (key );
123
123
} else {
124
- kls . setAttributesInMROFinalAssumption (key , attrAssumption );
124
+ cls . setAttributeInMROFinalAssumption (key , attrAssumption );
125
125
}
126
126
127
- if (kls .getStorage ().containsKey (key )) {
128
- return new PythonClassAssumptionPair (kls , attrAssumption );
127
+ if (cls .getStorage ().containsKey (key )) {
128
+ return new PythonClassAssumptionPair (cls , attrAssumption );
129
129
}
130
130
}
131
131
return new PythonClassAssumptionPair (null , attrAssumption );
@@ -148,17 +148,25 @@ protected Object lookupConstantMROCached(@SuppressWarnings("unused") PythonClass
148
148
return value ;
149
149
}
150
150
151
+ protected ReadAttributeFromObjectNode [] create (int size ) {
152
+ ReadAttributeFromObjectNode [] nodes = new ReadAttributeFromObjectNode [size ];
153
+ for (int i = 0 ; i < size ; i ++) {
154
+ nodes [i ] = ReadAttributeFromObjectNode .create ();
155
+ }
156
+ return nodes ;
157
+ }
158
+
151
159
@ Specialization (guards = {"klass == cachedKlass" , "mroLength < 32" }, limit = "5" , assumptions = "lookupStable" )
152
160
@ ExplodeLoop (kind = ExplodeLoop .LoopExplosionKind .FULL_EXPLODE_UNTIL_RETURN )
153
161
protected Object lookupConstantMRO (@ SuppressWarnings ("unused" ) PythonClass klass ,
154
162
@ Cached ("klass" ) @ SuppressWarnings ("unused" ) PythonClass cachedKlass ,
155
163
@ Cached ("cachedKlass.getLookupStableAssumption()" ) @ SuppressWarnings ("unused" ) Assumption lookupStable ,
156
- @ Cached ("create()" ) ReadAttributeFromObjectNode readAttrNode ,
157
164
@ Cached (value = "cachedKlass.getMethodResolutionOrder()" , dimensions = 1 ) PythonClass [] mro ,
158
- @ Cached ("mro.length" ) @ SuppressWarnings ("unused" ) int mroLength ) {
165
+ @ Cached ("mro.length" ) @ SuppressWarnings ("unused" ) int mroLength ,
166
+ @ Cached ("create(mroLength)" ) ReadAttributeFromObjectNode [] readAttrNodes ) {
159
167
for (int i = 0 ; i < mro .length ; i ++) {
160
168
PythonClass kls = mro [i ];
161
- Object value = readAttrNode .execute (kls , key );
169
+ Object value = readAttrNodes [ i ] .execute (kls , key );
162
170
if (value != PNone .NO_VALUE ) {
163
171
return value ;
164
172
}
0 commit comments