syntax: enable a generalized for with iterate
[nit.git] / src / syntax / icode_generation.nit
index acf2efe..d78829f 100644 (file)
@@ -24,7 +24,7 @@ private import primitive_info
 
 # An AST2ICode context stores the currently built icode informations
 class A2IContext
-special ICodeBuilder
+       super ICodeBuilder
        redef fun stmt(s: ICode)
        do
                if _current_node != null then
@@ -84,7 +84,7 @@ special ICodeBuilder
 
        init(visitor: AbsSyntaxVisitor, r: IRoutine, m: nullable MMMethod)
        do
-               super(visitor.module, r)
+               super(visitor.mmmodule, r)
                _visitor = visitor
                _return_seq = r.body
                _return_value = r.result
@@ -279,7 +279,7 @@ redef class MMImplicitInit
 end
 
 class A2IVisitor
-special AbsSyntaxVisitor
+       super AbsSyntaxVisitor
        writable var _icode_ctx: nullable A2IContext
        fun icode_ctx: A2IContext do return _icode_ctx.as(not null)
        redef fun visit(n) do n.accept_icode_generation(self)
@@ -625,7 +625,9 @@ redef class AForExpr
                v.seq = iclos.body
                escapable.continue_seq = iclos.body
                escapable.continue_value = null
-               v.stmt(new IMove(v.variable(variable), iclos.params.first))
+               for i in [0..variables.length[ do
+                       v.stmt(new IMove(v.variable(variables[i]), iclos.params[i]))
+               end
                v.generate_stmt(n_block)
 
                # Call closure
@@ -776,6 +778,36 @@ redef class ANotExpr
        end
 end
 
+redef class AOrElseExpr
+       redef fun generate_icode(v)
+       do
+               # Compute left operand
+               var e = v.generate_expr(n_expr)
+
+               # Prepare result
+               var reg = v.new_register(stype)
+
+               # Compare left and null
+               var n = v.lit_null_reg
+               var c = v.expr(new IIs(e, n), v.mmmodule.type_bool)
+               var iif = new IIf(c)
+               v.stmt(iif)
+               var old_seq = v.seq
+
+               # if equal, result = right opr
+               v.seq = iif.then_seq
+               v.add_assignment(reg, v.generate_expr(n_expr2))
+
+               # else, result = left operand
+               v.seq = iif.else_seq
+               v.add_assignment(reg, e)
+
+               v.seq = old_seq
+
+               return reg
+       end
+end
+
 redef class AIsaExpr
        redef fun generate_icode(v)
        do