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/macos/pocketpy/pocketpy.h
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

View File

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

View File

@ -84,6 +84,11 @@ struct Frame {
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){
PyVar value = _data[_data.size() + n];
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
public:
virtual PyVar next() = 0;
PyVarRef var;
PyVarRef loop_var;
BaseIter(VM* vm, PyVar _ref) : vm(vm), _ref(_ref) {}
virtual ~BaseIter() = default;
};