From 369418b0429205be6fd0925a9198ba6f6ac557f4 Mon Sep 17 00:00:00 2001 From: Krzosa Karol Date: Tue, 31 May 2022 13:39:34 +0200 Subject: [PATCH] Rewriting field.accesses that evaluate to constants --- ccodegen.cpp | 28 +++++----------------------- enums.kl | 6 ++++-- typechecking.cpp | 24 +++++++++++++++++++----- 3 files changed, 28 insertions(+), 30 deletions(-) diff --git a/ccodegen.cpp b/ccodegen.cpp index d6a333e..7b49966 100644 --- a/ccodegen.cpp +++ b/ccodegen.cpp @@ -78,20 +78,7 @@ function void gen_expr(Ast_Expr *ast){ switch(ast->kind){ CASE(IDENT, Atom){ - Sym *sym = resolved_get(node); - if(sym){ - if(sym->kind == SYM_CONST){ - if(sym->type == type_int){ - gen("%lld", sym->int_val); - } - else if(sym->type == type_string){ - gen("LIT(\"%s\")", sym->intern_val.str); - } - else gen("%s", node->intern_val.str); - } - else gen("%s", node->intern_val.str); - } - else gen("%s", node->intern_val.str); + gen("%s", node->intern_val.str); BREAK(); } @@ -116,15 +103,10 @@ gen_expr(Ast_Expr *ast){ CASE(BINARY, Binary){ if(node->op == TK_Dot){ Sym *sym = resolved_get(node->left); - if(sym->kind == SYM_CONST){ - gen("%lld", sym->int_val); - } - else{ - gen_expr(node->left); - if(sym->type->kind == TYPE_POINTER) gen("->"); - else gen("."); - gen_expr(node->right); - } + gen_expr(node->left); + if(sym->type->kind == TYPE_POINTER) gen("->"); + else gen("."); + gen_expr(node->right); } else{ gen("("); diff --git a/enums.kl b/enums.kl index 2be3531..da28e47 100644 --- a/enums.kl +++ b/enums.kl @@ -2,12 +2,13 @@ Thing :: struct len: int - + Constant_String :: "Test" Constant :: 10 Thing_Kind :: enum None Thing_Not +test_string := Thing.Constant_String thing: Thing access := thing.len test := Thing.Thing_Kind.Thing_Not @@ -19,4 +20,5 @@ Allocator_Kind :: enum Heap -kind := Allocator_Kind.Heap \ No newline at end of file +kind := Allocator_Kind.Heap + diff --git a/typechecking.cpp b/typechecking.cpp index e5585f3..d8f6700 100644 --- a/typechecking.cpp +++ b/typechecking.cpp @@ -667,8 +667,15 @@ resolve_expr(Ast_Expr *ast, Ast_Resolved_Type *expected_type, Sym *const_sym){ assert(resolved); // @warning: rewrite entire node into a constant { - sym_new_resolved(SYM_CONST, {}, resolved->type, resolved->value, node->left); - node->right = 0; + Ast_Atom *rewrite = (Ast_Atom *)node; + static_assert(sizeof(Ast_Binary) > sizeof(Ast_Atom), "This wont work"); + if(resolved->type == type_int){ + rewrite->kind = AST_INT; + rewrite->int_val = resolved->int_val; + } else if(resolved->type == type_string){ + rewrite->kind = AST_STR; + rewrite->intern_val = resolved->intern_val; + } else invalid_codepath; } result = operand(resolved); } @@ -680,10 +687,17 @@ resolve_expr(Ast_Expr *ast, Ast_Resolved_Type *expected_type, Sym *const_sym){ Sym *sym = resolved_get(query); result = operand(sym); assert(sym); - // @note: warning rewriting nodes with constant values + // @warning rewriting nodes with constant values if(sym->kind == SYM_CONST){ - sym_new_resolved(sym->kind, {}, sym->type, sym->value, node->left); - node->right = 0; + Ast_Atom *rewrite = (Ast_Atom *)node; + static_assert(sizeof(Ast_Binary) > sizeof(Ast_Atom), "This wont work"); + if(sym->type == type_int){ + rewrite->kind = AST_INT; + rewrite->int_val = sym->int_val; + } else if(sym->type == type_string){ + rewrite->kind = AST_STR; + rewrite->intern_val = sym->intern_val; + } else invalid_codepath; } else{ sym_new_resolved(sym->kind, {}, sym->type, sym->value, ident);