icode: ITypeCheck requires a receiver
[nit.git] / src / syntax / icode_generation.nit
index 5bd50bb..260d1e5 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
@@ -82,6 +82,9 @@ special ICodeBuilder
        # The method associated to the iroutine (if any)
        readable var _method: nullable MMMethod
 
+       # The register of self (if any)
+       var selfreg: nullable IRegister writable
+
        init(visitor: AbsSyntaxVisitor, r: IRoutine, m: nullable MMMethod)
        do
                super(visitor.mmmodule, r)
@@ -279,7 +282,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)
@@ -368,6 +371,7 @@ redef class AConcreteMethPropdef
                var params = v.iroutine.params.to_a
                var selfreg = v.variable(self_var)
                v.stmt(new IMove(selfreg, params[0]))
+               v.selfreg = selfreg
                params.shift
 
                var orig_meth: MMLocalProperty = method.global.intro
@@ -383,6 +387,7 @@ redef class AConcreteMethPropdef
                if n_block != null then
                        v.generate_stmt(n_block)
                end
+               v.selfreg = null
        end
 end
 
@@ -625,7 +630,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
@@ -810,7 +817,7 @@ redef class AIsaExpr
        redef fun generate_icode(v)
        do
                var e = v.generate_expr(n_expr)
-               return v.expr(new ITypeCheck(e, n_type.stype), stype)
+               return v.expr(new ITypeCheck(v.selfreg.as(not null), e, n_type.stype), stype)
        end
 end