{
symbol_t *symbol = declaration->symbol;
namespace_t namespace = declaration->namespace;
- assert(declaration->source_position.input_name != NULL);
/* a declaration should be only pushed once */
assert(declaration->parent_context == NULL);
if(symbol->declaration == NULL) {
symbol->declaration = declaration;
} else {
- declaration_t *iter = symbol->declaration;
- for( ; iter != NULL; iter = iter->symbol_next) {
- declaration_t *symbol_next = iter->symbol_next;
- if(symbol_next == NULL) {
- iter->symbol_next = declaration;
- assert(declaration->symbol_next == NULL);
- break;
- }
- if(symbol_next->namespace == namespace) {
- iter->symbol_next = declaration;
- declaration->symbol_next = symbol_next->symbol_next;
+ declaration_t *iter_last = NULL;
+ declaration_t *iter = symbol->declaration;
+ for( ; iter != NULL; iter_last = iter, iter = iter->symbol_next) {
+ /* replace an entry? */
+ if(iter->namespace == namespace) {
+ if(iter_last == NULL) {
+ symbol->declaration = declaration;
+ } else {
+ iter_last->symbol_next = declaration;
+ }
+ declaration->symbol_next = iter->symbol_next;
break;
}
}
+ if(iter == NULL) {
+ assert(iter_last->symbol_next == NULL);
+ iter_last->symbol_next = declaration;
+ }
}
return declaration;
static declaration_t *environment_push(declaration_t *declaration)
{
+ assert(declaration->source_position.input_name != NULL);
return stack_push(&environment_stack, declaration, context);
}
{
assert(token.type == T_IDENTIFIER);
symbol_t *symbol = token.v.symbol;
+ next_token();
declaration_t *label = get_label(symbol);
label_statement->statement.type = STATEMENT_LABEL;
label_statement->statement.source_position = token.source_position;
+ label_statement->label = label;
expect(':');
return NULL;
}
symbol_t *symbol = token.v.symbol;
+ next_token();
declaration_t *label = get_label(symbol);
expect(';');
- return NULL;
+ return (statement_t*) statement;
}
static statement_t *parse_continue(void)