replace BinTree with CachedNames

This commit is contained in:
blueloveTH 2025-06-20 17:32:53 +08:00
parent 5e65567c28
commit 5666d2c580
5 changed files with 38 additions and 12 deletions

View File

@ -4,6 +4,7 @@
#include "pocketpy/common/name.h"
#include "pocketpy/objects/codeobject.h"
#include "pocketpy/objects/bintree.h"
#include "pocketpy/objects/container.h"
#include "pocketpy/pocketpy.h"
#include "pocketpy/interpreter/heap.h"
#include "pocketpy/interpreter/frame.h"
@ -50,7 +51,7 @@ typedef struct VM {
py_TValue reg[8]; // users' registers
void* ctx; // user-defined context
BinTree cached_names;
CachedNames cached_names;
NameDict compile_time_funcs;
py_StackRef curr_class;

View File

@ -0,0 +1,12 @@
#pragma once
#include "pocketpy/objects/base.h"
#include "pocketpy/common/vector.h"
#include "pocketpy/pocketpy.h"
#define FIXEDHASH_T__HEADER
#define K py_Name
#define V py_TValue
#define NAME CachedNames
#include "pocketpy/xmacros/fixedhash.h"
#undef FIXEDHASH_T__HEADER

View File

@ -48,6 +48,7 @@ NAME* METHOD(new)();
void METHOD(delete)(NAME* self);
void METHOD(set)(NAME* self, K key, V* value);
V* METHOD(try_get)(NAME* self, K key);
bool METHOD(contains)(NAME* self, K key);
#endif
@ -104,6 +105,11 @@ V* METHOD(try_get)(NAME* self, K key) {
return NULL;
}
bool METHOD(contains)(NAME* self, K key) {
V* value = METHOD(try_get)(self, key);
return value != NULL;
}
#endif
/* Undefine all macros */

View File

@ -111,11 +111,7 @@ void VM__ctor(VM* self) {
ManagedHeap__ctor(&self->heap);
ValueStack__ctor(&self->stack);
const static BinTreeConfig cached_names_config = {
.f_cmp = BinTree__cmp_voidp,
.need_free_key = false,
};
BinTree__ctor(&self->cached_names, NULL, py_NIL(), &cached_names_config);
CachedNames__ctor(&self->cached_names);
NameDict__ctor(&self->compile_time_funcs, PK_TYPE_ATTR_LOAD_FACTOR);
/* Init Builtin Types */
@ -294,7 +290,7 @@ void VM__dtor(VM* self) {
TypeList__dtor(&self->types);
FixedMemoryPool__dtor(&self->pool_frame);
ValueStack__dtor(&self->stack);
BinTree__dtor(&self->cached_names);
CachedNames__dtor(&self->cached_names);
NameDict__dtor(&self->compile_time_funcs);
}
@ -674,7 +670,10 @@ void ManagedHeap__mark(ManagedHeap* self) {
// mark modules
BinTree__apply_mark(&vm->modules, p_stack);
// mark cached names
BinTree__apply_mark(&vm->cached_names, p_stack);
for(int i = 0; i < vm->cached_names.entries.length; i++) {
CachedNames_KV* kv = c11_chunkedvector__at(&vm->cached_names.entries, i);
pk__mark_value(&kv->val);
}
// mark compile time functions
for(int i = 0; i < vm->compile_time_funcs.capacity; i++) {
NameDict_KV* kv = &vm->compile_time_funcs.items[i];
@ -876,13 +875,13 @@ int py_replinput(char* buf, int max_size) {
py_Ref py_name2ref(py_Name name) {
assert(name != NULL);
BinTree* d = &pk_current_vm->cached_names;
py_Ref res = BinTree__try_get(d, name);
CachedNames* d = &pk_current_vm->cached_names;
py_Ref res = CachedNames__try_get(d, name);
if(res != NULL) return res;
// not found, create a new one
py_StackRef tmp = py_pushtmp();
py_newstrv(tmp, py_name2sv(name));
BinTree__set(d, name, tmp);
CachedNames__set(d, name, tmp);
py_pop();
return BinTree__try_get(d, name);
return CachedNames__try_get(d, name);
}

8
src/objects/container.c Normal file
View File

@ -0,0 +1,8 @@
#include "pocketpy/objects/container.h"
#define FIXEDHASH_T__SOURCE
#define K py_Name
#define V py_TValue
#define NAME CachedNames
#include "pocketpy/xmacros/fixedhash.h"
#undef FIXEDHASH_T__SOURCE