more fix...

This commit is contained in:
blueloveTH 2023-08-13 02:17:50 +08:00
parent 0bd7b45160
commit c9ace234cc
3 changed files with 17 additions and 8 deletions

View File

@ -32,9 +32,13 @@ struct NameDictImpl {
#define HASH_PROBE(key, ok, i) \ #define HASH_PROBE(key, ok, i) \
ok = false; \ ok = false; \
i = _hash(key, _mask, _hash_seed); \ i = _hash(key, _mask, _hash_seed); \
while(!_items[i].first.empty()) { \ while(true) { \
if(_items[i].first == (key)) { ok = true; break; } \ if(!_items[i].first.empty()){ \
i = (i + 1) & _mask; \ if(_items[i].first == (key)) { ok = true; break; } \
}else{ \
if(_items[i].second == 0) break; \
} \
i = (i + 1) & _mask; \
} }
#define NAMEDICT_ALLOC() \ #define NAMEDICT_ALLOC() \
@ -155,7 +159,7 @@ while(!_items[i].first.empty()) { \
HASH_PROBE(key, ok, i); HASH_PROBE(key, ok, i);
if(!ok) throw std::out_of_range(fmt("NameDict key not found: ", key)); if(!ok) throw std::out_of_range(fmt("NameDict key not found: ", key));
_items[i].first = StrName(); _items[i].first = StrName();
_items[i].second = nullptr; // _items[i].second = PY_DELETED_SLOT; // do not change .second if it is not zero, it means the slot is occupied by a deleted item
_size--; _size--;
} }

View File

@ -107,7 +107,7 @@ namespace pkpy{
_probe(key, ok, i); _probe(key, ok, i);
if(!ok) return false; if(!ok) return false;
_items[i].first = nullptr; _items[i].first = nullptr;
_items[i].second = nullptr; // _items[i].second = PY_DELETED_SLOT; // do not change .second if it is not NULL, it means the slot is occupied by a deleted item
_size--; _size--;
if(_size == 0){ if(_size == 0){

View File

@ -1034,12 +1034,17 @@ void VM::bind__len__(Type type, i64 (*f)(VM*, PyObject*)){
void Dict::_probe(PyObject *key, bool &ok, int &i) const{ void Dict::_probe(PyObject *key, bool &ok, int &i) const{
ok = false; ok = false;
i64 hash = vm->py_hash(key); i64 hash = vm->py_hash(key);
if(hash < 0) hash = -hash;
i = hash & _mask; i = hash & _mask;
while(_items[i].first != nullptr) { // std::cout << CAST(Str, vm->py_repr(key)) << " " << hash << " " << i << std::endl;
if(vm->py_equals(_items[i].first, key)) { ok = true; break; } while(true) {
if(_items[i].first != nullptr){
if(vm->py_equals(_items[i].first, key)) { ok = true; break; }
}else{
if(_items[i].second == nullptr) break;
}
// https://github.com/python/cpython/blob/3.8/Objects/dictobject.c#L166 // https://github.com/python/cpython/blob/3.8/Objects/dictobject.c#L166
i = ((5*i) + 1) & _mask; i = ((5*i) + 1) & _mask;
// std::cout << CAST(Str, vm->py_repr(key)) << " next: " << i << std::endl;
} }
} }