mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 03:20:18 +00:00
some refactor
This commit is contained in:
parent
2616c8378b
commit
ac82f6f33f
@ -11,17 +11,12 @@ struct Dict{
|
||||
struct Item{
|
||||
PyVar first;
|
||||
PyVar second;
|
||||
};
|
||||
|
||||
struct ItemNode{
|
||||
int prev;
|
||||
int next;
|
||||
};
|
||||
|
||||
static constexpr int __Capacity = 4;
|
||||
static constexpr int __Capacity = 8;
|
||||
static constexpr float __LoadFactor = 0.67f;
|
||||
static_assert(sizeof(Item) * __Capacity <= 128);
|
||||
static_assert(sizeof(ItemNode) * __Capacity <= 64);
|
||||
|
||||
int _capacity;
|
||||
int _mask;
|
||||
@ -30,7 +25,6 @@ struct Dict{
|
||||
int _head_idx; // for order preserving
|
||||
int _tail_idx; // for order preserving
|
||||
Item* _items;
|
||||
ItemNode* _nodes; // for order preserving
|
||||
|
||||
Dict();
|
||||
Dict(Dict&& other);
|
||||
@ -49,7 +43,7 @@ struct Dict{
|
||||
PyVar try_get(VM* vm, PyVar key) const;
|
||||
|
||||
bool contains(VM* vm, PyVar key) const;
|
||||
bool erase(VM* vm, PyVar key);
|
||||
bool del(VM* vm, PyVar key);
|
||||
void update(VM* vm, const Dict& other);
|
||||
|
||||
template<typename __Func>
|
||||
@ -57,7 +51,7 @@ struct Dict{
|
||||
int i = _head_idx;
|
||||
while(i != -1){
|
||||
f(_items[i].first, _items[i].second);
|
||||
i = _nodes[i].next;
|
||||
i = _items[i].next;
|
||||
}
|
||||
}
|
||||
|
||||
@ -66,6 +60,8 @@ struct Dict{
|
||||
void clear();
|
||||
~Dict();
|
||||
|
||||
void __alloc_items();
|
||||
|
||||
void _gc_mark(VM*) const;
|
||||
};
|
||||
|
||||
|
@ -4,17 +4,8 @@
|
||||
|
||||
namespace pkpy{
|
||||
|
||||
void* pool64_alloc(size_t) noexcept;
|
||||
void pool64_dealloc(void*) noexcept;
|
||||
|
||||
void* pool128_alloc(size_t) noexcept;
|
||||
void pool128_dealloc(void*) noexcept;
|
||||
|
||||
template<typename T>
|
||||
void* pool64_alloc() noexcept{
|
||||
return pool64_alloc(sizeof(T));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void* pool128_alloc() noexcept{
|
||||
return pool128_alloc(sizeof(T));
|
||||
|
72
src/dict.cpp
72
src/dict.cpp
@ -5,10 +5,17 @@ namespace pkpy{
|
||||
Dict::Dict(): _capacity(__Capacity),
|
||||
_mask(__Capacity-1),
|
||||
_size(0), _critical_size(__Capacity*__LoadFactor+0.5f), _head_idx(-1), _tail_idx(-1){
|
||||
_items = (Item*)pool128_alloc(_capacity * sizeof(Item));
|
||||
memset(_items, 0, _capacity * sizeof(Item));
|
||||
_nodes = (ItemNode*)pool64_alloc(_capacity * sizeof(ItemNode));
|
||||
memset(_nodes, -1, _capacity * sizeof(ItemNode));
|
||||
__alloc_items();
|
||||
}
|
||||
|
||||
void Dict::__alloc_items(){
|
||||
_items = (Item*)malloc(_capacity * sizeof(Item));
|
||||
for(int i=0; i<_capacity; i++){
|
||||
_items[i].first = nullptr;
|
||||
_items[i].second = nullptr;
|
||||
_items[i].prev = -1;
|
||||
_items[i].next = -1;
|
||||
}
|
||||
}
|
||||
|
||||
Dict::Dict(Dict&& other){
|
||||
@ -19,9 +26,7 @@ namespace pkpy{
|
||||
_head_idx = other._head_idx;
|
||||
_tail_idx = other._tail_idx;
|
||||
_items = other._items;
|
||||
_nodes = other._nodes;
|
||||
other._items = nullptr;
|
||||
other._nodes = nullptr;
|
||||
}
|
||||
|
||||
Dict::Dict(const Dict& other){
|
||||
@ -31,10 +36,9 @@ namespace pkpy{
|
||||
_critical_size = other._critical_size;
|
||||
_head_idx = other._head_idx;
|
||||
_tail_idx = other._tail_idx;
|
||||
_items = (Item*)pool128_alloc(_capacity * sizeof(Item));
|
||||
// copy items
|
||||
_items = (Item*)malloc(_capacity * sizeof(Item));
|
||||
memcpy(_items, other._items, _capacity * sizeof(Item));
|
||||
_nodes = (ItemNode*)pool64_alloc(_capacity * sizeof(ItemNode));
|
||||
memcpy(_nodes, other._nodes, _capacity * sizeof(ItemNode));
|
||||
}
|
||||
|
||||
void Dict::set(VM* vm, PyVar key, PyVar val){
|
||||
@ -51,8 +55,8 @@ namespace pkpy{
|
||||
_head_idx = i;
|
||||
_tail_idx = i;
|
||||
}else{
|
||||
_nodes[i].prev = _tail_idx;
|
||||
_nodes[_tail_idx].next = i;
|
||||
_items[i].prev = _tail_idx;
|
||||
_items[_tail_idx].next = i;
|
||||
_tail_idx = i;
|
||||
}
|
||||
}
|
||||
@ -61,7 +65,6 @@ namespace pkpy{
|
||||
|
||||
void Dict::_rehash(VM* vm){
|
||||
Item* old_items = _items;
|
||||
ItemNode* old_nodes = _nodes;
|
||||
int old_head_idx = _head_idx;
|
||||
|
||||
_capacity *= 4;
|
||||
@ -71,19 +74,16 @@ namespace pkpy{
|
||||
_head_idx = -1;
|
||||
_tail_idx = -1;
|
||||
|
||||
_items = (Item*)pool128_alloc(_capacity * sizeof(Item));
|
||||
memset(_items, 0, _capacity * sizeof(Item));
|
||||
_nodes = (ItemNode*)pool64_alloc(_capacity * sizeof(ItemNode));
|
||||
memset(_nodes, -1, _capacity * sizeof(ItemNode));
|
||||
__alloc_items();
|
||||
|
||||
// copy old items to new dict
|
||||
int i = old_head_idx;
|
||||
while(i != -1){
|
||||
set(vm, old_items[i].first, old_items[i].second);
|
||||
i = old_nodes[i].next;
|
||||
i = old_items[i].next;
|
||||
}
|
||||
pool128_dealloc(old_items);
|
||||
pool64_dealloc(old_nodes);
|
||||
|
||||
free(old_items);
|
||||
}
|
||||
|
||||
|
||||
@ -100,7 +100,7 @@ namespace pkpy{
|
||||
return ok;
|
||||
}
|
||||
|
||||
bool Dict::erase(VM* vm, PyVar key){
|
||||
bool Dict::del(VM* vm, PyVar key){
|
||||
bool ok; int i;
|
||||
_probe_0(vm, key, ok, i);
|
||||
if(!ok) return false;
|
||||
@ -113,18 +113,18 @@ namespace pkpy{
|
||||
_tail_idx = -1;
|
||||
}else{
|
||||
if(_head_idx == i){
|
||||
_head_idx = _nodes[i].next;
|
||||
_nodes[_head_idx].prev = -1;
|
||||
_head_idx = _items[i].next;
|
||||
_items[_head_idx].prev = -1;
|
||||
}else if(_tail_idx == i){
|
||||
_tail_idx = _nodes[i].prev;
|
||||
_nodes[_tail_idx].next = -1;
|
||||
_tail_idx = _items[i].prev;
|
||||
_items[_tail_idx].next = -1;
|
||||
}else{
|
||||
_nodes[_nodes[i].prev].next = _nodes[i].next;
|
||||
_nodes[_nodes[i].next].prev = _nodes[i].prev;
|
||||
_items[_items[i].prev].next = _items[i].next;
|
||||
_items[_items[i].next].prev = _items[i].prev;
|
||||
}
|
||||
}
|
||||
_nodes[i].prev = -1;
|
||||
_nodes[i].next = -1;
|
||||
_items[i].prev = -1;
|
||||
_items[i].next = -1;
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -138,7 +138,7 @@ namespace pkpy{
|
||||
int j = 0;
|
||||
while(i != -1){
|
||||
t[j++] = _items[i].first;
|
||||
i = _nodes[i].next;
|
||||
i = _items[i].next;
|
||||
}
|
||||
PK_ASSERT(j == _size);
|
||||
return t;
|
||||
@ -150,7 +150,7 @@ namespace pkpy{
|
||||
int j = 0;
|
||||
while(i != -1){
|
||||
t[j++] = _items[i].second;
|
||||
i = _nodes[i].next;
|
||||
i = _items[i].next;
|
||||
}
|
||||
PK_ASSERT(j == _size);
|
||||
return t;
|
||||
@ -160,13 +160,15 @@ namespace pkpy{
|
||||
_size = 0;
|
||||
_head_idx = -1;
|
||||
_tail_idx = -1;
|
||||
memset(_items, 0, _capacity * sizeof(Item));
|
||||
memset(_nodes, -1, _capacity * sizeof(ItemNode));
|
||||
for(int i=0; i<_capacity; i++){
|
||||
_items[i].first = nullptr;
|
||||
_items[i].second = nullptr;
|
||||
_items[i].prev = -1;
|
||||
_items[i].next = -1;
|
||||
}
|
||||
}
|
||||
|
||||
Dict::~Dict(){
|
||||
if(_items==nullptr) return;
|
||||
pool128_dealloc(_items);
|
||||
pool64_dealloc(_nodes);
|
||||
if(_items) free(_items);
|
||||
}
|
||||
} // namespace pkpy
|
@ -118,7 +118,7 @@ namespace pkpy{
|
||||
if(self.i == -1) return 0;
|
||||
vm->s_data.push(d._items[self.i].first);
|
||||
vm->s_data.push(d._items[self.i].second);
|
||||
self.i = d._nodes[self.i].next;
|
||||
self.i = d._items[self.i].next;
|
||||
return 2;
|
||||
});
|
||||
}
|
||||
|
@ -267,21 +267,17 @@ struct MemoryPool{
|
||||
}
|
||||
};
|
||||
|
||||
static MemoryPool<64> pool64;
|
||||
static MemoryPool<128> pool128;
|
||||
|
||||
void* pool64_alloc(size_t size) noexcept { return pool64.alloc(size); }
|
||||
void pool64_dealloc(void* p) noexcept { pool64.dealloc(p); }
|
||||
|
||||
void* pool128_alloc(size_t size) noexcept { return pool128.alloc(size); }
|
||||
void pool128_dealloc(void* p) noexcept { pool128.dealloc(p); }
|
||||
|
||||
void pools_shrink_to_fit() noexcept {
|
||||
pool64.shrink_to_fit();
|
||||
pool128.shrink_to_fit();
|
||||
}
|
||||
|
||||
std::string pool64_info() noexcept { return pool64.info(); }
|
||||
std::string pool64_info() noexcept { return "unavailable"; }
|
||||
std::string pool128_info() noexcept { return pool128.info(); }
|
||||
|
||||
}
|
@ -1345,7 +1345,7 @@ void __init_builtins(VM* _vm) {
|
||||
|
||||
_vm->bind__delitem__(VM::tp_dict, [](VM* vm, PyVar _0, PyVar _1) {
|
||||
Dict& self = _CAST(Dict&, _0);
|
||||
bool ok = self.erase(vm, _1);
|
||||
bool ok = self.del(vm, _1);
|
||||
if(!ok) vm->KeyError(_1);
|
||||
});
|
||||
|
||||
@ -1362,7 +1362,7 @@ void __init_builtins(VM* _vm) {
|
||||
return args[2];
|
||||
}
|
||||
}
|
||||
self.erase(vm, args[1]);
|
||||
self.del(vm, args[1]);
|
||||
return value;
|
||||
});
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user