From fb785b8adf74cad3b317ea6bf6ec756fcfbb7623 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Fri, 6 Mar 2020 14:03:35 +0100 Subject: [PATCH] cgen: optimize const definitions --- vlib/v/gen/cgen.v | 34 ++++++++++++++++++++++++++-------- vlib/v/gen/tests/1.c | 8 ++++---- 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/vlib/v/gen/cgen.v b/vlib/v/gen/cgen.v index 67aed482ac..1463efc065 100644 --- a/vlib/v/gen/cgen.v +++ b/vlib/v/gen/cgen.v @@ -143,13 +143,7 @@ fn (g mut Gen) stmt(node ast.Stmt) { g.writeln(';') } ast.ConstDecl { - for i, field in it.fields { - field_type_sym := g.table.get_type_symbol(field.typ) - name := field.name.replace('.', '__') - g.write('$field_type_sym.name $name = ') - g.expr(it.exprs[i]) - g.writeln(';') - } + g.const_decl(it) } ast.CompIf { // TODO @@ -609,6 +603,30 @@ fn (g mut Gen) index_expr(node ast.IndexExpr) { } } +fn (g mut Gen) const_decl(node ast.ConstDecl) { + for i, field in node.fields { + field_type_sym := g.table.get_type_symbol(field.typ) + name := field.name.replace('.', '__') + expr := node.exprs[i] + match expr { + // Simple expressions should use a #define + // so that we don't pollute the binary with unnecessary global vars + // Do not do this when building a module, otherwise the consts + // will not be accessible. + ast.CharLiteral, ast.IntegerLiteral { + g.write('#define $name ') + g.expr(expr) + g.writeln('') + } + else { + g.writeln('$field_type_sym.name $name; // inited later') // = ') + // TODO + // g.expr(node.exprs[i]) + } + } + } +} + fn (g mut Gen) call_args(args []ast.Expr) { for i, expr in args { g.expr(expr) @@ -699,7 +717,7 @@ fn (g &Gen) sort_structs(types []table.TypeSymbol) []table.TypeSymbol { } } else {} - } + } // add type and dependant types to graph dep_graph.add(t.name, field_deps) } diff --git a/vlib/v/gen/tests/1.c b/vlib/v/gen/tests/1.c index ce2badd70e..fb14a62d6f 100644 --- a/vlib/v/gen/tests/1.c +++ b/vlib/v/gen/tests/1.c @@ -29,8 +29,8 @@ void matches(); void end(); void localmod__pub_foo(); int localmod__get_int_10(); -int pi = 3; -int pi2 = pi; +#define pi 3 +int pi2; // inited later typedef enum { Color_red, // 0 @@ -155,7 +155,7 @@ void matches() { ; } -int path_sep = 10; +#define path_sep 10 void end() { int i = 2; @@ -164,7 +164,7 @@ void end() { int e = 2 + 3 * 4; } -int localmod__pub_int_const = 20; +#define localmod__pub_int_const 20 void localmod__pub_foo() { int a = 10;