mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
transformer: minor optimization for 'string literal'.len
(#14207)
This commit is contained in:
parent
e56385d57d
commit
e24482a143
@ -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(')')
|
||||
|
4
vlib/v/gen/c/testdata/README.md
vendored
4
vlib/v/gen/c/testdata/README.md
vendored
@ -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/ .
|
||||
|
||||
|
2
vlib/v/gen/c/testdata/strlit_len_optimization.c.must_have
vendored
Normal file
2
vlib/v/gen/c/testdata/strlit_len_optimization.c.must_have
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
int a = 5;
|
||||
int b = 7;
|
2
vlib/v/gen/c/testdata/strlit_len_optimization.out
vendored
Normal file
2
vlib/v/gen/c/testdata/strlit_len_optimization.out
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
5
|
||||
7
|
6
vlib/v/gen/c/testdata/strlit_len_optimization.vv
vendored
Normal file
6
vlib/v/gen/c/testdata/strlit_len_optimization.vv
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
fn main() {
|
||||
a := 'Vlang'.len
|
||||
b := r'Vlang\n'.len
|
||||
println(a)
|
||||
println(b)
|
||||
}
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user