X-Git-Url: http://nitlanguage.org diff --git a/src/syntax/icode_generation.nit b/src/syntax/icode_generation.nit index acf2efe..d78829f 100644 --- a/src/syntax/icode_generation.nit +++ b/src/syntax/icode_generation.nit @@ -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