# Perform a method call through vft
private fun table_send(mmethod: TableCallable, arguments: Array[RuntimeVariable]): nullable RuntimeVariable do
var mdef: MMethodDef
var name: String
if mmethod isa MMethod then
mdef = mmethod.intro
name = mmethod.full_name
else if mmethod isa MMethodDef then
mdef = mmethod
name = mmethod.full_name
else
abort
end
var recv = arguments.first
var rect = mdef.mclassdef.bound_mtype
var msignature = mdef.msignature.as(not null)
msignature = msignature.resolve_for(rect, rect, compiler.mainmodule, true)
adapt_signature(mdef, arguments)
var res: nullable RuntimeVariable
var ret = msignature.return_mtype
if ret == null then
res = null
else
res = self.new_var(ret)
end
before_send(res, mdef, arguments)
add "/* concrete call to {mdef} */"
if res != null then
var ress = new_expr("{recv}.rtclass.vft.get(\"{name}\").exec(new RTVal[]\{{arguments.join(",")}\});", compiler.mainmodule.object_type)
assign(res, ress)
else
add("{recv}.rtclass.vft.get(\"{name}\").exec(new RTVal[]\{{arguments.join(",")}\});")
end
add("\}") # closes the null case
return res
end
src/compiler/java_compiler.nit:638,2--679,4