metamodel: rename 'universal' to 'enum'
[nit.git] / src / analysis / inline_methods.nit
index 1b06b0d..875da44 100644 (file)
@@ -20,24 +20,27 @@ package inline_methods
 import icode
 
 private class InlineMethodVisitor
-special ICodeVisitor
+       super ICodeVisitor
        var _pass: Int = 0
        var _icb: ICodeBuilder
 
-       var _current_inlining: Array[IRoutine]
-
        redef fun visit_icode(ic)
        do
                if ic isa ICall then
                        var m = ic.property
                        var ir = m.iroutine
                        if ir != null and ic.is_inlinable then
-                               if _current_inlining.has(ir) then
+                               var icb = _icb
+                               if icb.iroutine == ir then
                                        # We cannot inline ir
-                                       # FIXME: what we want is a static call
+                                       # So, at least transform the call to a static one
+                                       current_icode.delete
+                                       var icall = new IStaticCall(ic.property, ic.exprs)
+                                       icall.closure_defs = ic.closure_defs
+                                       icall.result = ic.result
+                                       current_icode.insert_before(icall)
+                                       current_icode.delete
                                else
-                                       var icb = _icb
-                                       _current_inlining.push(ir)
                                        var seq = new ISeq
                                        var old_seq = icb.seq
                                        icb.seq = seq
@@ -51,7 +54,6 @@ special ICodeVisitor
                                        current_icode.delete
                                        icb.seq = old_seq
                                        visit_icode(seq)
-                                       _current_inlining.pop
                                end
                        end
                end
@@ -60,7 +62,6 @@ special ICodeVisitor
 
        init(m: MMModule, r: IRoutine)
        do
-               _current_inlining = [r]
                _icb = new ICodeBuilder(m, r)
        end
 end
@@ -72,7 +73,8 @@ redef class ICall
                var mn = m.name
                var cn = m.local_class.name
                return (m.is_intern and cn != once ("Object".to_symbol)) or
-                       (cn == (once ("Array".to_symbol)) and (mn == (once ("length".to_symbol)) or mn == (once ("[]".to_symbol)))) or
+                       (cn == (once ("Int".to_symbol)) and (mn == (once ("enumerate_to".to_symbol)) or mn == (once ("enumerate_before".to_symbol)))) or
+                       (cn == (once ("Array".to_symbol)) and (mn == (once ("length".to_symbol)) or mn == (once ("[]".to_symbol)) or mn == (once ("iterate".to_symbol)))) or
                        (cn == (once ("AbstractArrayRead".to_symbol)) and (mn == (once ("length".to_symbol)) or mn == (once ("[]".to_symbol)))) or
                        (m.global.intro.local_class.name == (once ("Inline__".to_symbol)))
        end