diff --git a/include/pocketpy/interpreter/vm.h b/include/pocketpy/interpreter/vm.h index 686ee963..4d136774 100644 --- a/include/pocketpy/interpreter/vm.h +++ b/include/pocketpy/interpreter/vm.h @@ -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; diff --git a/include/pocketpy/objects/container.h b/include/pocketpy/objects/container.h new file mode 100644 index 00000000..3d33c3ac --- /dev/null +++ b/include/pocketpy/objects/container.h @@ -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 \ No newline at end of file diff --git a/include/pocketpy/xmacros/fixedhash.h b/include/pocketpy/xmacros/fixedhash.h index 9351e822..1a6ae600 100644 --- a/include/pocketpy/xmacros/fixedhash.h +++ b/include/pocketpy/xmacros/fixedhash.h @@ -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 */ diff --git a/src/interpreter/vm.c b/src/interpreter/vm.c index 0865b7b3..383987c6 100644 --- a/src/interpreter/vm.c +++ b/src/interpreter/vm.c @@ -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); } \ No newline at end of file diff --git a/src/objects/container.c b/src/objects/container.c new file mode 100644 index 00000000..0b843f69 --- /dev/null +++ b/src/objects/container.c @@ -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