autofree: fix a bug with $if and add a test
							parent
							
								
									3612bd58ef
								
							
						
					
					
						commit
						0ff541375d
					
				| 
						 | 
				
			
			@ -782,9 +782,25 @@ fn (mut g Gen) stmts_with_tmp_var(stmts []ast.Stmt, tmp_var string) {
 | 
			
		|||
			// 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.position().pos - 1)
 | 
			
		||||
			stmt_pos := stmt.position()
 | 
			
		||||
			g.writeln('// af scope_vars')
 | 
			
		||||
			g.autofree_scope_vars(stmt_pos.pos - 1, stmt_pos.line_nr, false)
 | 
			
		||||
			mut stmt_pos := stmt.position()
 | 
			
		||||
			if stmt_pos.pos == 0 {
 | 
			
		||||
				// Do not autofree if the position is 0, since the correct scope won't be found.
 | 
			
		||||
				// Report a bug, since position shouldn't be 0 for most nodes.
 | 
			
		||||
				if stmt is ast.Module {
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
				if stmt is ast.ExprStmt {
 | 
			
		||||
					// For some reason ExprStmt.pos is 0 when ExprStmt.expr is comp if expr
 | 
			
		||||
					// Extract the pos. TODO figure out why and fix.
 | 
			
		||||
					stmt_pos = stmt.expr.position()
 | 
			
		||||
				}
 | 
			
		||||
				if stmt_pos.pos == 0 {
 | 
			
		||||
					print('autofree: first stmt pos = 0. ')
 | 
			
		||||
					println(typeof(stmt))
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			g.autofree_scope_vars(stmt_pos.pos, stmt_pos.line_nr, false)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,7 +18,8 @@ fn (mut p Parser) if_expr(is_comptime bool) ast.IfExpr {
 | 
			
		|||
	pos := if is_comptime {
 | 
			
		||||
		p.inside_ct_if_expr = true
 | 
			
		||||
		p.next() // `$`
 | 
			
		||||
		p.prev_tok.position().extend(p.tok.position())
 | 
			
		||||
		// p.prev_tok.position().extend(p.tok.position())
 | 
			
		||||
		p.tok.position()
 | 
			
		||||
	} else {
 | 
			
		||||
		p.tok.position()
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -278,6 +278,15 @@ fn string_array_get() {
 | 
			
		|||
	println(s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn comp_if() {
 | 
			
		||||
	// compif pos used to be 0, if it was the first statement in a block, vars wouldn't be freed
 | 
			
		||||
	$if macos {
 | 
			
		||||
		println('macos')
 | 
			
		||||
	}
 | 
			
		||||
	s := 'a' + 'b'
 | 
			
		||||
	println(s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn main() {
 | 
			
		||||
	println('start')
 | 
			
		||||
	simple()
 | 
			
		||||
| 
						 | 
				
			
			@ -297,6 +306,7 @@ fn main() {
 | 
			
		|||
	q := if_expr()
 | 
			
		||||
	s := return_if_expr()
 | 
			
		||||
	free_inside_opt_block()
 | 
			
		||||
	comp_if()
 | 
			
		||||
	// free_before_return()
 | 
			
		||||
	// free_before_return_bool()
 | 
			
		||||
	// free_before_break()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue