@@ -2134,12 +2134,14 @@ SequenceStorage doManagedEmptySameType(SequenceStorage dest, SequenceStorage lef
21342134
21352135 @ Specialization
21362136 SequenceStorage doGeneric (SequenceStorage dest , SequenceStorage left , SequenceStorage right ,
2137+ @ Cached LenNode lenLeft ,
2138+ @ Cached LenNode lenRight ,
21372139 @ Cached ("createClassProfile()" ) ValueProfile leftProfile ,
21382140 @ Cached ("createClassProfile()" ) ValueProfile rightProfile ) {
21392141 SequenceStorage leftProfiled = leftProfile .profile (left );
21402142 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 );
21432145 for (int i = 0 ; i < len1 ; i ++) {
21442146 getSetItemNode ().execute (dest , i , getGetItemNode ().execute (leftProfiled , i ));
21452147 }
@@ -2213,15 +2215,17 @@ public abstract static class ConcatNode extends SequenceStorageBaseNode {
22132215
22142216 @ Specialization
22152217 SequenceStorage doRight (SequenceStorage left , SequenceStorage right ,
2218+ @ Cached LenNode lenLeft ,
2219+ @ Cached LenNode lenRight ,
22162220 @ Cached PRaiseNode raiseNode ,
22172221 @ Cached ("createClassProfile()" ) ValueProfile leftProfile ,
22182222 @ Cached ("createClassProfile()" ) ValueProfile rightProfile ,
22192223 @ Cached ("create()" ) BranchProfile outOfMemProfile ) {
22202224 try {
22212225 SequenceStorage leftProfiled = leftProfile .profile (left );
22222226 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 );
22252229 // we eagerly generalize the store to avoid possible cascading generalizations
22262230 SequenceStorage generalized = generalizeStore (createEmpty (leftProfiled , rightProfiled , Math .addExact (len1 , len2 )), rightProfiled );
22272231 return doConcat (generalized , leftProfiled , rightProfiled );
@@ -2233,11 +2237,9 @@ SequenceStorage doRight(SequenceStorage left, SequenceStorage right,
22332237
22342238 private SequenceStorage createEmpty (SequenceStorage l , SequenceStorage r , int len ) {
22352239 if (l instanceof EmptySequenceStorage ) {
2236- return createEmptyNode .execute (r , len );
2240+ return createEmptyNode .execute (r , len , - 1 );
22372241 }
2238- SequenceStorage empty = createEmptyNode .execute (l , len );
2239- empty .ensureCapacity (len );
2240- empty .setNewLength (len );
2242+ SequenceStorage empty = createEmptyNode .execute (l , len , len );
22412243 return empty ;
22422244 }
22432245
@@ -2273,7 +2275,6 @@ public static ConcatNode create(Supplier<GeneralizationNode> genNodeProvider) {
22732275
22742276 @ ImportStatic (PGuards .class )
22752277 public abstract static class ExtendNode extends SequenceStorageBaseNode {
2276- @ Child private CreateEmptyNode createEmptyNode = CreateEmptyNode .create ();
22772278 @ Child private GeneralizationNode genNode ;
22782279
22792280 private final GenNodeSupplier genNodeProvider ;
@@ -2297,6 +2298,8 @@ protected LazyPythonClass getClass(Object value) {
22972298 @ Specialization (guards = {"hasStorage(seq)" , "cannotBeOverridden(getClass(seq))" })
22982299 SequenceStorage doWithStorage (SequenceStorage s , PSequence seq ,
22992300 @ Cached PRaiseNode raiseNode ,
2301+ @ Cached LenNode lenLeft ,
2302+ @ Cached LenNode lenRight ,
23002303 @ Cached ("createClassProfile()" ) ValueProfile leftProfile ,
23012304 @ Cached ("createClassProfile()" ) ValueProfile rightProfile ,
23022305 @ Cached ("createClassProfile()" ) ValueProfile sequenceProfile ,
@@ -2305,8 +2308,8 @@ SequenceStorage doWithStorage(SequenceStorage s, PSequence seq,
23052308 @ Cached ("create()" ) ConcatBaseNode concatStoragesNode ) {
23062309 SequenceStorage leftProfiled = leftProfile .profile (s );
23072310 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 );
23102313 SequenceStorage dest = null ;
23112314 try {
23122315 dest = ensureCapacityNode .execute (leftProfiled , Math .addExact (len1 , len2 ));
@@ -2376,7 +2379,7 @@ SequenceStorage doEmpty(EmptySequenceStorage s, @SuppressWarnings("unused") int
23762379 @ Specialization (guards = "times <= 0" )
23772380 SequenceStorage doZeroRepeat (SequenceStorage s , @ SuppressWarnings ("unused" ) int times ,
23782381 @ Cached CreateEmptyNode createEmptyNode ) {
2379- return createEmptyNode .execute (s , 0 );
2382+ return createEmptyNode .execute (s , 0 , - 1 );
23802383 }
23812384
23822385 /* special but common case: something like '[False] * n' */
@@ -2515,7 +2518,7 @@ SequenceStorage doGeneric(SequenceStorage s, int times,
25152518 @ Cached ("create()" ) LenNode lenNode ) {
25162519 try {
25172520 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 );
25192522
25202523 for (int i = 0 ; i < len ; i ++) {
25212524 setItemNode .execute (repeated , i , getGetItemNode ().execute (s , i ));
@@ -2951,7 +2954,7 @@ public abstract static class CreateEmptyNode extends SequenceStorageBaseNode {
29512954
29522955 @ Child private GetElementType getElementType ;
29532956
2954- public abstract SequenceStorage execute (SequenceStorage s , int cap );
2957+ public abstract SequenceStorage execute (SequenceStorage s , int cap , int len );
29552958
29562959 private ListStorageType getElementType (SequenceStorage s ) {
29572960 if (getElementType == null ) {
@@ -3002,49 +3005,94 @@ protected boolean isList(SequenceStorage s) {
30023005 }
30033006
30043007 @ 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 ;
30073015 }
30083016
30093017 @ 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 ;
30123025 }
30133026
30143027 @ 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 ;
30173035 }
30183036
30193037 @ 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 ;
30223045 }
30233046
30243047 @ 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 ;
30273055 }
30283056
30293057 @ 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 ;
30323065 }
30333066
30343067 @ Specialization (guards = "isList(s)" )
3035- ListSequenceStorage doList (@ SuppressWarnings ("unused" ) SequenceStorage s , int cap ) {
3068+ ListSequenceStorage doList (@ SuppressWarnings ("unused" ) SequenceStorage s , int cap , int len ) {
30363069 // 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 ;
30383076 }
30393077
30403078 @ 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 ;
30433086 }
30443087
30453088 @ 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 ;
30483096 }
30493097
30503098 public static CreateEmptyNode create () {
0 commit comments