1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00
v/vlib/compiler/optimization.v
Delyan Angelov 53c64abdeb compiler: make compiler an ordinary vlib/compiler module
* Move compiler/ under vlib/compiler/ .

* Add a minimal compiler/main.v driver program.

* Cleanup compiler/main.v .

* Make most compiler tests pass again.

* Apply the fix by @joe-conigliaro , so that the rest of the compiler tests are fixed too.

* Thanks to @avitkauskas, now the vlib/vcompiler/tests/str_gen_test.v test does not need to be special cased anymore.

* Reapply @joe-conigliaro fix for vgen.
2019-10-13 16:37:43 +03:00

41 lines
833 B
V

module compiler
// `a in [1,2,3]` => `a == 1 || a == 2 || a == 3`
// avoid allocation
// `typ` is the type of `a`
// `ph` is for string_eq()
fn (p mut Parser) in_optimization(typ string, ph int) {
p.check(.lsbr)
mut i := 0
// Get `a` expr value (can be a string literal, not a variable)
expr := p.cgen.cur_line.right(ph)
is_str := typ == 'string'
//println('!! $p.expr_var.name => $name ($typ)')
for p.tok != .rsbr && p.tok != .eof {
if i > 0 {
if is_str {
p.gen(' || string_eq($expr, ')
} else {
p.gen(' || $expr == ')
}
}
if i == 0 {
if is_str {
p.cgen.set_placeholder(ph, ' string_eq(')
p.gen(', ')
} else {
p.gen(' ==')
}
}
p.check_types(p.bool_expression(), typ)
if is_str {
p.gen(')')
}
if p.tok != .rsbr {
p.check(.comma)
}
i++
}
p.check(.rsbr)
}