@@ -2134,12 +2134,14 @@ SequenceStorage doManagedEmptySameType(SequenceStorage dest, SequenceStorage lef
2134
2134
2135
2135
@ Specialization
2136
2136
SequenceStorage doGeneric (SequenceStorage dest , SequenceStorage left , SequenceStorage right ,
2137
+ @ Cached LenNode lenLeft ,
2138
+ @ Cached LenNode lenRight ,
2137
2139
@ Cached ("createClassProfile()" ) ValueProfile leftProfile ,
2138
2140
@ Cached ("createClassProfile()" ) ValueProfile rightProfile ) {
2139
2141
SequenceStorage leftProfiled = leftProfile .profile (left );
2140
2142
SequenceStorage rightProfiled = rightProfile .profile (right );
2141
- int len1 = leftProfiled . length ( );
2142
- int len2 = rightProfiled . length ( );
2143
+ int len1 = lenLeft . execute ( leftProfiled );
2144
+ int len2 = lenRight . execute ( rightProfiled );
2143
2145
for (int i = 0 ; i < len1 ; i ++) {
2144
2146
getSetItemNode ().execute (dest , i , getGetItemNode ().execute (leftProfiled , i ));
2145
2147
}
@@ -2213,15 +2215,17 @@ public abstract static class ConcatNode extends SequenceStorageBaseNode {
2213
2215
2214
2216
@ Specialization
2215
2217
SequenceStorage doRight (SequenceStorage left , SequenceStorage right ,
2218
+ @ Cached LenNode lenLeft ,
2219
+ @ Cached LenNode lenRight ,
2216
2220
@ Cached PRaiseNode raiseNode ,
2217
2221
@ Cached ("createClassProfile()" ) ValueProfile leftProfile ,
2218
2222
@ Cached ("createClassProfile()" ) ValueProfile rightProfile ,
2219
2223
@ Cached ("create()" ) BranchProfile outOfMemProfile ) {
2220
2224
try {
2221
2225
SequenceStorage leftProfiled = leftProfile .profile (left );
2222
2226
SequenceStorage rightProfiled = rightProfile .profile (right );
2223
- int len1 = leftProfiled . length ( );
2224
- int len2 = rightProfiled . length ( );
2227
+ int len1 = lenLeft . execute ( leftProfiled );
2228
+ int len2 = lenRight . execute ( rightProfiled );
2225
2229
// we eagerly generalize the store to avoid possible cascading generalizations
2226
2230
SequenceStorage generalized = generalizeStore (createEmpty (leftProfiled , rightProfiled , Math .addExact (len1 , len2 )), rightProfiled );
2227
2231
return doConcat (generalized , leftProfiled , rightProfiled );
@@ -2233,11 +2237,9 @@ SequenceStorage doRight(SequenceStorage left, SequenceStorage right,
2233
2237
2234
2238
private SequenceStorage createEmpty (SequenceStorage l , SequenceStorage r , int len ) {
2235
2239
if (l instanceof EmptySequenceStorage ) {
2236
- return createEmptyNode .execute (r , len );
2240
+ return createEmptyNode .execute (r , len , - 1 );
2237
2241
}
2238
- SequenceStorage empty = createEmptyNode .execute (l , len );
2239
- empty .ensureCapacity (len );
2240
- empty .setNewLength (len );
2242
+ SequenceStorage empty = createEmptyNode .execute (l , len , len );
2241
2243
return empty ;
2242
2244
}
2243
2245
@@ -2273,7 +2275,6 @@ public static ConcatNode create(Supplier<GeneralizationNode> genNodeProvider) {
2273
2275
2274
2276
@ ImportStatic (PGuards .class )
2275
2277
public abstract static class ExtendNode extends SequenceStorageBaseNode {
2276
- @ Child private CreateEmptyNode createEmptyNode = CreateEmptyNode .create ();
2277
2278
@ Child private GeneralizationNode genNode ;
2278
2279
2279
2280
private final GenNodeSupplier genNodeProvider ;
@@ -2297,6 +2298,8 @@ protected LazyPythonClass getClass(Object value) {
2297
2298
@ Specialization (guards = {"hasStorage(seq)" , "cannotBeOverridden(getClass(seq))" })
2298
2299
SequenceStorage doWithStorage (SequenceStorage s , PSequence seq ,
2299
2300
@ Cached PRaiseNode raiseNode ,
2301
+ @ Cached LenNode lenLeft ,
2302
+ @ Cached LenNode lenRight ,
2300
2303
@ Cached ("createClassProfile()" ) ValueProfile leftProfile ,
2301
2304
@ Cached ("createClassProfile()" ) ValueProfile rightProfile ,
2302
2305
@ Cached ("createClassProfile()" ) ValueProfile sequenceProfile ,
@@ -2305,8 +2308,8 @@ SequenceStorage doWithStorage(SequenceStorage s, PSequence seq,
2305
2308
@ Cached ("create()" ) ConcatBaseNode concatStoragesNode ) {
2306
2309
SequenceStorage leftProfiled = leftProfile .profile (s );
2307
2310
SequenceStorage rightProfiled = rightProfile .profile (sequenceProfile .profile (seq ).getSequenceStorage ());
2308
- int len1 = leftProfiled . length ( );
2309
- int len2 = rightProfiled . length ( );
2311
+ int len1 = lenLeft . execute ( leftProfiled );
2312
+ int len2 = lenRight . execute ( rightProfiled );
2310
2313
SequenceStorage dest = null ;
2311
2314
try {
2312
2315
dest = ensureCapacityNode .execute (leftProfiled , Math .addExact (len1 , len2 ));
@@ -2376,7 +2379,7 @@ SequenceStorage doEmpty(EmptySequenceStorage s, @SuppressWarnings("unused") int
2376
2379
@ Specialization (guards = "times <= 0" )
2377
2380
SequenceStorage doZeroRepeat (SequenceStorage s , @ SuppressWarnings ("unused" ) int times ,
2378
2381
@ Cached CreateEmptyNode createEmptyNode ) {
2379
- return createEmptyNode .execute (s , 0 );
2382
+ return createEmptyNode .execute (s , 0 , - 1 );
2380
2383
}
2381
2384
2382
2385
/* special but common case: something like '[False] * n' */
@@ -2515,7 +2518,7 @@ SequenceStorage doGeneric(SequenceStorage s, int times,
2515
2518
@ Cached ("create()" ) LenNode lenNode ) {
2516
2519
try {
2517
2520
int len = lenNode .execute (s );
2518
- SequenceStorage repeated = createEmptyNode .execute (s , Math .multiplyExact (len , times ));
2521
+ SequenceStorage repeated = createEmptyNode .execute (s , Math .multiplyExact (len , times ), - 1 );
2519
2522
2520
2523
for (int i = 0 ; i < len ; i ++) {
2521
2524
setItemNode .execute (repeated , i , getGetItemNode ().execute (s , i ));
@@ -2951,7 +2954,7 @@ public abstract static class CreateEmptyNode extends SequenceStorageBaseNode {
2951
2954
2952
2955
@ Child private GetElementType getElementType ;
2953
2956
2954
- public abstract SequenceStorage execute (SequenceStorage s , int cap );
2957
+ public abstract SequenceStorage execute (SequenceStorage s , int cap , int len );
2955
2958
2956
2959
private ListStorageType getElementType (SequenceStorage s ) {
2957
2960
if (getElementType == null ) {
@@ -3002,49 +3005,94 @@ protected boolean isList(SequenceStorage s) {
3002
3005
}
3003
3006
3004
3007
@ Specialization (guards = "isBoolean(s)" )
3005
- BoolSequenceStorage doBoolean (@ SuppressWarnings ("unused" ) SequenceStorage s , int cap ) {
3006
- return new BoolSequenceStorage (cap );
3008
+ BoolSequenceStorage doBoolean (@ SuppressWarnings ("unused" ) SequenceStorage s , int cap , int len ) {
3009
+ BoolSequenceStorage ss = new BoolSequenceStorage (cap );
3010
+ if (len != -1 ) {
3011
+ ss .ensureCapacity (len );
3012
+ ss .setNewLength (len );
3013
+ }
3014
+ return ss ;
3007
3015
}
3008
3016
3009
3017
@ Specialization (guards = "isByte(s)" )
3010
- ByteSequenceStorage doByte (@ SuppressWarnings ("unused" ) SequenceStorage s , int cap ) {
3011
- return new ByteSequenceStorage (cap );
3018
+ ByteSequenceStorage doByte (@ SuppressWarnings ("unused" ) SequenceStorage s , int cap , int len ) {
3019
+ ByteSequenceStorage ss = new ByteSequenceStorage (cap );
3020
+ if (len != -1 ) {
3021
+ ss .ensureCapacity (len );
3022
+ ss .setNewLength (len );
3023
+ }
3024
+ return ss ;
3012
3025
}
3013
3026
3014
3027
@ Specialization (guards = "isChar(s)" )
3015
- CharSequenceStorage doChar (@ SuppressWarnings ("unused" ) SequenceStorage s , int cap ) {
3016
- return new CharSequenceStorage (cap );
3028
+ CharSequenceStorage doChar (@ SuppressWarnings ("unused" ) SequenceStorage s , int cap , int len ) {
3029
+ CharSequenceStorage ss = new CharSequenceStorage (cap );
3030
+ if (len != -1 ) {
3031
+ ss .ensureCapacity (len );
3032
+ ss .setNewLength (len );
3033
+ }
3034
+ return ss ;
3017
3035
}
3018
3036
3019
3037
@ Specialization (guards = "isInt(s)" )
3020
- IntSequenceStorage doInt (@ SuppressWarnings ("unused" ) SequenceStorage s , int cap ) {
3021
- return new IntSequenceStorage (cap );
3038
+ IntSequenceStorage doInt (@ SuppressWarnings ("unused" ) SequenceStorage s , int cap , int len ) {
3039
+ IntSequenceStorage ss = new IntSequenceStorage (cap );
3040
+ if (len != -1 ) {
3041
+ ss .ensureCapacity (len );
3042
+ ss .setNewLength (len );
3043
+ }
3044
+ return ss ;
3022
3045
}
3023
3046
3024
3047
@ Specialization (guards = "isLong(s)" )
3025
- LongSequenceStorage doLong (@ SuppressWarnings ("unused" ) SequenceStorage s , int cap ) {
3026
- return new LongSequenceStorage (cap );
3048
+ LongSequenceStorage doLong (@ SuppressWarnings ("unused" ) SequenceStorage s , int cap , int len ) {
3049
+ LongSequenceStorage ss = new LongSequenceStorage (cap );
3050
+ if (len != -1 ) {
3051
+ ss .ensureCapacity (len );
3052
+ ss .setNewLength (len );
3053
+ }
3054
+ return ss ;
3027
3055
}
3028
3056
3029
3057
@ Specialization (guards = "isDouble(s)" )
3030
- DoubleSequenceStorage doDouble (@ SuppressWarnings ("unused" ) SequenceStorage s , int cap ) {
3031
- return new DoubleSequenceStorage (cap );
3058
+ DoubleSequenceStorage doDouble (@ SuppressWarnings ("unused" ) SequenceStorage s , int cap , int len ) {
3059
+ DoubleSequenceStorage ss = new DoubleSequenceStorage (cap );
3060
+ if (len != -1 ) {
3061
+ ss .ensureCapacity (len );
3062
+ ss .setNewLength (len );
3063
+ }
3064
+ return ss ;
3032
3065
}
3033
3066
3034
3067
@ Specialization (guards = "isList(s)" )
3035
- ListSequenceStorage doList (@ SuppressWarnings ("unused" ) SequenceStorage s , int cap ) {
3068
+ ListSequenceStorage doList (@ SuppressWarnings ("unused" ) SequenceStorage s , int cap , int len ) {
3036
3069
// TODO not quite accurate in case of native sequence storage
3037
- return new ListSequenceStorage (cap );
3070
+ ListSequenceStorage ss = new ListSequenceStorage (cap );
3071
+ if (len != -1 ) {
3072
+ ss .ensureCapacity (len );
3073
+ ss .setNewLength (len );
3074
+ }
3075
+ return ss ;
3038
3076
}
3039
3077
3040
3078
@ Specialization (guards = "isTuple(s)" )
3041
- TupleSequenceStorage doTuple (@ SuppressWarnings ("unused" ) SequenceStorage s , int cap ) {
3042
- return new TupleSequenceStorage (cap );
3079
+ TupleSequenceStorage doTuple (@ SuppressWarnings ("unused" ) SequenceStorage s , int cap , int len ) {
3080
+ TupleSequenceStorage ss = new TupleSequenceStorage (cap );
3081
+ if (len != -1 ) {
3082
+ ss .ensureCapacity (len );
3083
+ ss .setNewLength (len );
3084
+ }
3085
+ return ss ;
3043
3086
}
3044
3087
3045
3088
@ Fallback
3046
- ObjectSequenceStorage doObject (@ SuppressWarnings ("unused" ) SequenceStorage s , int cap ) {
3047
- return new ObjectSequenceStorage (cap );
3089
+ ObjectSequenceStorage doObject (@ SuppressWarnings ("unused" ) SequenceStorage s , int cap , int len ) {
3090
+ ObjectSequenceStorage ss = new ObjectSequenceStorage (cap );
3091
+ if (len != -1 ) {
3092
+ ss .ensureCapacity (len );
3093
+ ss .setNewLength (len );
3094
+ }
3095
+ return ss ;
3048
3096
}
3049
3097
3050
3098
public static CreateEmptyNode create () {
0 commit comments