The refusal was about teardown, and an arena has none
This commit is contained in:
parent
9e80147527
commit
d0d94a05f6
35
FIX.org
35
FIX.org
@ -54,15 +54,38 @@ whatever locals already do; no new borrow regime for globals that locals lack.
|
|||||||
|
|
||||||
[embed] (lib/check.ml:4265) still covers build-time data and is untouched.
|
[embed] (lib/check.ml:4265) still covers build-time data and is untouched.
|
||||||
|
|
||||||
** 4. edn both typed and dynamic — QUEUED behind 3
|
** 4. edn both typed and dynamic — REDIRECTED to arenas, drop parked
|
||||||
Two projects, not one. (read-edn T bytes) does not exist — vendor/edn/edn.flan
|
Two projects, not one. (read-edn T bytes) does not exist — vendor/edn/edn.flan
|
||||||
is only a tokenizer, and the compile-time struct walk is NEXT.md item 9.
|
is only a tokenizer, and the compile-time struct walk is NEXT.md item 9.
|
||||||
|
|
||||||
The dynamic half is blocked: a dynamic EDN value is recursive, so it is a Vec
|
[drop] was dispatched to unblock the dynamic half and is being PARKED unmerged
|
||||||
whose element is move-only, which lib/check.ml:599 refuses and whose refusal
|
on its branch, not reverted, because the premise was wrong. The refusal at
|
||||||
names [drop] as the fix. So [drop] gets unstashed — it now has the customer
|
check.ml:599 is about *teardown*, not ownership: the type-erased runtime
|
||||||
NEXT.md:225 said it lacked. Full spec-memory.md:338 scope: recursive teardown
|
releases slots bytewise and cannot walk a move-only element. An arena never
|
||||||
AND the hook. Queued behind 3 because both land in check.ml.
|
releases a slot — [free-all] takes the whole region — so the premise does not
|
||||||
|
hold there.
|
||||||
|
|
||||||
|
That is also what Odin does, which NEXT.md:1620 already recorded: no
|
||||||
|
destructors, no drop, no finalizers; [delete] frees container memory and
|
||||||
|
nothing else. core:encoding/json ships a hand-written recursive
|
||||||
|
[destroy_value] in the *library*, and the idiomatic alternative is to parse
|
||||||
|
against temp_allocator and [free_all]. Neither is a language feature. Building
|
||||||
|
[drop] was a departure from NEXT.md:1589's settled "defer stays the answer",
|
||||||
|
taken on the assistant's prompting and withdrawn.
|
||||||
|
|
||||||
|
So: lift check.ml:599 for arena-allocated containers, and let read-edn take an
|
||||||
|
allocator — which is already the idiom, since spec-memory.md:283 makes the
|
||||||
|
allocator part of the calling convention with an explicit override.
|
||||||
|
|
||||||
|
The real cost, stated because it is not free: [can-free] is a RUNTIME
|
||||||
|
capability on the allocator value while check.ml:599 is a COMPILE-TIME refusal,
|
||||||
|
and the compiler cannot generally know statically that a construction site's
|
||||||
|
allocator is an arena. The spec's answer for the analogous drop case is a check
|
||||||
|
at the point of construction, one branch per container — a runtime branch. This
|
||||||
|
likely becomes a runtime trap rather than a static guarantee.
|
||||||
|
|
||||||
|
Ownership tracking itself is untouched. Moves are still tracked; what is given
|
||||||
|
up is freeing one element individually, which is the point of an arena.
|
||||||
|
|
||||||
** 5. defenum autoincrement — DISPATCHED
|
** 5. defenum autoincrement — DISPATCHED
|
||||||
C's rule: no value means previous+1, the first is 0, explicit and implicit mix.
|
C's rule: no value means previous+1, the first is 0, explicit and implicit mix.
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user