From da71bced464e10482e7b24b4e3bc3376a9894cc7 Mon Sep 17 00:00:00 2001 From: StunxFS <56417208+StunxFS@users.noreply.github.com> Date: Thu, 28 Apr 2022 15:35:16 -0400 Subject: [PATCH] transformer: minor optimization for `'string literal'.len` (#14207) --- vlib/v/gen/c/cgen.v | 3 +-- vlib/v/gen/c/testdata/README.md | 4 ++-- vlib/v/gen/c/testdata/strlit_len_optimization.c.must_have | 2 ++ vlib/v/gen/c/testdata/strlit_len_optimization.out | 2 ++ vlib/v/gen/c/testdata/strlit_len_optimization.vv | 6 ++++++ vlib/v/transformer/transformer.v | 6 ++++++ 6 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 vlib/v/gen/c/testdata/strlit_len_optimization.c.must_have create mode 100644 vlib/v/gen/c/testdata/strlit_len_optimization.out create mode 100644 vlib/v/gen/c/testdata/strlit_len_optimization.vv diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index 69dd1d3339..afa429e04b 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -3267,8 +3267,7 @@ fn (mut g Gen) selector_expr(node ast.SelectorExpr) { info := sym.info as ast.ArrayFixed g.write('$info.size') return - } - if sym.kind == .chan && (node.field_name == 'len' || node.field_name == 'closed') { + } else if sym.kind == .chan && (node.field_name == 'len' || node.field_name == 'closed') { g.write('sync__Channel_${node.field_name}(') g.expr(node.expr) g.write(')') diff --git a/vlib/v/gen/c/testdata/README.md b/vlib/v/gen/c/testdata/README.md index 6cff11b48b..3787edc20e 100644 --- a/vlib/v/gen/c/testdata/README.md +++ b/vlib/v/gen/c/testdata/README.md @@ -1,8 +1,8 @@ ## Purpose: tests data for the output of V's C code generator -## TLDR: `v vlib/v/gen/c/coutput_test.v` +## TLDR: `v run vlib/v/gen/c/coutput_test.v` -coutput_test.v is a *test runner*, that checks whether the generated C +coutput_test.v is a *test runner*, that checks whether the generated C source code matches *all* expectations, specified in *.c.must_have files, in the folder vlib/v/gen/c/testdata/ . diff --git a/vlib/v/gen/c/testdata/strlit_len_optimization.c.must_have b/vlib/v/gen/c/testdata/strlit_len_optimization.c.must_have new file mode 100644 index 0000000000..d541b43c1a --- /dev/null +++ b/vlib/v/gen/c/testdata/strlit_len_optimization.c.must_have @@ -0,0 +1,2 @@ +int a = 5; +int b = 7; diff --git a/vlib/v/gen/c/testdata/strlit_len_optimization.out b/vlib/v/gen/c/testdata/strlit_len_optimization.out new file mode 100644 index 0000000000..b3172d1242 --- /dev/null +++ b/vlib/v/gen/c/testdata/strlit_len_optimization.out @@ -0,0 +1,2 @@ +5 +7 diff --git a/vlib/v/gen/c/testdata/strlit_len_optimization.vv b/vlib/v/gen/c/testdata/strlit_len_optimization.vv new file mode 100644 index 0000000000..5ecdf69201 --- /dev/null +++ b/vlib/v/gen/c/testdata/strlit_len_optimization.vv @@ -0,0 +1,6 @@ +fn main() { + a := 'Vlang'.len + b := r'Vlang\n'.len + println(a) + println(b) +} diff --git a/vlib/v/transformer/transformer.v b/vlib/v/transformer/transformer.v index 6239237dfc..2ddf97629c 100644 --- a/vlib/v/transformer/transformer.v +++ b/vlib/v/transformer/transformer.v @@ -636,6 +636,12 @@ pub fn (mut t Transformer) expr(mut node ast.Expr) ast.Expr { } ast.SelectorExpr { node.expr = t.expr(mut node.expr) + if mut node.expr is ast.StringLiteral && node.field_name == 'len' { + return ast.IntegerLiteral{ + val: node.expr.val.len.str() + pos: node.pos + } + } } ast.SizeOf { node.expr = t.expr(mut node.expr)