@@ -708,4 +708,56 @@ Object doGeneric(@SuppressWarnings("unused") Object self) {
708
708
return PNotImplemented .NOT_IMPLEMENTED ;
709
709
}
710
710
}
711
+
712
+ @ Builtin (name = "rstrip" , minNumOfPositionalArgs = 1 , maxNumOfPositionalArgs = 2 , keywordArguments = {"bytes" })
713
+ @ GenerateNodeFactory
714
+ abstract static class RStripNode extends PythonBuiltinNode {
715
+ @ Specialization
716
+ @ TruffleBoundary
717
+ PByteArray strip (PByteArray self , @ SuppressWarnings ("unused" ) PNone bytes ,
718
+ @ Cached ("create()" ) BytesNodes .ToBytesNode toBytesNode ) {
719
+ byte [] bs = toBytesNode .execute (self );
720
+ int len = bs .length ;
721
+ for (int i = bs .length - 1 ; i >= 0 ; i --) {
722
+ if (Character .isWhitespace (bs [i ])) {
723
+ len --;
724
+ } else {
725
+ break ;
726
+ }
727
+ }
728
+ return newBytesUpTo (bs , len );
729
+ }
730
+
731
+ @ Specialization
732
+ @ TruffleBoundary
733
+ PByteArray strip (PByteArray self , PBytes bytes ,
734
+ @ Cached ("create()" ) BytesNodes .ToBytesNode selfToBytesNode ,
735
+ @ Cached ("create()" ) BytesNodes .ToBytesNode otherToBytesNode ) {
736
+ byte [] stripBs = selfToBytesNode .execute (bytes );
737
+ byte [] bs = otherToBytesNode .execute (self );
738
+ int len = bs .length ;
739
+ outer : for (int i = bs .length - 1 ; i >= 0 ; i --) {
740
+ for (byte b : stripBs ) {
741
+ if (b == bs [i ]) {
742
+ len --;
743
+ } else {
744
+ break outer ;
745
+ }
746
+ }
747
+ }
748
+ return newBytesUpTo (bs , len );
749
+ }
750
+
751
+ private PByteArray newBytesUpTo (byte [] bs , int len ) {
752
+ byte [] out ;
753
+ if (len != bs .length ) {
754
+ out = new byte [len ];
755
+ System .arraycopy (bs , 0 , out , 0 , len );
756
+ } else {
757
+ out = bs ;
758
+ }
759
+ return factory ().createByteArray (out );
760
+ }
761
+ }
762
+
711
763
}
0 commit comments