46 lines
1.4 KiB
C
46 lines
1.4 KiB
C
#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;
|
|
} |