C and Rust profiles previously duplicated primitive definitions.
Interop.Contracts — Callback call shapes
Platform spec article
Interop.Contracts — Callback call shapes
Spec standingStandard
-
Abstract boundary vocabulary authority.
Context
Decision
This feature hub must own the language-agnostic Interop.Contracts vocabulary. Profile features must bind these primitives, not redefine them.
Consequences
Articles under C/Rust ABI cite ownership, call shapes, and conformance from here.
Verification anchors
/platform-spec/language-meta/interop/interop-contracts/
-
C ABI and Rust ABI profiles map Interop.Contracts.
Context
Authors need one abstract model with two concrete ABI bindings.
Decision
Interop.Contracts does not prescribe a single calling convention. C ABI profile and Rust ABI profile must bind symbols, layouts, linking, and unwind rules to these primitives.
Consequences
Syntax for
Externcontracts remains under FFI and extern; profiles add ABI tables.Verification anchors
/platform-spec/language-meta/interop/interop-contracts/ and profile hubs.
-
Forward compatibility rules for hosts claiming Interop.Contracts.
Context
Hosts and compilers need a shared compatibility story at boundaries.
Decision
This feature must specify symbol identity, type-shape classes, call-shape classes, ownership obligations, error/unwind semantics, and a conformance envelope (versioning and forward compatibility) for compatibility claims.
Consequences
ABI contract tests and
BESKID_RUNTIME_ABI_VERSIONalign to the envelope.Verification anchors
compiler/crates/beskid_tests/src/abi/contracts.rs; conformance and versioning.
- Interop.Contracts — Callback call shapes Function-pointer parameters and host registration tables for foreign re-entry (v0.3).
- Interop.Contracts — Conformance and versioning ABI version gates, forward compatibility, and how artifacts claim Interop.Contracts conformance.
- Interop.Contracts — Core primitives Symbol identity, type-shape classes, call-shape classes, and boundary invariants shared by all interop profiles.
- Interop.Contracts — Error and unwind semantics Divergence, traps, and cross-boundary panic policy for FFI (v0.3).
- Interop.Contracts — Language-agnostic mapping rules How Beskid declarations map to abstract call shapes and foreign symbols before any C- or Rust-specific lowering.
- Interop.Contracts — Ownership at the boundary Borrow, transfer, and opaque-handle rules for parameters on foreign call shapes (v0.3).
0 revisions (git unavailable at build; counts may be empty)
No commits recorded for this path.
| Section id | Required | Found |
|---|---|---|
what-this-feature-specifies | yes | yes |
implementation-anchors | yes | yes |
Full tree: run pnpm verify:platform-spec-layout (writes src/generated/platform-spec-layout-report.json).
Callback type-shape
Section titled “Callback type-shape”A callback is a function pointer plus optional userdata (i64 opaque address in v0.3.0) passed to foreign code. The pointed-to function must use Export or a trampoline symbol documented in callback registration.
Allowed callback signatures use the same primitive and interop-view types as import methods.
Re-entrancy
Section titled “Re-entrancy”When foreign code invokes a Beskid export or registered callback:
- The runtime must enter a documented runtime scope (TLS heap/root/session).
- Allocation on the Beskid side must follow normal GC rules.
- Panics must map to trap/abort across the boundary in v0.3 Standard unless a profile documents
C-unwindfor a specific runtime entrypoint.
Foreign threads invoking Beskid without a host contract are Proposed (v0.3.2+).
Import side: function-pointer parameters
Section titled “Import side: function-pointer parameters”Extern contract methods may declare parameters whose type is a function type with Export ABI in v0.3.0 when the parameter list uses only permitted FFI types. The compiler must verify that the referenced export exists or will be generated.
Tables vs single callbacks
Section titled “Tables vs single callbacks”Hosts may register multiple callbacks through a versioned registration table (see export feature). Interop.Contracts only requires that each slot normalize to a flat call shape and stable symbol or trampoline identity.