mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-22 12:30:19 +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/common/name.h"
|
||||||
#include "pocketpy/objects/codeobject.h"
|
#include "pocketpy/objects/codeobject.h"
|
||||||
#include "pocketpy/objects/bintree.h"
|
#include "pocketpy/objects/bintree.h"
|
||||||
|
#include "pocketpy/objects/container.h"
|
||||||
#include "pocketpy/pocketpy.h"
|
#include "pocketpy/pocketpy.h"
|
||||||
#include "pocketpy/interpreter/heap.h"
|
#include "pocketpy/interpreter/heap.h"
|
||||||
#include "pocketpy/interpreter/frame.h"
|
#include "pocketpy/interpreter/frame.h"
|
||||||
@ -50,7 +51,7 @@ typedef struct VM {
|
|||||||
py_TValue reg[8]; // users' registers
|
py_TValue reg[8]; // users' registers
|
||||||
void* ctx; // user-defined context
|
void* ctx; // user-defined context
|
||||||
|
|
||||||
BinTree cached_names;
|
CachedNames cached_names;
|
||||||
NameDict compile_time_funcs;
|
NameDict compile_time_funcs;
|
||||||
|
|
||||||
py_StackRef curr_class;
|
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(delete)(NAME* self);
|
||||||
void METHOD(set)(NAME* self, K key, V* value);
|
void METHOD(set)(NAME* self, K key, V* value);
|
||||||
V* METHOD(try_get)(NAME* self, K key);
|
V* METHOD(try_get)(NAME* self, K key);
|
||||||
|
bool METHOD(contains)(NAME* self, K key);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -104,6 +105,11 @@ V* METHOD(try_get)(NAME* self, K key) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool METHOD(contains)(NAME* self, K key) {
|
||||||
|
V* value = METHOD(try_get)(self, key);
|
||||||
|
return value != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Undefine all macros */
|
/* Undefine all macros */
|
||||||
|
@ -111,11 +111,7 @@ void VM__ctor(VM* self) {
|
|||||||
ManagedHeap__ctor(&self->heap);
|
ManagedHeap__ctor(&self->heap);
|
||||||
ValueStack__ctor(&self->stack);
|
ValueStack__ctor(&self->stack);
|
||||||
|
|
||||||
const static BinTreeConfig cached_names_config = {
|
CachedNames__ctor(&self->cached_names);
|
||||||
.f_cmp = BinTree__cmp_voidp,
|
|
||||||
.need_free_key = false,
|
|
||||||
};
|
|
||||||
BinTree__ctor(&self->cached_names, NULL, py_NIL(), &cached_names_config);
|
|
||||||
NameDict__ctor(&self->compile_time_funcs, PK_TYPE_ATTR_LOAD_FACTOR);
|
NameDict__ctor(&self->compile_time_funcs, PK_TYPE_ATTR_LOAD_FACTOR);
|
||||||
|
|
||||||
/* Init Builtin Types */
|
/* Init Builtin Types */
|
||||||
@ -294,7 +290,7 @@ void VM__dtor(VM* self) {
|
|||||||
TypeList__dtor(&self->types);
|
TypeList__dtor(&self->types);
|
||||||
FixedMemoryPool__dtor(&self->pool_frame);
|
FixedMemoryPool__dtor(&self->pool_frame);
|
||||||
ValueStack__dtor(&self->stack);
|
ValueStack__dtor(&self->stack);
|
||||||
BinTree__dtor(&self->cached_names);
|
CachedNames__dtor(&self->cached_names);
|
||||||
NameDict__dtor(&self->compile_time_funcs);
|
NameDict__dtor(&self->compile_time_funcs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -674,7 +670,10 @@ void ManagedHeap__mark(ManagedHeap* self) {
|
|||||||
// mark modules
|
// mark modules
|
||||||
BinTree__apply_mark(&vm->modules, p_stack);
|
BinTree__apply_mark(&vm->modules, p_stack);
|
||||||
// mark cached names
|
// 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
|
// mark compile time functions
|
||||||
for(int i = 0; i < vm->compile_time_funcs.capacity; i++) {
|
for(int i = 0; i < vm->compile_time_funcs.capacity; i++) {
|
||||||
NameDict_KV* kv = &vm->compile_time_funcs.items[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) {
|
py_Ref py_name2ref(py_Name name) {
|
||||||
assert(name != NULL);
|
assert(name != NULL);
|
||||||
BinTree* d = &pk_current_vm->cached_names;
|
CachedNames* d = &pk_current_vm->cached_names;
|
||||||
py_Ref res = BinTree__try_get(d, name);
|
py_Ref res = CachedNames__try_get(d, name);
|
||||||
if(res != NULL) return res;
|
if(res != NULL) return res;
|
||||||
// not found, create a new one
|
// not found, create a new one
|
||||||
py_StackRef tmp = py_pushtmp();
|
py_StackRef tmp = py_pushtmp();
|
||||||
py_newstrv(tmp, py_name2sv(name));
|
py_newstrv(tmp, py_name2sv(name));
|
||||||
BinTree__set(d, name, tmp);
|
CachedNames__set(d, name, tmp);
|
||||||
py_pop();
|
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