Merge commit 'b7e675f'
authorJean Privat <jean@pryen.org>
Mon, 24 Feb 2014 20:53:12 +0000 (15:53 -0500)
committerJean Privat <jean@pryen.org>
Mon, 24 Feb 2014 20:53:12 +0000 (15:53 -0500)
Partially fixes issue #276 and add the test to exhibit the remaining bad
behavior of the issue

1  2 
src/rapid_type_analysis.nit

@@@ -81,6 -81,12 +81,12 @@@ class RapidTypeAnalysi
        # The method definitions that remain to visit
        private var todo = new List[MMethodDef]
  
+       private fun force_alive(classname: String)
+       do
+               var classes = self.modelbuilder.model.get_mclasses_by_name(classname)
+               if classes != null then for c in classes do self.add_new(c.mclass_type, c.mclass_type)
+       end
        # Run the analysis until all visitable method definitions are visited.
        fun run_analysis
        do
                        add_send(maintype, mainprop)
                end
  
-               # Force Bool
-               var classes = self.modelbuilder.model.get_mclasses_by_name("Bool")
-               if classes != null then for c in classes do self.add_new(c.mclass_type, c.mclass_type)
+               # Force primitive types
+               force_alive("Bool")
+               force_alive("Int")
+               force_alive("Float")
+               force_alive("Char")
  
                while not todo.is_empty do
                        var mmethoddef = todo.shift
@@@ -383,8 -391,6 +391,8 @@@ class RapidTypeVisito
        fun add_send(mtype: MType, mproperty: MMethod) do analysis.add_send(mtype, mproperty)
  
        fun add_cast_type(mtype: MType) do analysis.add_cast(mtype)
 +
 +      fun add_callsite(callsite: nullable CallSite) do if callsite != null then analysis.add_send(callsite.recv, callsite.mproperty)
  end
  
  ###
@@@ -503,7 -509,9 +511,7 @@@ en
  redef class ASendExpr
        redef fun accept_rapid_type_visitor(v)
        do
 -              var mproperty = self.mproperty.as(not null)
 -              var recvtype = self.n_expr.mtype.as(not null)
 -              v.add_send(recvtype, mproperty)
 +              v.add_callsite(callsite)
        end
  end
  
  redef class ASendReassignFormExpr
        redef fun accept_rapid_type_visitor(v)
        do
 -              v.add_send(self.read_type.as(not null), self.reassign_property.mproperty)
 -              var mproperty = self.mproperty.as(not null)
 -              var write_mproperty = self.write_mproperty.as(not null)
 -              if n_expr isa ASelfExpr then
 -                      v.add_monomorphic_send(v.receiver, mproperty)
 -                      v.add_monomorphic_send(v.receiver, write_mproperty)
 -              else
 -                      var recvtype = self.n_expr.mtype.as(not null)
 -                      v.add_send(recvtype, mproperty)
 -                      v.add_send(recvtype, write_mproperty)
 -              end
 +              v.add_callsite(callsite)
 +              v.add_callsite(reassign_callsite)
 +              v.add_callsite(write_callsite)
        end
  end
  
  redef class AVarReassignExpr
        redef fun accept_rapid_type_visitor(v)
        do
 -              v.add_send(self.read_type.as(not null), self.reassign_property.mproperty)
 +              v.add_callsite(reassign_callsite)
        end
  end
  
  redef class AAttrReassignExpr
        redef fun accept_rapid_type_visitor(v)
        do
 -              v.add_send(self.read_type.as(not null), self.reassign_property.mproperty)
 +              v.add_callsite(reassign_callsite)
        end
  end
  
  redef class ASuperExpr
        redef fun accept_rapid_type_visitor(v)
        do
 -              var mproperty = self.mproperty
 -              if mproperty != null then
 -                      v.add_monomorphic_send(v.receiver, mproperty)
 +              var callsite = self.callsite
 +              if callsite != null then
 +                      v.add_callsite(callsite)
                        return
                end
  
@@@ -571,6 -587,7 +579,6 @@@ redef class ANewExp
        do
                var mtype = self.mtype.as(MClassType)
                v.add_type(mtype)
 -              var mproperty = self.mproperty.as(not null)
 -              v.add_monomorphic_send(mtype, mproperty)
 +              v.add_callsite(callsite)
        end
  end