cgen: optional expr fix
parent
ed50fef1c0
commit
c993489fe9
|
@ -24,6 +24,7 @@ mut:
|
||||||
optionals []string // to avoid duplicates TODO perf, use map
|
optionals []string // to avoid duplicates TODO perf, use map
|
||||||
inside_ternary bool // ?: comma separated statements on a single line
|
inside_ternary bool // ?: comma separated statements on a single line
|
||||||
stmt_start_pos int
|
stmt_start_pos int
|
||||||
|
right_is_opt bool
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn cgen(files []ast.File, table &table.Table) string {
|
pub fn cgen(files []ast.File, table &table.Table) string {
|
||||||
|
@ -598,6 +599,9 @@ fn (g mut Gen) expr(node ast.Expr) {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
g.is_assign_expr = true
|
g.is_assign_expr = true
|
||||||
|
if table.type_is_optional(it.right_type) {
|
||||||
|
g.right_is_opt = true
|
||||||
|
}
|
||||||
mut str_add := false
|
mut str_add := false
|
||||||
if it.left_type == table.string_type_idx && it.op == .plus_assign {
|
if it.left_type == table.string_type_idx && it.op == .plus_assign {
|
||||||
// str += str2 => `str = string_add(str, str2)`
|
// str += str2 => `str = string_add(str, str2)`
|
||||||
|
@ -622,6 +626,7 @@ fn (g mut Gen) expr(node ast.Expr) {
|
||||||
else if str_add {
|
else if str_add {
|
||||||
g.write(')')
|
g.write(')')
|
||||||
}
|
}
|
||||||
|
g.right_is_opt = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ast.Assoc {
|
ast.Assoc {
|
||||||
|
@ -1142,7 +1147,11 @@ fn (g mut Gen) ident(node ast.Ident) {
|
||||||
// TODO `is`
|
// TODO `is`
|
||||||
match node.info {
|
match node.info {
|
||||||
ast.IdentVar {
|
ast.IdentVar {
|
||||||
if it.is_optional && !g.is_assign_expr {
|
// x ?int
|
||||||
|
// `x = 10` => `x.data = 10` (g.right_is_opt == false)
|
||||||
|
// `x = new_opt()` => `x = new_opt()` (g.right_is_opt == true)
|
||||||
|
// `println(x)` => `println(*(int*)x.data)`
|
||||||
|
if it.is_optional && !(g.is_assign_expr && g.right_is_opt) {
|
||||||
g.write('/*opt*/')
|
g.write('/*opt*/')
|
||||||
styp := g.typ(it.typ)[7..] // Option_int => int TODO perf?
|
styp := g.typ(it.typ)[7..] // Option_int => int TODO perf?
|
||||||
g.write('(*($styp*)${name}.data)')
|
g.write('(*($styp*)${name}.data)')
|
||||||
|
|
|
@ -52,8 +52,7 @@ void function2() {
|
||||||
}
|
}
|
||||||
if (false) {
|
if (false) {
|
||||||
foo(1);
|
foo(1);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
puts(tos3("else"));
|
puts(tos3("else"));
|
||||||
foo(100);
|
foo(100);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue