C and Rust profiles previously duplicated primitive definitions.
Interop.Contracts — Error and unwind semantics
Platform spec article
Interop.Contracts — Error and unwind semantics
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).
Return-shape classes
Section titled “Return-shape classes”| Shape | Foreign expectation | Beskid mapping |
|---|---|---|
| Value | Normal C return | Primitive or interop view per profile |
| Unit | void | No return value |
| Never | Does not return | Never → trap/unwind per profile |
Errors as values
Section titled “Errors as values”Beskid Result types must not appear on FFI boundaries in v0.3.0. Authors map foreign error codes to Beskid Result after the call returns.
Panics and unwinding
Section titled “Panics and unwinding”Across user FFI and export boundaries in v0.3 Standard:
- Beskid panic must not rely on foreign callers catching Rust/Beskid unwinds.
- The default policy is abort or trap at the boundary.
- Runtime syscalls and selected runtime exports may use
extern "C-unwind"internally; that class is not implied for userExternor[Export]without an explicit future profile.
Foreign errors
Section titled “Foreign errors”Foreign functions that communicate failure via return codes or errno remain the caller’s responsibility to translate; the platform does not inject automatic errno threading in v0.3.