stage1 大量重构
This commit is contained in:
1 parent
e4347cc3ea
commit
2a84b61e3d
18 files changed
+1831
-1354
No files matched your search
@@ -0,0 +1,46 @@
|
||||
#include "spl_scope.h"
|
||||
|
||||
void spl_scope_init(spl_scope_t *scope) {
|
||||
vec_init(scope->scopes);
|
||||
vec_push(scope->scopes, (spl_scope_node_t){0});
|
||||
scope->current_scope = 0;
|
||||
scope->root_scope = 0;
|
||||
}
|
||||
|
||||
void spl_scope_drop(spl_scope_t *scope) {
|
||||
for (usize i = 0; i < vec_size(scope->scopes); ++i) {
|
||||
map_free(vec_at(scope->scopes, i).symbols);
|
||||
}
|
||||
vec_free(scope->scopes);
|
||||
scope->current_scope = 0;
|
||||
scope->root_scope = 0;
|
||||
}
|
||||
|
||||
spl_scope_id_t spl_scope_alloc(spl_scope_t *scope) {
|
||||
spl_scope_node_t n = {0};
|
||||
n.parent = scope->current_scope;
|
||||
map_init(n.symbols, MAP_HASH_STR, MAP_CMP_STR);
|
||||
vec_push(scope->scopes, n);
|
||||
return vec_size(scope->scopes) - 1;
|
||||
}
|
||||
|
||||
bool spl_scope_insert(spl_scope_t *scope, spl_scope_id_t id, spl_symbol_t symbol) {
|
||||
Assert(id != 0 && id < vec_size(scope->scopes));
|
||||
spl_scope_node_t *node = &vec_at(scope->scopes, id);
|
||||
spl_symbol_t old = {0};
|
||||
if (map_get(node->symbols, symbol.name, &old))
|
||||
return false;
|
||||
map_put(node->symbols, symbol.name, symbol);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool spl_scope_find(spl_scope_t *scope, const char *name, spl_symbol_t *out) {
|
||||
if (!scope || !name || !out)
|
||||
return false;
|
||||
for (spl_scope_id_t id = scope->current_scope; id != 0; id = vec_at(scope->scopes, id).parent) {
|
||||
spl_scope_node_t *s = &vec_at(scope->scopes, id);
|
||||
if (map_get(s->symbols, name, out))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
Reference in new issue
Block a user