blueloveTH %!s(int64=2) %!d(string=hai) anos
pai
achega
c9ace234cc
Modificáronse 3 ficheiros con 17 adicións e 8 borrados
  1. 8 4
      include/pocketpy/namedict.h
  2. 1 1
      src/dict.cpp
  3. 8 3
      src/vm.cpp

+ 8 - 4
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--;
     }
 

+ 1 - 1
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){

+ 8 - 3
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;
     }
 }