@@ -2405,7 +2405,7 @@ fn (mut g Gen) autofree_call_pregen(node ast.CallExpr) {
24052405 g.is_autofree = old_is_autofree
24062406 g.is_autofree_tmp = false
24072407 s + = expr_code
2408- s + = ';// new af2 pre '
2408+ s + = ';'
24092409 g.strs_to_free0 << s
24102410 // This tmp arg var will be freed with the rest of the vars at the end of the scope.
24112411 }
@@ -2630,18 +2630,22 @@ fn (mut g Gen) call_args(node ast.CallExpr) {
26302630 // some c fn definitions dont have args (cfns.v) or are not updated in checker
26312631 // when these are fixed we wont need this check
26322632 if i < expected_types.len {
2633- if use_tmp_var_autofree {
2634- if arg.is_tmp_autofree { // && !g.is_js_call {
2635- // We saved expressions in temp variables so that they can be freed later.
2636- // `foo(str + str2) => x := str + str2; foo(x); x.free()`
2637- // g.write('_arg_expr_${g.called_fn_name}_${i}')
2638- // Use these variables here.
2639- fn_name := node.name.replace ('.' , '_' )
2640- // name := '_tt${g.tmp_count_af}_arg_expr_${fn_name}_${i}'
2641- name := '_arg_expr_${fn_name} _${i + 1} _${node.pos.pos} '
2633+ mut wrote_tmp_arg := false
2634+ if use_tmp_var_autofree && arg.is_tmp_autofree { // && !g.is_js_call {
2635+ // We saved expressions in temp variables so that they can be freed later.
2636+ // `foo(str + str2) => x := str + str2; foo(x); x.free()`
2637+ // g.write('_arg_expr_${g.called_fn_name}_${i}')
2638+ // Use these variables here.
2639+ fn_name := node.name.replace ('.' , '_' )
2640+ // name := '_tt${g.tmp_count_af}_arg_expr_${fn_name}_${i}'
2641+ name := '_arg_expr_${fn_name} _${i + 1} _${node.pos.pos} '
2642+ scope := g.file.scope.innermost (node.pos.pos)
2643+ if ! g.is_autofree_tmp || scope.known_var (name) {
26422644 g.write ('/*autofree arg*/' + name)
2645+ wrote_tmp_arg = true
26432646 }
2644- } else {
2647+ }
2648+ if ! wrote_tmp_arg {
26452649 g.ref_or_deref_arg (arg, expected_types[i], node.language, is_smartcast)
26462650 }
26472651 } else {
0 commit comments