rta: improve code for methods of classes
[nit.git] / src / rapid_type_analysis.nit
index d81d1c7..f763a56 100644 (file)
@@ -25,7 +25,7 @@ module rapid_type_analysis
 
 import semantize
 
-private import csv # for live_types_to_csv
+import csv # for live_types_to_csv
 private import ordered_tree # for live_methods_to_tree
 
 private import more_collections
@@ -82,6 +82,10 @@ class RapidTypeAnalysis
        # Live methods.
        var live_methods = new HashSet[MMethod]
 
+       # Live mmodules.
+       # Those with a live method definitions (see `live_methoddefs`)
+       var live_mmodules = new HashSet[MModule]
+
        # Live callsites.
        var live_callsites = new HashSet[CallSite]
 
@@ -209,11 +213,16 @@ class RapidTypeAnalysis
 
                # Force primitive types
                force_alive("Bool")
-               force_alive("Int")
                force_alive("Float")
                force_alive("Char")
                force_alive("Pointer")
                force_alive("Byte")
+               force_alive("Int")
+               force_alive("Int8")
+               force_alive("Int16")
+               force_alive("UInt16")
+               force_alive("Int32")
+               force_alive("UInt32")
 
                while not todo.is_empty do
                        var mmethoddef = todo.shift
@@ -249,11 +258,13 @@ class RapidTypeAnalysis
                        var npropdef = modelbuilder.mpropdef2node(mmethoddef)
 
                        if npropdef isa AClassdef then
-                               # It is an init for a class
-                               assert mmethoddef == npropdef.mfree_init
-
-                               if mmethoddef.mproperty.is_root_init and not mmethoddef.is_intro then
-                                       self.add_super_send(v.receiver, mmethoddef)
+                               if mmethoddef.mproperty.is_root_init then
+                                       if not mmethoddef.is_intro then
+                                               self.add_super_send(v.receiver, mmethoddef)
+                                       end
+                               else
+                                       npropdef.debug "cannot RTA {mmethoddef}"
+                                       abort
                                end
                                continue
                        else if mmethoddef.constant_value != null then
@@ -359,7 +370,7 @@ class RapidTypeAnalysis
                        for npropdef in modelbuilder.collect_attr_propdef(cd) do
                                if not npropdef.has_value then continue
 
-                               var mpropdef = npropdef.mpropdef.as(not null)
+                               var mpropdef = npropdef.mreadpropdef.as(not null)
                                var v = new RapidTypeVisitor(self, bound_mtype, mpropdef)
                                v.enter_visit(npropdef.n_expr)
                                v.enter_visit(npropdef.n_block)
@@ -389,6 +400,7 @@ class RapidTypeAnalysis
        do
                if live_methoddefs.has(mpropdef) then return
                live_methoddefs.add(mpropdef)
+               live_mmodules.add(mpropdef.mclassdef.mmodule)
                todo.add(mpropdef)
 
                var mproperty = mpropdef.mproperty
@@ -519,31 +531,35 @@ redef class ANode
        end
 end
 
-redef class AIntExpr
-       redef fun accept_rapid_type_visitor(v)
+redef class AExpr
+       # Make the `mtype` of the expression live
+       # Used by literals and instantiations
+       fun allocate_mtype(v: RapidTypeVisitor)
        do
+               var mtype = self.mtype
+               if not mtype isa MClassType then return
                v.add_type(self.mtype.as(MClassType))
        end
 end
 
-redef class AByteExpr
+redef class AIntegerExpr
        redef fun accept_rapid_type_visitor(v)
        do
-               v.add_type(self.mtype.as(MClassType))
+               allocate_mtype(v)
        end
 end
 
 redef class AFloatExpr
        redef fun accept_rapid_type_visitor(v)
        do
-               v.add_type(self.mtype.as(MClassType))
+               allocate_mtype(v)
        end
 end
 
 redef class ACharExpr
        redef fun accept_rapid_type_visitor(v)
        do
-               v.add_type(self.mtype.as(MClassType))
+               allocate_mtype(v)
        end
 end
 
@@ -567,7 +583,7 @@ redef class AStringFormExpr
        do
                var native = v.analysis.mainmodule.native_string_type
                v.add_type(native)
-               var prop = v.get_method(native, "to_s_with_length")
+               var prop = v.get_method(native, "to_s_full")
                v.add_monomorphic_send(native, prop)
        end
 end
@@ -592,7 +608,8 @@ end
 redef class ACrangeExpr
        redef fun accept_rapid_type_visitor(v)
        do
-               var mtype = self.mtype.as(MClassType)
+               var mtype = self.mtype
+               if not mtype isa MClassType then return
                v.add_type(mtype)
                v.add_callsite(init_callsite)
        end
@@ -601,7 +618,8 @@ end
 redef class AOrangeExpr
        redef fun accept_rapid_type_visitor(v)
        do
-               var mtype = self.mtype.as(MClassType)
+               var mtype = self.mtype
+               if not mtype isa MClassType then return
                v.add_type(mtype)
                v.add_callsite(init_callsite)
        end
@@ -610,28 +628,32 @@ end
 redef class ATrueExpr
        redef fun accept_rapid_type_visitor(v)
        do
-               v.add_type(self.mtype.as(MClassType))
+               allocate_mtype(v)
        end
 end
 
 redef class AFalseExpr
        redef fun accept_rapid_type_visitor(v)
        do
-               v.add_type(self.mtype.as(MClassType))
+               allocate_mtype(v)
        end
 end
 
 redef class AIsaExpr
        redef fun accept_rapid_type_visitor(v)
        do
-               v.add_cast_type(self.cast_type.as(not null))
+               var cast_type = self.cast_type
+               if cast_type == null then return
+               v.add_cast_type(cast_type)
        end
 end
 
 redef class AAsCastExpr
        redef fun accept_rapid_type_visitor(v)
        do
-               v.add_cast_type(self.mtype.as(not null))
+               var mtype = self.mtype
+               if mtype == null then return
+               v.add_cast_type(mtype)
        end
 end
 
@@ -679,7 +701,7 @@ redef class ASuperExpr
        end
 end
 
-redef class AForExpr
+redef class AForGroup
        redef fun accept_rapid_type_visitor(v)
        do
                v.add_callsite(self.method_iterator)