mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 11:30:18 +00:00
more fix...
This commit is contained in:
parent
0bd7b45160
commit
c9ace234cc
@ -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--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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){
|
||||||
|
11
src/vm.cpp
11
src/vm.cpp
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user