This commit is contained in:
blueloveTH 2022-12-07 21:19:56 +08:00
parent f57ca260ea
commit 91d9032a4d
3 changed files with 38 additions and 41 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<NamePointer> co_names; std::vector<std::pair<_Str, NameScope>> co_names;
std::vector<_Str> co_global_names; std::vector<_Str> co_global_names;
// for goto use // for goto use
@ -62,7 +62,7 @@ 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 = NamePointer(name, scope); auto p = std::make_pair(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;
} }
@ -109,7 +109,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].first;
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

@ -18,13 +18,8 @@ enum NameScope {
}; };
struct NamePointer : BasePointer { struct NamePointer : BasePointer {
_Str name; const std::pair<_Str, NameScope>* pair;
NameScope scope; NamePointer(const std::pair<_Str, NameScope>* pair) : pair(pair) {}
NamePointer(_Str name, NameScope scope) : name(name), scope(scope) {}
bool operator==(const NamePointer& other) const {
return name == other.name && scope == other.scope;
}
PyVar get(VM* vm, Frame* frame) const; PyVar get(VM* vm, Frame* frame) const;
void set(VM* vm, Frame* frame, PyVar val) const; void set(VM* vm, Frame* frame, PyVar val) const;
@ -33,8 +28,8 @@ struct NamePointer : BasePointer {
struct AttrPointer : BasePointer { struct AttrPointer : BasePointer {
mutable PyVar obj; mutable PyVar obj;
const NamePointer* attr; const NamePointer attr;
AttrPointer(PyVar obj, const NamePointer* attr) : obj(obj), attr(attr) {} AttrPointer(PyVar obj, const NamePointer attr) : obj(obj), attr(attr) {}
PyVar get(VM* vm, Frame* frame) const; PyVar get(VM* vm, Frame* frame) const;
void set(VM* vm, Frame* frame, PyVar val) const; void set(VM* vm, Frame* frame, PyVar val) const;

View File

@ -54,16 +54,18 @@ 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])); frame->push(PyPointer(NamePointer(
&(frame->code->co_names[byte.arg])
)));
} 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)); NamePointer(&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(AttrPointer(obj, &attr))); frame->push(PyPointer(AttrPointer(obj, NamePointer(&attr))));
} 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];
@ -80,12 +82,12 @@ protected:
} break; } break;
case OP_STORE_PTR: { case OP_STORE_PTR: {
PyVar obj = frame->popValue(this); PyVar obj = frame->popValue(this);
auto p = PyPointer_AS_C(frame->__pop()); VarRef r = frame->__pop();
p->set(this, frame, std::move(obj)); PyPointer_AS_C(r)->set(this, frame, std::move(obj));
} break; } break;
case OP_DELETE_PTR: { case OP_DELETE_PTR: {
auto p = PyPointer_AS_C(frame->__pop()); VarRef r = frame->__pop();
p->del(this, frame); PyPointer_AS_C(r)->del(this, frame);
} break; } break;
case OP_BUILD_SMART_TUPLE: case OP_BUILD_SMART_TUPLE:
{ {
@ -130,7 +132,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].first;
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);
@ -314,7 +316,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].first;
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);
@ -941,25 +943,25 @@ public:
/***** Pointers' Impl *****/ /***** Pointers' Impl *****/
PyVar NamePointer::get(VM* vm, Frame* frame) const{ PyVar NamePointer::get(VM* vm, Frame* frame) const{
auto it = frame->f_locals.find(name); auto it = frame->f_locals.find(pair->first);
if(it != frame->f_locals.end()) return it->second; if(it != frame->f_locals.end()) return it->second;
it = frame->f_globals().find(name); it = frame->f_globals().find(pair->first);
if(it != frame->f_globals().end()) return it->second; if(it != frame->f_globals().end()) return it->second;
it = vm->builtins->attribs.find(name); it = vm->builtins->attribs.find(pair->first);
if(it != vm->builtins->attribs.end()) return it->second; if(it != vm->builtins->attribs.end()) return it->second;
vm->nameError(name); vm->nameError(pair->first);
return nullptr; return nullptr;
} }
void NamePointer::set(VM* vm, Frame* frame, PyVar val) const{ void NamePointer::set(VM* vm, Frame* frame, PyVar val) const{
switch(scope) { switch(pair->second) {
case NAME_LOCAL: frame->f_locals[name] = std::move(val); break; case NAME_LOCAL: frame->f_locals[pair->first] = std::move(val); break;
case NAME_GLOBAL: case NAME_GLOBAL:
{ {
if(frame->f_locals.count(name) > 0){ if(frame->f_locals.count(pair->first) > 0){
frame->f_locals[name] = std::move(val); frame->f_locals[pair->first] = std::move(val);
}else{ }else{
frame->f_globals()[name] = std::move(val); frame->f_globals()[pair->first] = std::move(val);
} }
} break; } break;
default: UNREACHABLE(); default: UNREACHABLE();
@ -967,23 +969,23 @@ void NamePointer::set(VM* vm, Frame* frame, PyVar val) const{
} }
void NamePointer::del(VM* vm, Frame* frame) const{ void NamePointer::del(VM* vm, Frame* frame) const{
switch(scope) { switch(pair->second) {
case NAME_LOCAL: { case NAME_LOCAL: {
if(frame->f_locals.count(name) > 0){ if(frame->f_locals.count(pair->first) > 0){
frame->f_locals.erase(name); frame->f_locals.erase(pair->first);
}else{ }else{
vm->nameError(name); vm->nameError(pair->first);
} }
} break; } break;
case NAME_GLOBAL: case NAME_GLOBAL:
{ {
if(frame->f_locals.count(name) > 0){ if(frame->f_locals.count(pair->first) > 0){
frame->f_locals.erase(name); frame->f_locals.erase(pair->first);
}else{ }else{
if(frame->f_globals().count(name) > 0){ if(frame->f_globals().count(pair->first) > 0){
frame->f_globals().erase(name); frame->f_globals().erase(pair->first);
}else{ }else{
vm->nameError(name); vm->nameError(pair->first);
} }
} }
} break; } break;
@ -992,11 +994,11 @@ void NamePointer::del(VM* vm, Frame* frame) const{
} }
PyVar AttrPointer::get(VM* vm, Frame* frame) const{ PyVar AttrPointer::get(VM* vm, Frame* frame) const{
return vm->getAttr(obj, attr->name); return vm->getAttr(obj, attr.pair->first);
} }
void AttrPointer::set(VM* vm, Frame* frame, PyVar val) const{ void AttrPointer::set(VM* vm, Frame* frame, PyVar val) const{
vm->setAttr(obj, attr->name, val); vm->setAttr(obj, attr.pair->first, val);
} }
void AttrPointer::del(VM* vm, Frame* frame) const{ void AttrPointer::del(VM* vm, Frame* frame) const{