Signed-off-by: Jean Privat <jean@pryen.org>
n_args.n_exprs.add_all(args)
end
self.callsite = callsite
n_args.n_exprs.add_all(args)
end
self.callsite = callsite
+ self.recvtype = callsite.recv.as(MClassType)
if callsite.mproperty.is_new then
self.mtype = callsite.msignature.return_mtype
else
if callsite.mproperty.is_new then
self.mtype = callsite.msignature.return_mtype
else
redef class ANewExpr
redef fun expr(v)
do
redef class ANewExpr
redef fun expr(v)
do
- var mtype = self.mtype.as(MClassType)
+ var mtype = self.recvtype
+ assert mtype != null
var recv
var ctype = mtype.ctype
if mtype.mclass.name == "NativeArray" then
var recv
var ctype = mtype.ctype
if mtype.mclass.name == "NativeArray" then
redef class ANewExpr
redef fun expr(v)
do
redef class ANewExpr
redef fun expr(v)
do
- var mtype = v.unanchor_type(self.mtype.as(not null))
+ var mtype = v.unanchor_type(self.recvtype.as(not null))
var recv: Instance = new MutableInstance(mtype)
v.init_instance(recv)
var args = v.varargize(callsite.mpropdef, recv, self.n_args.n_exprs)
var recv: Instance = new MutableInstance(mtype)
v.init_instance(recv)
var args = v.varargize(callsite.mpropdef, recv, self.n_args.n_exprs)
redef class ANewExpr
redef fun accept_rapid_type_visitor(v)
do
redef class ANewExpr
redef fun accept_rapid_type_visitor(v)
do
- var mtype = self.mtype.as(MClassType)
+ var mtype = self.recvtype.as(not null)
v.add_type(mtype)
v.add_callsite(callsite)
end
v.add_type(mtype)
v.add_callsite(callsite)
end
# The constructor invoked by the new.
var callsite: nullable CallSite
# The constructor invoked by the new.
var callsite: nullable CallSite
+ # The designated type
+ var recvtype: nullable MClassType
+
redef fun accept_typing(v)
do
var recvtype = v.resolve_mtype(self.n_type)
if recvtype == null then return
redef fun accept_typing(v)
do
var recvtype = v.resolve_mtype(self.n_type)
if recvtype == null then return
if not recvtype isa MClassType then
if recvtype isa MNullableType then
if not recvtype isa MClassType then
if recvtype isa MNullableType then
+ self.recvtype = recvtype
+
var name: String
var nid = self.n_id
if nid != null then
var name: String
var nid = self.n_id
if nid != null then
var callsite = v.get_method(self, recvtype, name, false)
if callsite == null then return
var callsite = v.get_method(self, recvtype, name, false)
if callsite == null then return
+ if not callsite.mproperty.is_new then
+ self.mtype = recvtype
+ else
+ self.mtype = callsite.msignature.return_mtype
+ assert self.mtype != null
+ end
+
self.callsite = callsite
if not callsite.mproperty.is_init_for(recvtype.mclass) then
self.callsite = callsite
if not callsite.mproperty.is_init_for(recvtype.mclass) then