The plan for the pointer arm cimport already promised

This commit is contained in:
Joseph Ferano 2026-09-14 08:06:20 +07:00
parent c9bb12e591
commit bb2a9b202b

View File

@ -0,0 +1,47 @@
# Handoff — the pointer arm `agrees` already promised
`lib/cimport.ml`'s `agrees` decides whether a hand-written `declare-c` and the C header
say the same thing. Its comment has always listed three differences that are "expected and
are not reported"; the code implements two of them. The missing one — *a `(Ptr T)` where
the header says `T *`* — is what `../PORTING.md` §A.1 and §A.2 ran into, and it is why
`GetCodepointPrevious` cannot be bound honestly and why `UpdateTexture` has to be handed
`(addr (.r (at (slice-from-ptr pixels n) 0)))`.
This file is the running record of building that arm.
## The plan
1. A `ptr_agrees` beside `agrees`, consulted only at the two `declare-c` sites in
`diff_bound`, where the C spelling is still in hand. `agrees` itself is left alone:
`check_structs` uses it for field *widths*, and loosening it there is the hazard the
check exists to catch.
2. Breadth, decided rather than fallen into — see "What it accepts" below.
3. Rewrite the comment at `lib/cimport.ml:1291` so it describes the code instead of
promising it, and take the rotting binding count out of it.
4. Use it: `get-codepoint-previous-raw` in `vendor/raylib/raylib.flan`, and the
`(Ptr Color)` binding for `UpdateTexture`. Delete both workarounds.
5. `docs/PORTING.md` §A.1 and §A.2 annotated closed in the file's existing style.
## What it accepts (to be confirmed as it is built)
- `(Ptr T)` against a C `T *` for the same `T`.
- `(Ptr u8)` against `char *` — a byte is a byte, and the two spellings of one are not a
width disagreement. Scoped to the pointee, never to `agrees` at large.
- `(Ptr T)` for any `T` against `void *`. `value_ty` already *invents* `(Ptr u8)` for a
`void *`, so the check as it stands enforces cimport's own guess as if the header had
said it.
- `const` does not enter into it, because a non-const `char *` parameter makes `param_ty`
refuse and `diff_bound` skips a parameter it cannot render at all.
## What it still refuses
- `(Ptr A)` against `B *` for different named `A` and `B`.
- Anything that is not a pointer on the Flan side against a C pointer, and the reverse.
## Status
- [ ] the arm
- [ ] the comment
- [ ] tests, positive and negative
- [ ] the two raylib bindings
- [ ] PORTING.md