mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 11:30: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/flutter/src/pocketpy.h
|
||||||
plugins/macos/pocketpy/pocketpy.h
|
plugins/macos/pocketpy/pocketpy.h
|
||||||
plugins/godot/godot-cpp/
|
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
|
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));
|
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);
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user