This commit is contained in:
BLUELOVETH 2023-05-28 22:05:04 +08:00
parent b4c221095f
commit 73ad79d286
3 changed files with 31 additions and 19 deletions

View File

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

View File

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

View File

@ -136,6 +136,13 @@ while(!_items[i].first.empty()) { \
return _items[i].second; 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 try_set(StrName key, T val){
bool ok; uint16_t i; bool ok; uint16_t i;
HASH_PROBE(key, ok, i); HASH_PROBE(key, ok, i);