View Source Unifex.CodeGenerator.BaseType behaviour (Unifex v1.2.0)
Behaviour and abstraction over type-specific code generation.
When invoking callbacks for type :type
and interface Interface
it searches for
a module that implements given callback in the following order:
Unifex.CodeGenerator.BaseTypes.Type.Interface
Unifex.CodeGenerator.BaseTypes.Type
Unifex.CodeGenerator.BaseTypes.Default.Interface
Summary
Callbacks
Generates function call parsing UNIFEX_TERM argument
into the native variable with name variable
. Function should
return boolean value.
Provides a way to convert native variable name
into UNIFEX_TERM
Generates a destruction of variable content. Should be paired with generate_initialization/2
Generates an initialization of variable content. Should be paired with generate_destruction/2
Generates a native counterpart for the type.
Returns level of pointer nesting of native type.
Functions
Generates parsing of UNIFEX_TERM argument
into the native variable
Provides a way to convert native variable name
into UNIFEX_TERM
Generates a declaration of parameter (to be placed in function header) based on generate_native_type/1
and
provided name
.
Generates an destrucition of variable content. Should be paired with generate_initialization/1
Generates an initialization of variable content. Should be paired with generate_destruction/1
Types
@type arg_parse_ctx_t() :: %{ result_var: Unifex.CodeGenerator.code_t(), exit_label: Unifex.CodeGenerator.code_t() }
Callbacks
@callback generate_arg_parse( argument :: Unifex.CodeGenerator.code_t(), variable :: Unifex.CodeGenerator.code_t(), ctx :: map() ) :: Unifex.CodeGenerator.code_t()
Generates function call parsing UNIFEX_TERM argument
into the native variable with name variable
. Function should
return boolean value.
@callback generate_arg_serialize(name :: atom(), ctx :: map()) :: Unifex.CodeGenerator.code_t()
Provides a way to convert native variable name
into UNIFEX_TERM
@callback generate_destruction(name :: atom(), ctx :: map()) :: Unifex.CodeGenerator.code_t()
Generates a destruction of variable content. Should be paired with generate_initialization/2
@callback generate_initialization(name :: atom(), ctx :: map()) :: Unifex.CodeGenerator.code_t()
Generates an initialization of variable content. Should be paired with generate_destruction/2
@callback generate_native_type(ctx :: map()) :: Unifex.CodeGenerator.code_t() | [Unifex.CodeGenerator.code_t()]
Generates a native counterpart for the type.
Returns level of pointer nesting of native type.
Functions
@spec generate_arg_name(t(), name :: atom(), Unifex.CodeGenerator.t(), map()) :: [ Unifex.CodeGenerator.code_t() ]
generate_arg_parse(type, name, argument, postproc_fun \\ & &1, code_generator, ctx)
View Source@spec generate_arg_parse( t(), name :: atom(), argument :: Unifex.CodeGenerator.code_t(), (Unifex.CodeGenerator.code_t() -> Unifex.CodeGenerator.code_t()), Unifex.CodeGenerator.t(), map() ) :: Unifex.CodeGenerator.code_t()
Generates parsing of UNIFEX_TERM argument
into the native variable
@spec generate_arg_serialize( t(), name :: atom(), Unifex.CodeGenerator.t(), ctx :: map() ) :: Unifex.CodeGenerator.code_t()
Provides a way to convert native variable name
into UNIFEX_TERM
Tries to get value from type-specific module, uses enif_make_#{type}
as fallback value.
generate_declaration(type, name, mode \\ :default, code_generator, ctx)
View Source@spec generate_declaration( t(), name :: atom(), mode :: :default | :const | :const_unless_ptr_on_ptr, Unifex.CodeGenerator.t(), ctx :: map() ) :: [Unifex.CodeGenerator.code_t()]
Generates a declaration of parameter (to be placed in function header) based on generate_native_type/1
and
provided name
.
Uses type
as fallback for generate_native_type/1
When mode is set to :const_unless_ptr_on_ptr, function will choose to behave like it would be set to :default or :const,
depending on value returned by ptr_level(type, code_generator, ctx)
.
This mode can be used in places, when in general, you want to have declaration of variable with const type, but using :const
mode would generate code, that would require explicit cast to avoid generating warnings during compilation - e.g. in C,
passing argument of type char **
to function, that expects argument of type char const * const *
without any explicit cast,
will generate such a warning
@spec generate_destruction( t(), name :: atom(), Unifex.CodeGenerator.t(), ctx :: map() ) :: Unifex.CodeGenerator.code_t()
Generates an destrucition of variable content. Should be paired with generate_initialization/1
Returns an empty string if the type does not provide destructor
@spec generate_initialization( t(), name :: atom(), Unifex.CodeGenerator.t(), ctx :: map() ) :: Unifex.CodeGenerator.code_t()
Generates an initialization of variable content. Should be paired with generate_destruction/1
Returns an empty string if the type does not provide initialization
@spec generate_native_type(t(), :const | :default, Unifex.CodeGenerator.t(), map()) :: Unifex.CodeGenerator.code_t()
@spec ptr_level(t(), Unifex.CodeGenerator.t(), ctx :: map()) :: integer()