icode: method inlining moves from IRoutine to ICodeBuilder
[nit.git] / src / analysis / inline_methods.nit
index 8e174d4..0e37bec 100644 (file)
@@ -22,27 +22,37 @@ import icode
 private class InlineMethodVisitor
 special ICodeVisitor
        var _pass: Int = 0
+       var _icb: ICodeBuilder
 
        redef fun visit_icode(ic)
        do
                if ic isa ICall then
                        var m = ic.property
                        if m.iroutine != null and ic.is_inlinable then
+                               var icb = _icb
                                var ir = m.iroutine.as(not null)
                                var seq = new ISeq
+                               var old_seq = icb.seq
+                               icb.seq = seq
                                current_icode.insert_before(seq)
-                               var e = ir.inline_in_seq(seq, ic.exprs)
+                               var e = icb.inline_routine(ir, ic.exprs)
                                var r = ic.result
                                if r != null then
                                        assert e != null
                                        current_icode.insert_before(new IMove(r, e))
                                end
                                current_icode.delete
+                               icb.seq = old_seq
                                visit_icode(seq)
                        end
                end
                super
        end
+
+       init(m: MMModule, r: IRoutine)
+       do
+               _icb = new ICodeBuilder(m, r)
+       end
 end
 
 redef class ICall
@@ -60,7 +70,7 @@ end
 redef class IRoutine
        fun inline_methods(m: MMModule)
        do
-               var v = new InlineMethodVisitor
+               var v = new InlineMethodVisitor(m, self)
                v.visit_iroutine(self)
        end
 end