A runtime function customized on a specific monomorph receiver type

Introduced properties

private var _recv: MClassType

nitc :: CustomizedRuntimeFunction :: _recv

The considered reciever
init defaultinit(mmethoddef: MMethodDef, recv: MClassType, return_mtype: nullable MType)

nitc :: CustomizedRuntimeFunction :: defaultinit

private fun recv: MClassType

nitc :: CustomizedRuntimeFunction :: recv

The considered reciever
private fun recv=(recv: MClassType)

nitc :: CustomizedRuntimeFunction :: recv=

The considered reciever

Redefined properties

redef fun ==(o: nullable Object): Bool

nitc $ CustomizedRuntimeFunction :: ==

used in the compiler worklist
redef type SELF: CustomizedRuntimeFunction

nitc $ CustomizedRuntimeFunction :: SELF

Type of this instance, automatically specialized in every class
redef fun build_c_name: String

nitc $ CustomizedRuntimeFunction :: build_c_name

Non cached version of c_name
redef fun call(v: VISITOR, arguments: Array[RuntimeVariable]): nullable RuntimeVariable

nitc $ CustomizedRuntimeFunction :: call

Implements a call of the runtime_function
redef fun declare_signature(v: VISITOR, sig: String)

nitc $ CustomizedRuntimeFunction :: 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 $ CustomizedRuntimeFunction :: end_compile_to_c

Hook called at the end of compile_to_c function. This function
redef fun hash: Int

nitc $ CustomizedRuntimeFunction :: hash

used in the compiler work-list
redef fun recv_mtype: MType

nitc $ CustomizedRuntimeFunction :: recv_mtype

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

nitc $ CustomizedRuntimeFunction :: resolve_ith_parameter

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

nitc $ CustomizedRuntimeFunction :: resolve_receiver

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

nitc $ CustomizedRuntimeFunction :: resolve_return_mtype

Step 3 : Returns the return type used by the runtime function.
redef fun return_mtype=(return_mtype: nullable MType)

nitc $ CustomizedRuntimeFunction :: return_mtype=

redef fun to_s: String

nitc $ CustomizedRuntimeFunction :: 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 _mmethoddef: MMethodDef

nitc :: AbstractRuntimeFunction :: _mmethoddef

The associated Nit method
private var _recv: MClassType

nitc :: CustomizedRuntimeFunction :: _recv

The considered reciever
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_frame(v: VISITOR, arguments: Array[RuntimeVariable]): StaticFrame

nitc :: AbstractRuntimeFunction :: build_frame

Builds the static frame for current runtime method
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=

abstract fun call(v: VISITOR, arguments: Array[RuntimeVariable]): nullable RuntimeVariable

nitc :: AbstractRuntimeFunction :: call

Implements a call of the runtime_function
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
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, recv: MClassType, return_mtype: nullable MType)

nitc :: CustomizedRuntimeFunction :: 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).
private fun recv: MClassType

nitc :: CustomizedRuntimeFunction :: recv

The considered reciever
private fun recv=(recv: MClassType)

nitc :: CustomizedRuntimeFunction :: recv=

The considered reciever
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::global_compiler::CustomizedRuntimeFunction CustomizedRuntimeFunction nitc::AbstractRuntimeFunction AbstractRuntimeFunction nitc::global_compiler::CustomizedRuntimeFunction->nitc::AbstractRuntimeFunction core::Object Object nitc::AbstractRuntimeFunction->core::Object ...core::Object ... ...core::Object->core::Object nitc::CustomizedThunkFunction CustomizedThunkFunction nitc::CustomizedThunkFunction->nitc::global_compiler::CustomizedRuntimeFunction

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 CustomizedThunkFunction

nitc :: CustomizedThunkFunction

Thunk implementation for global compiler.

Class definitions

nitc $ CustomizedRuntimeFunction
# A runtime function customized on a specific monomorph receiver type
private class CustomizedRuntimeFunction
	super AbstractRuntimeFunction

	redef type COMPILER: GlobalCompiler
	redef type VISITOR: GlobalCompilerVisitor

	# The considered reciever
	# (usually is a live type but no strong guarantee)
	var recv: MClassType

	redef fun build_c_name
	do
		var res = self.c_name_cache
		if res != null then return res
		if self.mmethoddef.mclassdef.bound_mtype == self.recv then
			res = self.mmethoddef.c_name
		else
			res = "{mmethoddef.c_name}__{recv.c_name}"
		end
		self.c_name_cache = res
		return res
	end

	# used in the compiler worklist
	redef fun ==(o)
	do
		if not o isa CustomizedRuntimeFunction then return false
		if self.mmethoddef != o.mmethoddef then return false
		if self.recv != o.recv then return false
		return true
	end

	# used in the compiler work-list
	redef fun hash do return self.mmethoddef.hash + self.recv.hash

	redef fun to_s
	do
		if self.mmethoddef.mclassdef.bound_mtype == self.recv then
			return self.mmethoddef.to_s
		else
			return "{self.mmethoddef}@{self.recv}"
		end
	end

        redef fun recv_mtype
        do
                return recv
        end

        redef var return_mtype

        redef fun resolve_receiver(v)
        do
                var selfvar = new RuntimeVariable("self", recv, recv)
		if v.compiler.runtime_type_analysis.live_types.has(recv) then
			selfvar.is_exact = true
		end
                return selfvar
        end

        redef fun resolve_return_mtype(v)
        do
                var selfvar = v.frame.selfvar
                if has_return then
                        var ret = msignature.return_mtype.as(not null)
                        return_mtype = v.resolve_for(ret, selfvar)
                end
        end
        redef fun resolve_ith_parameter(v, i)
        do
                var selfvar = v.frame.selfvar
                var mp = msignature.mparameters[i]
                var mtype = mp.mtype
                if mp.is_vararg then
                        mtype = v.mmodule.array_type(mtype)
                end
                mtype = v.resolve_for(mtype, selfvar)
                return new RuntimeVariable("p{i}", mtype, mtype)
        end

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

        redef fun end_compile_to_c(v)
        do
	        if not self.c_name.has_substring("VIRTUAL", 0) then v.compiler.names[self.c_name] = "{mmethoddef.mclassdef.mmodule.name}::{mmethoddef.mclassdef.mclass.name}::{mmethoddef.mproperty.name} ({mmethoddef.location.file.filename}:{mmethoddef.location.line_start})"
        end

	redef fun call(v: VISITOR, arguments: Array[RuntimeVariable]): nullable RuntimeVariable
	do
		var ret = self.mmethoddef.msignature.return_mtype
		if ret != null then
			ret = v.resolve_for(ret, arguments.first)
		end

                # TODO: remove this guard when gcc warning issue (#2781) is resolved
                # WARNING: the next two lines of code is used to prevent inlining.
                # Inlining of a callref seems to work all the time. However,
                # it will produce some deadcode in certain scenarios (when using nullable type).
                #
                # ~~~~nitish
                # class A[E]
                #       fun toto(x: E)
                #       do
                #               # ...do something with x...
                #       end
                # end
                # end
                # var a = new A[nullable Int]
                # var f = &a.toto
                # f.call(null)  # Will produce a proper C callsite, but it will
                #               # produce unreachable (dead code) for type checking
                #               # and covariance. Thus, creating warnings when
                #               # compiling in global. However, if you ignore
                #               # those warnings, the binary works perfectly fine.
                # ~~~~
                var intromclassdef = self.mmethoddef.mproperty.intro_mclassdef
                var is_callref = v.compiler.all_routine_types_name.has(intromclassdef.name)

                if self.mmethoddef.can_inline(v) and not is_callref then
			var frame = new StaticFrame(v, self.mmethoddef, self.recv, arguments)
			frame.returnlabel = v.get_name("RET_LABEL")
			if ret != null then
				frame.returnvar = v.new_var(ret)
			end
			var old_frame = v.frame
			v.frame = frame
			v.add("\{ /* Inline {self} ({arguments.join(",")}) */")
			self.mmethoddef.compile_inside_to_c(v, arguments)
			v.add("{frame.returnlabel.as(not null)}:(void)0;")
			v.add("\}")
			v.frame = old_frame
			return frame.returnvar
		end
		v.adapt_signature(self.mmethoddef, arguments)
		v.compiler.todo(self)
		if ret == null then
			v.add("{self.c_name}({arguments.join(",")});")
			return null
		else
			var res = v.new_var(ret)
			v.add("{res} = {self.c_name}({arguments.join(",")});")
			return res
		end
	end
end
src/compiler/global_compiler.nit:1013,1--1161,3