Phase 8b: modern names for the raw-memory and OS/IO primitives
Groups B and C of the leftover-primitive cleanup — renames, not new machinery,
and deliberately NO unsafe_ prefix (a __-prefix is itself a C convention, and an
`unsafe` marker carries no signal in a fully-manual-memory language with no safe
subset to contrast against).
memory: mem_free -> free mem_realloc -> resize mem_set -> fill
ptr_add -> offset
process: os_argc -> arg_count os_arg -> arg os_exit -> exit
os_system -> run os_getenv -> getenv read_byte -> read_char
dead: mem_copy, os_time, write_byte (0 uses) — deleted
Two reseeds: accept both old and new names in the intrinsic dispatch, then
migrate every call site and drop the old names. file_open/read/write/seek/tell/
close are left as-is — they're the domain-prefixed syscall layer wrapped by
read_file, not the argc/argv-style C-ness the audit targeted; a `File` type is a
separate, larger design if wanted.
test.sh's CLI smoke updated (os_exit -> exit); check-vocabulary's grammar marker
moved off the deleted names. Reseeded (22243 lines); C-free fixpoint holds;
goldens identical; 18/18; vocab + doc-fences clean.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
6f1ba2c214
commit
d3301684f1
19 changed files with 2468 additions and 2614 deletions
|
|
@ -5,9 +5,8 @@
|
|||
var g_windowed: bool = false # headless by default (games read stdin / dump PPM)
|
||||
|
||||
fn is_intrinsic2(name: ptr) -> bool {
|
||||
if (name == "mem_free") or (name == "mem_copy") or (name == "mem_set") { return true }
|
||||
if (name == "ptr_add") or (name == "read_byte") or (name == "write_byte") { return true }
|
||||
if (name == "os_time") { return true }
|
||||
if (name == "free") or (name == "fill") { return true }
|
||||
if (name == "offset") or (name == "read_char") { return true }
|
||||
if (name == "as_fixed") or (name == "as_int") { return true }
|
||||
if (name == "is_windowed") or (name == "game_title") { return true }
|
||||
if (name == "win_open") or (name == "win_poll") or (name == "win_present") { return true }
|
||||
|
|
@ -16,35 +15,22 @@ fn is_intrinsic2(name: ptr) -> bool {
|
|||
}
|
||||
|
||||
fn emit_intrinsic2(name: ptr, e: Node) -> Val {
|
||||
if (name == "mem_free") {
|
||||
if (name == "free") {
|
||||
let p = arg_code(e, 0); emit(" call void @free(ptr "); emit(p); emit(")\n"); return val("0", "void")
|
||||
}
|
||||
if (name == "mem_copy") {
|
||||
let d = arg_code(e, 0); let s = arg_code(e, 1); let n = arg_code(e, 2)
|
||||
let w = emit_bind(`zext i32 {n} to i64`)
|
||||
emit(" call ptr @memcpy(ptr "); emit(d); emit(", ptr "); emit(s); emit(", i64 "); emit(w); emit(")\n")
|
||||
return val("0", "void")
|
||||
}
|
||||
if (name == "mem_set") {
|
||||
if (name == "fill") {
|
||||
let p = arg_code(e, 0); let v = arg_code(e, 1); let n = arg_code(e, 2)
|
||||
let w = emit_bind(`zext i32 {n} to i64`)
|
||||
emit(" call ptr @memset(ptr "); emit(p); emit(", i32 "); emit(v); emit(", i64 "); emit(w); emit(")\n")
|
||||
return val("0", "void")
|
||||
}
|
||||
if (name == "ptr_add") {
|
||||
if (name == "offset") {
|
||||
let p = arg_code(e, 0); let n = arg_code(e, 1)
|
||||
let g = nreg()
|
||||
emit(" "); emit(g); emit(" = getelementptr inbounds i8, ptr "); emit(p); emit(", i32 "); emit(n); emit("\n")
|
||||
return val(g, "ptr")
|
||||
}
|
||||
if (name == "read_byte") { return val(emit_bind("call i32 @getchar()"), "int") }
|
||||
if (name == "write_byte") {
|
||||
let v = arg_code(e, 0); emit(" call i32 @putchar(i32 "); emit(v); emit(")\n"); return val("0", "void")
|
||||
}
|
||||
if (name == "os_time") {
|
||||
let r = emit_bind("call i64 @time(ptr null)")
|
||||
return val(emit_bind(`trunc i64 {r} to i32`), "int")
|
||||
}
|
||||
if (name == "read_char") { return val(emit_bind("call i32 @getchar()"), "int") }
|
||||
if (name == "as_fixed") { let a = emit_expr(e.kids[0]); return val(a.code, "fixed") }
|
||||
if (name == "as_int") { let a = emit_expr(e.kids[0]); return val(a.code, "int") }
|
||||
if (name == "is_windowed") { if g_windowed { return val("1", "bool") }; return val("0", "bool") }
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue