From 73ad79d286e6781d1ced6b19e724c684e7a083db Mon Sep 17 00:00:00 2001 From: BLUELOVETH Date: Sun, 28 May 2023 22:05:04 +0800 Subject: [PATCH] ... --- src/ceval.h | 37 ++++++++++++++++++++++--------------- src/compiler.h | 6 ++---- src/namedict.h | 7 +++++++ 3 files changed, 31 insertions(+), 19 deletions(-) diff --git a/src/ceval.h b/src/ceval.h index 7fff5274..2fa1fb14 100644 --- a/src/ceval.h +++ b/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 diff --git a/src/compiler.h b/src/compiler.h index 1e49a025..7089e5f7 100644 --- a/src/compiler.h +++ b/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); diff --git a/src/namedict.h b/src/namedict.h index d78581ef..6244ac62 100644 --- a/src/namedict.h +++ b/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);