This commit is contained in:
blueloveTH 2023-02-19 22:05:19 +08:00
parent b23c4fe6c9
commit 8433d40f2c
9 changed files with 29 additions and 18 deletions

1
.gitignore vendored
View File

@ -18,3 +18,4 @@ plugins/flutter/example/web/lib/pocketpy.wasm
plugins/flutter/src/pocketpy.h plugins/flutter/src/pocketpy.h
plugins/macos/pocketpy/pocketpy.h plugins/macos/pocketpy/pocketpy.h
plugins/godot/godot-cpp/ plugins/godot/godot-cpp/
123.txt

View File

@ -1,6 +0,0 @@
x = 0
for i in range(5000000):
x += 1
assert x == 5000000

2
benchmarks/loop_0.py Normal file
View File

@ -0,0 +1,2 @@
for i in range(10000000):
pass

2
benchmarks/loop_1.py Normal file
View File

@ -0,0 +1,2 @@
for i in range(10000000):
x = i

6
benchmarks/loop_2.py Normal file
View File

@ -0,0 +1,6 @@
x = 0
for i in range(10000000):
x += 1
assert x == 10000000

View File

@ -1,6 +1,6 @@
g++ -o pocketpy src/main.cpp --std=c++17 -pg -O1 -fno-rtti g++ -o pocketpy src/main.cpp --std=c++17 -pg -O2 -fno-rtti
./pocketpy benchmarks/simple.py ./pocketpy benchmarks/loop_1.py
gprof pocketpy gmon.out > gprof.txt gprof pocketpy gmon.out > gprof.txt

View File

@ -55,9 +55,11 @@ PyVar VM::run_frame(Frame* frame){
else frame->push(PyRef(ref)); else frame->push(PyRef(ref));
} continue; } continue;
case OP_STORE_REF: { case OP_STORE_REF: {
PyVar obj = frame->pop_value(this); // PyVar obj = frame->pop_value(this);
PyVarRef r = frame->pop(); // PyVarRef r = frame->pop();
PyRef_AS_C(r)->set(this, frame, std::move(obj)); // PyRef_AS_C(r)->set(this, frame, std::move(obj));
PyRef_AS_C(frame->top_1())->set(this, frame, frame->top_value(this));
frame->_pop(); frame->_pop();
} continue; } continue;
case OP_DELETE_REF: case OP_DELETE_REF:
PyRef_AS_C(frame->top())->del(this, frame); PyRef_AS_C(frame->top())->del(this, frame);
@ -228,17 +230,16 @@ PyVar VM::run_frame(Frame* frame){
} continue; } continue;
case OP_GET_ITER: { case OP_GET_ITER: {
PyVar obj = frame->pop_value(this); PyVar obj = frame->pop_value(this);
PyVar iter_obj = asIter(obj); PyVar iter = asIter(obj);
PyVarRef var = frame->pop(); check_type(frame->top(), tp_ref);
check_type(var, tp_ref); PyIter_AS_C(iter)->loop_var = frame->pop();
PyIter_AS_C(iter_obj)->var = var; frame->push(std::move(iter));
frame->push(std::move(iter_obj));
} continue; } continue;
case OP_FOR_ITER: { case OP_FOR_ITER: {
auto& it = PyIter_AS_C(frame->top()); auto& it = PyIter_AS_C(frame->top());
PyVar obj = it->next(); PyVar obj = it->next();
if(obj != nullptr){ if(obj != nullptr){
PyRef_AS_C(it->var)->set(this, frame, std::move(obj)); PyRef_AS_C(it->loop_var)->set(this, frame, std::move(obj));
}else{ }else{
int blockEnd = frame->co->blocks[byte.block].end; int blockEnd = frame->co->blocks[byte.block].end;
frame->jump_abs_safe(blockEnd); frame->jump_abs_safe(blockEnd);

View File

@ -84,6 +84,11 @@ struct Frame {
return _data.back(); return _data.back();
} }
inline PyVar& top_1(){
if(_data.size() < 2) throw std::runtime_error("_data.size() < 2");
return _data[_data.size()-2];
}
inline PyVar top_value_offset(VM* vm, int n){ inline PyVar top_value_offset(VM* vm, int n){
PyVar value = _data[_data.size() + n]; PyVar value = _data[_data.size() + n];
try_deref(vm, value); try_deref(vm, value);

View File

@ -71,7 +71,7 @@ protected:
PyVar _ref; // keep a reference to the object so it will not be deleted while iterating PyVar _ref; // keep a reference to the object so it will not be deleted while iterating
public: public:
virtual PyVar next() = 0; virtual PyVar next() = 0;
PyVarRef var; PyVarRef loop_var;
BaseIter(VM* vm, PyVar _ref) : vm(vm), _ref(_ref) {} BaseIter(VM* vm, PyVar _ref) : vm(vm), _ref(_ref) {}
virtual ~BaseIter() = default; virtual ~BaseIter() = default;
}; };