瀏覽代碼

replace `BinTree` with `CachedNames`

blueloveTH 8 月之前
父節點
當前提交
5666d2c580

+ 2 - 1
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;

+ 12 - 0
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

+ 6 - 0
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 */

+ 10 - 11
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);
 }

+ 8 - 0
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