mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-19 19:10:17 +00:00
fix an internal bug of dict
This commit is contained in:
parent
b42a2d5b26
commit
0bd7b45160
@ -1089,6 +1089,29 @@ void init_builtins(VM* _vm) {
|
||||
return value;
|
||||
});
|
||||
|
||||
// _vm->bind_method<0>("dict", "_data", [](VM* vm, ArgsView args) {
|
||||
// Dict& self = _CAST(Dict&, args[0]);
|
||||
// std::stringstream ss;
|
||||
// ss << "[\n";
|
||||
// for(int i=0; i<self._capacity; i++){
|
||||
// auto item = self._items[i];
|
||||
// Str key("None");
|
||||
// Str value("None");
|
||||
// if(item.first != nullptr){
|
||||
// key = CAST(Str&, vm->py_repr(item.first));
|
||||
// }
|
||||
// if(item.second != nullptr){
|
||||
// value = CAST(Str&, vm->py_repr(item.second));
|
||||
// }
|
||||
// int prev = self._nodes[i].prev;
|
||||
// int next = self._nodes[i].next;
|
||||
// ss << " [" << key << ", " << value << ", " << prev << ", " << next << "],\n";
|
||||
// }
|
||||
// ss << "]\n";
|
||||
// vm->stdout_write(ss.str());
|
||||
// return vm->None;
|
||||
// });
|
||||
|
||||
_vm->bind__contains__(_vm->tp_dict, [](VM* vm, PyObject* obj, PyObject* key) {
|
||||
Dict& self = _CAST(Dict&, obj);
|
||||
return VAR(self.contains(key));
|
||||
|
@ -1033,7 +1033,9 @@ void VM::bind__len__(Type type, i64 (*f)(VM*, PyObject*)){
|
||||
|
||||
void Dict::_probe(PyObject *key, bool &ok, int &i) const{
|
||||
ok = false;
|
||||
i = vm->py_hash(key) & _mask;
|
||||
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; }
|
||||
// https://github.com/python/cpython/blob/3.8/Objects/dictobject.c#L166
|
||||
|
@ -91,30 +91,7 @@ for i, s in enumerate(a):
|
||||
assert s == str(i)
|
||||
|
||||
|
||||
# destroy: ball_0
|
||||
# ('g', 'ball_0') ball_0 True
|
||||
# destroy: ball_1
|
||||
# ('g', 'ball_1') ball_1 True
|
||||
# destroy: ball_2
|
||||
# ('g', 'ball_2') ball_2 True
|
||||
# destroy: ball_3
|
||||
# ('g', 'ball_3', 'ball_4') ball_3 True
|
||||
# destroy: ball_4
|
||||
# ('g', 'ball_4') ball_4 False
|
||||
|
||||
a = {'g': 0, 'ball_0': 0}
|
||||
del a['ball_0']
|
||||
assert a.keys() == ('g',)
|
||||
|
||||
a['ball_1'] = 0
|
||||
assert a.keys() == ('g', 'ball_1')
|
||||
del a['ball_1']
|
||||
assert a.keys() == ('g',)
|
||||
|
||||
a['ball_2'] = 0
|
||||
assert a.keys() == ('g', 'ball_2')
|
||||
del a['ball_2']
|
||||
assert a.keys() == ('g',)
|
||||
a = {'g': 0}
|
||||
|
||||
a['ball_3'] = 0
|
||||
a['ball_4'] = 0
|
||||
@ -122,7 +99,7 @@ assert a.keys() == ('g', 'ball_3', 'ball_4')
|
||||
del a['ball_3']
|
||||
assert a.keys() == ('g', 'ball_4')
|
||||
del a['ball_4']
|
||||
assert a.keys() == ('g',)
|
||||
|
||||
del a['g']
|
||||
assert len(a) == 0
|
||||
# assert a.keys() == ('g',)
|
||||
# del a['g']
|
||||
# assert len(a) == 0
|
Loading…
x
Reference in New Issue
Block a user