autofree: fix if expressions
parent
a52314d70a
commit
42da37e900
|
@ -74,7 +74,8 @@ mut:
|
||||||
// inside_if_expr bool
|
// inside_if_expr bool
|
||||||
ternary_names map[string]string
|
ternary_names map[string]string
|
||||||
ternary_level_names map[string][]string
|
ternary_level_names map[string][]string
|
||||||
stmt_path_pos []int
|
stmt_path_pos []int // positions of each statement start, for inserting C statements before the current statement
|
||||||
|
skip_stmt_pos bool // for handling if expressions + autofree (since both prepend C statements)
|
||||||
right_is_opt bool
|
right_is_opt bool
|
||||||
autofree bool
|
autofree bool
|
||||||
indent int
|
indent int
|
||||||
|
@ -725,9 +726,12 @@ fn (mut g Gen) stmts_with_tmp_var(stmts []ast.Stmt, tmp_var string) {
|
||||||
for i, stmt in stmts {
|
for i, stmt in stmts {
|
||||||
if i == stmts.len - 1 && tmp_var != '' {
|
if i == stmts.len - 1 && tmp_var != '' {
|
||||||
// Handle if expressions, set the value of the last expression to the temp var.
|
// Handle if expressions, set the value of the last expression to the temp var.
|
||||||
|
g.stmt_path_pos << g.out.len
|
||||||
|
g.skip_stmt_pos = true
|
||||||
g.writeln('$tmp_var = /* if expr set */')
|
g.writeln('$tmp_var = /* if expr set */')
|
||||||
}
|
}
|
||||||
g.stmt(stmt)
|
g.stmt(stmt)
|
||||||
|
g.skip_stmt_pos = false
|
||||||
if g.inside_ternary > 0 && i < stmts.len - 1 {
|
if g.inside_ternary > 0 && i < stmts.len - 1 {
|
||||||
g.write(',')
|
g.write(',')
|
||||||
}
|
}
|
||||||
|
@ -761,7 +765,9 @@ fn (mut g Gen) write_v_source_line_info(pos token.Position) {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (mut g Gen) stmt(node ast.Stmt) {
|
fn (mut g Gen) stmt(node ast.Stmt) {
|
||||||
|
if !g.skip_stmt_pos {
|
||||||
g.stmt_path_pos << g.out.len
|
g.stmt_path_pos << g.out.len
|
||||||
|
}
|
||||||
defer {
|
defer {
|
||||||
// If we have temporary string exprs to free after this statement, do it. e.g.:
|
// If we have temporary string exprs to free after this statement, do it. e.g.:
|
||||||
// `foo('a' + 'b')` => `tmp := 'a' + 'b'; foo(tmp); string_free(&tmp);`
|
// `foo('a' + 'b')` => `tmp := 'a' + 'b'; foo(tmp); string_free(&tmp);`
|
||||||
|
@ -1047,7 +1053,9 @@ fn (mut g Gen) stmt(node ast.Stmt) {
|
||||||
g.writeln('// TypeDecl')
|
g.writeln('// TypeDecl')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if !g.skip_stmt_pos { // && g.stmt_path_pos.len > 0 {
|
||||||
g.stmt_path_pos.delete_last()
|
g.stmt_path_pos.delete_last()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (mut g Gen) write_defer_stmts() {
|
fn (mut g Gen) write_defer_stmts() {
|
||||||
|
|
|
@ -159,10 +159,14 @@ fn tt() {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_string(s string) string {
|
fn get_string(s string) string {
|
||||||
return s
|
return s.clone() // TODO handle returning the argument without clone()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn if_expr() string {
|
||||||
|
a := if true { get_string('a' + 'b') } else { get_string('c' + 'd') }
|
||||||
|
return a
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
fn return_if_expr() string {
|
fn return_if_expr() string {
|
||||||
return if true {
|
return if true {
|
||||||
get_string('a' + 'b')
|
get_string('a' + 'b')
|
||||||
|
@ -170,7 +174,7 @@ fn return_if_expr() string {
|
||||||
get_string('c' + 'd')
|
get_string('c' + 'd')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
fn main() {
|
fn main() {
|
||||||
println('start')
|
println('start')
|
||||||
simple()
|
simple()
|
||||||
|
@ -186,7 +190,8 @@ fn main() {
|
||||||
str_replace2()
|
str_replace2()
|
||||||
if_cond()
|
if_cond()
|
||||||
addition_with_tmp_expr()
|
addition_with_tmp_expr()
|
||||||
// return_if_expr()
|
if_expr()
|
||||||
|
return_if_expr()
|
||||||
println('end')
|
println('end')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue