The C function associated to a methoddef separately compiled

Introduced properties

private var _build_c_name: String

nitc :: SeparateRuntimeFunction :: _build_c_name

The name on the compiled method
private var _c_funptrtype: String

nitc :: SeparateRuntimeFunction :: _c_funptrtype

The C type for the function pointer.
private var _c_ret: String

nitc :: SeparateRuntimeFunction :: _c_ret

The C return type (something or void)
private var _c_sig: String

nitc :: SeparateRuntimeFunction :: _c_sig

The C signature (only the parmeter part)
private var _called_recv: MType

nitc :: SeparateRuntimeFunction :: _called_recv

The call-side static receiver
private var _called_signature: MSignature

nitc :: SeparateRuntimeFunction :: _called_signature

The call-side static signature
protected fun build_c_name=(build_c_name: String)

nitc :: SeparateRuntimeFunction :: build_c_name=

The name on the compiled method
fun c_funptrtype: String

nitc :: SeparateRuntimeFunction :: c_funptrtype

The C type for the function pointer.
protected fun c_funptrtype=(c_funptrtype: String)

nitc :: SeparateRuntimeFunction :: c_funptrtype=

The C type for the function pointer.
fun c_ret: String

nitc :: SeparateRuntimeFunction :: c_ret

The C return type (something or void)
protected fun c_ret=(c_ret: String)

nitc :: SeparateRuntimeFunction :: c_ret=

The C return type (something or void)
fun c_sig: String

nitc :: SeparateRuntimeFunction :: c_sig

The C signature (only the parmeter part)
protected fun c_sig=(c_sig: String)

nitc :: SeparateRuntimeFunction :: c_sig=

The C signature (only the parmeter part)
fun called_recv: MType

nitc :: SeparateRuntimeFunction :: called_recv

The call-side static receiver
protected fun called_recv=(called_recv: MType)

nitc :: SeparateRuntimeFunction :: called_recv=

The call-side static receiver
fun called_signature: MSignature

nitc :: SeparateRuntimeFunction :: called_signature

The call-side static signature
protected fun called_signature=(called_signature: MSignature)

nitc :: SeparateRuntimeFunction :: called_signature=

The call-side static signature
fun compile_trampolines(compiler: SeparateCompiler)

nitc :: SeparateRuntimeFunction :: compile_trampolines

Compile the trampolines used to implement late-binding.
init defaultinit(mmethoddef: MMethodDef, called_recv: MType, called_signature: MSignature, build_c_name: String)

nitc :: SeparateRuntimeFunction :: defaultinit

Redefined properties

redef type SELF: SeparateRuntimeFunction

nitc $ SeparateRuntimeFunction :: SELF

Type of this instance, automatically specialized in every class
redef fun body_to_c(v: VISITOR)

nitc $ SeparateRuntimeFunction :: body_to_c

Generate the code for the body without return statement at the end and
redef fun build_c_name: String

nitc $ SeparateRuntimeFunction :: build_c_name

The name on the compiled method
redef fun build_frame(v: VISITOR, arguments: Array[RuntimeVariable]): StaticFrame

nitc $ SeparateRuntimeFunction :: build_frame

Builds the static frame for current runtime method
redef fun declare_signature(v: VISITOR, sig: String)

nitc $ SeparateRuntimeFunction :: declare_signature

How the concrete compiler will declare the method, e.g inside a global header file,
redef fun end_compile_to_c(v: VISITOR)

nitc $ SeparateRuntimeFunction :: end_compile_to_c

Hook called at the end of compile_to_c function. This function
redef fun msignature: MSignature

nitc $ SeparateRuntimeFunction :: msignature

The current msignature to use when compiling : signature_to_c and body_to_c.
redef fun recv_mtype: MType

nitc $ SeparateRuntimeFunction :: recv_mtype

The current receiver type to compile : signature_to_c and body_to_c.
redef fun to_s: String

nitc $ SeparateRuntimeFunction :: to_s

User readable representation of self.

All properties

fun !=(other: nullable Object): Bool

core :: Object :: !=

Have self and other different values?
fun ==(other: nullable Object): Bool

core :: Object :: ==

Have self and other the same value?
type CLASS: Class[SELF]

core :: Object :: CLASS

The type of the class of self.
type SELF: Object

core :: Object :: SELF

Type of this instance, automatically specialized in every class
private var _build_c_name: String

nitc :: SeparateRuntimeFunction :: _build_c_name

The name on the compiled method
private var _c_funptrtype: String

nitc :: SeparateRuntimeFunction :: _c_funptrtype

The C type for the function pointer.
private var _c_ret: String

nitc :: SeparateRuntimeFunction :: _c_ret

The C return type (something or void)
private var _c_sig: String

nitc :: SeparateRuntimeFunction :: _c_sig

The C signature (only the parmeter part)
private var _called_recv: MType

nitc :: SeparateRuntimeFunction :: _called_recv

The call-side static receiver
private var _called_signature: MSignature

nitc :: SeparateRuntimeFunction :: _called_signature

The call-side static signature
private var _mmethoddef: MMethodDef

nitc :: AbstractRuntimeFunction :: _mmethoddef

The associated Nit method
protected fun body_to_c(v: VISITOR)

nitc :: AbstractRuntimeFunction :: body_to_c

Generate the code for the body without return statement at the end and
protected abstract fun build_c_name: String

nitc :: AbstractRuntimeFunction :: build_c_name

Non cached version of c_name
protected fun build_c_name=(build_c_name: String)

nitc :: SeparateRuntimeFunction :: build_c_name=

The name on the compiled method
protected fun build_frame(v: VISITOR, arguments: Array[RuntimeVariable]): StaticFrame

nitc :: AbstractRuntimeFunction :: build_frame

Builds the static frame for current runtime method
fun c_funptrtype: String

nitc :: SeparateRuntimeFunction :: c_funptrtype

The C type for the function pointer.
protected fun c_funptrtype=(c_funptrtype: String)

nitc :: SeparateRuntimeFunction :: c_funptrtype=

The C type for the function pointer.
fun c_name: String

nitc :: AbstractRuntimeFunction :: c_name

The mangled c name of the runtime_function
protected fun c_name_cache: nullable String

nitc :: AbstractRuntimeFunction :: c_name_cache

fun c_name_cache=(c_name_cache: nullable String)

nitc :: AbstractRuntimeFunction :: c_name_cache=

fun c_ret: String

nitc :: SeparateRuntimeFunction :: c_ret

The C return type (something or void)
protected fun c_ret=(c_ret: String)

nitc :: SeparateRuntimeFunction :: c_ret=

The C return type (something or void)
fun c_sig: String

nitc :: SeparateRuntimeFunction :: c_sig

The C signature (only the parmeter part)
protected fun c_sig=(c_sig: String)

nitc :: SeparateRuntimeFunction :: c_sig=

The C signature (only the parmeter part)
abstract fun call(v: VISITOR, arguments: Array[RuntimeVariable]): nullable RuntimeVariable

nitc :: AbstractRuntimeFunction :: call

Implements a call of the runtime_function
fun called_recv: MType

nitc :: SeparateRuntimeFunction :: called_recv

The call-side static receiver
protected fun called_recv=(called_recv: MType)

nitc :: SeparateRuntimeFunction :: called_recv=

The call-side static receiver
fun called_signature: MSignature

nitc :: SeparateRuntimeFunction :: called_signature

The call-side static signature
protected fun called_signature=(called_signature: MSignature)

nitc :: SeparateRuntimeFunction :: called_signature=

The call-side static signature
protected fun class_factory(name: String): CLASS

core :: Object :: class_factory

Implementation used by get_class to create the specific class.
fun class_name: String

core :: Object :: class_name

The class name of the object.
fun compile_to_c(compiler: COMPILER)

nitc :: AbstractRuntimeFunction :: compile_to_c

Generate the code
fun compile_trampolines(compiler: SeparateCompiler)

nitc :: SeparateRuntimeFunction :: compile_trampolines

Compile the trampolines used to implement late-binding.
protected abstract fun declare_signature(v: VISITOR, signature: String)

nitc :: AbstractRuntimeFunction :: declare_signature

How the concrete compiler will declare the method, e.g inside a global header file,
init defaultinit(mmethoddef: MMethodDef, called_recv: MType, called_signature: MSignature, build_c_name: String)

nitc :: SeparateRuntimeFunction :: defaultinit

protected fun end_compile_to_c(v: VISITOR)

nitc :: AbstractRuntimeFunction :: end_compile_to_c

Hook called at the end of compile_to_c function. This function
private fun fill_parameters(v: VISITOR)

nitc :: AbstractRuntimeFunction :: fill_parameters

Fills the argument array inside v.frame.arguments, calling resolve_ith_parameter
fun get_class: CLASS

core :: Object :: get_class

The meta-object representing the dynamic type of self.
fun has_return: Bool

nitc :: AbstractRuntimeFunction :: has_return

Returns true if the associated mmethoddef's return type isn't null,
fun hash: Int

core :: Object :: hash

The hash code of the object.
init init

core :: Object :: init

fun inspect: String

core :: Object :: inspect

Developer readable representation of self.
protected fun inspect_head: String

core :: Object :: inspect_head

Return "CLASSNAME:#OBJECTID".
intern fun is_same_instance(other: nullable Object): Bool

core :: Object :: is_same_instance

Return true if self and other are the same instance (i.e. same identity).
fun is_same_serialized(other: nullable Object): Bool

core :: Object :: is_same_serialized

Is self the same as other in a serialization context?
intern fun is_same_type(other: Object): Bool

core :: Object :: is_same_type

Return true if self and other have the same dynamic type.
fun mmethoddef: MMethodDef

nitc :: AbstractRuntimeFunction :: mmethoddef

The associated Nit method
protected fun mmethoddef=(mmethoddef: MMethodDef)

nitc :: AbstractRuntimeFunction :: mmethoddef=

The associated Nit method
fun msignature: MSignature

nitc :: AbstractRuntimeFunction :: msignature

The current msignature to use when compiling : signature_to_c and body_to_c.
private intern fun native_class_name: CString

core :: Object :: native_class_name

The class name of the object in CString format.
intern fun object_id: Int

core :: Object :: object_id

An internal hash code for the object based on its identity.
fun output

core :: Object :: output

Display self on stdout (debug only).
intern fun output_class_name

core :: Object :: output_class_name

Display class name on stdout (debug only).
protected fun recv_mtype: MType

nitc :: AbstractRuntimeFunction :: recv_mtype

The current receiver type to compile : signature_to_c and body_to_c.
protected fun resolve_ith_parameter(v: VISITOR, i: Int): RuntimeVariable

nitc :: AbstractRuntimeFunction :: resolve_ith_parameter

Step 4 : Creates RuntimeVariable for each method argument.
protected fun resolve_receiver(v: VISITOR): RuntimeVariable

nitc :: AbstractRuntimeFunction :: resolve_receiver

Prepare the self runtime variable to be used by the rest of
protected fun resolve_return_mtype(v: VISITOR)

nitc :: AbstractRuntimeFunction :: resolve_return_mtype

Step 3 : Returns the return type used by the runtime function.
protected fun return_mtype: nullable MType

nitc :: AbstractRuntimeFunction :: return_mtype

protected fun return_mtype=(return_mtype: nullable MType)

nitc :: AbstractRuntimeFunction :: return_mtype=

fun serialization_hash: Int

core :: Object :: serialization_hash

Hash value use for serialization
protected fun signature_to_c(v: VISITOR): String

nitc :: AbstractRuntimeFunction :: signature_to_c

Generate the code for the signature with an open curly brace
intern fun sys: Sys

core :: Object :: sys

Return the global sys object, the only instance of the Sys class.
abstract fun to_jvalue(env: JniEnv): JValue

core :: Object :: to_jvalue

fun to_s: String

core :: Object :: to_s

User readable representation of self.
package_diagram nitc::SeparateRuntimeFunction SeparateRuntimeFunction nitc::AbstractRuntimeFunction AbstractRuntimeFunction nitc::SeparateRuntimeFunction->nitc::AbstractRuntimeFunction core::Object Object nitc::AbstractRuntimeFunction->core::Object ...core::Object ... ...core::Object->core::Object nitc::SeparateThunkFunction SeparateThunkFunction nitc::SeparateThunkFunction->nitc::SeparateRuntimeFunction

Ancestors

interface Object

core :: Object

The root of the class hierarchy.

Parents

abstract class AbstractRuntimeFunction

nitc :: AbstractRuntimeFunction

A C function associated to a Nit method

Children

Class definitions

nitc $ SeparateRuntimeFunction
# The C function associated to a methoddef separately compiled
class SeparateRuntimeFunction
	super AbstractRuntimeFunction

	# The call-side static receiver
	var called_recv: MType

	# The call-side static signature
	var called_signature: MSignature

	# The name on the compiled method
	redef var build_c_name: String

	redef fun to_s do return self.mmethoddef.to_s

	redef fun msignature
	do
		return called_signature
	end

	redef fun recv_mtype
	do
		return called_recv
	end

	redef fun return_mtype
	do
		return called_signature.return_mtype
	end

	# The C return type (something or `void`)
	var c_ret: String is lazy do
		var ret = called_signature.return_mtype
		if ret != null then
			return ret.ctype
		else
			return "void"
		end
	end

	# The C signature (only the parmeter part)
	var c_sig: String is lazy do
		var sig = new FlatBuffer
		sig.append("({called_recv.ctype} self")
		for i in [0..called_signature.arity[ do
			var mp = called_signature.mparameters[i]
			var mtype = mp.mtype
			if mp.is_vararg then
				mtype = mmethoddef.mclassdef.mmodule.array_type(mtype)
			end
			sig.append(", {mtype.ctype} p{i}")
		end
		sig.append(")")
		return sig.to_s
	end

	# The C type for the function pointer.
	var c_funptrtype: String is lazy do return "{c_ret}(*){c_sig}"

	redef fun declare_signature(v, sig)
	do
		v.compiler.provide_declaration(c_name, "{sig};")
	end

	redef fun body_to_c(v)
	do
		var rta = v.compiler.as(SeparateCompiler).runtime_type_analysis
		if rta != null and not rta.live_mmodules.has(mmethoddef.mclassdef.mmodule) then
			v.add_abort("FATAL: Dead method executed.")
		else
			super
		end
	end

	redef fun end_compile_to_c(v)
	do
		var compiler = v.compiler
		compiler.names[self.c_name] = "{mmethoddef.full_name} ({mmethoddef.location.file.filename}:{mmethoddef.location.line_start})"
	end

	redef fun build_frame(v, arguments)
	do
		var recv = mmethoddef.mclassdef.bound_mtype
		return new StaticFrame(v, mmethoddef, recv, arguments)
	end

	# Compile the trampolines used to implement late-binding.
	#
	# See `opt_trampoline_call`.
	fun compile_trampolines(compiler: SeparateCompiler)
	do
		var recv = self.mmethoddef.mclassdef.bound_mtype
		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
			var n2 = "CALL_" + m.const_color
			compiler.provide_declaration(n2, "{c_ret} {n2}{c_sig};")
			var v2 = compiler.new_visitor
			v2.add "{c_ret} {n2}{c_sig} \{"
			v2.require_declaration(m.const_color)
			var call = "(({c_funptrtype})({v2.class_info(selfvar)}->vft[{m.const_color}]))({arguments.join(", ")});"
			if ret != null then
				v2.add "return {call}"
			else
				v2.add call
			end

			v2.add "\}"

		end
		if mmethoddef.has_supercall and not recv.is_c_primitive then
			var m = mmethoddef
			var n2 = "CALL_" + m.const_color
			compiler.provide_declaration(n2, "{c_ret} {n2}{c_sig};")
			var v2 = compiler.new_visitor
			v2.add "{c_ret} {n2}{c_sig} \{"
			v2.require_declaration(m.const_color)
			var call = "(({c_funptrtype})({v2.class_info(selfvar)}->vft[{m.const_color}]))({arguments.join(", ")});"
			if ret != null then
				v2.add "return {call}"
			else
				v2.add call
			end

			v2.add "\}"
		end
	end
end
src/compiler/separate_compiler.nit:2463,1--2594,3