mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-21 20:10:17 +00:00
optimize
This commit is contained in:
parent
d450c11478
commit
040ef62d51
@ -79,7 +79,7 @@ struct CodeObject {
|
|||||||
auto _start = co_code.begin() + start;
|
auto _start = co_code.begin() + start;
|
||||||
auto _end = co_code.begin() + end;
|
auto _end = co_code.begin() + end;
|
||||||
co_code.insert(co_code.end(), _start, _end);
|
co_code.insert(co_code.end(), _start, _end);
|
||||||
for(int i=start; i<end; i++) co_code[i].op = OP_NO_OP;
|
for(int i=start; i<end; i++) co_code[i].op = OP_DELETED_OP;
|
||||||
}
|
}
|
||||||
|
|
||||||
_Str toString(){
|
_Str toString(){
|
||||||
@ -227,15 +227,15 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PyVarList popNValuesReversed(VM* vm, int n){
|
pkpy::ArgList popNValuesReversed(VM* vm, int n){
|
||||||
PyVarList v(n);
|
pkpy::ArgList v(n);
|
||||||
for(int i=n-1; i>=0; i--) v[i] = std::move(popValue(vm));
|
for(int i=n-1; i>=0; i--) v._index(i) = std::move(popValue(vm));
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
PyVarList __popNReversed(int n){
|
pkpy::ArgList __popNReversed(int n){
|
||||||
PyVarList v(n);
|
pkpy::ArgList v(n);
|
||||||
for(int i=n-1; i>=0; i--) v[i] = std::move(__pop());
|
for(int i=n-1; i>=0; i--) v._index(i) = std::move(__pop());
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
};
|
};
|
@ -1,6 +1,7 @@
|
|||||||
#ifdef OPCODE
|
#ifdef OPCODE
|
||||||
|
|
||||||
OPCODE(NO_OP)
|
OPCODE(NO_OP)
|
||||||
|
OPCODE(DELETED_OP)
|
||||||
OPCODE(LOAD_CONST)
|
OPCODE(LOAD_CONST)
|
||||||
OPCODE(IMPORT_NAME)
|
OPCODE(IMPORT_NAME)
|
||||||
OPCODE(PRINT_EXPR)
|
OPCODE(PRINT_EXPR)
|
||||||
|
@ -137,6 +137,10 @@ namespace pkpy {
|
|||||||
return _args[i];
|
return _args[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline PyVar& _index(uint8_t i){
|
||||||
|
return _args[i];
|
||||||
|
}
|
||||||
|
|
||||||
// overload = for &&
|
// overload = for &&
|
||||||
ArgList& operator=(ArgList&& other){
|
ArgList& operator=(ArgList&& other){
|
||||||
if(this != &other){
|
if(this != &other){
|
||||||
@ -162,6 +166,14 @@ namespace pkpy {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PyVarList toList() const {
|
||||||
|
PyVarList ret(_size);
|
||||||
|
for(uint8_t i=0; i<_size; i++){
|
||||||
|
ret[i] = _args[i];
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
~ArgList(){
|
~ArgList(){
|
||||||
__tryRelease();
|
__tryRelease();
|
||||||
}
|
}
|
||||||
|
43
src/vm.h
43
src/vm.h
@ -91,10 +91,10 @@ protected:
|
|||||||
} break;
|
} break;
|
||||||
case OP_BUILD_SMART_TUPLE:
|
case OP_BUILD_SMART_TUPLE:
|
||||||
{
|
{
|
||||||
PyVarList items = frame->__popNReversed(byte.arg);
|
pkpy::ArgList items = frame->__popNReversed(byte.arg);
|
||||||
bool done = false;
|
bool done = false;
|
||||||
for(auto& item : items){
|
for(int i=0; i<items.size(); i++){
|
||||||
if(!item->isType(_tp_pointer)) {
|
if(!items[i]->isType(_tp_pointer)) {
|
||||||
done = true;
|
done = true;
|
||||||
PyVarList values(items.size());
|
PyVarList values(items.size());
|
||||||
for(int i=0; i<items.size(); i++){
|
for(int i=0; i<items.size(); i++){
|
||||||
@ -112,9 +112,9 @@ protected:
|
|||||||
} break;
|
} break;
|
||||||
case OP_BUILD_STRING:
|
case OP_BUILD_STRING:
|
||||||
{
|
{
|
||||||
PyVarList items = frame->popNValuesReversed(this, byte.arg);
|
pkpy::ArgList items = frame->popNValuesReversed(this, byte.arg);
|
||||||
_StrStream ss;
|
_StrStream ss;
|
||||||
for(const auto& i : items) ss << PyStr_AS_C(asStr(i));
|
for(int i=0; i<items.size(); i++) ss << PyStr_AS_C(asStr(items[i]));
|
||||||
frame->push(PyStr(ss.str()));
|
frame->push(PyStr(ss.str()));
|
||||||
} break;
|
} break;
|
||||||
case OP_LOAD_EVAL_FN: {
|
case OP_LOAD_EVAL_FN: {
|
||||||
@ -124,7 +124,7 @@ protected:
|
|||||||
pkpy::ArgList args(2);
|
pkpy::ArgList args(2);
|
||||||
args[1] = frame->popValue(this); // obj
|
args[1] = frame->popValue(this); // obj
|
||||||
args[0] = frame->__topValueN(this, -2); // list
|
args[0] = frame->__topValueN(this, -2); // list
|
||||||
fastCall(args[0], "append"_c, std::move(args));
|
fastCall("append"_c, std::move(args));
|
||||||
} break;
|
} break;
|
||||||
case OP_STORE_FUNCTION:
|
case OP_STORE_FUNCTION:
|
||||||
{
|
{
|
||||||
@ -159,26 +159,20 @@ protected:
|
|||||||
case OP_POP_TOP: frame->popValue(this); break;
|
case OP_POP_TOP: frame->popValue(this); break;
|
||||||
case OP_BINARY_OP:
|
case OP_BINARY_OP:
|
||||||
{
|
{
|
||||||
pkpy::ArgList args(2);
|
pkpy::ArgList args = frame->popNValuesReversed(this, 2);
|
||||||
args[1] = frame->popValue(this);
|
frame->push(fastCall(BINARY_SPECIAL_METHODS[byte.arg], std::move(args)));
|
||||||
args[0] = frame->popValue(this);
|
|
||||||
frame->push(fastCall(args[0], BINARY_SPECIAL_METHODS[byte.arg], std::move(args)));
|
|
||||||
} break;
|
} break;
|
||||||
case OP_BITWISE_OP:
|
case OP_BITWISE_OP:
|
||||||
{
|
{
|
||||||
pkpy::ArgList args(2);
|
pkpy::ArgList args = frame->popNValuesReversed(this, 2);
|
||||||
args[1] = frame->popValue(this);
|
frame->push(fastCall(BITWISE_SPECIAL_METHODS[byte.arg], std::move(args)));
|
||||||
args[0] = frame->popValue(this);
|
|
||||||
frame->push(fastCall(args[0], BITWISE_SPECIAL_METHODS[byte.arg], std::move(args)));
|
|
||||||
} break;
|
} break;
|
||||||
case OP_COMPARE_OP:
|
case OP_COMPARE_OP:
|
||||||
{
|
{
|
||||||
pkpy::ArgList args(2);
|
pkpy::ArgList args = frame->popNValuesReversed(this, 2);
|
||||||
args[1] = frame->popValue(this);
|
|
||||||
args[0] = frame->popValue(this);
|
|
||||||
// for __ne__ we use the negation of __eq__
|
// for __ne__ we use the negation of __eq__
|
||||||
int op = byte.arg == 3 ? 2 : byte.arg;
|
int op = byte.arg == 3 ? 2 : byte.arg;
|
||||||
PyVar res = fastCall(args[0], CMP_SPECIAL_METHODS[op], std::move(args));
|
PyVar res = fastCall(CMP_SPECIAL_METHODS[op], std::move(args));
|
||||||
if(op != byte.arg) res = PyBool(!PyBool_AS_C(res));
|
if(op != byte.arg) res = PyBool(!PyBool_AS_C(res));
|
||||||
frame->push(std::move(res));
|
frame->push(std::move(res));
|
||||||
} break;
|
} break;
|
||||||
@ -192,7 +186,7 @@ protected:
|
|||||||
{
|
{
|
||||||
PyVar rhs = frame->popValue(this);
|
PyVar rhs = frame->popValue(this);
|
||||||
PyVar lhs = frame->popValue(this);
|
PyVar lhs = frame->popValue(this);
|
||||||
bool ret_c = PyBool_AS_C(call(std::move(rhs), __contains__, {std::move(lhs)}));
|
bool ret_c = PyBool_AS_C(call(rhs, __contains__, {std::move(lhs)}));
|
||||||
if(byte.arg == 1) ret_c = !ret_c;
|
if(byte.arg == 1) ret_c = !ret_c;
|
||||||
frame->push(PyBool(ret_c));
|
frame->push(PyBool(ret_c));
|
||||||
} break;
|
} break;
|
||||||
@ -241,12 +235,12 @@ protected:
|
|||||||
} break;
|
} break;
|
||||||
case OP_BUILD_LIST:
|
case OP_BUILD_LIST:
|
||||||
{
|
{
|
||||||
PyVarList items = frame->popNValuesReversed(this, byte.arg);
|
pkpy::ArgList items = frame->popNValuesReversed(this, byte.arg);
|
||||||
frame->push(PyList(items));
|
frame->push(PyList(items.toList()));
|
||||||
} break;
|
} break;
|
||||||
case OP_BUILD_MAP:
|
case OP_BUILD_MAP:
|
||||||
{
|
{
|
||||||
PyVarList items = frame->popNValuesReversed(this, byte.arg*2);
|
pkpy::ArgList items = frame->popNValuesReversed(this, byte.arg*2);
|
||||||
PyVar obj = call(builtins->attribs["dict"], {});
|
PyVar obj = call(builtins->attribs["dict"], {});
|
||||||
for(int i=0; i<items.size(); i+=2){
|
for(int i=0; i<items.size(); i+=2){
|
||||||
call(obj, __setitem__, {items[i], items[i+1]});
|
call(obj, __setitem__, {items[i], items[i+1]});
|
||||||
@ -256,7 +250,7 @@ protected:
|
|||||||
case OP_DUP_TOP: frame->push(frame->topValue(this)); break;
|
case OP_DUP_TOP: frame->push(frame->topValue(this)); break;
|
||||||
case OP_CALL:
|
case OP_CALL:
|
||||||
{
|
{
|
||||||
PyVarList args = frame->popNValuesReversed(this, byte.arg);
|
pkpy::ArgList args = frame->popNValuesReversed(this, byte.arg);
|
||||||
PyVar callable = frame->popValue(this);
|
PyVar callable = frame->popValue(this);
|
||||||
PyVar ret = call(std::move(callable), std::move(args), true);
|
PyVar ret = call(std::move(callable), std::move(args), true);
|
||||||
if(ret == __py2py_call_signal) return ret;
|
if(ret == __py2py_call_signal) return ret;
|
||||||
@ -448,7 +442,8 @@ public:
|
|||||||
return True;
|
return True;
|
||||||
}
|
}
|
||||||
|
|
||||||
PyVar fastCall(const PyVar& obj, const _Str& name, pkpy::ArgList&& args){
|
PyVar fastCall(const _Str& name, pkpy::ArgList&& args){
|
||||||
|
const PyVar& obj = args[0];
|
||||||
PyObject* cls = obj->_type.get();
|
PyObject* cls = obj->_type.get();
|
||||||
while(cls != None.get()) {
|
while(cls != None.get()) {
|
||||||
auto it = cls->attribs.find(name);
|
auto it = cls->attribs.find(name);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user