blueloveTH 3 年 前
コミット
91d9032a4d
3 ファイル変更38 行追加41 行削除
  1. 3 3
      src/codeobject.h
  2. 4 9
      src/pointer.h
  3. 31 29
      src/vm.h

+ 3 - 3
src/codeobject.h

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

+ 4 - 9
src/pointer.h

@@ -18,13 +18,8 @@ enum NameScope {
 };
 };
 
 
 struct NamePointer : BasePointer {
 struct NamePointer : BasePointer {
-    _Str name;
-    NameScope scope;
-    NamePointer(_Str name, NameScope scope) : name(name), scope(scope) {}
-
-    bool operator==(const NamePointer& other) const {
-        return name == other.name && scope == other.scope;
-    }
+    const std::pair<_Str, NameScope>* pair;
+    NamePointer(const std::pair<_Str, NameScope>* pair) : pair(pair) {}
 
 
     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;
-    AttrPointer(PyVar obj, const NamePointer* attr) : obj(obj), attr(attr) {}
+    const NamePointer 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;

+ 31 - 29
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());
-                p->set(this, frame, std::move(obj));
+                VarRef r = frame->__pop();
+                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());
-                p->del(this, frame);
+                VarRef r = frame->__pop();
+                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) {
-        case NAME_LOCAL: frame->f_locals[name] = std::move(val); break;
+    switch(pair->second) {
+        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){
-                frame->f_locals[name] = std::move(val);
+            if(frame->f_locals.count(pair->first) > 0){
+                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){
-                frame->f_locals.erase(name);
+            if(frame->f_locals.count(pair->first) > 0){
+                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){
-                frame->f_locals.erase(name);
+            if(frame->f_locals.count(pair->first) > 0){
+                frame->f_locals.erase(pair->first);
             }else{
             }else{
-                if(frame->f_globals().count(name) > 0){
-                    frame->f_globals().erase(name);
+                if(frame->f_globals().count(pair->first) > 0){
+                    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{