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()
}
@type t() :: atom() | {:list, atom()}

Callbacks

Link to this callback

generate_arg_parse(argument, variable, ctx)

View Source (optional)
@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.

Link to this callback

generate_arg_serialize(name, ctx)

View Source (optional)
@callback generate_arg_serialize(name :: atom(), ctx :: map()) ::
  Unifex.CodeGenerator.code_t()

Provides a way to convert native variable name into UNIFEX_TERM

Link to this callback

generate_destruction(name, ctx)

View Source (optional)
@callback generate_destruction(name :: atom(), ctx :: map()) ::
  Unifex.CodeGenerator.code_t()

Generates a destruction of variable content. Should be paired with generate_initialization/2

Link to this callback

generate_initialization(name, ctx)

View Source (optional)
@callback generate_initialization(name :: atom(), ctx :: map()) ::
  Unifex.CodeGenerator.code_t()

Generates an initialization of variable content. Should be paired with generate_destruction/2

Link to this callback

generate_native_type(ctx)

View Source (optional)
@callback generate_native_type(ctx :: map()) ::
  Unifex.CodeGenerator.code_t() | [Unifex.CodeGenerator.code_t()]

Generates a native counterpart for the type.

Link to this callback

ptr_level(ctx)

View Source (optional)
@callback ptr_level(ctx :: map()) :: integer()

Returns level of pointer nesting of native type.

Functions

Link to this function

generate_arg_name(type, name, code_generator, ctx)

View Source
@spec generate_arg_name(t(), name :: atom(), Unifex.CodeGenerator.t(), map()) :: [
  Unifex.CodeGenerator.code_t()
]
Link to this function

generate_arg_parse(type, name, argument, postproc_fun \\ & &1, code_generator, ctx)

View Source

Generates parsing of UNIFEX_TERM argument into the native variable

Link to this function

generate_arg_serialize(type, name, code_generator, ctx)

View Source
@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.

Link to this function

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

Link to this function

generate_destruction(type, name, code_generator, ctx)

View Source
@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

Link to this function

generate_initialization(type, name, code_generator, ctx)

View Source
@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

Link to this function

generate_native_type(type, mode \\ :default, code_generator, ctx)

View Source
@spec generate_native_type(t(), :const | :default, Unifex.CodeGenerator.t(), map()) ::
  Unifex.CodeGenerator.code_t()
Link to this function

ptr_level(type, code_generator, ctx)

View Source
@spec ptr_level(t(), Unifex.CodeGenerator.t(), ctx :: map()) :: integer()