autofree: use scopes to avoid dups
							parent
							
								
									df82ef6bc7
								
							
						
					
					
						commit
						0dfd51408e
					
				|  | @ -111,7 +111,7 @@ mut: | |||
| 	match_sumtype_syms    []table.TypeSymbol | ||||
| 	// tmp_arg_vars_to_free  []string
 | ||||
| 	// autofree_pregen       map[string]string
 | ||||
| 	autofree_tmp_vars     []string // to avoid redefining the same tmp vars in a single function
 | ||||
| 	// autofree_tmp_vars     []string // to avoid redefining the same tmp vars in a single function
 | ||||
| 	called_fn_name        string | ||||
| 	cur_mod               string | ||||
| 	is_js_call            bool // for handling a special type arg #1 `json.decode(User, ...)`
 | ||||
|  |  | |||
|  | @ -17,7 +17,7 @@ fn (mut g Gen) gen_fn_decl(it ast.FnDecl, skip bool) { | |||
| 	} | ||||
| 	if g.pref.autofree { | ||||
| 		defer { | ||||
| 			g.autofree_tmp_vars = [] | ||||
| 			// g.autofree_tmp_vars = []
 | ||||
| 		} | ||||
| 	} | ||||
| 	// if g.fileis('vweb.v') {
 | ||||
|  | @ -630,6 +630,7 @@ fn (mut g Gen) autofree_call_pregen(node ast.CallExpr) { | |||
| 	} | ||||
| 	free_tmp_arg_vars = false // set the flag to true only if we have at least one arg to free
 | ||||
| 	g.tmp_count2++ | ||||
| 	mut scope := g.file.scope.innermost(node.pos.pos) | ||||
| 	for i, arg in node.args { | ||||
| 		if !arg.is_tmp_autofree { | ||||
| 			continue | ||||
|  | @ -645,12 +646,18 @@ fn (mut g Gen) autofree_call_pregen(node ast.CallExpr) { | |||
| 		// t := '_tt${g.tmp_count2}_arg_expr_${fn_name}_$i'
 | ||||
| 		t := '_arg_expr_${fn_name}_$i' | ||||
| 		// g.called_fn_name = name
 | ||||
| 		used := t in g.autofree_tmp_vars | ||||
| 		// used := t in g.autofree_tmp_vars
 | ||||
| 		used := scope.known_var(t) | ||||
| 		if used { | ||||
| 			g.write('$t = ') | ||||
| 		} else { | ||||
| 			g.write('string $t = ') | ||||
| 			g.autofree_tmp_vars << t | ||||
| 			scope.register(t, ast.Var{ | ||||
| 				name: t | ||||
| 				typ: table.string_type | ||||
| 				is_arg: true // TODO hack so that it's not freed twice when out of scope. it's probably better to use one model
 | ||||
| 			}) | ||||
| 			// g.autofree_tmp_vars << t
 | ||||
| 		} | ||||
| 		g.expr(arg.expr) | ||||
| 		g.writeln(';// new af pre') | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue