diff --git a/src/pocketpy.h b/src/pocketpy.h index ebc64a9e..feced34c 100644 --- a/src/pocketpy.h +++ b/src/pocketpy.h @@ -421,16 +421,16 @@ void __initializeBuiltinFunctions(VM* _vm) { return vm->PyInt(_self.size()); }); - _vm->bindMethod<1>("list", "__getitem__", [](VM* vm, const pkpy::ArgList& args) { - const PyVarList& _self = vm->PyList_AS_C(args[0]); + _vm->bindMethodMulti<1>({"list", "tuple"}, "__getitem__", [](VM* vm, const pkpy::ArgList& args) { + bool list = args[0]->is_type(vm->_tp_list); + const PyVarList& _self = list ? vm->PyList_AS_C(args[0]) : vm->PyTuple_AS_C(args[0]); if(args[1]->is_type(vm->_tp_slice)){ _Slice s = vm->PySlice_AS_C(args[1]); s.normalize(_self.size()); PyVarList _new_list; - for(size_t i = s.start; i < s.stop; i++) - _new_list.push_back(_self[i]); - return vm->PyList(_new_list); + for(size_t i = s.start; i < s.stop; i++) _new_list.push_back(_self[i]); + return list ? vm->PyList(_new_list) : vm->PyTuple(_new_list); } int _index = (int)vm->PyInt_AS_C(args[1]); @@ -469,13 +469,6 @@ void __initializeBuiltinFunctions(VM* _vm) { return vm->PyInt(_self.size()); }); - _vm->bindMethod<1>("tuple", "__getitem__", [](VM* vm, const pkpy::ArgList& args) { - const PyVarList& _self = vm->PyTuple_AS_C(args[0]); - int _index = (int)vm->PyInt_AS_C(args[1]); - _index = vm->normalized_index(_index, _self.size()); - return _self[_index]; - }); - /************ PyBool ************/ _vm->bindStaticMethod<1>("bool", "__new__", CPP_LAMBDA(vm->asBool(args[0]))); diff --git a/tests/_builtin_ty.py b/tests/_builtin_ty.py index ae3b3bf3..fecd5f44 100644 --- a/tests/_builtin_ty.py +++ b/tests/_builtin_ty.py @@ -77,6 +77,14 @@ assert l[1:4] == [2,3,4] assert l[-1:-3] == [] assert l[-3:-1] == [2,3] +l = (1,2,3,4) +assert l[2] == 3 +assert l[-1] == 4 +assert l[:32] == (1,2,3,4) +assert l[32:] == tuple([]) +assert l[1:4] == (2,3,4) +assert l[-1:-3] == tuple([]) +assert l[-3:-1] == (2,3) l1 = [1];l2 = l1;l1.append(2);l3 = [1,1,2] assert l2[1] == 2