infix
A JIT-Powered FFI Library for C
Loading...
Searching...
No Matches
302_aggregates.c File Reference

Unit test for reverse trampolines (callbacks) with aggregate types. More...

#include "common/double_tap.h"
#include "types.h"
#include <infix/infix.h>
#include <math.h>
#include <string.h>
Include dependency graph for 302_aggregates.c:

Macros

#define DBLTAP_IMPLEMENTATION
 

Functions

Point point_callback_handler (Point p)
 
int large_struct_pass_handler (LargeStruct s)
 
LargeStruct large_struct_return_handler (int a)
 
int vector4_callback_handler (Vector4 v)
 
Number number_union_return_handler (float f)
 
void point_closure_handler (infix_context_t *ctx, void *ret, void **args)
 
void execute_point_callback (Point(*func_ptr)(Point), Point p)
 
void execute_large_struct_pass_callback (int(*func_ptr)(LargeStruct), LargeStruct s)
 
void execute_large_struct_return_callback (LargeStruct(*func_ptr)(int), int a)
 
void execute_vector4_callback (int(*func_ptr)(Vector4), Vector4 v, int expected)
 
void execute_number_union_return_callback (Number(*func_ptr)(float), float f)
 
int process_packed_struct (PackedStruct p)
 
 subtest ("Callback with small struct: Point(Point)")
 
 subtest ("Callback with large struct argument: int(LargeStruct)")
 
 subtest ("Callback returning large struct: LargeStruct(int)")
 
 subtest ("Callback with struct containing array: int(Vector4)")
 
 subtest ("Callback returning union: Number(float)")
 
 subtest ("Packed struct")
 

Variables

 TEST
 

Detailed Description

Unit test for reverse trampolines (callbacks) with aggregate types.

This test file verifies that infix can correctly create and execute reverse trampolines for functions that take or return aggregate types (structs, unions, etc.) by value. This is a critical test of the reverse-call JIT-compiler and the ABI implementation's ability to correctly marshal arguments from their native locations (registers/stack) into the generic format for the C handler.

The test covers:

  • Small Structs: A Point struct, which is typically passed in registers. Both the type-safe callback and generic closure models are tested.
  • Large Structs: A LargeStruct, which is passed/returned by reference via a hidden pointer, testing the stub's ability to handle this ABI rule.
  • Structs with Arrays: A Vector4 struct, which may be an HFA on some platforms.
  • Unions: A Number union, testing the handling of this aggregate type.
  • Packed Structs: A PackedStruct with non-natural alignment, testing that the raw bytes are correctly marshalled regardless of internal layout.

Macro Definition Documentation

◆ DBLTAP_IMPLEMENTATION

#define DBLTAP_IMPLEMENTATION

Function Documentation

◆ execute_large_struct_pass_callback()

void execute_large_struct_pass_callback ( int(*)(LargeStruct func_ptr,
LargeStruct  s 
)

◆ execute_large_struct_return_callback()

void execute_large_struct_return_callback ( LargeStruct(*)(int)  func_ptr,
int  a 
)

◆ execute_number_union_return_callback()

void execute_number_union_return_callback ( Number(*)(float)  func_ptr,
float  f 
)

◆ execute_point_callback()

void execute_point_callback ( Point(*)(Point func_ptr,
Point  p 
)

◆ execute_vector4_callback()

void execute_vector4_callback ( int(*)(Vector4 func_ptr,
Vector4  v,
int  expected 
)

◆ large_struct_pass_handler()

int large_struct_pass_handler ( LargeStruct  s)

◆ large_struct_return_handler()

LargeStruct large_struct_return_handler ( int  a)

◆ number_union_return_handler()

Number number_union_return_handler ( float  f)

◆ point_callback_handler()

Point point_callback_handler ( Point  p)

◆ point_closure_handler()

void point_closure_handler ( infix_context_t ctx,
void *  ret,
void **  args 
)

◆ process_packed_struct()

int process_packed_struct ( PackedStruct  p)

◆ subtest() [1/6]

subtest ( "Callback returning large struct: LargeStruct(int)"  )

◆ subtest() [2/6]

subtest ( "Callback returning union: Number(float)"  )

◆ subtest() [3/6]

subtest ( "Callback with large struct argument: int(LargeStruct)"  )

◆ subtest() [4/6]

subtest ( "Callback with small struct: Point(Point)"  )

◆ subtest() [5/6]

subtest ( "Callback with struct containing array: int(Vector4)"  )

◆ subtest() [6/6]

subtest ( "Packed struct"  )

◆ vector4_callback_handler()

int vector4_callback_handler ( Vector4  v)

Variable Documentation

◆ TEST

TEST
Initial value:
{
plan(6)
#define plan(count)
Definition double_tap.h:163