blueloveTH 2 年之前
父節點
當前提交
c2a9b77a18
共有 4 個文件被更改,包括 18 次插入11 次删除
  1. 2 1
      src/iter.h
  2. 2 2
      src/obj.h
  3. 12 7
      src/tuplelist.h
  4. 2 1
      src/vm.h

+ 2 - 1
src/iter.h

@@ -69,7 +69,8 @@ inline PyObject* Generator::next(){
         frame = std::move(vm->callstack.top());
         vm->callstack.pop();
         state = 1;
-        return frame.popx();
+        PyObject** _sp = frame._sp;
+        return POPX();
     }else{
         state = 2;
         return nullptr;

+ 2 - 2
src/obj.h

@@ -139,11 +139,11 @@ struct Py_ final: PyObject {
 };
 
 #define OBJ_GET(T, obj) (((Py_<T>*)(obj))->_value)
-#define OBJ_MARK(obj) if(!is_tagged(obj)) obj->_obj_gc_mark()
+#define OBJ_MARK(obj) if(!is_tagged(obj)) (obj)->_obj_gc_mark()
 
 Str obj_type_name(VM* vm, Type type);
 
-#if DEBUG_NO_BUILTIN_MODULES
+#if DEBUG_NO_BUILTIN_MODULES || DEBUG_NO_NAME_GETTER
 #define OBJ_NAME(obj) Str("<?>")
 #else
 #define OBJ_NAME(obj) OBJ_GET(Str, vm->getattr(obj, __name__))

+ 12 - 7
src/tuplelist.h

@@ -60,13 +60,6 @@ public:
     PyObject** begin() const { return _args; }
     PyObject** end() const { return _args + _size; }
 
-    List to_list() noexcept {
-        List ret(_size);
-        // TODO: use move/memcpy
-        for(int i=0; i<_size; i++) ret[i] = _args[i];
-        return ret;
-    }
-
     void extend_self(PyObject* self){
         PyObject** old_args = _args;
         int old_size = _size;
@@ -99,6 +92,18 @@ struct ArgsView{
     int size() const { return _end - _begin; }
     bool empty() const { return _begin == _end; }
     PyObject* operator[](int i) const { return _begin[i]; }
+
+    List to_list() const{
+        List ret(size());
+        for(int i=0; i<size(); i++) ret[i] = _begin[i];
+        return ret;
+    }
+
+    Tuple to_tuple() const{
+        Tuple ret(size());
+        for(int i=0; i<size(); i++) ret[i] = _begin[i];
+        return ret;
+    }
 };
 
 }   // namespace pkpy

+ 2 - 1
src/vm.h

@@ -897,7 +897,8 @@ inline void VM::_error(Exception e){
         e.is_re = false;
         throw e;
     }
-    top_frame()->push(VAR(e));
+    PyObject** _sp = top_frame()->_sp;
+    PUSH(VAR(e));
     _raise();
 }