@@ -2395,10 +2395,115 @@ SequenceStorage doEmpty(EmptySequenceStorage s, @SuppressWarnings("unused") int
2395
2395
2396
2396
@ Specialization (guards = "times <= 0" )
2397
2397
SequenceStorage doZeroRepeat (SequenceStorage s , @ SuppressWarnings ("unused" ) int times ,
2398
- @ Cached ( "create()" ) CreateEmptyNode createEmptyNode ) {
2398
+ @ Cached CreateEmptyNode createEmptyNode ) {
2399
2399
return createEmptyNode .execute (s , 0 );
2400
2400
}
2401
2401
2402
+ /* special but common case: something like '[False] * n' */
2403
+ @ Specialization (guards = {"s.length() == 1" , "times > 0" })
2404
+ BoolSequenceStorage doBoolSingleElement (BoolSequenceStorage s , int times ,
2405
+ @ Shared ("raiseNode" ) @ Cached PRaiseNode raiseNode ,
2406
+ @ Cached BranchProfile outOfMemProfile ) {
2407
+ try {
2408
+ boolean [] repeated = new boolean [Math .multiplyExact (s .length (), times )];
2409
+ Arrays .fill (repeated , s .getBoolItemNormalized (0 ));
2410
+ return new BoolSequenceStorage (repeated );
2411
+ } catch (OutOfMemoryError | ArithmeticException e ) {
2412
+ outOfMemProfile .enter ();
2413
+ throw raiseNode .raise (MemoryError );
2414
+ }
2415
+ }
2416
+
2417
+ /* special but common case: something like '["\x00"] * n' */
2418
+ @ Specialization (guards = {"s.length() == 1" , "times > 0" })
2419
+ ByteSequenceStorage doByteSingleElement (ByteSequenceStorage s , int times ,
2420
+ @ Shared ("raiseNode" ) @ Cached PRaiseNode raiseNode ,
2421
+ @ Cached BranchProfile outOfMemProfile ) {
2422
+ try {
2423
+ byte [] repeated = new byte [Math .multiplyExact (s .length (), times )];
2424
+ Arrays .fill (repeated , s .getByteItemNormalized (0 ));
2425
+ return new ByteSequenceStorage (repeated );
2426
+ } catch (OutOfMemoryError | ArithmeticException e ) {
2427
+ outOfMemProfile .enter ();
2428
+ throw raiseNode .raise (MemoryError );
2429
+ }
2430
+ }
2431
+
2432
+ /* special but common case: something like '["0"] * n' */
2433
+ @ Specialization (guards = {"s.length() == 1" , "times > 0" })
2434
+ CharSequenceStorage doCharSingleElement (CharSequenceStorage s , int times ,
2435
+ @ Shared ("raiseNode" ) @ Cached PRaiseNode raiseNode ,
2436
+ @ Cached BranchProfile outOfMemProfile ) {
2437
+ try {
2438
+ char [] repeated = new char [Math .multiplyExact (s .length (), times )];
2439
+ Arrays .fill (repeated , s .getCharItemNormalized (0 ));
2440
+ return new CharSequenceStorage (repeated );
2441
+ } catch (OutOfMemoryError | ArithmeticException e ) {
2442
+ outOfMemProfile .enter ();
2443
+ throw raiseNode .raise (MemoryError );
2444
+ }
2445
+ }
2446
+
2447
+ /* special but common case: something like '[0] * n' */
2448
+ @ Specialization (guards = {"s.length() == 1" , "times > 0" })
2449
+ IntSequenceStorage doIntSingleElement (IntSequenceStorage s , int times ,
2450
+ @ Shared ("raiseNode" ) @ Cached PRaiseNode raiseNode ,
2451
+ @ Cached BranchProfile outOfMemProfile ) {
2452
+ try {
2453
+ int [] repeated = new int [Math .multiplyExact (s .length (), times )];
2454
+ Arrays .fill (repeated , s .getIntItemNormalized (0 ));
2455
+ return new IntSequenceStorage (repeated );
2456
+ } catch (OutOfMemoryError | ArithmeticException e ) {
2457
+ outOfMemProfile .enter ();
2458
+ throw raiseNode .raise (MemoryError );
2459
+ }
2460
+ }
2461
+
2462
+ /* special but common case: something like '[0L] * n' */
2463
+ @ Specialization (guards = {"s.length() == 1" , "times > 0" })
2464
+ LongSequenceStorage doLongSingleElement (LongSequenceStorage s , int times ,
2465
+ @ Shared ("raiseNode" ) @ Cached PRaiseNode raiseNode ,
2466
+ @ Cached BranchProfile outOfMemProfile ) {
2467
+ try {
2468
+ long [] repeated = new long [Math .multiplyExact (s .length (), times )];
2469
+ Arrays .fill (repeated , s .getLongItemNormalized (0 ));
2470
+ return new LongSequenceStorage (repeated );
2471
+ } catch (OutOfMemoryError | ArithmeticException e ) {
2472
+ outOfMemProfile .enter ();
2473
+ throw raiseNode .raise (MemoryError );
2474
+ }
2475
+ }
2476
+
2477
+ /* special but common case: something like '[0.0] * n' */
2478
+ @ Specialization (guards = {"s.length() == 1" , "times > 0" })
2479
+ DoubleSequenceStorage doDoubleSingleElement (DoubleSequenceStorage s , int times ,
2480
+ @ Shared ("raiseNode" ) @ Cached PRaiseNode raiseNode ,
2481
+ @ Cached BranchProfile outOfMemProfile ) {
2482
+ try {
2483
+ double [] repeated = new double [Math .multiplyExact (s .length (), times )];
2484
+ Arrays .fill (repeated , s .getDoubleItemNormalized (0 ));
2485
+ return new DoubleSequenceStorage (repeated );
2486
+ } catch (OutOfMemoryError | ArithmeticException e ) {
2487
+ outOfMemProfile .enter ();
2488
+ throw raiseNode .raise (MemoryError );
2489
+ }
2490
+ }
2491
+
2492
+ /* special but common case: something like '[None] * n' */
2493
+ @ Specialization (guards = {"s.length() == 1" , "times > 0" })
2494
+ ObjectSequenceStorage doObjectSingleElement (ObjectSequenceStorage s , int times ,
2495
+ @ Shared ("raiseNode" ) @ Cached PRaiseNode raiseNode ,
2496
+ @ Cached BranchProfile outOfMemProfile ) {
2497
+ try {
2498
+ Object [] repeated = new Object [Math .multiplyExact (s .length (), times )];
2499
+ Arrays .fill (repeated , s .getItemNormalized (0 ));
2500
+ return new ObjectSequenceStorage (repeated );
2501
+ } catch (OutOfMemoryError | ArithmeticException e ) {
2502
+ outOfMemProfile .enter ();
2503
+ throw raiseNode .raise (MemoryError );
2504
+ }
2505
+ }
2506
+
2402
2507
@ Specialization (limit = "MAX_ARRAY_STORAGES" , guards = {"times > 0" , "!isNative(s)" , "s.getClass() == cachedClass" })
2403
2508
SequenceStorage doManaged (BasicSequenceStorage s , int times ,
2404
2509
@ Exclusive @ Cached PRaiseNode raiseNode ,
0 commit comments