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));
} 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

View File

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

View File

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