@@ -139,6 +139,15 @@ def _reference_fast(args):
139
139
return obj
140
140
return list (obj )
141
141
142
+ def _wrap_slice_fun (fun , since = 0 , default = None ):
143
+ def wrapped_fun (args ):
144
+ if not isinstance (args [0 ], list ) and not isinstance (args [0 ], set ) and not isinstance (args [0 ], tuple ) and not isinstance (args [0 ], str ):
145
+ if sys .version_info .minor >= since :
146
+ raise SystemError ("expected list type" )
147
+ else :
148
+ return default
149
+ return fun (args )
150
+ return wrapped_fun
142
151
143
152
class NoNumber ():
144
153
pass
@@ -733,6 +742,7 @@ def compile_module(self, name):
733
742
({'a' :0 , 'b' :1 },),
734
743
(DummySequence (),),
735
744
(DummyListSubclass (),),
745
+ ('hello' ,),
736
746
),
737
747
resultspec = "i" ,
738
748
argspec = 'O' ,
@@ -750,6 +760,7 @@ def compile_module(self, name):
750
760
([None ],),
751
761
(set (),),
752
762
(DummyListSubclass (),),
763
+ ('hello' ,),
753
764
),
754
765
resultspec = "n" ,
755
766
argspec = 'O' ,
@@ -772,13 +783,58 @@ def compile_module(self, name):
772
783
(set (), 0 ),
773
784
({'a' , 'b' }, 0 ),
774
785
(DummyListSubclass (), 1 ),
786
+ ('hello' , 1 ),
775
787
),
776
788
resultspec = "O" ,
777
789
argspec = 'On' ,
778
790
arguments = ["PyObject* sequence" , "Py_ssize_t idx" ],
779
791
cmpfunc = unhandled_error_compare
780
792
)
781
-
793
+
794
+ test_PySequence_GetSlice = CPyExtFunction (
795
+ _wrap_slice_fun (lambda args : args [0 ][args [1 ]:args [2 ]]),
796
+ lambda : (
797
+ (tuple (), 0 , 1 ),
798
+ ((1 , 2 , 3 ), 1 , 2 ),
799
+ ((None ,), 1 , 2 ),
800
+ ([], 0 , 1 ),
801
+ (['a' , 'b' , 'c' ], 1 , 2 ),
802
+ ([None ], 0 , 1 ),
803
+ (set (), 0 , 1 ),
804
+ ({'a' , 'b' }, 1 , 2 ),
805
+ (DummyListSubclass (), 0 , 1 ),
806
+ ('hello' , 0 , 1 ),
807
+ ),
808
+ resultspec = "O" ,
809
+ argspec = 'Onn' ,
810
+ arguments = ["PyObject* sequence" , "Py_ssize_t ilow" , "Py_ssize_t ihigh" ],
811
+ cmpfunc = unhandled_error_compare
812
+ )
813
+
814
+ test_PySequence_Contains = CPyExtFunction (
815
+ lambda args : args [1 ] in args [0 ],
816
+ lambda : (
817
+ (tuple (), 1 ),
818
+ ((1 , 2 , 3 ), 1 ),
819
+ ((1 , 2 , 3 ), 4 ),
820
+ ((None ,), 1 ),
821
+ ([], 1 ),
822
+ (['a' , 'b' , 'c' ], 'a' ),
823
+ (['a' , 'b' , 'c' ], 'd' ),
824
+ ([None ], 1 ),
825
+ (set (), 1 ),
826
+ ({'a' , 'b' }, 'a' ),
827
+ ({'a' , 'b' }, 'c' ),
828
+ (DummyListSubclass (), 1 ),
829
+ ('hello' , 'e' ),
830
+ ('hello' , 'x' ),
831
+ ),
832
+ resultspec = "i" ,
833
+ argspec = 'OO' ,
834
+ arguments = ["PyObject* haystack" , "PyObject* needle" ],
835
+ cmpfunc = unhandled_error_compare
836
+ )
837
+
782
838
test_PySequence_ITEM = CPyExtFunction (
783
839
_reference_getitem ,
784
840
lambda : (
@@ -788,6 +844,7 @@ def compile_module(self, name):
788
844
([], 10 ),
789
845
(['a' , 'b' , 'c' ], 2 ),
790
846
([None ], 0 ),
847
+ ('hello' , 0 ),
791
848
),
792
849
resultspec = "O" ,
793
850
argspec = 'On' ,
@@ -803,6 +860,7 @@ def compile_module(self, name):
803
860
((None ,), 1 , None ),
804
861
([], 10 , 1 ),
805
862
(['a' , 'b' , 'c' ], 2 , 'z' ),
863
+ ('hello' , 2 , 'z' ),
806
864
),
807
865
code = ''' PyObject* wrap_PySequence_SetItem(PyObject* sequence, Py_ssize_t idx, PyObject* value) {
808
866
if (PySequence_SetItem(sequence, idx, value) < 0) {
@@ -830,6 +888,27 @@ def compile_module(self, name):
830
888
({'a' : 0 , 'b' : 1 , 'c' : 2 },),
831
889
(None ,),
832
890
(0 ,),
891
+ ('hello' ,),
892
+ ),
893
+ resultspec = "O" ,
894
+ argspec = 'O' ,
895
+ arguments = ["PyObject* sequence" ],
896
+ cmpfunc = unhandled_error_compare
897
+ )
898
+
899
+ test_PySequence_List = CPyExtFunction (
900
+ lambda args : list (args [0 ]),
901
+ lambda : (
902
+ (list (),),
903
+ ((1 , 2 , 3 ),),
904
+ ((None ,),),
905
+ ([],),
906
+ (['a' , 'b' , 'c' ],),
907
+ ({'a' , 'b' , 'c' },),
908
+ ({'a' : 0 , 'b' : 1 , 'c' : 2 },),
909
+ (None ,),
910
+ (0 ,),
911
+ ('hello' ,),
833
912
),
834
913
resultspec = "O" ,
835
914
argspec = 'O' ,
0 commit comments