@@ -110,7 +110,7 @@ fn (mut g Gen) stmt(node ast.Stmt) {
110110 ast.TypeDecl {}
111111 ast.InterfaceDecl {}
112112 else {
113- eprintln ('native.stmt(): bad node: ' + node.type_name ())
113+ g. n_error ('native.stmt(): bad node: ' + node.type_name ())
114114 }
115115 }
116116}
@@ -208,62 +208,23 @@ fn (mut g Gen) for_stmt(node ast.ForStmt) {
208208 g.println ('; label ${end_label }' )
209209 return
210210 }
211- infix_expr := node.cond as ast.InfixExpr
212- mut jump_addr := i32 ( 0 ) // location of `jne *00 00 00 00*`
211+ g. println ( '; for stmt {' )
212+
213213 start := g.pos ()
214214 start_label := g.labels.new_label ()
215215 g.labels.addrs[start_label] = start
216- g.println ('; label ${start_label }' )
217- match infix_expr.left {
218- ast.Ident {
219- match infix_expr.right {
220- ast.Ident {
221- reg := g.code_gen.main_reg ()
222- g.code_gen.mov_var_to_reg (reg, infix_expr.right as ast.Ident )
223- g.code_gen.cmp_var_reg (infix_expr.left as ast.Ident , reg)
224- }
225- ast.IntegerLiteral {
226- lit := infix_expr.right as ast.IntegerLiteral
227- g.code_gen.cmp_var (infix_expr.left as ast.Ident , i32 (lit.val.int ()))
228- }
229- else {
230- g.n_error ('unhandled expression type' )
231- }
232- }
233- match infix_expr.left.tok_kind {
234- .lt {
235- jump_addr = g.code_gen.cjmp (.jge)
236- }
237- .gt {
238- jump_addr = g.code_gen.cjmp (.jle)
239- }
240- .le {
241- jump_addr = g.code_gen.cjmp (.jg)
242- }
243- .ge {
244- jump_addr = g.code_gen.cjmp (.jl)
245- }
246- .ne {
247- jump_addr = g.code_gen.cjmp (.je)
248- }
249- .eq {
250- jump_addr = g.code_gen.cjmp (.jne)
251- }
252- else {
253- g.n_error ('unhandled infix cond token' )
254- }
255- }
256- }
257- else {
258- g.n_error ('unhandled infix.left' )
259- }
260- }
216+ g.println ('; label ${start_label } (start of for loop)' )
217+
218+ // Condition
219+ mut cjmp_addr := g.condition (node.cond, false ) // jmp if false, location of `jne *00 00 00 00*` (to be patched by LabelPatch)
261220 end_label := g.labels.new_label ()
262221 g.labels.patches << LabelPatch{
263222 id: end_label
264- pos: jump_addr
223+ pos: cjmp_addr
265224 }
266- g.println ('; jump to label ${end_label }' )
225+ g.println ('; cjmp to label ${end_label } (out of loop)' )
226+
227+ // Body of the loop
267228 g.labels.branches << BranchLabel{
268229 name: node.label
269230 start: start_label
@@ -273,10 +234,11 @@ fn (mut g Gen) for_stmt(node ast.ForStmt) {
273234 g.labels.branches.pop ()
274235 // Go back to `cmp ...`
275236 g.code_gen.jmp_back (start)
276- // Update the jump addr to current pos
237+
238+ g.println ('; for stmt }' )
239+ // Set the jump (out of the loop) addr to current pos
277240 g.labels.addrs[end_label] = g.pos ()
278- g.println ('; label ${end_label }' )
279- g.println ('jmp after for' )
241+ g.println ('; label ${end_label } (out of for loop)' )
280242}
281243
282244fn (mut g Gen) for_in_stmt (node ast.ForInStmt) { // Work on that
0 commit comments