stage2 修复大量AI生成的风格问题 stage1 修复对于vm abi的错误生成
This commit is contained in:
1 parent
0e38858785
commit
76f980654c
40 files changed
+619
-938
No files matched your search
+25
-42
@@ -1,8 +1,7 @@
|
||||
// Expect retcode = 0
|
||||
|
||||
// splc1 (stage2 自举编译器入口)。
|
||||
// 当前实现 `--dump <lex|ast|sema|ir|vm> <file> [out]`:读取源文件,按与 stage1
|
||||
// splc0 完全一致的格式打印各阶段产物,供 diff 测试逐字节比对。
|
||||
// splc1:自举编译器入口。`splc1 <in> <out>` 编译;`--dump <mode> <file>` 打印各阶段
|
||||
// 产物,格式必须与 splc0 逐字节一致以通过 diff。
|
||||
|
||||
type .{ .ByteView } = @import("./utils/byte_view.spl");
|
||||
type .{ .ByteBuffer } = @import("./utils/byte_buffer.spl");
|
||||
@@ -13,8 +12,7 @@ type Ast = @import("./ast.spl");
|
||||
type Parser = @import("./parser.spl");
|
||||
type Sema = @import("./sema.spl");
|
||||
type .{ .append_usize } = @import("./utils/fmt.spl");
|
||||
type .{ .read_all, .print, .eprint, .open_cstr, .write_all } = @import("./utils/io.spl");
|
||||
type File = @import("./sys/file.spl");
|
||||
type .{ .read_all, .print, .eprint, .open_cstr, .write_all, .File } = @import("./utils/io.spl");
|
||||
type .{ .Sources, .Source, .set_new, .set_add, .set_at, .set_drop } = @import("./utils/source.spl");
|
||||
type .{ .Diag, .Code, .span_none } = @import("./diag.spl");
|
||||
type Logger = @import("./utils/log.spl");
|
||||
@@ -27,7 +25,7 @@ type .{ .Layout } = @import("./layout.spl");
|
||||
type Ir2VmM = @import("./ir2vm.spl");
|
||||
type .{ .Ir2Vm } = @import("./ir2vm.spl");
|
||||
type Ir2CM = @import("./ir2c.spl");
|
||||
type .{ .alloc, .free } = @import("./sys/mem.spl");
|
||||
type .{ .alloc, .free } = @import("./utils/memory.spl");
|
||||
|
||||
fn token_at(tokens: *Vec, index: usize): Token {
|
||||
match Vec.get(tokens, index) {
|
||||
@@ -131,14 +129,11 @@ fn dump_lex(log: *Logger, path: ByteView): i32 {
|
||||
}
|
||||
defer { Vec.drop(&tokens); }
|
||||
|
||||
// 非法输入:走诊断(stage1 在此处是宽容无视,stage2 显式报错)。
|
||||
// 非法输入:走诊断(显式报错,不静默)。
|
||||
if Diag.has_error(diag) {
|
||||
var rendered = ByteBuffer.new();
|
||||
defer { ByteBuffer.drop(&rendered); }
|
||||
match Diag.render_human(&diag, &rendered) {
|
||||
.Ok => {},
|
||||
.Err(error) => {},
|
||||
}
|
||||
Diag.render_human(&diag, &rendered);
|
||||
eprint(ByteBuffer.as_slice(rendered));
|
||||
ret 1;
|
||||
}
|
||||
@@ -200,10 +195,7 @@ fn dump_ast(log: *Logger, path: ByteView): i32 {
|
||||
if Diag.has_error(diag) || p.failed {
|
||||
var rendered = ByteBuffer.new();
|
||||
defer { ByteBuffer.drop(&rendered); }
|
||||
match Diag.render_human(&diag, &rendered) {
|
||||
.Ok => {},
|
||||
.Err(error) => {},
|
||||
}
|
||||
Diag.render_human(&diag, &rendered);
|
||||
eprint(ByteBuffer.as_slice(rendered));
|
||||
ret 1;
|
||||
}
|
||||
@@ -221,7 +213,6 @@ fn dump_ast(log: *Logger, path: ByteView): i32 {
|
||||
ret 0;
|
||||
}
|
||||
|
||||
// ---- @import 模块加载器(driver 侧)----
|
||||
|
||||
type ModEntry = struct {
|
||||
path: ByteView,
|
||||
@@ -236,7 +227,6 @@ type LoaderCtx = struct {
|
||||
diag: *Diag,
|
||||
}
|
||||
|
||||
fn ignore_bool(b: bool) {}
|
||||
|
||||
fn append_bytes(buf: *ByteBuffer, bytes: []u8): bool {
|
||||
match ByteBuffer.append(buf, bytes) {
|
||||
@@ -263,7 +253,7 @@ fn sub(p: ByteView, a: usize, b: usize): []u8 {
|
||||
fn normalize_pop(out: *ByteBuffer) {
|
||||
var cur = ByteBuffer.as_slice(out.*);
|
||||
if cur.len == 0 {
|
||||
ignore_bool(append_bytes(out, ".."));
|
||||
append_bytes(out, "..");
|
||||
ret;
|
||||
}
|
||||
var end = cur.len;
|
||||
@@ -274,7 +264,7 @@ fn normalize_pop(out: *ByteBuffer) {
|
||||
var start = end;
|
||||
while start > 0 && cur.ptr[start - 1] != '/' { start = start - 1; }
|
||||
if end - start == 2 && cur.ptr[start] == '.' && cur.ptr[start + 1] == '.' {
|
||||
ignore_bool(append_bytes(out, ".."));
|
||||
append_bytes(out, "..");
|
||||
ret;
|
||||
}
|
||||
var new_len: usize = 0;
|
||||
@@ -286,7 +276,7 @@ fn normalize_pop(out: *ByteBuffer) {
|
||||
// 折叠重复分隔符、解析 "." 与 ".."、'\' 统一成 '/'。
|
||||
fn normalize_into(out: *ByteBuffer, p: ByteView) {
|
||||
if p.len > 0 && (p.ptr[0] == '/' || p.ptr[0] == '\\') {
|
||||
ignore_bool(append_byte(out, '/'));
|
||||
append_byte(out, '/');
|
||||
}
|
||||
var i: usize = 0;
|
||||
while i < p.len {
|
||||
@@ -302,9 +292,9 @@ fn normalize_into(out: *ByteBuffer, p: ByteView) {
|
||||
}
|
||||
var cur = ByteBuffer.as_slice(out.*);
|
||||
if cur.len > 0 && cur.ptr[cur.len - 1] != '/' {
|
||||
ignore_bool(append_byte(out, '/'));
|
||||
append_byte(out, '/');
|
||||
}
|
||||
ignore_bool(append_bytes(out, seg));
|
||||
append_bytes(out, seg);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -325,9 +315,9 @@ fn resolve_path(from: ByteView, path: ByteView): ByteBuffer {
|
||||
i = i + 1;
|
||||
}
|
||||
if last >= 0 {
|
||||
ignore_bool(append_bytes(&out, sub(from, 0, (last as usize) + 1)));
|
||||
append_bytes(&out, sub(from, 0, (last as usize) + 1));
|
||||
}
|
||||
ignore_bool(append_bytes(&out, ByteView.as_slice(path)));
|
||||
append_bytes(&out, ByteView.as_slice(path));
|
||||
var norm = ByteBuffer.new();
|
||||
normalize_into(&norm, ByteView.from_slice(ByteBuffer.as_slice(out)));
|
||||
ByteBuffer.drop(&out);
|
||||
@@ -504,10 +494,7 @@ fn dump_sema(log: *Logger, path: ByteView): i32 {
|
||||
if Diag.has_error(diag) || p.failed {
|
||||
var rendered = ByteBuffer.new();
|
||||
defer { ByteBuffer.drop(&rendered); }
|
||||
match Diag.render_human(&diag, &rendered) {
|
||||
.Ok => {},
|
||||
.Err(error) => {},
|
||||
}
|
||||
Diag.render_human(&diag, &rendered);
|
||||
eprint(ByteBuffer.as_slice(rendered));
|
||||
ret 1;
|
||||
}
|
||||
@@ -538,10 +525,7 @@ fn dump_sema(log: *Logger, path: ByteView): i32 {
|
||||
if Diag.has_error(diag) {
|
||||
var rendered = ByteBuffer.new();
|
||||
defer { ByteBuffer.drop(&rendered); }
|
||||
match Diag.render_human(&diag, &rendered) {
|
||||
.Ok => {},
|
||||
.Err(error) => {},
|
||||
}
|
||||
Diag.render_human(&diag, &rendered);
|
||||
eprint(ByteBuffer.as_slice(rendered));
|
||||
ret 1;
|
||||
}
|
||||
@@ -573,7 +557,7 @@ type PipeMode = enum {
|
||||
|
||||
fn step(mode: PipeMode, s: []u8) {
|
||||
if @enum2int(mode) == @enum2int(PipeMode.State) {
|
||||
match eprint(s) { .Ok => {}, .Err(error) => {} }
|
||||
eprint(s);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -631,7 +615,7 @@ fn run_pipeline(log: *Logger, path: ByteView, mode: PipeMode, outpath: ByteView)
|
||||
if Diag.has_error(diag) || p.failed {
|
||||
var rendered = ByteBuffer.new();
|
||||
defer { ByteBuffer.drop(&rendered); }
|
||||
match Diag.render_human(&diag, &rendered) { .Ok => {}, .Err(error) => {} }
|
||||
Diag.render_human(&diag, &rendered);
|
||||
eprint(ByteBuffer.as_slice(rendered));
|
||||
ret 1;
|
||||
}
|
||||
@@ -662,7 +646,7 @@ fn run_pipeline(log: *Logger, path: ByteView, mode: PipeMode, outpath: ByteView)
|
||||
if Diag.has_error(diag) {
|
||||
var rendered = ByteBuffer.new();
|
||||
defer { ByteBuffer.drop(&rendered); }
|
||||
match Diag.render_human(&diag, &rendered) { .Ok => {}, .Err(error) => {} }
|
||||
Diag.render_human(&diag, &rendered);
|
||||
eprint(ByteBuffer.as_slice(rendered));
|
||||
ret 1;
|
||||
}
|
||||
@@ -677,13 +661,13 @@ fn run_pipeline(log: *Logger, path: ByteView, mode: PipeMode, outpath: ByteView)
|
||||
var asts = Vec.blank(@sizeof(usize), @alignof(usize));
|
||||
defer { Vec.drop(&asts); }
|
||||
var ap: *Ast = *
|
||||
match Vec.push(&asts, &ap as *u8) { .Ok => {}, .Err(error) => {} }
|
||||
Vec.push(&asts, &ap as *u8);
|
||||
var mi: usize = 0;
|
||||
while mi < ctx.mods.len {
|
||||
var m = mod_at(&ctx, mi);
|
||||
if m != null && m.ok && m.ast != null {
|
||||
var mp: *Ast = m.ast;
|
||||
match Vec.push(&asts, &mp as *u8) { .Ok => {}, .Err(error) => {} }
|
||||
Vec.push(&asts, &mp as *u8);
|
||||
}
|
||||
mi = mi + 1;
|
||||
}
|
||||
@@ -692,7 +676,7 @@ fn run_pipeline(log: *Logger, path: ByteView, mode: PipeMode, outpath: ByteView)
|
||||
if Diag.has_error(diag) {
|
||||
var rendered = ByteBuffer.new();
|
||||
defer { ByteBuffer.drop(&rendered); }
|
||||
match Diag.render_human(&diag, &rendered) { .Ok => {}, .Err(error) => {} }
|
||||
Diag.render_human(&diag, &rendered);
|
||||
eprint(ByteBuffer.as_slice(rendered));
|
||||
ret 1;
|
||||
}
|
||||
@@ -736,8 +720,8 @@ fn run_pipeline(log: *Logger, path: ByteView, mode: PipeMode, outpath: ByteView)
|
||||
Logger.error(log, "cannot open C output file");
|
||||
ret 1;
|
||||
}
|
||||
match write_all(&f, ByteBuffer.as_slice(cout)) { .Ok => {}, .Err(error) => {} }
|
||||
ignore_i32(File.close(&f));
|
||||
write_all(&f, ByteBuffer.as_slice(cout));
|
||||
File.close(&f);
|
||||
} else {
|
||||
match print(ByteBuffer.as_slice(cout)) {
|
||||
.Ok => {},
|
||||
@@ -754,7 +738,7 @@ fn run_pipeline(log: *Logger, path: ByteView, mode: PipeMode, outpath: ByteView)
|
||||
var ir2vm: Ir2Vm = undefined;
|
||||
Ir2VmM.init(&ir2vm, &builder.ir, &sema.types.ir, &layout, &sema.attr);
|
||||
defer { Ir2VmM.drop(&ir2vm); }
|
||||
ignore_i32(Ir2VmM.run(&ir2vm));
|
||||
Ir2VmM.run(&ir2vm);
|
||||
step(mode, "state: ir2vm ok\n");
|
||||
|
||||
if @enum2int(mode) == @enum2int(PipeMode.Vm) {
|
||||
@@ -782,7 +766,6 @@ fn run_pipeline(log: *Logger, path: ByteView, mode: PipeMode, outpath: ByteView)
|
||||
ret 0;
|
||||
}
|
||||
|
||||
fn ignore_i32(v: i32) {}
|
||||
|
||||
fn main(argc: i32, argv: **u8): i32 {
|
||||
// 无参数:自测运行(`nob test stage2`)视为成功。
|
||||
|
||||
Reference in new issue
Block a user