Thunk implementation for global compiler.

For more detail see abstract_compiler::ThunkFunction documentation.

Introduced properties

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

nitc :: CustomizedThunkFunction :: defaultinit

Redefined properties

redef type SELF: CustomizedThunkFunction

nitc $ CustomizedThunkFunction :: SELF

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

nitc $ CustomizedThunkFunction :: c_name

The mangled c name of the runtime_function
redef fun hash: Int

nitc $ CustomizedThunkFunction :: hash

The hash code of the object.
redef fun resolve_receiver(v: VISITOR): RuntimeVariable

nitc $ CustomizedThunkFunction :: resolve_receiver

Prepare the self runtime variable to be used by the rest of
redef fun target_recv: MType

nitc $ CustomizedThunkFunction :: target_recv

The type expected by the callee. Used to resolve mmethoddef's formal

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 _polymorph_call_flag: Bool

nitc :: ThunkFunction :: _polymorph_call_flag

Determines if the callsite should be polymorphic or static.
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 :: CustomizedThunkFunction :: defaultinit

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).
fun polymorph_call_flag: Bool

nitc :: ThunkFunction :: polymorph_call_flag

Determines if the callsite should be polymorphic or static.
fun polymorph_call_flag=(polymorph_call_flag: Bool)

nitc :: ThunkFunction :: polymorph_call_flag=

Determines if the callsite should be polymorphic or static.
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 target_recv: MType

nitc :: ThunkFunction :: target_recv

The type expected by the callee. Used to resolve mmethoddef's formal
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::CustomizedThunkFunction CustomizedThunkFunction nitc::ThunkFunction ThunkFunction nitc::CustomizedThunkFunction->nitc::ThunkFunction nitc::global_compiler::CustomizedRuntimeFunction CustomizedRuntimeFunction nitc::CustomizedThunkFunction->nitc::global_compiler::CustomizedRuntimeFunction nitc::AbstractRuntimeFunction AbstractRuntimeFunction nitc::ThunkFunction->nitc::AbstractRuntimeFunction nitc::global_compiler::CustomizedRuntimeFunction->nitc::AbstractRuntimeFunction ...nitc::AbstractRuntimeFunction ... ...nitc::AbstractRuntimeFunction->nitc::AbstractRuntimeFunction

Ancestors

abstract class AbstractRuntimeFunction

nitc :: AbstractRuntimeFunction

A C function associated to a Nit method
interface Object

core :: Object

The root of the class hierarchy.

Parents

private class CustomizedRuntimeFunction

nitc :: CustomizedRuntimeFunction

A runtime function customized on a specific monomorph receiver type
abstract class ThunkFunction

nitc :: ThunkFunction

Base class for all thunk-like function. A thunk is a function whose purpose

Class definitions

nitc $ CustomizedThunkFunction
# Thunk implementation for global compiler.
# For more detail see `abstract_compiler::ThunkFunction` documentation.
class CustomizedThunkFunction
        super ThunkFunction
        super CustomizedRuntimeFunction

        redef fun c_name
        do
                return "THUNK_" + super
        end

        redef fun hash
        do
                return super + c_name.hash
        end

        redef fun resolve_receiver(v)
        do
                var res = super(v)
                if res.is_exact then res.is_exact = not polymorph_call_flag
                return res
        end

        redef fun target_recv
        do
                # If the targeted method was introduced by a primitive type,
                # then target_recv must be set to it. Otherwise, there will
                # be a missing cast. Here's an example:
                #
                # ~~~~nitish
                # class Int
                #       fun mult_by(x:Int):Int do return x * self
                # end
                #
                # var f = &10.mult_by
                # ~~~~
                # Here the thunk `f` must box the receiver `10` into an object.
                # This is due to the memory representation of a call ref which
                # has a pointer to an opaque type `val*`:
                #
                # ```C
                # struct Mult_by_callref_struct {
                #       classid;
                #       // The receiver `10` would be here
                #       val* recv;
                #       // the targeted receiver is a `long`
                #       long (*pointer_to_mult_by)(long, long);
                # }
                # ```
                #
                # Thus, every primitive type must be boxed into an `Object` when
                # instantiating a callref.
                #
                # However, if the underlying method was introduced by a primitive
                # type then a cast must be invoked to convert our boxed receiver
                # to its original primitive type.
                var intro_recv = mmethoddef.mproperty.intro_mclassdef.bound_mtype
                if intro_recv.is_c_primitive then
                        return intro_recv
                end
                return recv_mtype
        end
end
src/compiler/global_compiler.nit:1163,1--1225,3