mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-21 12:00:18 +00:00
replace BinTree
with CachedNames
This commit is contained in:
parent
5e65567c28
commit
5666d2c580
@ -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
include/pocketpy/objects/container.h
Normal file
12
include/pocketpy/objects/container.h
Normal 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
|
@ -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 */
|
||||
|
@ -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
8
src/objects/container.c
Normal 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
|
Loading…
x
Reference in New Issue
Block a user