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 _end = co_code.begin() + 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(){
|
||||
@ -227,15 +227,15 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
PyVarList popNValuesReversed(VM* vm, int n){
|
||||
PyVarList v(n);
|
||||
for(int i=n-1; i>=0; i--) v[i] = std::move(popValue(vm));
|
||||
pkpy::ArgList popNValuesReversed(VM* vm, int n){
|
||||
pkpy::ArgList v(n);
|
||||
for(int i=n-1; i>=0; i--) v._index(i) = std::move(popValue(vm));
|
||||
return v;
|
||||
}
|
||||
|
||||
PyVarList __popNReversed(int n){
|
||||
PyVarList v(n);
|
||||
for(int i=n-1; i>=0; i--) v[i] = std::move(__pop());
|
||||
pkpy::ArgList __popNReversed(int n){
|
||||
pkpy::ArgList v(n);
|
||||
for(int i=n-1; i>=0; i--) v._index(i) = std::move(__pop());
|
||||
return v;
|
||||
}
|
||||
};
|
@ -1,6 +1,7 @@
|
||||
#ifdef OPCODE
|
||||
|
||||
OPCODE(NO_OP)
|
||||
OPCODE(DELETED_OP)
|
||||
OPCODE(LOAD_CONST)
|
||||
OPCODE(IMPORT_NAME)
|
||||
OPCODE(PRINT_EXPR)
|
||||
|
@ -137,6 +137,10 @@ namespace pkpy {
|
||||
return _args[i];
|
||||
}
|
||||
|
||||
inline PyVar& _index(uint8_t i){
|
||||
return _args[i];
|
||||
}
|
||||
|
||||
// overload = for &&
|
||||
ArgList& operator=(ArgList&& other){
|
||||
if(this != &other){
|
||||
@ -162,6 +166,14 @@ namespace pkpy {
|
||||
return ret;
|
||||
}
|
||||
|
||||
PyVarList toList() const {
|
||||
PyVarList ret(_size);
|
||||
for(uint8_t i=0; i<_size; i++){
|
||||
ret[i] = _args[i];
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
~ArgList(){
|
||||
__tryRelease();
|
||||
}
|
||||
|
43
src/vm.h
43
src/vm.h
@ -91,10 +91,10 @@ protected:
|
||||
} break;
|
||||
case OP_BUILD_SMART_TUPLE:
|
||||
{
|
||||
PyVarList items = frame->__popNReversed(byte.arg);
|
||||
pkpy::ArgList items = frame->__popNReversed(byte.arg);
|
||||
bool done = false;
|
||||
for(auto& item : items){
|
||||
if(!item->isType(_tp_pointer)) {
|
||||
for(int i=0; i<items.size(); i++){
|
||||
if(!items[i]->isType(_tp_pointer)) {
|
||||
done = true;
|
||||
PyVarList values(items.size());
|
||||
for(int i=0; i<items.size(); i++){
|
||||
@ -112,9 +112,9 @@ protected:
|
||||
} break;
|
||||
case OP_BUILD_STRING:
|
||||
{
|
||||
PyVarList items = frame->popNValuesReversed(this, byte.arg);
|
||||
pkpy::ArgList items = frame->popNValuesReversed(this, byte.arg);
|
||||
_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()));
|
||||
} break;
|
||||
case OP_LOAD_EVAL_FN: {
|
||||
@ -124,7 +124,7 @@ protected:
|
||||
pkpy::ArgList args(2);
|
||||
args[1] = frame->popValue(this); // obj
|
||||
args[0] = frame->__topValueN(this, -2); // list
|
||||
fastCall(args[0], "append"_c, std::move(args));
|
||||
fastCall("append"_c, std::move(args));
|
||||
} break;
|
||||
case OP_STORE_FUNCTION:
|
||||
{
|
||||
@ -159,26 +159,20 @@ protected:
|
||||
case OP_POP_TOP: frame->popValue(this); break;
|
||||
case OP_BINARY_OP:
|
||||
{
|
||||
pkpy::ArgList args(2);
|
||||
args[1] = frame->popValue(this);
|
||||
args[0] = frame->popValue(this);
|
||||
frame->push(fastCall(args[0], BINARY_SPECIAL_METHODS[byte.arg], std::move(args)));
|
||||
pkpy::ArgList args = frame->popNValuesReversed(this, 2);
|
||||
frame->push(fastCall(BINARY_SPECIAL_METHODS[byte.arg], std::move(args)));
|
||||
} break;
|
||||
case OP_BITWISE_OP:
|
||||
{
|
||||
pkpy::ArgList args(2);
|
||||
args[1] = frame->popValue(this);
|
||||
args[0] = frame->popValue(this);
|
||||
frame->push(fastCall(args[0], BITWISE_SPECIAL_METHODS[byte.arg], std::move(args)));
|
||||
pkpy::ArgList args = frame->popNValuesReversed(this, 2);
|
||||
frame->push(fastCall(BITWISE_SPECIAL_METHODS[byte.arg], std::move(args)));
|
||||
} break;
|
||||
case OP_COMPARE_OP:
|
||||
{
|
||||
pkpy::ArgList args(2);
|
||||
args[1] = frame->popValue(this);
|
||||
args[0] = frame->popValue(this);
|
||||
pkpy::ArgList args = frame->popNValuesReversed(this, 2);
|
||||
// for __ne__ we use the negation of __eq__
|
||||
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));
|
||||
frame->push(std::move(res));
|
||||
} break;
|
||||
@ -192,7 +186,7 @@ protected:
|
||||
{
|
||||
PyVar rhs = 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;
|
||||
frame->push(PyBool(ret_c));
|
||||
} break;
|
||||
@ -241,12 +235,12 @@ protected:
|
||||
} break;
|
||||
case OP_BUILD_LIST:
|
||||
{
|
||||
PyVarList items = frame->popNValuesReversed(this, byte.arg);
|
||||
frame->push(PyList(items));
|
||||
pkpy::ArgList items = frame->popNValuesReversed(this, byte.arg);
|
||||
frame->push(PyList(items.toList()));
|
||||
} break;
|
||||
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"], {});
|
||||
for(int i=0; i<items.size(); i+=2){
|
||||
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_CALL:
|
||||
{
|
||||
PyVarList args = frame->popNValuesReversed(this, byte.arg);
|
||||
pkpy::ArgList args = frame->popNValuesReversed(this, byte.arg);
|
||||
PyVar callable = frame->popValue(this);
|
||||
PyVar ret = call(std::move(callable), std::move(args), true);
|
||||
if(ret == __py2py_call_signal) return ret;
|
||||
@ -448,7 +442,8 @@ public:
|
||||
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();
|
||||
while(cls != None.get()) {
|
||||
auto it = cls->attribs.find(name);
|
||||
|
Loading…
x
Reference in New Issue
Block a user