From c9ace234cc8863b07be0ce3bcb18c3c5f145f8f1 Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Sun, 13 Aug 2023 02:17:50 +0800 Subject: [PATCH] more fix... --- include/pocketpy/namedict.h | 12 ++++++++---- src/dict.cpp | 2 +- src/vm.cpp | 11 ++++++++--- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/include/pocketpy/namedict.h b/include/pocketpy/namedict.h index 8a61cde9..51b65842 100644 --- a/include/pocketpy/namedict.h +++ b/include/pocketpy/namedict.h @@ -32,9 +32,13 @@ struct NameDictImpl { #define HASH_PROBE(key, ok, i) \ ok = false; \ i = _hash(key, _mask, _hash_seed); \ -while(!_items[i].first.empty()) { \ - if(_items[i].first == (key)) { ok = true; break; } \ - i = (i + 1) & _mask; \ +while(true) { \ + if(!_items[i].first.empty()){ \ + if(_items[i].first == (key)) { ok = true; break; } \ + }else{ \ + if(_items[i].second == 0) break; \ + } \ + i = (i + 1) & _mask; \ } #define NAMEDICT_ALLOC() \ @@ -155,7 +159,7 @@ while(!_items[i].first.empty()) { \ HASH_PROBE(key, ok, i); if(!ok) throw std::out_of_range(fmt("NameDict key not found: ", key)); _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--; } diff --git a/src/dict.cpp b/src/dict.cpp index f50c436d..8add915a 100644 --- a/src/dict.cpp +++ b/src/dict.cpp @@ -107,7 +107,7 @@ namespace pkpy{ _probe(key, ok, i); if(!ok) return false; _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--; if(_size == 0){ diff --git a/src/vm.cpp b/src/vm.cpp index 58176eb4..9537515c 100644 --- a/src/vm.cpp +++ b/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{ ok = false; i64 hash = vm->py_hash(key); - if(hash < 0) hash = -hash; i = hash & _mask; - while(_items[i].first != nullptr) { - if(vm->py_equals(_items[i].first, key)) { ok = true; break; } + // std::cout << CAST(Str, vm->py_repr(key)) << " " << hash << " " << i << std::endl; + 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 i = ((5*i) + 1) & _mask; + // std::cout << CAST(Str, vm->py_repr(key)) << " next: " << i << std::endl; } }