Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -982,6 +982,26 @@ jobs:
done
fi

# #8113 — the perry-ffi <-> perry-runtime ABI mirror, which had NEVER
# EXECUTED. `perry_ffi::types::layout_tests` is
# `#[cfg(all(test, feature = "runtime-link"))]`, `runtime-link` was
# enabled nowhere in `.github/`, and the scope loop above runs
# `cargo test -p perry-ffi` with DEFAULT features — so the module never
# even compiled. Deleting a mirrored field still went red (an `offset_of!`
# on a missing field stops compiling), but a SIZE or PADDING divergence
# between the two structs was invisible, which is precisely the failure
# mode of a header-layout change.
#
# Unconditional, not scope-gated: perry-ffi's optional dependency on
# perry-runtime means a runtime-only diff need not pull perry-ffi into
# scope, and this is the one check that says the published ABI mirror
# still matches the runtime it mirrors.
- name: perry-ffi ABI mirror matches the runtime (#8113)
env:
CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_RUSTFLAGS: "-C linker-features=-lld"
CARGO_PROFILE_TEST_DEBUG: "0"
run: cargo test -p perry-ffi --features runtime-link --lib

# ---------------------------------------------------------------------------
# Scoped e2e: run the integration suites NAMED BY THE DIFF (#5960)
#
Expand Down
2 changes: 1 addition & 1 deletion TYPE_LOWERING.md
Original file line number Diff line number Diff line change
Expand Up @@ -614,7 +614,7 @@ can bypass part of the generic NaN-boxing overhead:

### `ObjectHeader` Layout

Every heap object has: `object_type` (u32), `class_id` (u32), `field_count` (u32), `keys_array` pointer. Inline property slots follow immediately in memory.
Every heap object has: `class_id` (u32), `parent_class_id` (u32, which carries the runtime `ShapeId` once stamped), `keys_array` pointer, `meta` pointer — 24 bytes on LP64, 16 on ILP32. Inline property slots follow immediately in memory. (#8113 removed the `object_type` and `field_count` words: the receiver kind comes from `GcHeader.obj_type` plus the ShapeId descriptor's `object_kind`, and the live inline-slot bound from the same descriptor's `live_inline_slot_count`.)

- **Shape caching**: Objects with the same key set share a `keys_array` pointer.
- **`KEYS_INDEX`**: FNV-1a hash map built when `keys_array.length > 32` for O(1) lookup.
Expand Down
Loading
Loading