فهرست منبع

use fast move

Update safestl.h
blueloveTH 3 سال پیش
والد
کامیت
a9726205ff
2فایلهای تغییر یافته به همراه7 افزوده شده و 5 حذف شده
  1. 2 2
      src/ceval.h
  2. 5 3
      src/safestl.h

+ 2 - 2
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);

+ 5 - 3
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;
         }