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

Property definitions

nitc :: nitni_utilities $ MMethod :: build_ccall
	# 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