nitc :: MMethod :: build_ccall
recv_mtype
from_module
(used for type resolving and as a possible prefix)suffix
to the method name (may be "super", "impl", null, etc.)call_context
identifying which types and casts to use (see CallContext
and its instances)param_suffix
# Build a C function call for the FFI implementation (uses friendly naming).
# * On a specific static receiver type `recv_mtype`
# * In referene to the module `from_module` (used for type resolving and as a possible prefix)
# * Has a possible `suffix` to the method name (may be "__super", "__impl", null, etc.)
# * With a specified length indicating whether it uses the sort name or the long name with
# the module name as prefix
# * The `call_context` identifying which types and casts to use (see `CallContext` and its instances)
# * Possible suffix to the parameters `param_suffix`
fun build_ccall(recv_mtype: MClassType, from_mmodule: MModule, suffix: nullable String, length: SignatureLength, call_context: CallContext, param_suffix: nullable String): String
do
if param_suffix == null then param_suffix = ""
var mmethoddef = lookup_first_definition(from_mmodule, recv_mtype)
var signature = mmethoddef.msignature
assert signature != null
var return_mtype = null
if self.is_init then
return_mtype = recv_mtype
else if signature.return_mtype != null then
return_mtype = signature.return_mtype
return_mtype = return_mtype.resolve_for(recv_mtype, recv_mtype, from_mmodule, true)
end
var cname = build_cname(recv_mtype, from_mmodule, suffix, length)
var cparams = new List[String]
if not self.is_init then
cparams.add(call_context.cast_to(recv_mtype, "self{param_suffix}"))
end
for p in signature.mparameters do
var param_mtype = p.mtype.resolve_for(recv_mtype, recv_mtype, from_mmodule, true)
cparams.add(call_context.cast_to(param_mtype, "{p.name}{param_suffix}"))
end
var joined_cparams = cparams.join(", ")
var ccall = "{cname}({joined_cparams})"
if return_mtype != null then
return "return {call_context.cast_from(return_mtype, ccall)};"
else
return "{ccall};"
end
end
src/nitni/nitni_utilities.nit:85,2--128,4