BLUELOVETH 2 лет назад
Родитель
Сommit
73ad79d286
3 измененных файлов с 31 добавлено и 19 удалено
  1. 22 15
      src/ceval.h
  2. 2 4
      src/compiler.h
  3. 7 0
      src/namedict.h

+ 22 - 15
src/ceval.h

@@ -589,21 +589,28 @@ __NEXT_STEP:;
         PUSH(format(spec, _0));
     } DISPATCH();
     /*****************************************/
-    TARGET(INC_FAST)
-        _0 = frame->_locals[byte.arg];
-        if(_0 == PY_NULL) vm->NameError(co->varnames[byte.arg]);
-        frame->_locals[byte.arg] = VAR(CAST(i64, _0) + 1);
-        DISPATCH();
-    TARGET(DEC_FAST)
-        _0 = frame->_locals[byte.arg];
-        if(_0 == PY_NULL) vm->NameError(co->varnames[byte.arg]);
-        frame->_locals[byte.arg] = VAR(CAST(i64, _0) - 1);
-        DISPATCH();
-    // TARGET(INC_GLOBAL)
-    //     _name = StrName(byte.arg);
-    //     _0 = frame->f_globals().try_get(_name);
-    //     if(_0 == nullptr) vm->NameError(_name);
-    //     frame->f_globals().try_set()
+    TARGET(INC_FAST){
+        PyObject** p = &frame->_locals[byte.arg];
+        if(*p == PY_NULL) vm->NameError(co->varnames[byte.arg]);
+        *p = VAR(CAST(i64, *p) + 1);
+    } DISPATCH();
+    TARGET(DEC_FAST){
+        PyObject** p = &frame->_locals[byte.arg];
+        if(*p == PY_NULL) vm->NameError(co->varnames[byte.arg]);
+        *p = VAR(CAST(i64, *p) - 1);
+    } DISPATCH();
+    TARGET(INC_GLOBAL){
+        _name = StrName(byte.arg);
+        PyObject** p = frame->f_globals().try_get_2(_name);
+        if(p == nullptr) vm->NameError(_name);
+        *p = VAR(CAST(i64, *p) + 1);
+    } DISPATCH();
+    TARGET(DEC_GLOBAL){
+        _name = StrName(byte.arg);
+        PyObject** p = frame->f_globals().try_get_2(_name);
+        if(p == nullptr) vm->NameError(_name);
+        *p = VAR(CAST(i64, *p) - 1);
+    } DISPATCH();
 
 #if !PK_ENABLE_COMPUTED_GOTO
 #if DEBUG_EXTRA_CHECK

+ 2 - 4
src/compiler.h

@@ -741,8 +741,7 @@ __SUBSCR_END:
                 StrName name(prev().sv());
                 switch(name_scope()){
                     case NAME_LOCAL:
-                        int namei = ctx()->add_varname(name);
-                        ctx()->emit(OP_INC_FAST, namei, prev().line);
+                        ctx()->emit(OP_INC_FAST, ctx()->add_varname(name), prev().line);
                         break;
                     case NAME_GLOBAL:
                         ctx()->emit(OP_INC_GLOBAL, name.index, prev().line);
@@ -756,8 +755,7 @@ __SUBSCR_END:
                 StrName name(prev().sv());
                 switch(name_scope()){
                     case NAME_LOCAL:
-                        int namei = ctx()->add_varname(name);
-                        ctx()->emit(OP_DEC_FAST, namei, prev().line);
+                        ctx()->emit(OP_DEC_FAST, ctx()->add_varname(name), prev().line);
                         break;
                     case NAME_GLOBAL:
                         ctx()->emit(OP_DEC_GLOBAL, name.index, prev().line);

+ 7 - 0
src/namedict.h

@@ -136,6 +136,13 @@ while(!_items[i].first.empty()) {       \
         return _items[i].second;
     }
 
+    T* try_get_2(StrName key) {
+        bool ok; uint16_t i;
+        HASH_PROBE(key, ok, i);
+        if(!ok) return nullptr;
+        return &_items[i].second;
+    }
+
     bool try_set(StrName key, T val){
         bool ok; uint16_t i;
         HASH_PROBE(key, ok, i);