99
99
import com .oracle .graal .python .nodes .object .GetLazyClassNode ;
100
100
import com .oracle .graal .python .nodes .object .IsBuiltinClassProfile ;
101
101
import com .oracle .graal .python .nodes .subscript .GetItemNode ;
102
+ import com .oracle .graal .python .nodes .subscript .SliceLiteralNode .CastToSliceComponentNode ;
102
103
import com .oracle .graal .python .nodes .truffle .PythonArithmeticTypes ;
103
- import com .oracle .graal .python .nodes .util .CastToIndexNode ;
104
104
import com .oracle .graal .python .nodes .util .CastToJavaIntNode ;
105
105
import com .oracle .graal .python .nodes .util .CastToJavaStringNode ;
106
106
import com .oracle .graal .python .nodes .util .CastToJavaStringNodeGen ;
@@ -444,8 +444,7 @@ static Object doAll(VirtualFrame frame, Object left, Object right,
444
444
445
445
abstract static class PrefixSuffixBaseNode extends PythonQuaternaryBuiltinNode {
446
446
447
- @ Child private CastToIndexNode startNode ;
448
- @ Child private CastToIndexNode endNode ;
447
+ @ Child private CastToSliceComponentNode castSliceComponentNode ;
449
448
@ Child private GetObjectArrayNode getObjectArrayNode ;
450
449
@ Child private CastToJavaStringNode castToJavaStringNode ;
451
450
@@ -493,8 +492,8 @@ boolean doObjectPrefixGeneric(VirtualFrame frame, Object self, Object substr, Ob
493
492
@ Cached CastToJavaStringCheckedNode castPrefixNode ) {
494
493
String selfStr = castSelfNode .cast (self , INVALID_RECEIVER , "startswith" , self );
495
494
int len = selfStr .length ();
496
- int istart = PGuards . isPNone ( start ) ? 0 : adjustStart (castStart (frame , start ), len );
497
- int iend = PGuards .isPNone (end ) ? len : adjustEnd (castEnd (frame , end ), len );
495
+ int istart = adjustStart (castSlicePart (frame , start ), len );
496
+ int iend = PGuards .isPNone (end ) ? len : adjustEnd (castSlicePart (frame , end ), len );
498
497
String prefixStr = castPrefixNode .cast (substr , INVALID_FIRST_ARG , "startswith" , substr );
499
498
return doIt (selfStr , prefixStr , istart , iend );
500
499
}
@@ -504,8 +503,8 @@ boolean doTuplePrefixGeneric(VirtualFrame frame, Object self, PTuple substrs, Ob
504
503
@ Cached CastToJavaStringCheckedNode castSelfNode ) {
505
504
String selfStr = castSelfNode .cast (self , INVALID_RECEIVER , "startswith" , self );
506
505
int len = selfStr .length ();
507
- int istart = PGuards . isPNone ( start ) ? 0 : adjustStart (castStart (frame , start ), len );
508
- int iend = PGuards .isPNone (end ) ? len : adjustEnd (castEnd (frame , end ), len );
506
+ int istart = adjustStart (castSlicePart (frame , start ), len );
507
+ int iend = PGuards .isPNone (end ) ? len : adjustEnd (castSlicePart (frame , end ), len );
509
508
return doIt (selfStr , substrs , istart , iend );
510
509
}
511
510
@@ -553,24 +552,13 @@ static int adjustEnd(int end, int length) {
553
552
return adjustStart (end , length );
554
553
}
555
554
556
- private int castStart (VirtualFrame frame , Object start ) {
557
- if (startNode == null ) {
555
+ private int castSlicePart (VirtualFrame frame , Object idx ) {
556
+ if (castSliceComponentNode == null ) {
558
557
CompilerDirectives .transferToInterpreterAndInvalidate ();
559
- startNode = insert (CastToIndexNode .create (TypeError , val -> {
560
- throw raise (PythonBuiltinClassType .TypeError , "slice indices must be integers or None or have an __index__ method" );
561
- }));
558
+ // None should map to 0, overflow to the maximum integer
559
+ castSliceComponentNode = insert (CastToSliceComponentNode .create (0 , Integer .MAX_VALUE ));
562
560
}
563
- return startNode .execute (frame , start );
564
- }
565
-
566
- private int castEnd (VirtualFrame frame , Object end ) {
567
- if (endNode == null ) {
568
- CompilerDirectives .transferToInterpreterAndInvalidate ();
569
- endNode = insert (CastToIndexNode .create (TypeError , val -> {
570
- throw raise (PythonBuiltinClassType .TypeError , "slice indices must be integers or None or have an __index__ method" );
571
- }));
572
- }
573
- return endNode .execute (frame , end );
561
+ return castSliceComponentNode .execute (frame , idx );
574
562
}
575
563
576
564
private GetObjectArrayNode ensureGetObjectArrayNode () {
0 commit comments