From db07e7bd3dd9eb9058afa5bd7573ddbafd00b14c Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Sun, 24 May 2020 11:47:59 -0500 Subject: [PATCH] bug fixes for params shadowing --- onyx | Bin 82952 -> 83216 bytes onyx.c | 4 ++- onyxmsgs.c | 1 + onyxmsgs.h | 1 + onyxparser.c | 69 +++++++++++++++++++++++++++++---------------- onyxparser.h | 23 +++++++-------- progs/minimal.onyx | 10 ++++--- 7 files changed, 67 insertions(+), 41 deletions(-) diff --git a/onyx b/onyx index 2c67a97770447bdd8cd6786329c985c095e460e5..6ec79ea91f5dad35682e1545c61ee8a15a197f14 100755 GIT binary patch delta 29931 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 QRj-b+c~fP}n^^k)0c3tXGXMYp diff --git a/onyx.c b/onyx.c index cd94fdc3..d91dd70e 100644 --- a/onyx.c +++ b/onyx.c @@ -54,7 +54,9 @@ int main(int argc, char *argv[]) { if (onyx_message_has_errors(&msgs)) { onyx_message_print(&msgs); } else { - onyx_ast_print(program); + // TODO: Make a better AST printer so there aren't infinite loops + // onyx_ast_print(program); + bh_printf("No errors.\n"); } bh_file_contents_delete(&fc); diff --git a/onyxmsgs.c b/onyxmsgs.c index fae03d85..6b92357d 100644 --- a/onyxmsgs.c +++ b/onyxmsgs.c @@ -8,6 +8,7 @@ static const char* msg_formats[] = { "expected lval '%s'", "attempt to assign to constant '%s'", "unknown symbol '%s'", + "redefinition of function '%s'", }; void onyx_message_add(OnyxMessages* msgs, OnyxMessageType type, OnyxFilePos pos, ...) { diff --git a/onyxmsgs.h b/onyxmsgs.h index 81c667b2..fc102233 100644 --- a/onyxmsgs.h +++ b/onyxmsgs.h @@ -15,6 +15,7 @@ typedef enum OnyxMessageType { ONYX_MESSAGE_TYPE_NOT_LVAL, ONYX_MESSAGE_TYPE_ASSIGN_CONST, ONYX_MESSAGE_TYPE_UNKNOWN_SYMBOL, + ONYX_MESSAGE_TYPE_FUNCTION_REDEFINITION, ONYX_MESSAGE_TYPE_COUNT, } OnyxMessageType; diff --git a/onyxparser.c b/onyxparser.c index 020c88d3..82949e79 100644 --- a/onyxparser.c +++ b/onyxparser.c @@ -72,7 +72,8 @@ static b32 is_terminating_token(OnyxTokenType token_type); static OnyxToken* expect(OnyxParser* parser, OnyxTokenType token_type); static OnyxAstNodeScope* enter_scope(OnyxParser* parser); static OnyxAstNodeScope* leave_scope(OnyxParser* parser); -static void insert_local(OnyxParser* parser, OnyxAstNodeLocal* local); +static void insert_identifier(OnyxParser* parser, OnyxAstNode* ident, b32 is_local); +static void remove_identifier(OnyxParser* parser, OnyxAstNode* ident); static OnyxAstNode* parse_factor(OnyxParser* parser); static OnyxAstNode* parse_bin_op(OnyxParser* parser, OnyxAstNode* left); static OnyxAstNode* parse_expression(OnyxParser* parser); @@ -146,16 +147,7 @@ static OnyxAstNodeScope* leave_scope(OnyxParser* parser) { assert(parser->curr_scope != NULL); for (OnyxAstNodeLocal *walker = parser->curr_scope->last_local; walker != NULL; walker = walker->prev_local) { - onyx_token_null_toggle(*walker->token); - - if (walker->shadowed) { - // NOTE: Restore shadowed variable - bh_hash_put(OnyxAstNode*, parser->identifiers, walker->token->token, walker->shadowed); - } else { - bh_hash_delete(OnyxAstNode*, parser->identifiers, walker->token->token); - } - - onyx_token_null_toggle(*walker->token); + remove_identifier(parser, (OnyxAstNode *) walker); } parser->curr_scope = parser->curr_scope->prev_scope; @@ -174,13 +166,16 @@ static OnyxAstNode* lookup_identifier(OnyxParser* parser, OnyxToken* token) { return ident; } -static void insert_local(OnyxParser* parser, OnyxAstNodeLocal* local) { - OnyxAstNodeScope* scope = parser->curr_scope; - local->prev_local = scope->last_local; - scope->last_local = local; +static void insert_identifier(OnyxParser* parser, OnyxAstNode* ident, b32 is_local) { + OnyxAstNodeLocal* local = (OnyxAstNodeLocal *) ident; + if (is_local) { + OnyxAstNodeScope* scope = parser->curr_scope; + local->prev_local = scope->last_local; + scope->last_local = local; + } onyx_token_null_toggle(*local->token); - if (bh_hash_has(OnyxAstNodeLocal*, parser->identifiers, local->token->token)) { + if (bh_hash_has(OnyxAstNode*, parser->identifiers, local->token->token)) { local->shadowed = bh_hash_get(OnyxAstNode*, parser->identifiers, local->token->token); } @@ -188,6 +183,18 @@ static void insert_local(OnyxParser* parser, OnyxAstNodeLocal* local) { onyx_token_null_toggle(*local->token); } +static void remove_identifier(OnyxParser* parser, OnyxAstNode* ident) { + OnyxAstNodeLocal* local = (OnyxAstNodeLocal *) ident; + + onyx_token_null_toggle(*local->token); + if (local->shadowed) { + bh_hash_put(OnyxAstNode*, parser->identifiers, local->token->token, local->shadowed); + } else { + bh_hash_delete(OnyxAstNode*, parser->identifiers, local->token->token); + } + onyx_token_null_toggle(*local->token); +} + static OnyxAstNode* parse_factor(OnyxParser* parser) { switch (parser->curr_token->type) { case TOKEN_TYPE_OPEN_PAREN: { @@ -296,7 +303,7 @@ static b32 parse_symbol_statement(OnyxParser* parser, OnyxAstNode** ret) { local->type = type; local->flags |= flags; - insert_local(parser, local); + insert_identifier(parser, (OnyxAstNode *) local, 1); if (parser->curr_token->type == TOKEN_TYPE_SYM_EQUALS) { parser_next_token(parser); @@ -528,21 +535,16 @@ static OnyxAstNodeFuncDef* parse_function_definition(OnyxParser* parser) { OnyxTypeInfo* return_type = parse_type(parser); func_def->return_type = return_type; - // BUG: if a param has the same name as a global or function, that global/function - // will no longer be in scope after the function body ends for (OnyxAstNodeParam* p = func_def->params; p != NULL; p = p->next) { - onyx_token_null_toggle(*p->token); - bh_hash_put(OnyxAstNode*, parser->identifiers, p->token->token, (OnyxAstNode*) p); - onyx_token_null_toggle(*p->token); + insert_identifier(parser, (OnyxAstNode *) p, 0); } func_def->body = parse_block(parser, 1); for (OnyxAstNodeParam* p = func_def->params; p != NULL; p = p->next) { - onyx_token_null_toggle(*p->token); - bh_hash_delete(OnyxAstNode*, parser->identifiers, p->token->token); - onyx_token_null_toggle(*p->token); + remove_identifier(parser, (OnyxAstNode *) p); } + return func_def; } @@ -578,6 +580,23 @@ static OnyxAstNode* parse_top_level_statement(OnyxParser* parser) { if (parser->curr_token->type == TOKEN_TYPE_KEYWORD_PROC) { OnyxAstNodeFuncDef* func_def = parse_function_definition(parser); func_def->token = symbol; + + onyx_token_null_toggle(*symbol); + + if (!bh_hash_has(OnyxAstNode *, parser->identifiers, symbol->token)) { + bh_hash_put(OnyxAstNode *, parser->identifiers, symbol->token, (OnyxAstNode *) func_def); + } else { + onyx_message_add(parser->msgs, + ONYX_MESSAGE_TYPE_FUNCTION_REDEFINITION, + symbol->pos, + symbol->token); + + // NOTE: I really wish C had defer... + onyx_token_null_toggle(*symbol); + return NULL; + } + + onyx_token_null_toggle(*symbol); return (OnyxAstNode *) func_def; } else if (parser->curr_token->type == TOKEN_TYPE_KEYWORD_STRUCT) { diff --git a/onyxparser.h b/onyxparser.h index 3dfd782c..9b16c10b 100644 --- a/onyxparser.h +++ b/onyxparser.h @@ -120,7 +120,18 @@ struct OnyxAstNodeLocal { OnyxTypeInfo *type; OnyxAstNodeLocal *prev_local; OnyxAstNode *shadowed; - OnyxAstNode *unused2; + OnyxAstNode *unused; +}; + +// NOTE: Needs to have shadowed in the same position as OnyxAstNodeLocal +struct OnyxAstNodeParam { + OnyxAstNodeKind kind; + u32 flags; + OnyxToken *token; // Symbol name i.e. 'a', 'b' + OnyxTypeInfo *type; + OnyxAstNodeParam *next; + OnyxAstNode *shadowed; + u64 param_count; }; struct OnyxAstNodeScope { @@ -143,16 +154,6 @@ struct OnyxAstNodeBlock { OnyxAstNodeScope *scope; // NOTE: Only set on blocks belonging to functions }; -struct OnyxAstNodeParam { - OnyxAstNodeKind kind; - u32 flags; - OnyxToken *token; // Symbol name i.e. 'a', 'b' - OnyxTypeInfo *type; - OnyxAstNodeParam *next; - u64 param_count; - OnyxAstNode *right; -}; - struct OnyxAstNodeFuncDef { OnyxAstNodeKind kind; u32 flags; diff --git a/progs/minimal.onyx b/progs/minimal.onyx index 8e3b4d85..5b82b699 100644 --- a/progs/minimal.onyx +++ b/progs/minimal.onyx @@ -1,19 +1,21 @@ /* This is a comment */ /* Currently the "foreign" keyword doesn't do anything */ -foreign "console" log :: proc (a i32, b i32) -> i32 ---; +foreign "console" log :: proc (a i32, b i32) -> i32 --- export add :: proc (a i32, b i32) -> i32 { /* More comments */ return a + b; -}; +} + +c :: proc () -> void --- export mul :: proc (a i32, b i32) -> i32 { c: const i32 = a - b; /* Don't love this syntax, but it's easy to parse so whatever Inferred type, but constant */ - d: const = a + 2; + d: const = a + b; return c * d; -}; +} -- 2.25.1