stage1 部分功能测试00,01,02,06成功

This commit is contained in:
zzy
2026-07-05 18:23:33 +08:00
parent 50b07074fb
commit 51d8510b79
30 changed files with 4336 additions and 59 deletions

View File

@@ -8,6 +8,8 @@
*/
#include "spl_syscall.h"
#include "include/core_vec.h"
#include "spl_ir.h"
#include "spl_vm.h"
#include <stdio.h>
@@ -77,36 +79,36 @@
* OS syscalls
* ================================================================= */
/* os_exit — terminate process with the given exit code */
SYSCALL_1(os_exit, int, (exit(a1), (spl_val_t)0))
/* vm_exit — terminate process with the given exit code */
SYSCALL_1(vm_exit, int, (exit(a1), (spl_val_t)0))
/* os_putchar — write a single character to stdout */
SYSCALL_1(os_putchar, int, putchar(a1))
/* vm_putchar — write a single character to stdout */
SYSCALL_1(vm_putchar, int, putchar(a1))
/* os_getchar — read a single character from stdin */
SYSCALL_0(os_getchar, getchar())
/* vm_getchar — read a single character from stdin */
SYSCALL_0(vm_getchar, getchar())
/* os_putint — print an integer to stdout */
SYSCALL_1(os_putint, int, (fprintf(stdout, "%d", a1), (spl_val_t)0))
/* vm_putint — print an integer to stdout */
SYSCALL_1(vm_putint, int, (fprintf(stdout, "%d", a1), (spl_val_t)0))
/* os_putstr — print a string to stdout (no trailing newline) */
SYSCALL_1(os_putstr, const char *, (fputs(a1, stdout), (spl_val_t)0))
/* vm_putstr — print a string to stdout (no trailing newline) */
SYSCALL_1(vm_putstr, const char *, (fputs(a1, stdout), (spl_val_t)0))
/* os_fopen — open a file, returns FILE* as spl_val_t */
SYSCALL_2(os_fopen, const char *, const char *, (uintptr_t)fopen(a1, a2))
/* vm_fopen — open a file, returns FILE* as spl_val_t */
SYSCALL_2(vm_fopen, const char *, const char *, (uintptr_t)fopen(a1, a2))
/* os_fclose — close a file, returns 0 on success */
SYSCALL_1(os_fclose, FILE *, fclose(a1))
/* vm_fclose — close a file, returns 0 on success */
SYSCALL_1(vm_fclose, FILE *, fclose(a1))
/* os_fread — read from file, returns number of items read */
SYSCALL_4(os_fread, void *, size_t, size_t, FILE *, fread(a1, a2, a3, a4))
/* vm_fread — read from file, returns number of items read */
SYSCALL_4(vm_fread, void *, size_t, size_t, FILE *, fread(a1, a2, a3, a4))
/* os_fwrite — write to file, returns number of items written */
SYSCALL_4(os_fwrite, const void *, size_t, size_t, FILE *, fwrite(a1, a2, a3, a4))
/* vm_fwrite — write to file, returns number of items written */
SYSCALL_4(vm_fwrite, const void *, size_t, size_t, FILE *, fwrite(a1, a2, a3, a4))
/* os_fsize — get file size in bytes */
static spl_val_t os_fsize(int nargs, spl_val_t *args) {
CHECK_NARGS("os_fsize", 1);
/* vm_fsize — get file size in bytes */
static spl_val_t vm_fsize(int nargs, spl_val_t *args) {
CHECK_NARGS("vm_fsize", 1);
FILE *f = (FILE *)(uintptr_t)args[0];
long cur = ftell(f);
fseek(f, 0, SEEK_END);
@@ -115,9 +117,9 @@ static spl_val_t os_fsize(int nargs, spl_val_t *args) {
return (spl_val_t)(uintptr_t)sz;
}
/* os_read_file — read entire file into a malloc'd, null-terminated buffer */
static spl_val_t os_read_file(int nargs, spl_val_t *args) {
CHECK_NARGS("os_read_file", 1);
/* vm_read_file — read entire file into a malloc'd, null-terminated buffer */
static spl_val_t vm_read_file(int nargs, spl_val_t *args) {
CHECK_NARGS("vm_read_file", 1);
const char *path = (const char *)(uintptr_t)args[0];
FILE *f = fopen(path, "rb");
if (!f)
@@ -136,23 +138,74 @@ static spl_val_t os_read_file(int nargs, spl_val_t *args) {
return (spl_val_t)(uintptr_t)buf;
}
/* os_alloc — allocate memory (malloc) */
SYSCALL_1(os_alloc, size_t, (uintptr_t)malloc(a1))
/* vm_alloc — allocate memory (malloc) */
SYSCALL_1(vm_alloc, size_t, (uintptr_t)malloc(a1))
/* os_free — free memory */
SYSCALL_1(os_free, void *, (free(a1), (spl_val_t)0))
/* vm_free — free memory */
SYSCALL_1(vm_free, void *, (free(a1), (spl_val_t)0))
/* os_realloc — reallocate memory (realloc) */
SYSCALL_2(os_realloc, void *, size_t, (uintptr_t)realloc(a1, a2))
/* vm_realloc — reallocate memory (realloc) */
SYSCALL_2(vm_realloc, void *, size_t, (uintptr_t)realloc(a1, a2))
/* os_strlen — get string length */
SYSCALL_1(os_strlen, const char *, strlen(a1))
/* vm_strlen — get string length */
SYSCALL_1(vm_strlen, const char *, strlen(a1))
/* os_strcmp — compare two strings */
SYSCALL_2(os_strcmp, const char *, const char *, strcmp(a1, a2))
/* vm_strcmp — compare two strings */
SYSCALL_2(vm_strcmp, const char *, const char *, strcmp(a1, a2))
/* os_memcpy — copy memory, returns dst */
SYSCALL_3(os_memcpy, void *, const void *, size_t, (memcpy(a1, a2, a3), (uintptr_t)a1))
/* vm_memcpy — copy memory, returns dst */
SYSCALL_3(vm_memcpy, void *, const void *, size_t, (memcpy(a1, a2, a3), (uintptr_t)a1))
static spl_val_t vm_printf(int nargs, spl_val_t *args) {
(void)args;
if (nargs <= 0) {
return 0;
}
const char *fmt = (const char *)args[0];
usize fmt_len = strlen(fmt);
typedef VEC(char) string_builder_t;
string_builder_t buffer;
vec_init(buffer);
if (nargs <= 1) {
printf("%s", fmt);
return nargs;
}
int arg_idx = 0;
char tmp_buf[32];
memset(tmp_buf, 0, sizeof(tmp_buf));
for (int i = 0; i < fmt_len; ++i) {
if (fmt[i] != '%') {
vec_push(buffer, fmt[i]);
continue;
}
arg_idx += 1;
if (++i >= fmt_len) {
continue;
}
switch (fmt[i]) {
case 'd':
snprintf(tmp_buf, sizeof(tmp_buf), "%zd", args[arg_idx]);
for (int j = 0; j < strlen(tmp_buf); ++j) {
vec_push(buffer, tmp_buf[j]);
}
break;
case 'c':
vec_push(buffer, (char)args[arg_idx]);
break;
case 's':
for (int j = 0; j < strlen((const char *)args[arg_idx]); ++j) {
vec_push(buffer, ((const char *)args[arg_idx])[j]);
}
break;
default:
continue;
}
}
vec_push(buffer, '\0');
printf("%s", buffer.data);
vec_free(buffer);
return nargs;
}
/* =================================================================
* VM syscalls (for comptime — compile-time code execution)
@@ -287,23 +340,24 @@ SYSCALL_1(vm_run, spl_vm_t *, spl_vm_run_until(a1, 0))
void spl_syscall_register(spl_prog_t *prog) {
static spl_native_t table[] = {
/* OS operations */
{"os_exit", 0, os_exit},
{"os_putchar", 0, os_putchar},
{"os_getchar", 0, os_getchar},
{"os_putint", 0, os_putint},
{"os_putstr", 0, os_putstr},
{"os_fopen", 0, os_fopen},
{"os_fclose", 0, os_fclose},
{"os_fread", 0, os_fread},
{"os_fwrite", 0, os_fwrite},
{"os_fsize", 0, os_fsize},
{"os_read_file", 0, os_read_file},
{"os_alloc", 0, os_alloc},
{"os_free", 0, os_free},
{"os_realloc", 0, os_realloc},
{"os_strlen", 0, os_strlen},
{"os_strcmp", 0, os_strcmp},
{"os_memcpy", 0, os_memcpy},
{"vm_exit", 0, vm_exit},
{"vm_putchar", 0, vm_putchar},
{"vm_getchar", 0, vm_getchar},
{"vm_putint", 0, vm_putint},
{"vm_putstr", 0, vm_putstr},
{"vm_fopen", 0, vm_fopen},
{"vm_fclose", 0, vm_fclose},
{"vm_fread", 0, vm_fread},
{"vm_fwrite", 0, vm_fwrite},
{"vm_fsize", 0, vm_fsize},
{"vm_read_file", 0, vm_read_file},
{"vm_alloc", 0, vm_alloc},
{"vm_free", 0, vm_free},
{"vm_realloc", 0, vm_realloc},
{"vm_strlen", 0, vm_strlen},
{"vm_strcmp", 0, vm_strcmp},
{"vm_memcpy", 0, vm_memcpy},
{"vm_printf", 0, vm_printf},
/* VM operations (comptime) */
{"vm_new", 0, vm_new},
{"vm_drop", 0, vm_drop},