function pointers and callbacks
This commit is contained in:
@@ -40,11 +40,38 @@ main :: func() void {
|
||||
}
|
||||
```
|
||||
|
||||
Header imports expose supported external functions, typedefs, C scalars, and
|
||||
pointers to opaque records. They never add linker inputs; implementations must
|
||||
still be supplied explicitly with the C-prefixed linking options. Set
|
||||
Header imports expose supported external functions, typedefs, C scalars, fixed
|
||||
arrays, complete plain structs and unions, function pointer typedefs, and
|
||||
pointers to opaque records. Plain records can be constructed with keyed
|
||||
literals, accessed by field, and passed or returned by value through fixed C
|
||||
signatures on `aarch64-macos`. Unsupported or incomplete records remain
|
||||
pointer-only. Header imports never add linker inputs; implementations must still
|
||||
be supplied explicitly with the C-prefixed linking options. Set
|
||||
`BROLANG_LIBCLANG_PATH` when libclang is not installed in a standard location.
|
||||
|
||||
```bro
|
||||
native :: import "../include/native.h"
|
||||
|
||||
pair native.Pair :: native.echo_pair(native.Pair { left = 20, right = 22 })
|
||||
choice native.Choice :: native.Choice { integer = 42 }
|
||||
```
|
||||
|
||||
Concrete `c_func` declarations and definitions can be passed to C function
|
||||
pointer parameters. Imported C callback typedefs are nullable, so calling one
|
||||
from Brolang requires an explicit unwrap:
|
||||
|
||||
```bro
|
||||
native :: import "../include/native.h"
|
||||
|
||||
double :: c_func(value c_int) c_int {
|
||||
return value + value
|
||||
}
|
||||
|
||||
call_mapper :: func(mapper native.Imported_Mapper) c_int {
|
||||
return mapper?(21)
|
||||
}
|
||||
```
|
||||
|
||||
Bodyless manual and imported C functions may be variadic:
|
||||
|
||||
```bro
|
||||
@@ -97,13 +124,14 @@ Current prototype features:
|
||||
- `#` comments
|
||||
- Immutable `::` bindings, mutable function-local `=` bindings, and `_` sinks
|
||||
- Exact-width signed/unsigned integers, `f32`, `f64`, `isize`, `usize`, and loose integer-constrained `int`
|
||||
- Target-dependent atomic `c_*` primitive types, `c_func`, and pointer-only `c_struct`
|
||||
- Target-dependent atomic `c_*` primitive types, `c_func`, and defined or opaque `c_struct`
|
||||
- Arrays, sentinel arrays, single-item pointers, many-item pointers, sentinel many-item pointers, slices, sentinel slices, strings, character literals, optionals, and native structs
|
||||
- String literals as immutable pointers to static zero-terminated byte arrays
|
||||
- Pointer-preserving `.ptr`/`.len`, pointer-to-array indexing and slicing, postfix pointer dereference and optional unwrap, and keyed struct literals
|
||||
- Contextual integer constants and compile-time folding of addition and unary negation trees
|
||||
- Directory packages with merged declarations and file-local relative imports
|
||||
- Relative C header imports as synthetic package namespaces
|
||||
- Plain imported C structs/unions, fixed arrays, and C function pointer typedefs, including keyed literals, field access, callbacks, and Apple Silicon by-value ABI lowering
|
||||
- Qualified imported globals and functions with package-aware symbol mangling
|
||||
- Demand-monomorphized Brolang and C-ABI functions
|
||||
- Bodyless concrete C function declarations with exact external symbol names
|
||||
|
||||
Reference in New Issue
Block a user