diff --git a/src/ceval.h b/src/ceval.h index 50e9bdde..6b4fd83f 100644 --- a/src/ceval.h +++ b/src/ceval.h @@ -186,7 +186,7 @@ PyVar VM::run_frame(Frame* frame){ case OP_RE_RAISE: _raise(); break; case OP_BUILD_LIST: frame->push(PyList( - frame->pop_n_values_reversed(this, byte.arg).to_list())); + frame->pop_n_values_reversed(this, byte.arg).move_to_list())); break; case OP_BUILD_MAP: { @@ -200,7 +200,7 @@ PyVar VM::run_frame(Frame* frame){ case OP_BUILD_SET: { PyVar list = PyList( - frame->pop_n_values_reversed(this, byte.arg).to_list() + frame->pop_n_values_reversed(this, byte.arg).move_to_list() ); PyVar obj = call(builtins->attr("set"), pkpy::one_arg(list)); frame->push(obj); diff --git a/src/safestl.h b/src/safestl.h index 23bc1fde..34784bd4 100644 --- a/src/safestl.h +++ b/src/safestl.h @@ -94,7 +94,8 @@ namespace pkpy { Args(pkpy::List&& other) noexcept { _alloc(other.size()); - for(int i=0; i<_size; i++) _args[i] = std::move(other[i]); + memcpy((void*)_args, (void*)other.data(), sizeof(PyVar)*_size); + memset((void*)other.data(), 0, sizeof(PyVar)*_size); other.clear(); } @@ -112,9 +113,10 @@ namespace pkpy { inline int size() const { return _size; } - pkpy::List to_list() const { + pkpy::List move_to_list() noexcept { pkpy::List ret(_size); - for(int i=0; i<_size; i++) ret[i] = _args[i]; + memcpy((void*)ret.data(), (void*)_args, sizeof(PyVar)*_size); + memset((void*)_args, 0, sizeof(PyVar)*_size); return ret; }