cgen: execute defer stmts in LIFO order (#9528)
							parent
							
								
									b319068151
								
							
						
					
					
						commit
						a3455b8433
					
				| 
						 | 
				
			
			@ -1243,7 +1243,8 @@ fn (mut g Gen) stmt(node ast.Stmt) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
fn (mut g Gen) write_defer_stmts() {
 | 
			
		||||
	for defer_stmt in g.defer_stmts {
 | 
			
		||||
	for i := g.defer_stmts.len - 1; i >= 0; i-- {
 | 
			
		||||
		defer_stmt := g.defer_stmts[i]
 | 
			
		||||
		g.writeln('// Defer begin')
 | 
			
		||||
		g.writeln('if (${g.defer_flag_var(defer_stmt)} == true) {')
 | 
			
		||||
		g.indent++
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -101,3 +101,19 @@ fn test_defer_with_if() {
 | 
			
		|||
	set_num_if(mut n, 20, false)
 | 
			
		||||
	assert n.val == 10
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_defer_order() {
 | 
			
		||||
	mut i := 0
 | 
			
		||||
	defer {
 | 
			
		||||
		i++
 | 
			
		||||
		assert i == 3
 | 
			
		||||
	}
 | 
			
		||||
	defer {
 | 
			
		||||
		i++
 | 
			
		||||
		assert i == 2
 | 
			
		||||
	}
 | 
			
		||||
	defer {
 | 
			
		||||
		i++
 | 
			
		||||
		assert i == 1
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue