ffi M5.A.next.4.1: interp arms for reflection builtins on .type_tag
Second slice of the .type_tag activation. The reflection
intrinsics (`type_name`, `type_eq`, `has_impl`) now have
interp-time implementations that read `.type_tag` Values
directly. Today's lower-time fast path (folding to
`const_string`/`const_bool` when the type arg is statically
resolvable) stays — these interp arms are the fallback path
for when lowering emits a real `builtin_call` because the
arg is interp-time-only (e.g. `args[i]` inside a builder body
where the pack element is bound at interp execution).
Plumbing:
- New BuiltinId entries: `type_name`, `type_eq`, `has_impl`.
- Interp arms in `execBuiltinInner`:
- `type_name(t)`: reads `.type_tag` via `asTypeId`, looks up
via `module.types.typeName`, dupes the slice into the
interp allocator, returns `.string`. Non-`.type_tag` arg
→ `bailDetail` ("argument is not a Type value").
- `type_eq(a, b)`: both args must be `.type_tag`; compares
TypeIds. Either side missing → `bailDetail`.
- `has_impl(P, T)`: bails with a "not yet wired" message —
interp-time has_impl needs a queryable snapshot of the
host's `protocol_thunk_map` + `param_impl_map`, which is
its own follow-up slice. Static-arg has_impl still works
via the lower-time `tryConstBoolCondition` fast path.
- emit_llvm: explicit arms for the three new builtins that
log + map to undef-i64 (Type values are comptime-only; if
one of these reaches LLVM emit, lowering produced wrong
IR — the LLVM verifier downstream surfaces the offending
site).
Three new Zig unit tests in interp.test.zig:
- `type_name builtin on type_tag` — emits a `builtin_call`
to `type_name` with a `const_type(s64)` operand, asserts
the result is the string "s64".
- `type_eq builtin on type_tag values` — two equal Type
operands compare equal.
- (Pre-existing) `const_type yields type_tag` + `type_tag
comparison` from 4.0 still pass.
208/208 example tests + `zig build test` green. No source-
language path constructs `.type_tag` yet — the foundation is
ready for the `$args`-in-expression-position slice that
turns it on for users.
This commit is contained in:
@@ -367,6 +367,17 @@ pub const BuiltinId = enum(u16) {
|
||||
type_of,
|
||||
alloc,
|
||||
dealloc,
|
||||
// Comptime-only reflection builtins. Today's `tryLowerReflectionCall`
|
||||
// folds these at lower time when the type argument is statically
|
||||
// resolvable — emits a `const_string` / `const_bool` directly.
|
||||
// These BuiltinId entries are the FALLBACK path: when the arg is
|
||||
// a runtime/interp-time value (e.g. `args[i]` inside a builder
|
||||
// body, carrying a `.type_tag(TypeId)` only at interp execution),
|
||||
// lowering emits a `builtin_call` to one of these. The interp
|
||||
// implements them; emit_llvm bails (Type is comptime-only).
|
||||
type_name,
|
||||
type_eq,
|
||||
has_impl,
|
||||
};
|
||||
|
||||
pub const CompilerCall = struct {
|
||||
|
||||
Reference in New Issue
Block a user