cgen: fix string frees in calls
parent
ab37dcaa9c
commit
77e56aa3f9
|
@ -92,6 +92,7 @@ mut:
|
||||||
inside_vweb_tmpl bool
|
inside_vweb_tmpl bool
|
||||||
inside_return bool
|
inside_return bool
|
||||||
strs_to_free string
|
strs_to_free string
|
||||||
|
inside_call bool
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -598,7 +599,7 @@ fn (mut g Gen) stmt(node ast.Stmt) {
|
||||||
defer {
|
defer {
|
||||||
// If have temporary string exprs to free after this statement, do it. e.g.:
|
// If 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);`
|
||||||
if false && g.pref.autofree {
|
if g.pref.autofree {
|
||||||
if g.strs_to_free != '' {
|
if g.strs_to_free != '' {
|
||||||
g.writeln(g.strs_to_free)
|
g.writeln(g.strs_to_free)
|
||||||
g.strs_to_free = ''
|
g.strs_to_free = ''
|
||||||
|
|
|
@ -313,6 +313,8 @@ fn (mut g Gen) call_expr(node ast.CallExpr) {
|
||||||
if node.should_be_skipped {
|
if node.should_be_skipped {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
g.inside_call = true
|
||||||
|
defer {g.inside_call = false}
|
||||||
gen_or := node.or_block.kind != .absent
|
gen_or := node.or_block.kind != .absent
|
||||||
cur_line := if gen_or && g.is_assign_rhs {
|
cur_line := if gen_or && g.is_assign_rhs {
|
||||||
line := g.go_before_stmt(0)
|
line := g.go_before_stmt(0)
|
||||||
|
|
|
@ -142,7 +142,7 @@ fn (mut g Gen) string_literal(node ast.StringLiteral) {
|
||||||
fn (mut g Gen) string_inter_literal(node ast.StringInterLiteral) {
|
fn (mut g Gen) string_inter_literal(node ast.StringInterLiteral) {
|
||||||
mut cur_line := ''
|
mut cur_line := ''
|
||||||
mut tmp := ''
|
mut tmp := ''
|
||||||
free := g.pref.autofree && !g.inside_return &&
|
free := g.pref.autofree && g.inside_call && !g.inside_return &&
|
||||||
g.inside_ternary == 0 && g.cur_fn != 0 &&
|
g.inside_ternary == 0 && g.cur_fn != 0 &&
|
||||||
g.cur_fn.name != ''
|
g.cur_fn.name != ''
|
||||||
if free {
|
if free {
|
||||||
|
@ -157,7 +157,7 @@ fn (mut g Gen) string_inter_literal(node ast.StringInterLiteral) {
|
||||||
*/
|
*/
|
||||||
// g.insert_before_stmt('// str tmp var\nstring $tmp = ')
|
// g.insert_before_stmt('// str tmp var\nstring $tmp = ')
|
||||||
cur_line = g.go_before_stmt(0)
|
cur_line = g.go_before_stmt(0)
|
||||||
g.writeln('// free _str')
|
g.writeln('// free _str2 $g.inside_call')
|
||||||
g.write('string $tmp = ')
|
g.write('string $tmp = ')
|
||||||
g.strs_to_free += 'string_free(&$tmp); /*tmp str*/'
|
g.strs_to_free += 'string_free(&$tmp); /*tmp str*/'
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue