function pointers and callbacks

This commit is contained in:
2026-06-15 21:09:46 +02:00
parent 3b7c3fcbd0
commit f5605fd3ec
21 changed files with 1927 additions and 122 deletions
+10
View File
@@ -4,12 +4,22 @@ pass_alias :: func(value native.imported_int_alias) native.imported_int {
return value
}
double_value :: c_func(value c_int) c_int {
return value + value
}
call_mapper :: func(mapper native.Imported_Mapper) c_int {
return mapper?(21)
}
main :: func() void {
_ = native.imported_add(pass_alias(20), 22)
_ = native.imported_scalar(3, 4)
_ = native.child_value(7)
_ = native.imported_read(native.imported_handle()?)
_ = native.imported_string("hello")
_ = native.imported_apply(double_value, 21)
_ = call_mapper(double_value)
_ = native.configured_value(9)
signed i8 :: -2
unsigned u16 :: 3
+30
View File
@@ -7,12 +7,35 @@ typedef int imported_int;
typedef imported_int imported_int_alias;
typedef struct Imported_Handle Imported_Handle;
typedef void (*Imported_Callback)(int value);
typedef int (*Imported_Mapper)(int value);
typedef struct Imported_Value {
int value;
} Imported_Value;
typedef union Imported_Union {
int value;
} Imported_Union;
typedef struct Imported_Bitfield {
unsigned value : 1;
} Imported_Bitfield;
typedef struct __attribute__((packed)) Imported_Packed {
char first;
int second;
} Imported_Packed;
typedef struct Imported_Flexible {
int count;
int values[];
} Imported_Flexible;
typedef struct Imported_Qualified {
const int value;
} Imported_Qualified;
typedef struct Imported_Overaligned {
_Alignas(16) int value;
} Imported_Overaligned;
typedef struct Imported_Anonymous {
struct {
int value;
};
} Imported_Anonymous;
typedef enum Imported_Enum {
IMPORTED_ENUM_VALUE,
} Imported_Enum;
@@ -22,6 +45,7 @@ unsigned long imported_scalar(unsigned char value, unsigned long extra);
Imported_Handle *imported_handle(void);
int imported_read(const Imported_Handle *handle);
int imported_string(const char *value);
int imported_apply(Imported_Mapper mapper, int value);
Imported_Value imported_by_value(Imported_Value value);
int imported_volatile(volatile int *value);
_Bool imported_bool(_Bool value);
@@ -37,5 +61,11 @@ int configured_value(int value);
#define IMPORTED_MACRO 42
int imported_variadic(int marker, ...);
Imported_Bitfield imported_bitfield(Imported_Bitfield value);
Imported_Packed imported_packed(Imported_Packed value);
Imported_Flexible imported_flexible(Imported_Flexible value);
Imported_Qualified imported_qualified(Imported_Qualified value);
Imported_Overaligned imported_overaligned(Imported_Overaligned value);
Imported_Anonymous imported_anonymous(Imported_Anonymous value);
#endif
+11
View File
@@ -36,6 +36,17 @@ int imported_string(const char *value) {
return 0;
}
int imported_apply(Imported_Mapper mapper, int value) {
if (mapper == NULL) {
abort();
}
int result = mapper(value);
if (result != value * 2) {
abort();
}
return result;
}
int imported_variadic(int marker, ...) {
va_list args;
va_start(args, marker);