@@ -285,9 +285,6 @@ abstract static class SequenceStorageBaseNode extends PNodeWithContext {
285
285
protected static final int MAX_SEQUENCE_STORAGES = 13 ;
286
286
protected static final int MAX_ARRAY_STORAGES = 9 ;
287
287
288
- @ Child private GetElementType getElementType ;
289
- @ Child private LenNode lenNode ;
290
-
291
288
protected static boolean isByteStorage (NativeSequenceStorage store ) {
292
289
return store .getElementType () == ListStorageType .Byte ;
293
290
}
@@ -320,11 +317,7 @@ protected static boolean isNative(SequenceStorage store) {
320
317
return store instanceof NativeSequenceStorage ;
321
318
}
322
319
323
- protected boolean isEmpty (SequenceStorage left ) {
324
- if (lenNode == null ) {
325
- CompilerDirectives .transferToInterpreterAndInvalidate ();
326
- lenNode = insert (LenNode .create ());
327
- }
320
+ protected boolean isEmpty (LenNode lenNode , SequenceStorage left ) {
328
321
return lenNode .execute (left ) == 0 ;
329
322
}
330
323
@@ -411,55 +404,6 @@ protected static boolean isList(ListStorageType et) {
411
404
protected static boolean hasStorage (Object source ) {
412
405
return source instanceof PSequence && !(source instanceof PString );
413
406
}
414
-
415
- protected boolean isBoolean (SequenceStorage s ) {
416
- return getElementType (s ) == ListStorageType .Boolean ;
417
- }
418
-
419
- protected boolean isByte (SequenceStorage s ) {
420
- return getElementType (s ) == ListStorageType .Byte ;
421
- }
422
-
423
- protected boolean isByteLike (SequenceStorage s ) {
424
- return isByte (s ) || isInt (s ) || isLong (s );
425
- }
426
-
427
- protected boolean isChar (SequenceStorage s ) {
428
- return getElementType (s ) == ListStorageType .Char ;
429
- }
430
-
431
- private ListStorageType getElementType (SequenceStorage s ) {
432
- if (getElementType == null ) {
433
- CompilerDirectives .transferToInterpreterAndInvalidate ();
434
- getElementType = insert (GetElementType .create ());
435
- }
436
- return getElementType .execute (s );
437
- }
438
-
439
- protected boolean isInt (SequenceStorage s ) {
440
- return getElementType (s ) == ListStorageType .Int ;
441
- }
442
-
443
- protected boolean isLong (SequenceStorage s ) {
444
- return getElementType (s ) == ListStorageType .Long ;
445
- }
446
-
447
- protected boolean isDouble (SequenceStorage s ) {
448
- return getElementType (s ) == ListStorageType .Double ;
449
- }
450
-
451
- protected boolean isObject (SequenceStorage s ) {
452
- return getElementType (s ) == ListStorageType .Generic ;
453
- }
454
-
455
- protected boolean isTuple (SequenceStorage s ) {
456
- return getElementType (s ) == ListStorageType .Tuple ;
457
- }
458
-
459
- protected boolean isList (SequenceStorage s ) {
460
- return getElementType (s ) == ListStorageType .List ;
461
- }
462
-
463
407
}
464
408
465
409
abstract static class NormalizingNode extends PNodeWithContext {
@@ -720,7 +664,7 @@ public static GetItemDynamicNode getUncached() {
720
664
721
665
@ GenerateUncached
722
666
@ ImportStatic (SequenceStorageBaseNode .class )
723
- abstract static class GetItemScalarNode extends Node {
667
+ public abstract static class GetItemScalarNode extends Node {
724
668
725
669
public abstract Object execute (SequenceStorage s , int idx );
726
670
@@ -1239,7 +1183,7 @@ public static SetItemNode create(String invalidItemErrorMessage) {
1239
1183
1240
1184
@ GenerateUncached
1241
1185
@ ImportStatic (SequenceStorageBaseNode .class )
1242
- abstract static class SetItemScalarNode extends Node {
1186
+ public abstract static class SetItemScalarNode extends Node {
1243
1187
1244
1188
public abstract void execute (SequenceStorage s , int idx , Object value );
1245
1189
@@ -1840,6 +1784,8 @@ public abstract static class CmpNode extends SequenceStorageBaseNode {
1840
1784
@ Child private BinaryComparisonNode comparisonNode ;
1841
1785
@ Child private CoerceToBooleanNode castToBooleanNode ;
1842
1786
1787
+ @ Child private LenNode lenNode ;
1788
+
1843
1789
private final BinCmpOp cmpOp ;
1844
1790
1845
1791
protected CmpNode (BinCmpOp cmpOp ) {
@@ -1848,8 +1794,17 @@ protected CmpNode(BinCmpOp cmpOp) {
1848
1794
1849
1795
public abstract boolean execute (VirtualFrame frame , SequenceStorage left , SequenceStorage right );
1850
1796
1797
+ protected boolean isEmpty (SequenceStorage left ) {
1798
+ if (lenNode == null ) {
1799
+ CompilerDirectives .transferToInterpreterAndInvalidate ();
1800
+ lenNode = insert (LenNode .create ());
1801
+ }
1802
+ return lenNode .execute (left ) == 0 ;
1803
+ }
1804
+
1805
+ @ SuppressWarnings ("unused" )
1851
1806
@ Specialization (guards = {"isEmpty(left)" , "isEmpty(right)" })
1852
- boolean doEmpty (@ SuppressWarnings ( "unused" ) SequenceStorage left , @ SuppressWarnings ( "unused" ) SequenceStorage right ) {
1807
+ boolean doEmpty (SequenceStorage left , SequenceStorage right ) {
1853
1808
return cmpOp .cmp (0 , 0 );
1854
1809
}
1855
1810
@@ -2627,8 +2582,18 @@ public abstract static class ContainsNode extends SequenceStorageBaseNode {
2627
2582
@ Child private BinaryComparisonNode equalsNode ;
2628
2583
@ Child private CoerceToBooleanNode castToBooleanNode ;
2629
2584
2585
+ @ Child private LenNode lenNode ;
2586
+
2630
2587
public abstract boolean execute (VirtualFrame frame , SequenceStorage left , Object item );
2631
2588
2589
+ protected boolean isEmpty (SequenceStorage left ) {
2590
+ if (lenNode == null ) {
2591
+ CompilerDirectives .transferToInterpreterAndInvalidate ();
2592
+ lenNode = insert (LenNode .create ());
2593
+ }
2594
+ return lenNode .execute (left ) == 0 ;
2595
+ }
2596
+
2632
2597
@ Specialization (guards = "isEmpty(left)" )
2633
2598
@ SuppressWarnings ("unused" )
2634
2599
boolean doEmpty (SequenceStorage left , Object item ) {
@@ -2984,8 +2949,58 @@ public static AppendNode getUncached() {
2984
2949
2985
2950
public abstract static class CreateEmptyNode extends SequenceStorageBaseNode {
2986
2951
2952
+ @ Child private GetElementType getElementType ;
2953
+
2987
2954
public abstract SequenceStorage execute (SequenceStorage s , int cap );
2988
2955
2956
+ private ListStorageType getElementType (SequenceStorage s ) {
2957
+ if (getElementType == null ) {
2958
+ CompilerDirectives .transferToInterpreterAndInvalidate ();
2959
+ getElementType = insert (GetElementType .create ());
2960
+ }
2961
+ return getElementType .execute (s );
2962
+ }
2963
+
2964
+ protected boolean isBoolean (SequenceStorage s ) {
2965
+ return getElementType (s ) == ListStorageType .Boolean ;
2966
+ }
2967
+
2968
+ protected boolean isInt (SequenceStorage s ) {
2969
+ return getElementType (s ) == ListStorageType .Int ;
2970
+ }
2971
+
2972
+ protected boolean isLong (SequenceStorage s ) {
2973
+ return getElementType (s ) == ListStorageType .Long ;
2974
+ }
2975
+
2976
+ protected boolean isByte (SequenceStorage s ) {
2977
+ return getElementType (s ) == ListStorageType .Byte ;
2978
+ }
2979
+
2980
+ protected boolean isByteLike (SequenceStorage s ) {
2981
+ return isByte (s ) || isInt (s ) || isLong (s );
2982
+ }
2983
+
2984
+ protected boolean isChar (SequenceStorage s ) {
2985
+ return getElementType (s ) == ListStorageType .Char ;
2986
+ }
2987
+
2988
+ protected boolean isDouble (SequenceStorage s ) {
2989
+ return getElementType (s ) == ListStorageType .Double ;
2990
+ }
2991
+
2992
+ protected boolean isObject (SequenceStorage s ) {
2993
+ return getElementType (s ) == ListStorageType .Generic ;
2994
+ }
2995
+
2996
+ protected boolean isTuple (SequenceStorage s ) {
2997
+ return getElementType (s ) == ListStorageType .Tuple ;
2998
+ }
2999
+
3000
+ protected boolean isList (SequenceStorage s ) {
3001
+ return getElementType (s ) == ListStorageType .List ;
3002
+ }
3003
+
2989
3004
@ Specialization (guards = "isBoolean(s)" )
2990
3005
BoolSequenceStorage doBoolean (@ SuppressWarnings ("unused" ) SequenceStorage s , int cap ) {
2991
3006
return new BoolSequenceStorage (cap );
@@ -3224,7 +3239,8 @@ public static DeleteNode create(String keyTypeErrorMessage) {
3224
3239
}
3225
3240
}
3226
3241
3227
- abstract static class DeleteItemNode extends SequenceStorageBaseNode {
3242
+ @ GenerateUncached
3243
+ public abstract static class DeleteItemNode extends SequenceStorageBaseNode {
3228
3244
3229
3245
public abstract void execute (SequenceStorage s , int idx );
3230
3246
@@ -3366,8 +3382,9 @@ public abstract static class ItemIndexNode extends SequenceStorageBaseNode {
3366
3382
3367
3383
public abstract int execute (VirtualFrame frame , SequenceStorage s , double item , int start , int end );
3368
3384
3369
- @ Specialization (guards = "isBoolean(s)" )
3370
- int doBoolean (SequenceStorage s , boolean item , int start , int end ) {
3385
+ @ Specialization (guards = "isBoolean(getElementType, s)" )
3386
+ int doBoolean (SequenceStorage s , boolean item , int start , int end ,
3387
+ @ Cached @ SuppressWarnings ("unused" ) GetElementType getElementType ) {
3371
3388
for (int i = start ; i < getLength (s , end ); i ++) {
3372
3389
if (getItemScalarNode ().executeBoolean (s , i ) == item ) {
3373
3390
return i ;
@@ -3376,8 +3393,9 @@ int doBoolean(SequenceStorage s, boolean item, int start, int end) {
3376
3393
return -1 ;
3377
3394
}
3378
3395
3379
- @ Specialization (guards = "isByte(s)" )
3380
- int doByte (SequenceStorage s , byte item , int start , int end ) {
3396
+ @ Specialization (guards = "isByte(getElementType, s)" )
3397
+ int doByte (SequenceStorage s , byte item , int start , int end ,
3398
+ @ Cached @ SuppressWarnings ("unused" ) GetElementType getElementType ) {
3381
3399
for (int i = start ; i < getLength (s , end ); i ++) {
3382
3400
if (getItemScalarNode ().executeByte (s , i ) == item ) {
3383
3401
return i ;
@@ -3386,8 +3404,9 @@ int doByte(SequenceStorage s, byte item, int start, int end) {
3386
3404
return -1 ;
3387
3405
}
3388
3406
3389
- @ Specialization (guards = "isChar(s)" )
3390
- int doChar (SequenceStorage s , char item , int start , int end ) {
3407
+ @ Specialization (guards = "isChar(getElementType, s)" )
3408
+ int doChar (SequenceStorage s , char item , int start , int end ,
3409
+ @ Cached @ SuppressWarnings ("unused" ) GetElementType getElementType ) {
3391
3410
for (int i = start ; i < getLength (s , end ); i ++) {
3392
3411
if (getItemScalarNode ().executeChar (s , i ) == item ) {
3393
3412
return i ;
@@ -3396,8 +3415,9 @@ int doChar(SequenceStorage s, char item, int start, int end) {
3396
3415
return -1 ;
3397
3416
}
3398
3417
3399
- @ Specialization (guards = "isInt(s)" )
3400
- int doInt (SequenceStorage s , int item , int start , int end ) {
3418
+ @ Specialization (guards = "isInt(getElementType, s)" )
3419
+ int doInt (SequenceStorage s , int item , int start , int end ,
3420
+ @ Cached @ SuppressWarnings ("unused" ) GetElementType getElementType ) {
3401
3421
for (int i = start ; i < getLength (s , end ); i ++) {
3402
3422
if (getItemScalarNode ().executeInt (s , i ) == item ) {
3403
3423
return i ;
@@ -3406,8 +3426,9 @@ int doInt(SequenceStorage s, int item, int start, int end) {
3406
3426
return -1 ;
3407
3427
}
3408
3428
3409
- @ Specialization (guards = "isLong(s)" )
3410
- int doLong (SequenceStorage s , long item , int start , int end ) {
3429
+ @ Specialization (guards = "isLong(getElementType, s)" )
3430
+ int doLong (SequenceStorage s , long item , int start , int end ,
3431
+ @ Cached @ SuppressWarnings ("unused" ) GetElementType getElementType ) {
3411
3432
for (int i = start ; i < getLength (s , end ); i ++) {
3412
3433
if (getItemScalarNode ().executeLong (s , i ) == item ) {
3413
3434
return i ;
@@ -3416,8 +3437,9 @@ int doLong(SequenceStorage s, long item, int start, int end) {
3416
3437
return -1 ;
3417
3438
}
3418
3439
3419
- @ Specialization (guards = "isDouble(s)" )
3420
- int doDouble (SequenceStorage s , double item , int start , int end ) {
3440
+ @ Specialization (guards = "isDouble(getElementType, s)" )
3441
+ int doDouble (SequenceStorage s , double item , int start , int end ,
3442
+ @ Cached @ SuppressWarnings ("unused" ) GetElementType getElementType ) {
3421
3443
for (int i = start ; i < getLength (s , end ); i ++) {
3422
3444
if (getItemScalarNode ().executeDouble (s , i ) == item ) {
3423
3445
return i ;
0 commit comments