Commit c8f61a01 authored by Martin Mareš's avatar Martin Mareš

Symbols are not scoped.

parent 91447965
...@@ -35,6 +35,13 @@ static struct keyword { ...@@ -35,6 +35,13 @@ static struct keyword {
static struct keyword *kw_hash[KW_HASH_SIZE]; static struct keyword *kw_hash[KW_HASH_SIZE];
static struct symbol **sym_hash; static struct symbol **sym_hash;
struct sym_scope {
struct sym_scope *next; /* Next on scope stack */
struct symbol *name; /* Name of this scope */
int active; /* Currently entered */
};
static struct sym_scope *conf_this_scope;
int conf_lino; int conf_lino;
static int cf_hash(byte *c); static int cf_hash(byte *c);
...@@ -184,7 +191,7 @@ cf_find_sym(byte *c, unsigned int h0) ...@@ -184,7 +191,7 @@ cf_find_sym(byte *c, unsigned int h0)
sym_hash = cfg_allocz(SYM_HASH_SIZE * sizeof(struct keyword *)); sym_hash = cfg_allocz(SYM_HASH_SIZE * sizeof(struct keyword *));
else else
for(s = sym_hash[h]; s; s=s->next) for(s = sym_hash[h]; s; s=s->next)
if (!strcmp(s->name, c)) if (!strcmp(s->name, c) && s->scope->active)
return s; return s;
l = strlen(c); l = strlen(c);
if (l > SYM_MAX_LEN) if (l > SYM_MAX_LEN)
...@@ -192,6 +199,7 @@ cf_find_sym(byte *c, unsigned int h0) ...@@ -192,6 +199,7 @@ cf_find_sym(byte *c, unsigned int h0)
s = cfg_alloc(sizeof(struct symbol) + l); s = cfg_alloc(sizeof(struct symbol) + l);
s->next = sym_hash[h]; s->next = sym_hash[h];
sym_hash[h] = s; sym_hash[h] = s;
s->scope = conf_this_scope;
s->class = SYM_VOID; s->class = SYM_VOID;
s->def = NULL; s->def = NULL;
s->aux = 0; s->aux = 0;
...@@ -240,6 +248,8 @@ cf_lex_init(int is_cli) ...@@ -240,6 +248,8 @@ cf_lex_init(int is_cli)
BEGIN(CLI); BEGIN(CLI);
else else
BEGIN(INITIAL); BEGIN(INITIAL);
conf_this_scope = cfg_allocz(sizeof(struct sym_scope));
conf_this_scope->active = 1;
} }
void void
...@@ -254,3 +264,22 @@ cf_lex_init_tables(void) ...@@ -254,3 +264,22 @@ cf_lex_init_tables(void)
kw_hash[h] = k; kw_hash[h] = k;
} }
} }
void
cf_push_scope(struct symbol *sym)
{
struct sym_scope *s = cfg_alloc(sizeof(struct sym_scope));
s->next = conf_this_scope;
conf_this_scope = s;
s->active = 1;
s->name = sym;
}
void
cf_pop_scope(void)
{
conf_this_scope->active = 0;
conf_this_scope = conf_this_scope->next;
ASSERT(conf_this_scope);
}
...@@ -50,6 +50,7 @@ extern int (*cf_read_hook)(byte *buf, unsigned int max); ...@@ -50,6 +50,7 @@ extern int (*cf_read_hook)(byte *buf, unsigned int max);
struct symbol { struct symbol {
struct symbol *next; struct symbol *next;
struct sym_scope *scope;
int class; int class;
int aux; int aux;
void *aux2; void *aux2;
...@@ -75,6 +76,8 @@ void cf_lex_init(int is_cli); ...@@ -75,6 +76,8 @@ void cf_lex_init(int is_cli);
struct symbol *cf_find_symbol(byte *c); struct symbol *cf_find_symbol(byte *c);
struct symbol *cf_default_name(char *prefix, int *counter); struct symbol *cf_default_name(char *prefix, int *counter);
void cf_define_symbol(struct symbol *symbol, int type, void *def); void cf_define_symbol(struct symbol *symbol, int type, void *def);
void cf_push_context(struct symbol *);
void cf_pop_context(void);
/* Parser */ /* Parser */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment