# The C type for the function pointer.
var c_funptrtype: String is lazy do return "{c_ret}(*){c_sig}"
- # The arguments, as generated by `compile_to_c`
- private var arguments: Array[RuntimeVariable] is noinit
-
redef fun compile_to_c(compiler)
do
var mmethoddef = self.mmethoddef
+ var sig = "{c_ret} {c_name}{c_sig}"
+ compiler.provide_declaration(self.c_name, "{sig} __attribute__((weak));")
+
+ var rta = compiler.as(SeparateCompiler).runtime_type_analysis
+ if rta != null and not rta.live_mmodules.has(mmethoddef.mclassdef.mmodule) then
+ return
+ end
+
var recv = self.mmethoddef.mclassdef.bound_mtype
var v = compiler.new_visitor
var selfvar = new RuntimeVariable("self", called_recv, recv)
var msignature = called_signature
var ret = called_signature.return_mtype
- var sig = new FlatBuffer
var comment = new FlatBuffer
- sig.append(c_ret)
- sig.append(" ")
- sig.append(self.c_name)
- sig.append(c_sig)
comment.append("({selfvar}: {selfvar.mtype}")
arguments.add(selfvar)
for i in [0..msignature.arity[ do
if ret != null then
comment.append(": {ret}")
end
- compiler.provide_declaration(self.c_name, "{sig};")
- self.arguments = arguments.to_a
v.add_decl("/* method {self} for {comment} */")
v.add_decl("{sig} \{")
fun compile_trampolines(compiler: SeparateCompiler)
do
var recv = self.mmethoddef.mclassdef.bound_mtype
- var selfvar = arguments.first
+ var selfvar = new RuntimeVariable("self", called_recv, recv)
var ret = called_signature.return_mtype
+ var arguments = ["self"]
+ for i in [0..called_signature.arity[ do arguments.add "p{i}"
if mmethoddef.is_intro and not recv.is_c_primitive then
var m = mmethoddef.mproperty
# Live methods.
var live_methods = new HashSet[MMethod]
+ # Live mmodules.
+ # Those with a live method definitions (see `live_methoddefs`)
+ var live_mmodules = new HashSet[MModule]
+
# Live callsites.
var live_callsites = new HashSet[CallSite]
do
if live_methoddefs.has(mpropdef) then return
live_methoddefs.add(mpropdef)
+ live_mmodules.add(mpropdef.mclassdef.mmodule)
todo.add(mpropdef)
var mproperty = mpropdef.mproperty