From ffee4a035497ec0a294d70dda7b50889adfd4569 Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Sat, 17 Feb 2024 19:55:04 +0800 Subject: [PATCH] some fix --- include/pocketpy/vm.h | 22 +--------------------- src/collections.cpp | 10 +++++----- src/pocketpy.cpp | 31 ++++++++++++++++++++++++++----- src/vm.cpp | 2 +- 4 files changed, 33 insertions(+), 32 deletions(-) diff --git a/include/pocketpy/vm.h b/include/pocketpy/vm.h index 9c6973ad..5660567a 100644 --- a/include/pocketpy/vm.h +++ b/include/pocketpy/vm.h @@ -330,7 +330,7 @@ public: }); } - int normalized_index(int index, int size); + i64 normalized_index(i64 index, int size); PyObject* py_next(PyObject* obj); bool py_callable(PyObject* obj); @@ -629,24 +629,4 @@ PyObject* VM::bind_func(PyObject* obj, Str name, NativeFuncC fn, UserData userda return nf; } -/***************************************************/ - -template -PyObject* PyArrayGetItem(VM* vm, PyObject* obj, PyObject* index){ - static_assert(std::is_same_v || std::is_same_v); - const T& self = _CAST(T&, obj); - - if(is_non_tagged_type(index, vm->tp_slice)){ - const Slice& s = _CAST(Slice&, index); - int start, stop, step; - vm->parse_int_slice(s, self.size(), start, stop, step); - List new_list; - for(int i=start; step>0?istop; i+=step) new_list.push_back(self[i]); - return VAR(T(std::move(new_list))); - } - - int i = CAST(int, index); - i = vm->normalized_index(i, self.size()); - return self[i]; -} } // namespace pkpy \ No newline at end of file diff --git a/src/collections.cpp b/src/collections.cpp index bb2a99cd..9c85ff7f 100644 --- a/src/collections.cpp +++ b/src/collections.cpp @@ -76,25 +76,25 @@ namespace pkpy vm->bind__getitem__(PK_OBJ_GET(Type, type), [](VM *vm, PyObject* _0, PyObject* _1) { PyDeque &self = _CAST(PyDeque &, _0); - int index = CAST(int, _1); + i64 index = CAST(i64, _1); index = vm->normalized_index(index, self.dequeItems.size()); // error is handled by the vm->normalized_index - return self.dequeItems.at(index); + return self.dequeItems[index]; }); // sets the item at the given index, if index is negative, it will be treated as index + len(deque) // if the index is out of range, IndexError will be thrown --> required for [] operator vm->bind__setitem__(PK_OBJ_GET(Type, type), [](VM *vm, PyObject* _0, PyObject* _1, PyObject* _2) { PyDeque &self = _CAST(PyDeque&, _0); - int index = CAST(int, _1); + i64 index = CAST(i64, _1); index = vm->normalized_index(index, self.dequeItems.size()); // error is handled by the vm->normalized_index - self.dequeItems.at(index) = _2; + self.dequeItems[index] = _2; }); // erases the item at the given index, if index is negative, it will be treated as index + len(deque) // if the index is out of range, IndexError will be thrown --> required for [] operator vm->bind__delitem__(PK_OBJ_GET(Type, type), [](VM *vm, PyObject* _0, PyObject* _1) { PyDeque &self = _CAST(PyDeque&, _0); - int index = CAST(int, _1); + i64 index = CAST(i64, _1); index = vm->normalized_index(index, self.dequeItems.size()); // error is handled by the vm->normalized_index self.dequeItems.erase(self.dequeItems.begin() + index); }); diff --git a/src/pocketpy.cpp b/src/pocketpy.cpp index 866d3e2b..68c861b6 100644 --- a/src/pocketpy.cpp +++ b/src/pocketpy.cpp @@ -6,6 +6,27 @@ namespace pkpy{ void add_module_cjson(VM* vm); #endif +template +PyObject* PyArrayGetItem(VM* vm, PyObject* _0, PyObject* _1){ + static_assert(std::is_same_v || std::is_same_v); + const T& self = _CAST(T&, _0); + i64 index; + if(try_cast_int(_1, &index)){ + index = vm->normalized_index(index, self.size()); + return self[index]; + } + if(is_non_tagged_type(_1, vm->tp_slice)){ + const Slice& s = _CAST(Slice&, _1); + int start, stop, step; + vm->parse_int_slice(s, self.size(), start, stop, step); + List new_list; + for(int i=start; step>0?istop; i+=step) new_list.push_back(self[i]); + return VAR(T(std::move(new_list))); + } + vm->TypeError("indices must be integers or slices"); + PK_UNREACHABLE() +} + void init_builtins(VM* _vm) { #define BIND_NUM_ARITH_OPT(name, op) \ _vm->bind##name(VM::tp_int, [](VM* vm, PyObject* lhs, PyObject* rhs) { \ @@ -529,7 +550,7 @@ void init_builtins(VM* _vm) { vm->parse_int_slice(s, self.u8_length(), start, stop, step); return VAR(self.u8_slice(start, stop, step)); } - int i = CAST(int, _1); + i64 i = CAST(i64, _1); i = vm->normalized_index(i, self.u8_length()); return VAR(self.u8_getitem(i)); }); @@ -812,7 +833,7 @@ void init_builtins(VM* _vm) { return self.popx_back(); } if(args.size() == 1+1){ - int index = CAST(int, args[1]); + i64 index = CAST(i64, args[1]); index = vm->normalized_index(index, self.size()); PyObject* ret = self[index]; self.erase(index); @@ -924,13 +945,13 @@ void init_builtins(VM* _vm) { _vm->bind__getitem__(VM::tp_list, PyArrayGetItem); _vm->bind__setitem__(VM::tp_list, [](VM* vm, PyObject* _0, PyObject* _1, PyObject* _2){ List& self = _CAST(List&, _0); - int i = CAST(int, _1); + i64 i = CAST(i64, _1); i = vm->normalized_index(i, self.size()); self[i] = _2; }); _vm->bind__delitem__(VM::tp_list, [](VM* vm, PyObject* _0, PyObject* _1){ List& self = _CAST(List&, _0); - int i = CAST(int, _1); + i64 i = CAST(i64, _1); i = vm->normalized_index(i, self.size()); self.erase(i); }); @@ -1035,7 +1056,7 @@ void init_builtins(VM* _vm) { _vm->bind__getitem__(VM::tp_bytes, [](VM* vm, PyObject* obj, PyObject* index) { const Bytes& self = _CAST(Bytes&, obj); - int i = CAST(int, index); + i64 i = CAST(i64, index); i = vm->normalized_index(i, self.size()); return VAR(self[i]); }); diff --git a/src/vm.cpp b/src/vm.cpp index 0351310e..d6ed685d 100644 --- a/src/vm.cpp +++ b/src/vm.cpp @@ -254,7 +254,7 @@ namespace pkpy{ return false; } - int VM::normalized_index(int index, int size){ + i64 VM::normalized_index(i64 index, int size){ if(index < 0) index += size; if(index < 0 || index >= size){ IndexError(std::to_string(index) + " not in [0, " + std::to_string(size) + ")");