This commit is contained in:
blueloveTH 2022-12-05 19:01:29 +08:00
parent d450c11478
commit 040ef62d51
4 changed files with 39 additions and 31 deletions

View File

@ -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;
} }
}; };

View File

@ -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)

View File

@ -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();
} }

View File

@ -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);