typing: add `ARangeExpr::init_callsite` and use it everywhere
authorJean Privat <jean@pryen.org>
Wed, 26 Mar 2014 20:08:05 +0000 (16:08 -0400)
committerJean Privat <jean@pryen.org>
Wed, 26 Mar 2014 20:08:05 +0000 (16:08 -0400)
One more callsite, and less method got manually

Signed-off-by: Jean Privat <jean@pryen.org>

src/abstract_compiler.nit
src/naive_interpreter.nit
src/rapid_type_analysis.nit
src/transform.nit
src/typing.nit

index fad8d84..0f854ba 100644 (file)
@@ -2365,7 +2365,7 @@ redef class ACrangeExpr
                var i2 = v.expr(self.n_expr2, null)
                var mtype = self.mtype.as(MClassType)
                var res = v.init_instance(mtype)
-               var it = v.send(v.get_property("init", res.mtype), [res, i1, i2])
+               var it = v.compile_callsite(init_callsite.as(not null), [res, i1, i2])
                return res
        end
 end
@@ -2377,7 +2377,7 @@ redef class AOrangeExpr
                var i2 = v.expr(self.n_expr2, null)
                var mtype = self.mtype.as(MClassType)
                var res = v.init_instance(mtype)
-               var it = v.send(v.get_property("without_last", res.mtype), [res, i1, i2])
+               var it = v.compile_callsite(init_callsite.as(not null), [res, i1, i2])
                return res
        end
 end
index 09b97fd..730ea74 100644 (file)
@@ -1427,7 +1427,7 @@ redef class ACrangeExpr
                var mtype = v.unanchor_type(self.mtype.as(not null))
                var res = new MutableInstance(mtype)
                v.init_instance(res)
-               v.send(v.force_get_primitive_method("init", mtype), [res, e1, e2])
+               v.callsite(init_callsite, [res, e1, e2])
                return res
        end
 end
@@ -1442,7 +1442,7 @@ redef class AOrangeExpr
                var mtype = v.unanchor_type(self.mtype.as(not null))
                var res = new MutableInstance(mtype)
                v.init_instance(res)
-               v.send(v.force_get_primitive_method("without_last", mtype), [res, e1, e2])
+               v.callsite(init_callsite, [res, e1, e2])
                return res
        end
 end
index c609772..aad2de0 100644 (file)
@@ -515,8 +515,7 @@ redef class ACrangeExpr
        do
                var mtype = self.mtype.as(MClassType)
                v.add_type(mtype)
-               var prop = v.get_method(mtype, "init")
-               v.add_monomorphic_send(mtype, prop)
+               v.add_callsite(init_callsite)
        end
 end
 
@@ -525,8 +524,7 @@ redef class AOrangeExpr
        do
                var mtype = self.mtype.as(MClassType)
                v.add_type(mtype)
-               var prop = v.get_method(mtype, "without_last")
-               v.add_monomorphic_send(mtype, prop)
+               v.add_callsite(init_callsite)
        end
 end
 
index 4ec6635..bf4b992 100644 (file)
@@ -225,9 +225,7 @@ redef class ACrangeExpr
        redef fun accept_transform_visitor(v)
        do
                var mtype = self.mtype.as(MClassType)
-               var meth = v.get_method(self, "init", mtype.mclass)
-
-               replace_with(v.builder.make_new(mtype, meth, [n_expr, n_expr2]))
+               replace_with(v.builder.make_new(mtype, init_callsite.mproperty, [n_expr, n_expr2]))
        end
 end
 
@@ -236,9 +234,7 @@ redef class AOrangeExpr
        redef fun accept_transform_visitor(v)
        do
                var mtype = self.mtype.as(MClassType)
-               var meth = v.get_method(self, "without_last", mtype.mclass)
-
-               replace_with(v.builder.make_new(mtype, meth, [n_expr, n_expr2]))
+               replace_with(v.builder.make_new(mtype, init_callsite.mproperty, [n_expr, n_expr2]))
        end
 end
 
index 6f84ef6..c001f3a 100644 (file)
@@ -1085,6 +1085,8 @@ redef class AArrayExpr
 end
 
 redef class ARangeExpr
+       var init_callsite: nullable CallSite
+
        redef fun accept_typing(v)
        do
                var discrete_class = v.get_mclass(self, "Discrete")
@@ -1095,13 +1097,28 @@ redef class ARangeExpr
                if t1 == null or t2 == null then return
                var mclass = v.get_mclass(self, "Range")
                if mclass == null then return # Forward error
+               var mtype
                if v.is_subtype(t1, t2) then
-                       self.mtype = mclass.get_mtype([t2])
+                       mtype = mclass.get_mtype([t2])
                else if v.is_subtype(t2, t1) then
-                       self.mtype = mclass.get_mtype([t1])
+                       mtype = mclass.get_mtype([t1])
                else
                        v.error(self, "Type Error: Cannot create range: {t1} vs {t2}")
+                       return
+               end
+
+               self.mtype = mtype
+
+               # get the constructor
+               var callsite
+               if self isa ACrangeExpr then
+                       callsite = v.get_method(self, mtype, "init", false)
+               else if self isa AOrangeExpr then
+                       callsite = v.get_method(self, mtype, "without_last", false)
+               else
+                       abort
                end
+               init_callsite = callsite
        end
 end