Merge remote-tracking branch 'origin/master' into init_auto
[nit.git] / src / rapid_type_analysis.nit
index 87e808c..5da1494 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
@@ -213,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
@@ -240,7 +245,6 @@ class RapidTypeAnalysis
                                v.add_monomorphic_send(vararg, self.modelbuilder.force_get_primitive_method(node, "with_native", vararg.mclass, self.mainmodule))
                        end
 
-                       # TODO? new_msignature
                        var sig = msignature
                        var osig = mmeth.intro.msignature.as(not null)
                        for i in [0..sig.arity[ do
@@ -253,11 +257,19 @@ 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
+                                       # Final init call
+                                       if not mmethoddef.is_intro then
+                                               self.add_super_send(v.receiver, mmethoddef)
+                                       end
+                               else if mmethoddef.mclassdef.auto_init == mmethoddef then
+                                       # autoinit call
+                                       for i in mmethoddef.initializers do
+                                               if i isa MMethod then self.add_send(v.receiver, i)
+                                       end
+                               else
+                                       npropdef.debug "cannot RTA {mmethoddef}"
+                                       abort
                                end
                                continue
                        else if mmethoddef.constant_value != null then
@@ -576,8 +588,13 @@ 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)
+               v.add_callsite(to_re)
+               v.add_callsite(ignore_case)
+               v.add_callsite(newline)
+               v.add_callsite(extended)
+               v.add_callsite(to_bytes_with_copy)
        end
 end
 
@@ -694,7 +711,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)