From 3a4998c4da552e0e8c194da2ac6c8b3ea29bc86d Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Wed, 26 Mar 2014 16:08:05 -0400 Subject: [PATCH] typing: add `ARangeExpr::init_callsite` and use it everywhere One more callsite, and less method got manually Signed-off-by: Jean Privat --- src/abstract_compiler.nit | 4 ++-- src/naive_interpreter.nit | 4 ++-- src/rapid_type_analysis.nit | 6 ++---- src/transform.nit | 8 ++------ src/typing.nit | 21 +++++++++++++++++++-- 5 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/abstract_compiler.nit b/src/abstract_compiler.nit index fad8d84..0f854ba 100644 --- a/src/abstract_compiler.nit +++ b/src/abstract_compiler.nit @@ -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 diff --git a/src/naive_interpreter.nit b/src/naive_interpreter.nit index 09b97fd..730ea74 100644 --- a/src/naive_interpreter.nit +++ b/src/naive_interpreter.nit @@ -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 diff --git a/src/rapid_type_analysis.nit b/src/rapid_type_analysis.nit index c609772..aad2de0 100644 --- a/src/rapid_type_analysis.nit +++ b/src/rapid_type_analysis.nit @@ -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 diff --git a/src/transform.nit b/src/transform.nit index 4ec6635..bf4b992 100644 --- a/src/transform.nit +++ b/src/transform.nit @@ -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 diff --git a/src/typing.nit b/src/typing.nit index 6f84ef6..c001f3a 100644 --- a/src/typing.nit +++ b/src/typing.nit @@ -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 -- 1.7.9.5