Accessing constant values in structs
This commit is contained in:
26
ccodegen.cpp
26
ccodegen.cpp
@@ -78,7 +78,20 @@ function void
|
||||
gen_expr(Ast_Expr *ast){
|
||||
switch(ast->kind){
|
||||
CASE(IDENT, Atom){
|
||||
gen("%s", node->intern_val.str);
|
||||
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);
|
||||
BREAK();
|
||||
}
|
||||
|
||||
@@ -305,13 +318,10 @@ gen_ast(Ast *ast){
|
||||
}
|
||||
}
|
||||
else if(sym->type == type_int){
|
||||
gen("enum { %s = %lld };", node->name.str, sym->int_val);
|
||||
gen("// constant int %s = %lld;", node->name.str, sym->int_val);
|
||||
}
|
||||
else if(sym->type == type_string){
|
||||
gen("String %s = LIT(\"%s\");", node->name.str, sym->intern_val.str);
|
||||
}
|
||||
else if(sym->type->kind == TYPE_ENUM){
|
||||
gen("enum { %s = %lld };", node->name.str, sym->int_val);
|
||||
gen("// String %s = LIT(\"%s\");", node->name.str, sym->intern_val.str);
|
||||
}
|
||||
else if(sym->type == type_type){
|
||||
if(sym->type_val->kind == TYPE_STRUCT){
|
||||
@@ -339,7 +349,7 @@ gen_ast(Ast *ast){
|
||||
Ast_Enum *enu = (Ast_Enum *)sym->type_val->ast;
|
||||
assert(enu->kind == AST_ENUM);
|
||||
if(node->value->kind == AST_ENUM){
|
||||
gen("enum %s{", node->name.str);
|
||||
gen("/*enum %s{", node->name.str);
|
||||
// @todo add typespec
|
||||
global_indent++;
|
||||
For(enu->members){
|
||||
@@ -350,7 +360,7 @@ gen_ast(Ast *ast){
|
||||
gen(",");
|
||||
}
|
||||
global_indent--;
|
||||
genln("};");
|
||||
genln("};*/");
|
||||
}
|
||||
else{
|
||||
// Type alias
|
||||
|
||||
Reference in New Issue
Block a user