X-Git-Url: http://nitlanguage.org diff --git a/src/nitni/nitni_callbacks.nit b/src/nitni/nitni_callbacks.nit index 5cf389f..c9725d0 100644 --- a/src/nitni/nitni_callbacks.nit +++ b/src/nitni/nitni_callbacks.nit @@ -33,7 +33,10 @@ class VerifyNitniCallbacksPhase redef fun process_npropdef(npropdef) do - if not npropdef isa AExternPropdef then return + if not npropdef isa AMethPropdef then return + var mpropdef = npropdef.mpropdef + if mpropdef == null then return + if not mpropdef.is_extern then return npropdef.verify_nitni_callbacks(toolcontext) end @@ -80,7 +83,7 @@ class ForeignCallbackSet end end -redef class AExternPropdef +redef class AMethPropdef private var foreign_callbacks_cache: nullable ForeignCallbackSet = null # All foreign callbacks from this method @@ -108,7 +111,7 @@ redef class AExternPropdef # return type var rmt = mpropdef.msignature.return_mtype if rmt != null then - if rmt isa MParameterType or rmt isa MVirtualType then + if rmt isa MFormalType then var mclass_type = mpropdef.mclassdef.bound_mtype rmt = rmt.anchor_to(mmodule, mclass_type) end @@ -119,7 +122,7 @@ redef class AExternPropdef # params for p in mpropdef.msignature.mparameters do var mtype = p.mtype.resolve_for(recv_type, recv_type, mmodule, true) - if mtype isa MParameterType or mtype isa MVirtualType then + if mtype isa MFormalType then var mclass_type = mpropdef.mclassdef.bound_mtype mtype = mtype.anchor_to(mmodule, mclass_type) end @@ -139,6 +142,8 @@ redef class AExternPropdef redef fun accept_rapid_type_visitor(v) do + if foreign_callbacks_cache == null then return + for cb in foreign_callbacks.callbacks do v.add_send(cb.recv_mtype, cb.mproperty.as(MMethod)) for cast in foreign_callbacks.casts do v.add_cast_type(cast.to) for sup in foreign_callbacks.supers do @@ -214,7 +219,7 @@ class MExplicitCall var cname if mproperty.is_init then - if mproperty.name == "init" or mproperty.name == "new" then + if mproperty.name == "init" or mproperty.name == "new" or mproperty.name == "defaultinit" then cname = "new_{recv_mtype.mangled_cname}" else cname = "new_{recv_mtype.mangled_cname}_{mproperty.short_cname}" @@ -268,7 +273,7 @@ end redef class AExternCall # Verify this explicit declaration of call from C and collect all relevant callbacks - fun verify_and_collect(npropdef: AExternPropdef, callback_set: ForeignCallbackSet, + fun verify_and_collect(npropdef: AMethPropdef, callback_set: ForeignCallbackSet, toolcontext: ToolContext) is abstract end @@ -282,7 +287,7 @@ redef class ALocalPropExternCall mmodule, mclass_type, m_name ) if method == null then - toolcontext.error(location, "Local method {m_name} not found.") + toolcontext.error(location, "Error: local method `{m_name}` not found.") return end @@ -298,18 +303,17 @@ redef class AFullPropExternCall do var mmodule = npropdef.mpropdef.mclassdef.mmodule var mclassdef = npropdef.mpropdef.mclassdef - var nclassdef = toolcontext.modelbuilder.mclassdef2nclassdef[mclassdef] var mclass_type = mclassdef.bound_mtype - var mtype = toolcontext.modelbuilder.resolve_mtype(nclassdef, n_type) + var mtype = toolcontext.modelbuilder.resolve_mtype(mclassdef, n_type) if mtype == null then return - if mtype isa MParameterType or mtype isa MVirtualType then + if mtype isa MFormalType then mtype = mtype.anchor_to(mmodule, mclass_type) end if mtype isa MNullableType then - toolcontext.error(location, "Type {n_type.collect_text} is nullable and thus cannot be the receiver." ) + toolcontext.error(location, "Error: type `{n_type.collect_text}` is nullable and thus cannot be the receiver." ) return end @@ -318,7 +322,7 @@ redef class AFullPropExternCall mmodule, mtype, m_name ) if method == null then - toolcontext.error(location, "Method {m_name} not found in {n_type.collect_text}." ) + toolcontext.error(location, "Error: method `{m_name}` not found in `{n_type.collect_text}`." ) return end @@ -333,21 +337,26 @@ redef class AInitPropExternCall do var mmodule = npropdef.mpropdef.mclassdef.mmodule var mclassdef = npropdef.mpropdef.mclassdef - var nclassdef = toolcontext.modelbuilder.mclassdef2nclassdef[mclassdef] - var mtype = toolcontext.modelbuilder.resolve_mtype(nclassdef, n_type) + var mtype = toolcontext.modelbuilder.resolve_mtype(mclassdef, n_type) if mtype == null then return if not mtype isa MClassType then - toolcontext.error(location, "Type {n_type.collect_text} is not a class and thus cannot be used to instanciate a new instance." ) + toolcontext.error(location, "Error: type `{n_type.collect_text}` is not a class and thus cannot be used to instantiate a new instance." ) return end - var meth_name = "init" + var meth_name = "new" var meth = toolcontext.modelbuilder.try_get_mproperty_by_name2( self, mmodule, mtype, meth_name ) if meth == null then - toolcontext.error(location, "Method {meth_name} not found in {n_type.collect_text}." ) + meth_name = "defaultinit" + meth = toolcontext.modelbuilder.try_get_mproperty_by_name2( self, + mmodule, mtype, meth_name ) + end + + if meth == null then + toolcontext.error(location, "Error: method `{meth_name}` not found in `{n_type.collect_text}`." ) return end @@ -362,6 +371,7 @@ redef class ASuperExternCall do callback_set.supers.add( new MExplicitSuper( npropdef.mpropdef.as(not null) ) ) callback_set.types.add( npropdef.mpropdef.mclassdef.mclass.mclass_type ) + npropdef.mpropdef.has_supercall = true end end @@ -387,9 +397,9 @@ redef class ACastAsExternCall redef fun verify_and_collect(npropdef, callback_set, toolcontext) do - var parent_aclassdef = npropdef.parent.as(AClassdef) - toolcontext.modelbuilder.resolve_mtype_unchecked(parent_aclassdef, n_from_type, true) - toolcontext.modelbuilder.resolve_mtype_unchecked(parent_aclassdef, n_to_type, true) + var mclassdef = npropdef.mpropdef.mclassdef + toolcontext.modelbuilder.resolve_mtype_unchecked(mclassdef, n_from_type, true) + toolcontext.modelbuilder.resolve_mtype_unchecked(mclassdef, n_to_type, true) super end end @@ -400,8 +410,8 @@ redef class AAsNullableExternCall redef fun verify_and_collect(npropdef, callback_set, toolcontext) do - var parent_aclassdef = npropdef.parent.as(AClassdef) - toolcontext.modelbuilder.resolve_mtype_unchecked(parent_aclassdef, n_type, true) + var mclassdef = npropdef.mpropdef.mclassdef + toolcontext.modelbuilder.resolve_mtype_unchecked(mclassdef, n_type, true) super end end @@ -410,14 +420,14 @@ redef class AAsNotNullableExternCall redef fun from_mtype do return n_type.mtype.as_nullable redef fun to_mtype do var mtype = n_type.mtype.as(not null) - if mtype isa MNullableType then return mtype.mtype + mtype = mtype.undecorate return mtype end redef fun verify_and_collect(npropdef, callback_set, toolcontext) do - var parent_aclassdef = npropdef.parent.as(AClassdef) - toolcontext.modelbuilder.resolve_mtype_unchecked(parent_aclassdef, n_type, true) + var mclassdef = npropdef.mpropdef.mclassdef + toolcontext.modelbuilder.resolve_mtype_unchecked(mclassdef, n_type, true) super end end