mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 11:30:18 +00:00
optimize
This commit is contained in:
parent
f57ca260ea
commit
91d9032a4d
@ -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';
|
||||||
|
@ -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;
|
||||||
|
60
src/vm.h
60
src/vm.h
@ -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{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user