v/vlib/compiler/optimization.v

49 lines
958 B
V
Raw Normal View History

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)
2019-12-07 01:05:19 +01:00
if p.tok == .rsbr {
p.error('`x in []` is always false')
}
mut i := 0
// Get `a` expr value (can be a string literal, not a variable)
expr := p.cgen.cur_line[ph..]
is_str := typ == 'string'
2019-12-19 22:29:37 +01:00
// 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, ')
2019-12-19 22:29:37 +01:00
}
else {
p.gen(' || $expr == ')
}
2019-11-27 06:48:04 +01:00
}
if i == 0 {
if is_str {
2019-11-27 06:48:04 +01:00
p.cgen.set_placeholder(ph, ' (string_eq(')
p.gen(', ')
2019-12-19 22:29:37 +01:00
}
else {
2019-11-27 06:48:04 +01:00
p.cgen.set_placeholder(ph, ' (')
p.gen(' ==')
2019-11-27 06:48:04 +01:00
}
}
p.check_types(p.bool_expression(), typ)
if is_str {
p.gen(')')
2019-11-27 06:48:04 +01:00
}
if p.tok != .rsbr {
p.check(.comma)
2019-12-18 05:52:14 +01:00
p.fspace()
}
i++
2019-11-27 06:48:04 +01:00
}
p.gen(')')
p.check(.rsbr)
}
2019-12-19 22:29:37 +01:00