v.gen.c: implement `-d trace_autofree` for conditional tracing comments about autofree
							parent
							
								
									274c817028
								
							
						
					
					
						commit
						066374bae4
					
				|  | @ -1034,8 +1034,8 @@ fn (mut g Gen) stmts_with_tmp_var(stmts []ast.Stmt, tmp_var string) { | |||
| 		stmt := stmts[0] | ||||
| 		// stmt := stmts[stmts.len-1]
 | ||||
| 		if stmt !is ast.FnDecl && g.inside_ternary == 0 { | ||||
| 			// g.writeln('// autofree scope')
 | ||||
| 			// g.writeln('// autofree_scope_vars($stmt.pos.pos) | ${typeof(stmt)}')
 | ||||
| 			// g.trace_autofree('// autofree scope')
 | ||||
| 			// g.trace_autofree('// autofree_scope_vars($stmt.pos.pos) | ${typeof(stmt)}')
 | ||||
| 			// go back 1 position is important so we dont get the
 | ||||
| 			// internal scope of for loops and possibly other nodes
 | ||||
| 			// g.autofree_scope_vars(stmt.pos.pos - 1)
 | ||||
|  | @ -1116,7 +1116,7 @@ fn (mut g Gen) stmt(node ast.Stmt) { | |||
| 			} else { | ||||
| 				// continue or break
 | ||||
| 				if g.is_autofree && !g.is_builtin_mod { | ||||
| 					g.writeln('// free before continue/break') | ||||
| 					g.trace_autofree('// free before continue/break') | ||||
| 					g.autofree_scope_vars_stop(node.pos.pos - 1, node.pos.line_nr, true, | ||||
| 						g.branch_parent_pos) | ||||
| 				} | ||||
|  | @ -2719,11 +2719,16 @@ fn (mut g Gen) autofree_scope_vars_stop(pos int, line_nr int, free_parent_scopes | |||
| 		// TODO why can scope.pos be 0? (only outside fns?)
 | ||||
| 		return | ||||
| 	} | ||||
| 	g.writeln('// autofree_scope_vars(pos=$pos line_nr=$line_nr scope.pos=$scope.start_pos scope.end_pos=$scope.end_pos)') | ||||
| 	g.trace_autofree('// autofree_scope_vars(pos=$pos line_nr=$line_nr scope.pos=$scope.start_pos scope.end_pos=$scope.end_pos)') | ||||
| 	g.autofree_scope_vars2(scope, scope.start_pos, scope.end_pos, line_nr, free_parent_scopes, | ||||
| 		stop_pos) | ||||
| } | ||||
| 
 | ||||
| [if trace_autofree] | ||||
| fn (mut g Gen) trace_autofree(line string) { | ||||
| 	g.writeln(line) | ||||
| } | ||||
| 
 | ||||
| // fn (mut g Gen) autofree_scope_vars2(scope &ast.Scope, end_pos int) {
 | ||||
| fn (mut g Gen) autofree_scope_vars2(scope &ast.Scope, start_pos int, end_pos int, line_nr int, free_parent_scopes bool, stop_pos int) { | ||||
| 	if isnil(scope) { | ||||
|  | @ -2732,20 +2737,20 @@ fn (mut g Gen) autofree_scope_vars2(scope &ast.Scope, start_pos int, end_pos int | |||
| 	for _, obj in scope.objects { | ||||
| 		match obj { | ||||
| 			ast.Var { | ||||
| 				g.writeln('// var "$obj.name" var.pos=$obj.pos.pos var.line_nr=$obj.pos.line_nr') | ||||
| 				g.trace_autofree('// var "$obj.name" var.pos=$obj.pos.pos var.line_nr=$obj.pos.line_nr') | ||||
| 				if obj.name == g.returned_var_name { | ||||
| 					g.writeln('// skipping returned var') | ||||
| 					g.trace_autofree('// skipping returned var') | ||||
| 					continue | ||||
| 				} | ||||
| 				if obj.is_or { | ||||
| 					// Skip vars inited with the `or {}`, since they are generated
 | ||||
| 					// after the or block in C.
 | ||||
| 					g.writeln('// skipping `or{}` var "$obj.name"') | ||||
| 					g.trace_autofree('// skipping `or{}` var "$obj.name"') | ||||
| 					continue | ||||
| 				} | ||||
| 				if obj.is_tmp { | ||||
| 					// Skip for loop vars
 | ||||
| 					g.writeln('// skipping tmp var "$obj.name"') | ||||
| 					g.trace_autofree('// skipping tmp var "$obj.name"') | ||||
| 					continue | ||||
| 				} | ||||
| 				// if var.typ == 0 {
 | ||||
|  | @ -2778,7 +2783,7 @@ fn (mut g Gen) autofree_scope_vars2(scope &ast.Scope, start_pos int, end_pos int | |||
| 	// if !isnil(scope.parent) && line_nr > 0 {
 | ||||
| 	if free_parent_scopes && !isnil(scope.parent) | ||||
| 		&& (stop_pos == -1 || scope.parent.start_pos >= stop_pos) { | ||||
| 		g.writeln('// af parent scope:') | ||||
| 		g.trace_autofree('// af parent scope:') | ||||
| 		g.autofree_scope_vars2(scope.parent, start_pos, end_pos, line_nr, true, stop_pos) | ||||
| 	} | ||||
| } | ||||
|  | @ -2801,7 +2806,7 @@ fn (mut g Gen) autofree_variable(v ast.Var) { | |||
| 		// Don't free simple string literals.
 | ||||
| 		match v.expr { | ||||
| 			ast.StringLiteral { | ||||
| 				g.writeln('// str literal') | ||||
| 				g.trace_autofree('// str literal') | ||||
| 			} | ||||
| 			else { | ||||
| 				// NOTE/TODO: assign_stmt multi returns variables have no expr
 | ||||
|  | @ -4771,7 +4776,7 @@ fn (mut g Gen) return_stmt(node ast.Return) { | |||
| 			g.writeln('return ($styp){0};') | ||||
| 		} else { | ||||
| 			if g.is_autofree { | ||||
| 				g.writeln('// free before return (no values returned)') | ||||
| 				g.trace_autofree('// free before return (no values returned)') | ||||
| 				g.autofree_scope_vars(node.pos.pos - 1, node.pos.line_nr, true) | ||||
| 			} | ||||
| 			g.writeln('return;') | ||||
|  |  | |||
|  | @ -65,7 +65,7 @@ fn (mut g Gen) comptime_call(node ast.ComptimeCall) { | |||
| 		} | ||||
| 		return | ||||
| 	} | ||||
| 	g.writeln('// \$method call. sym="$node.sym.name"') | ||||
| 	g.trace_autofree('// \$method call. sym="$node.sym.name"') | ||||
| 	if node.method_name == 'method' { | ||||
| 		// `app.$method()`
 | ||||
| 		m := node.sym.find_method(g.comp_for_method) or { return } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue