This commit is contained in:
blueloveTH 2022-12-05 02:36:46 +08:00
parent 2f38cadf27
commit 2cd5d46ee9
3 changed files with 16 additions and 14 deletions

View File

@ -41,7 +41,7 @@ struct CodeObject {
std::vector<ByteCode> co_code; std::vector<ByteCode> co_code;
PyVarList co_consts; PyVarList co_consts;
std::vector<std::shared_ptr<NamePointer>> co_names; std::vector<NamePointer> co_names;
std::vector<_Str> co_global_names; std::vector<_Str> co_global_names;
// for goto use // for goto use
@ -61,9 +61,9 @@ struct CodeObject {
if(scope == NAME_LOCAL && std::find(co_global_names.begin(), co_global_names.end(), name) != co_global_names.end()){ if(scope == NAME_LOCAL && std::find(co_global_names.begin(), co_global_names.end(), name) != co_global_names.end()){
scope = NAME_GLOBAL; scope = NAME_GLOBAL;
} }
auto p = std::make_shared<NamePointer>(name, scope); auto p = NamePointer(name, scope);
for(int i=0; i<co_names.size(); i++){ for(int i=0; i<co_names.size(); i++){
if(*co_names[i] == *p) return i; if(co_names[i] == p) return i;
} }
co_names.push_back(p); co_names.push_back(p);
return co_names.size() - 1; return co_names.size() - 1;
@ -108,7 +108,7 @@ struct CodeObject {
_StrStream names; _StrStream names;
names << "co_names: "; names << "co_names: ";
for(int i=0; i<co_names.size(); i++){ for(int i=0; i<co_names.size(); i++){
names << co_names[i]->name; names << co_names[i].name;
if(i != co_names.size() - 1) names << ", "; if(i != co_names.size() - 1) names << ", ";
} }
ss << '\n' << consts.str() << '\n' << names.str() << '\n'; ss << '\n' << consts.str() << '\n' << names.str() << '\n';

View File

@ -10,7 +10,7 @@ struct BasePointer;
class VM; class VM;
class Frame; class Frame;
typedef std::shared_ptr<const BasePointer> _Pointer; typedef pkpy::shared_ptr<const BasePointer> _Pointer;
typedef PyVar (*_CppFunc)(VM*, const pkpy::ArgList&); typedef PyVar (*_CppFunc)(VM*, const pkpy::ArgList&);
typedef std::shared_ptr<CodeObject> _Code; typedef std::shared_ptr<CodeObject> _Code;

View File

@ -55,28 +55,30 @@ protected:
frame->push(obj); frame->push(obj);
} break; } break;
case OP_LOAD_NAME_PTR: { case OP_LOAD_NAME_PTR: {
frame->push(PyPointer(frame->code->co_names[byte.arg])); const BasePointer* p = new NamePointer(frame->code->co_names[byte.arg]);
frame->push(PyPointer(_Pointer(p)));
} break; } break;
case OP_STORE_NAME_PTR: { case OP_STORE_NAME_PTR: {
const auto& p = frame->code->co_names[byte.arg]; const auto& p = frame->code->co_names[byte.arg];
p->set(this, frame, frame->popValue(this)); p.set(this, frame, frame->popValue(this));
} break; } break;
case OP_BUILD_ATTR_PTR: { case OP_BUILD_ATTR_PTR: {
const auto& attr = frame->code->co_names[byte.arg]; const auto& attr = frame->code->co_names[byte.arg];
PyVar obj = frame->popValue(this); PyVar obj = frame->popValue(this);
frame->push(PyPointer(std::make_shared<AttrPointer>(obj, attr.get()))); const BasePointer* p = new AttrPointer(obj, &attr);
frame->push(PyPointer(_Pointer(p)));
} break; } break;
case OP_BUILD_ATTR_PTR_PTR: { case OP_BUILD_ATTR_PTR_PTR: {
const auto& attr = frame->code->co_names[byte.arg]; const auto& attr = frame->code->co_names[byte.arg];
PyVar obj = frame->popValue(this); PyVar obj = frame->popValue(this);
__checkType(obj, _tp_user_pointer); __checkType(obj, _tp_user_pointer);
const _Pointer& p = std::get<_Pointer>(obj->_native); const _Pointer& p = std::get<_Pointer>(obj->_native);
frame->push(PyPointer(std::make_shared<AttrPointer>(p->get(this, frame), attr.get()))); frame->push(PyPointer(_Pointer(new AttrPointer(p->get(this, frame), &attr))));
} break; } break;
case OP_BUILD_INDEX_PTR: { case OP_BUILD_INDEX_PTR: {
PyVar index = frame->popValue(this); PyVar index = frame->popValue(this);
PyVar obj = frame->popValue(this); PyVar obj = frame->popValue(this);
frame->push(PyPointer(std::make_shared<IndexPointer>(obj, index))); frame->push(PyPointer(_Pointer(new IndexPointer(obj, index))));
} break; } break;
case OP_STORE_PTR: { case OP_STORE_PTR: {
PyVar obj = frame->popValue(this); PyVar obj = frame->popValue(this);
@ -106,7 +108,7 @@ protected:
std::vector<_Pointer> pointers(items.size()); std::vector<_Pointer> pointers(items.size());
for(int i=0; i<items.size(); i++) for(int i=0; i<items.size(); i++)
pointers[i] = PyPointer_AS_C(items[i]); pointers[i] = PyPointer_AS_C(items[i]);
frame->push(PyPointer(std::make_shared<CompoundPointer>(pointers))); frame->push(PyPointer(_Pointer(new CompoundPointer(pointers))));
} break; } break;
case OP_BUILD_STRING: case OP_BUILD_STRING:
{ {
@ -133,7 +135,7 @@ protected:
} break; } break;
case OP_BUILD_CLASS: case OP_BUILD_CLASS:
{ {
const _Str& clsName = frame->code->co_names[byte.arg]->name; const _Str& clsName = frame->code->co_names[byte.arg].name;
PyVar clsBase = frame->popValue(this); PyVar clsBase = frame->popValue(this);
if(clsBase == None) clsBase = _tp_object; if(clsBase == None) clsBase = _tp_object;
__checkType(clsBase, _tp_type); __checkType(clsBase, _tp_type);
@ -209,7 +211,7 @@ protected:
{ {
// _pointer to pointer // _pointer to pointer
const _Pointer p = PyPointer_AS_C(frame->__pop()); const _Pointer p = PyPointer_AS_C(frame->__pop());
_Pointer up = std::make_shared<UserPointer>(p, frame->id); _Pointer up(new UserPointer(p, frame->id));
frame->push(newObject(_tp_user_pointer, std::move(up))); frame->push(newObject(_tp_user_pointer, std::move(up)));
} break; } break;
case OP_UNARY_DEREF: case OP_UNARY_DEREF:
@ -318,7 +320,7 @@ protected:
} break; } break;
case OP_IMPORT_NAME: case OP_IMPORT_NAME:
{ {
const _Str& name = frame->code->co_names[byte.arg]->name; const _Str& name = frame->code->co_names[byte.arg].name;
auto it = _modules.find(name); auto it = _modules.find(name);
if(it == _modules.end()){ if(it == _modules.end()){
auto it2 = _lazyModules.find(name); auto it2 = _lazyModules.find(name);