diff --git a/src/codeobject.h b/src/codeobject.h index 6cecdc0c..eafaf293 100644 --- a/src/codeobject.h +++ b/src/codeobject.h @@ -153,7 +153,7 @@ public: inline PyVar __pop(){ if(s_data.empty()) throw std::runtime_error("s_data.empty() is true"); - PyVar v = s_data.back(); + PyVar v = std::move(s_data.back()); s_data.pop_back(); return v; } @@ -173,10 +173,14 @@ public: return __deref_pointer(vm, s_data[s_data.size() + n]); } - inline void push(PyVar v){ + inline void push(const PyVar& v){ s_data.push_back(v); } + inline void push(PyVar&& v){ + s_data.emplace_back(std::move(v)); + } + void __reportForIter(){ int lastIp = ip - 1; @@ -209,7 +213,7 @@ public: PyVarList popNValuesReversed(VM* vm, int n){ PyVarList v(n); - for(int i=n-1; i>=0; i--) v[i] = popValue(vm); + for(int i=n-1; i>=0; i--) v[i] = std::move(popValue(vm)); return v; } diff --git a/src/main.cpp b/src/main.cpp index f8d55f83..286e869e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,7 +2,7 @@ #include "pocketpy.h" -//#define PK_DEBUG_TIME +#define PK_DEBUG_TIME struct Timer{ const char* title; diff --git a/src/vm.h b/src/vm.h index 48e8e33c..3baa0cdd 100644 --- a/src/vm.h +++ b/src/vm.h @@ -32,14 +32,13 @@ _raw = new PyObject(_native); \ _raw->setType(ptype); \ } \ - PyVar obj = PyVar(_raw, [this](PyObject* p){\ + return PyVar(_raw, [this](PyObject* p){ \ if(_pool##name.size() < max_size){ \ _pool##name.push_back(p); \ }else{ \ delete p; \ } \ }); \ - return obj; \ } typedef void(*PrintFn)(const VM*, const char*); @@ -84,7 +83,7 @@ private: case OP_STORE_PTR: { PyVar obj = frame->popValue(this); _Pointer p = PyPointer_AS_C(frame->__pop()); - p->set(this, frame, obj); + p->set(this, frame, std::move(obj)); } break; case OP_DELETE_PTR: { _Pointer p = PyPointer_AS_C(frame->__pop()); @@ -161,13 +160,13 @@ private: { PyVar rhs = frame->popValue(this); PyVar lhs = frame->popValue(this); - frame->push(fastCall(lhs, BINARY_SPECIAL_METHODS[byte.arg], {lhs,rhs})); + frame->push(fastCall(lhs, BINARY_SPECIAL_METHODS[byte.arg], {lhs,std::move(rhs)})); } break; case OP_BITWISE_OP: { PyVar rhs = frame->popValue(this); PyVar lhs = frame->popValue(this); - frame->push(fastCall(lhs, BITWISE_SPECIAL_METHODS[byte.arg], {lhs,rhs})); + frame->push(fastCall(lhs, BITWISE_SPECIAL_METHODS[byte.arg], {lhs,std::move(rhs)})); } break; case OP_COMPARE_OP: { @@ -175,9 +174,9 @@ private: PyVar lhs = frame->popValue(this); // for __ne__ we use the negation of __eq__ int op = byte.arg == 3 ? 2 : byte.arg; - PyVar res = fastCall(lhs, CMP_SPECIAL_METHODS[op], {lhs,rhs}); + PyVar res = fastCall(lhs, CMP_SPECIAL_METHODS[op], {lhs,std::move(rhs)}); if(op != byte.arg) res = PyBool(!PyBool_AS_C(res)); - frame->push(res); + frame->push(std::move(res)); } break; case OP_IS_OP: { @@ -240,9 +239,9 @@ private: { PyVarList args = frame->popNValuesReversed(this, byte.arg); PyVar callable = frame->popValue(this); - PyVar ret = call(callable, args, true); + PyVar ret = call(std::move(callable), std::move(args), true); if(ret == __py2py_call_signal) return ret; - frame->push(ret); + frame->push(std::move(ret)); } break; case OP_JUMP_ABSOLUTE: frame->jump(byte.arg); break; case OP_SAFE_JUMP_ABSOLUTE: frame->safeJump(byte.arg); break; @@ -383,13 +382,13 @@ public: } PyVar fastCall(const PyVar& obj, const _Str& name, PyVarList args){ - PyVar cls = obj->_type; - while(cls != None) { + PyObject* cls = obj->_type.get(); + while(cls != None.get()) { auto it = cls->attribs.find(name); if(it != cls->attribs.end()){ return call(it->second, args); } - cls = cls->attribs[__base__]; + cls = cls->attribs[__base__].get(); } attributeError(obj, name); return nullptr; @@ -548,8 +547,8 @@ public: auto it = obj->attribs.find(name); if(it != obj->attribs.end()) return it->second; - PyVar cls = obj->_type; - while(cls != None) { + PyObject* cls = obj->_type.get(); + while(cls != None.get()) { it = cls->attribs.find(name); if(it != cls->attribs.end()){ PyVar valueFromCls = it->second; @@ -559,16 +558,20 @@ public: return valueFromCls; } } - cls = cls->attribs[__base__]; + cls = cls->attribs[__base__].get(); } if(throw_err) attributeError(obj, name); return nullptr; } - inline void setAttr(PyVar& obj, const _Str& name, PyVar value) { + inline void setAttr(PyVar& obj, const _Str& name, const PyVar& value) { obj->attribs[name] = value; } + inline void setAttr(PyVar& obj, const _Str& name, PyVar&& value) { + obj->attribs[name] = std::move(value); + } + void bindMethod(_Str typeName, _Str funcName, _CppFunc fn) { funcName.intern(); PyVar type = _types[typeName]; @@ -906,7 +909,7 @@ void CompoundPointer::del(VM* vm, Frame* frame) const{ /***** Frame's Impl *****/ inline PyVar Frame::__deref_pointer(VM* vm, PyVar v){ - if(v->isType(vm->_tp_pointer)) v = vm->PyPointer_AS_C(v)->get(vm, this); + if(v->isType(vm->_tp_pointer)) return vm->PyPointer_AS_C(v)->get(vm, this); return v; } diff --git a/test_cpp.sh b/test_cpp.sh new file mode 100644 index 00000000..d79f9fd9 --- /dev/null +++ b/test_cpp.sh @@ -0,0 +1,7 @@ +g++ -o pocketpy src/main.cpp --std=c++17 -pg -O1 -pthread + +./pocketpy tests/1.py + +gprof pocketpy gmon.out > gprof.txt + +rm gmon.out \ No newline at end of file diff --git a/test_cpp_1.sh b/test_cpp_1.sh deleted file mode 100644 index de57a2c9..00000000 --- a/test_cpp_1.sh +++ /dev/null @@ -1,8 +0,0 @@ -g++ -o pocketpy src/main.cpp --std=c++17 -pg -O1 -pthread -Wno-literal-suffix - -./pocketpy tests/1.py - -gprof pocketpy gmon.out > gprof.txt - -#gprof pocketpy | gprof2dot | dot -Tsvg -o output.svg -rm gmon.out \ No newline at end of file diff --git a/tests/1.py b/tests/1.py new file mode 100644 index 00000000..4a5d1f56 --- /dev/null +++ b/tests/1.py @@ -0,0 +1,16 @@ +def is_prime(x): + if x<2: + return False + for i in range(2,x): + if x%i == 0: + return False + return True + +def test(n): + k = 0 + for i in range(n): + if is_prime(i): + k += 1 + return k + +print(test(10000)) \ No newline at end of file