1
0
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:
StunxFS 2022-04-28 15:35:16 -04:00 committed by GitHub
parent e56385d57d
commit e24482a143
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 19 additions and 4 deletions

View File

@ -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(')')

View File

@ -1,6 +1,6 @@
## 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
source code matches *all* expectations, specified in *.c.must_have files,

View File

@ -0,0 +1,2 @@
int a = 5;
int b = 7;

View File

@ -0,0 +1,2 @@
5
7

View File

@ -0,0 +1,6 @@
fn main() {
a := 'Vlang'.len
b := r'Vlang\n'.len
println(a)
println(b)
}

View File

@ -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)