# 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
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
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)
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
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