stage2 提供sys包装 解决stage1的bug

This commit is contained in:
zzy committed 2026-09-17 17:25:55 +08:00
1 parent 5de4937637
commit 1a6df012cd
5 files changed
+178 -29

No files matched your search

+22
View File
@@ -0,0 +1,22 @@
// Expect retcode = 6
// exit.spl
// usage: type exit = @import("exit.spl"); exit.ok();
#extern(vm) fn vm_exit(code: i32);
fn now(code: i32) {
vm_exit(code);
}
fn ok() {
vm_exit(0);
}
fn fail() {
vm_exit(1);
}
fn main(): void {
now(6);
}
+70
View File
@@ -0,0 +1,70 @@
#extern(vm) fn vm_fopen(path: *any, mode: *any): *any;
#extern(vm) fn vm_fclose(f: *any): i32;
#extern(vm) fn vm_fread(buf: *any, sz: usize, n: usize, f: *any): usize;
#extern(vm) fn vm_fwrite(buf: *any, sz: usize, n: usize, f: *any): usize;
#extern(vm) fn vm_fsize(f: *any): usize;
#extern(vm) fn vm_stdin(): *any;
#extern(vm) fn vm_stdout(): *any;
#extern(vm) fn vm_stderr(): *any;
#extern(vm) fn vm_putchar(c: i32): i32;
#extern(vm) fn vm_getchar(): i32;
handle: *any,
type File = @self;
fn stdin(): File { ret File { .handle = vm_stdin() }; }
fn stdout(): File { ret File { .handle = vm_stdout() }; }
fn stderr(): File { ret File { .handle = vm_stderr() }; }
fn open(path: *u8, mode: *u8): File {
ret File { .handle = vm_fopen(path as *any, mode as *any) };
}
fn valid(f: *File): bool {
ret f.handle != null;
}
fn write(f: *File, data: *u8, n: u64): u64 {
if f.handle == null { ret 0; }
ret vm_fwrite(data as *any, 1, n, f.handle);
}
fn write_byte(f: *File, b: u8): u64 {
var tmp: u8 = b;
ret write(f, &tmp, 1);
}
fn read(f: *File, buf: *u8, n: u64): u64 {
if f.handle == null { ret 0; }
ret vm_fread(buf as *any, 1, n, f.handle);
}
fn size(f: *File): u64 {
if f.handle == null { ret 0; }
ret vm_fsize(f.handle);
}
fn close(f: *File): i32 {
if f.handle == null { ret -1; }
var r = vm_fclose(f.handle);
f.handle = null;
ret r;
}
fn putchar(c: u8) {
vm_putchar(c as i32);
}
fn getchar(): i32 {
ret vm_getchar();
}
fn main(): void {
var out = stdout();
@assert(out.handle != null, "stdout");
var msg = "file: ok\n";
var n = write(&out, msg.ptr, msg.len);
@assert(n == msg.len, "write");
putchar(46 as u8);
putchar(10 as u8);
}
+79
View File
@@ -0,0 +1,79 @@
#extern(vm) fn vm_alloc(sz: usize): *any;
#extern(vm) fn vm_free(p: *any);
#extern(vm) fn vm_realloc(p: *any, sz: usize): *any;
#extern(vm) fn vm_memcpy(dst: *any, src: *any, n: usize): *any;
#extern(vm) fn vm_memcmp(a: *any, b: *any, n: usize): isize;
fn alloc(sz: usize): *any {
if sz == 0 { ret null; }
ret vm_alloc(sz);
}
fn free(p: *any) {
if p == null { ret; }
vm_free(p);
}
fn realloc(p: *any, sz: usize): *any {
if p == null { ret alloc(sz); }
if sz == 0 { free(p); ret null; }
ret vm_realloc(p, sz);
}
fn copy(dst: *any, src: *any, n: usize): *any {
if n == 0 { ret dst; }
ret vm_memcpy(dst, src, n);
}
fn cmp(a: *any, b: *any, n: usize): isize {
if n == 0 { ret 0; }
ret vm_memcmp(a, b, n);
}
fn set(dst: *any, byte: u8, n: usize): *any {
var d = dst as *u8;
var i: usize = 0;
while i < n {
d[i] = byte;
i = i + 1;
}
ret dst;
}
fn zero(dst: *any, n: usize): *any {
ret set(dst, 0 as u8, n);
}
fn main(): void {
var p = alloc(16);
@assert(p != null, "alloc");
var q = alloc(16);
@assert(p != q, "distinct");
@assert(alloc(0) == null, "alloc(0)");
var a: u8 = 42;
var b: u8 = 0;
copy(&b as *any, &a as *any, 1);
@assert(b == 42, "copy");
var x: u8 = 1;
var y: u8 = 2;
@assert(cmp(&x as *any, &y as *any, 1) < 0, "cmp lt");
@assert(cmp(&y as *any, &x as *any, 1) > 0, "cmp gt");
@assert(cmp(&x as *any, &x as *any, 1) == 0, "cmp eq");
var buf = alloc(8);
zero(buf, 8);
var bp = buf as *u8;
@assert(bp[0] == 0, "zero");
@assert(bp[7] == 0, "zero end");
set(buf, 0xAB as u8, 8);
@assert(bp[0] == 0xAB as u8, "set");
var r = realloc(p, 32);
@assert(r != null, "realloc");
free(r);
free(q);
free(buf);
free(null);
}