src: Modified compilers for the support of the new Integers
[nit.git] / src / rapid_type_analysis.nit
index d81d1c7..87e808c 100644 (file)
@@ -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]
 
@@ -359,7 +363,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 +393,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 +524,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
 
@@ -592,7 +601,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 +611,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 +621,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