@@ -159,6 +159,7 @@ abstract static class SequenceStorageBaseNode extends PBaseNode {
159
159
protected static final int DEFAULT_CAPACITY = 8 ;
160
160
161
161
protected static final int MAX_SEQUENCE_STORAGES = 12 ;
162
+ protected static final int MAX_ARRAY_STORAGES = 9 ;
162
163
163
164
protected static boolean isByteStorage (NativeSequenceStorage store ) {
164
165
return store .getElementType () == ListStorageType .Byte ;
@@ -590,7 +591,7 @@ private Node getReadNode() {
590
591
}
591
592
592
593
@ ImportStatic (ListStorageType .class )
593
- abstract static class GetItemSliceNode extends PBaseNode {
594
+ abstract static class GetItemSliceNode extends SequenceStorageBaseNode {
594
595
595
596
@ Child private Node readNode ;
596
597
@ Child private Node executeNode ;
@@ -603,7 +604,7 @@ protected EmptySequenceStorage doEmpty(EmptySequenceStorage storage, int start,
603
604
return EmptySequenceStorage .INSTANCE ;
604
605
}
605
606
606
- @ Specialization (limit = "5 " , guards = {"storage.getClass() == cachedClass" })
607
+ @ Specialization (limit = "MAX_ARRAY_STORAGES " , guards = {"storage.getClass() == cachedClass" })
607
608
protected SequenceStorage doManagedStorage (BasicSequenceStorage storage , int start , int stop , int step , int length ,
608
609
@ Cached ("storage.getClass()" ) Class <? extends BasicSequenceStorage > cachedClass ) {
609
610
return cachedClass .cast (storage ).getSliceInBound (start , stop , step , length );
@@ -975,7 +976,7 @@ abstract static class SetStorageSliceNode extends SequenceStorageBaseNode {
975
976
976
977
public abstract void execute (SequenceStorage s , SliceInfo info , SequenceStorage iterable );
977
978
978
- @ Specialization (limit = "9 " , guards = {"self.getClass() == cachedClass" , "self.getClass() == sequence.getClass()" , "replacesWholeSequence(cachedClass, self, info)" })
979
+ @ Specialization (limit = "MAX_ARRAY_STORAGES " , guards = {"self.getClass() == cachedClass" , "self.getClass() == sequence.getClass()" , "replacesWholeSequence(cachedClass, self, info)" })
979
980
void doWholeSequence (BasicSequenceStorage self , @ SuppressWarnings ("unused" ) SliceInfo info , BasicSequenceStorage sequence ,
980
981
@ Cached ("self.getClass()" ) Class <? extends BasicSequenceStorage > cachedClass ) {
981
982
BasicSequenceStorage selfProfiled = cachedClass .cast (self );
@@ -2154,39 +2155,39 @@ SequenceStorage doZeroRepeat(SequenceStorage s, @SuppressWarnings("unused") int
2154
2155
return storageTypeProfile .profile (s ).createEmpty (0 );
2155
2156
}
2156
2157
2157
- @ Specialization (limit = "2 " , guards = {"times > 0" , "!isNative(s)" , "s.getClass() == cachedClass" })
2158
+ @ Specialization (limit = "MAX_ARRAY_STORAGES " , guards = {"times > 0" , "!isNative(s)" , "s.getClass() == cachedClass" })
2158
2159
SequenceStorage doManaged (BasicSequenceStorage s , int times ,
2159
2160
@ Cached ("create()" ) BranchProfile outOfMemProfile ,
2160
2161
@ Cached ("s.getClass()" ) Class <? extends SequenceStorage > cachedClass ) {
2161
2162
try {
2162
2163
SequenceStorage profiled = cachedClass .cast (s );
2163
2164
Object arr1 = profiled .getInternalArrayObject ();
2164
2165
int len = profiled .length ();
2165
- SequenceStorage repeated = profiled .createEmpty (Math .multiplyExact (len , times ));
2166
+ int newLength = Math .multiplyExact (len , times );
2167
+ SequenceStorage repeated = profiled .createEmpty (newLength );
2166
2168
Object destArr = repeated .getInternalArrayObject ();
2167
2169
repeat (destArr , arr1 , len , times );
2168
- repeated .setNewLength (len * times );
2170
+ repeated .setNewLength (newLength );
2169
2171
return repeated ;
2170
2172
} catch (OutOfMemoryError | ArithmeticException e ) {
2171
2173
outOfMemProfile .enter ();
2172
2174
throw raise (MemoryError );
2173
2175
}
2174
2176
}
2175
2177
2176
- @ Specialization (replaces = "doManaged" , limit = "2" , guards = { "times > 0" , "s.getClass() == cachedClass" } )
2178
+ @ Specialization (replaces = "doManaged" , guards = "times > 0" )
2177
2179
SequenceStorage doGeneric (SequenceStorage s , int times ,
2178
2180
@ Cached ("create()" ) BranchProfile outOfMemProfile ,
2179
- @ Cached ("s.getClass ()" ) Class <? extends SequenceStorage > cachedClass ) {
2181
+ @ Cached ("create ()" ) LenNode lenNode ) {
2180
2182
try {
2181
- SequenceStorage profiled = cachedClass .cast (s );
2182
- int len = profiled .length ();
2183
+ int len = lenNode .execute (s );
2183
2184
2184
2185
ObjectSequenceStorage repeated = new ObjectSequenceStorage (Math .multiplyExact (len , times ));
2185
2186
2186
2187
// TODO avoid temporary array
2187
2188
Object [] values = new Object [len ];
2188
2189
for (int i = 0 ; i < len ; i ++) {
2189
- values [i ] = getGetItemNode ().execute (profiled , i );
2190
+ values [i ] = getGetItemNode ().execute (s , i );
2190
2191
}
2191
2192
2192
2193
Object destArr = repeated .getInternalArrayObject ();
@@ -2538,7 +2539,7 @@ SequenceStorage doEmpty(EmptySequenceStorage s, Object val,
2538
2539
return recursive .execute (newStorage , val );
2539
2540
}
2540
2541
2541
- @ Specialization (limit = "9 " , guards = "s.getClass() == cachedClass" )
2542
+ @ Specialization (limit = "MAX_ARRAY_STORAGES " , guards = "s.getClass() == cachedClass" )
2542
2543
SequenceStorage doManaged (BasicSequenceStorage s , Object val ,
2543
2544
@ Cached ("s.getClass()" ) Class <? extends BasicSequenceStorage > cachedClass ,
2544
2545
@ Cached ("create()" ) SetItemScalarNode setItemNode ) {
0 commit comments