use fast move

Update safestl.h
This commit is contained in:
blueloveTH 2023-02-18 16:54:20 +08:00
parent d6bacab50f
commit a9726205ff
2 changed files with 7 additions and 5 deletions

View File

@ -186,7 +186,7 @@ PyVar VM::run_frame(Frame* frame){
case OP_RE_RAISE: _raise(); break; case OP_RE_RAISE: _raise(); break;
case OP_BUILD_LIST: case OP_BUILD_LIST:
frame->push(PyList( 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; break;
case OP_BUILD_MAP: case OP_BUILD_MAP:
{ {
@ -200,7 +200,7 @@ PyVar VM::run_frame(Frame* frame){
case OP_BUILD_SET: case OP_BUILD_SET:
{ {
PyVar list = PyList( 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)); PyVar obj = call(builtins->attr("set"), pkpy::one_arg(list));
frame->push(obj); frame->push(obj);

View File

@ -94,7 +94,8 @@ namespace pkpy {
Args(pkpy::List&& other) noexcept { Args(pkpy::List&& other) noexcept {
_alloc(other.size()); _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(); other.clear();
} }
@ -112,9 +113,10 @@ namespace pkpy {
inline int size() const { return _size; } inline int size() const { return _size; }
pkpy::List to_list() const { pkpy::List move_to_list() noexcept {
pkpy::List ret(_size); 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; return ret;
} }