mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 03:20:18 +00:00
up
This commit is contained in:
parent
b23c4fe6c9
commit
8433d40f2c
1
.gitignore
vendored
1
.gitignore
vendored
@ -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
|
||||
|
@ -1,6 +0,0 @@
|
||||
x = 0
|
||||
|
||||
for i in range(5000000):
|
||||
x += 1
|
||||
|
||||
assert x == 5000000
|
2
benchmarks/loop_0.py
Normal file
2
benchmarks/loop_0.py
Normal file
@ -0,0 +1,2 @@
|
||||
for i in range(10000000):
|
||||
pass
|
2
benchmarks/loop_1.py
Normal file
2
benchmarks/loop_1.py
Normal file
@ -0,0 +1,2 @@
|
||||
for i in range(10000000):
|
||||
x = i
|
6
benchmarks/loop_2.py
Normal file
6
benchmarks/loop_2.py
Normal file
@ -0,0 +1,6 @@
|
||||
x = 0
|
||||
|
||||
for i in range(10000000):
|
||||
x += 1
|
||||
|
||||
assert x == 10000000
|
@ -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
|
||||
|
||||
|
19
src/ceval.h
19
src/ceval.h
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user