stage1 修复vm 提供简单参数检查 修复聚合类型bug

This commit is contained in:
zzy
2026-07-14 22:30:19 +08:00
parent f7f71c5f52
commit ab63c8ed90
7 changed files with 367 additions and 32 deletions

View File

@@ -8,6 +8,133 @@ type Pair = struct {
b: i32,
}
type Three = struct {
a: i64,
b: i64,
c: i64,
}
type Tag = enum {
Unknown,
BlockComment,
LineComment,
Ident,
Number,
}
type Token = struct {
loc_start: i32,
loc_end: i32,
tag: Tag,
}
fn make_three(a: i64, b: i64, c: i64) Three {
ret Three { .a = a, .b = b, .c = c };
}
fn sum_three(t: Three) i64 {
ret t.a + t.b + t.c;
}
fn make_token(s: i32, e: i32, t: Tag) Token {
ret Token { .loc_start = s, .loc_end = e, .tag = t };
}
fn test_ret_enum_struct() i32 {
var tok := make_token(10, 20, Tag.BlockComment);
if tok.loc_start != 10 { ret 1; }
if tok.loc_end != 20 { ret 2; }
if tok.tag != Tag.BlockComment { ret 3; }
ret 0;
}
fn test_nested_ret_enum() i32 {
var tok := make_token(1, 5, Tag.Ident);
if tok.tag != Tag.Ident { ret 1; }
var tok2 := make_token(6, 9, Tag.Number);
if tok2.tag != Tag.Number { ret 2; }
if tok.tag != Tag.Ident { ret 3; }
ret 0;
}
fn test_copy_token() i32 {
var tok := make_token(0, 100, Tag.LineComment);
var c := tok;
if c.loc_start != 0 { ret 1; }
if c.tag != Tag.LineComment { ret 2; }
c.tag = Tag.Ident;
if tok.tag != Tag.LineComment { ret 3; }
if c.tag != Tag.Ident { ret 4; }
ret 0;
}
fn test_pass_token(t: Token) i32 {
if t.tag != Tag.Number { ret 1; }
if t.loc_start != 42 { ret 2; }
ret 0;
}
fn test_param_pass_token() i32 {
var tok := make_token(42, 99, Tag.Number);
var r := test_pass_token(tok);
if r != 0 { ret r; }
ret 0;
}
fn test_get_tag(tok: Token) i32 {
ret tok.tag;
}
fn test_chain_func_call() i32 {
var tok := make_token(1, 2, Tag.BlockComment);
var tg := test_get_tag(tok);
if tg != Tag.BlockComment { ret 1; }
var tok2 := make_token(3, 4, Tag.LineComment);
var tg2 := test_get_tag(tok2);
if tg2 != Tag.LineComment { ret 2; }
ret 0;
}
fn test_ret_multi_slot_struct() i32 {
var t := make_three(10, 20, 30);
if t.a != 10 { ret 1; }
if t.b != 20 { ret 2; }
if t.c != 30 { ret 3; }
ret 0;
}
fn test_pass_struct_by_value() i32 {
var t := make_three(10, 20, 30);
var sum := sum_three(t);
if sum != 60 { ret 1; }
ret 0;
}
fn test_copy_struct() i32 {
var t := make_three(10, 20, 30);
var t2: Three;
t2 = t;
if t2.a != 10 { ret 1; }
t2.a = 99;
if t.a != 10 { ret 2; }
if t2.a != 99 { ret 3; }
ret 0;
}
fn test_multi_calls() i32 {
var ta := make_three(5, 10, 15);
var tb := make_three(20, 25, 30);
if ta.a + ta.b + ta.c != 30 { ret 1; }
if tb.a + tb.b + tb.c != 75 { ret 2; }
ret 0;
}
fn test_literal_arg() i32 {
var sum := sum_three(Three { .a = 7, .b = 8, .c = 9 });
if sum != 24 { ret 1; }
ret 0;
}
fn main() i32 {
/* struct 字段访问 */
var p: Pair;
@@ -60,5 +187,29 @@ fn main() i32 {
if o.inner.val != 42 { ret 7; }
if o.extra != 58 { ret 8; }
/* 多 slot 结构体返回值测试 */
var r9 := test_ret_multi_slot_struct();
if r9 != 0 { ret 100; }
var r10 := test_pass_struct_by_value();
if r10 != 0 { ret 101; }
var r11 := test_copy_struct();
if r11 != 0 { ret 102; }
var r12 := test_multi_calls();
if r12 != 0 { ret 103; }
var r13 := test_literal_arg();
if r13 != 0 { ret 104; }
/* 含 enum 字段的结构体返回值测试 */
var r14 := test_ret_enum_struct();
if r14 != 0 { ret 110; }
var r15 := test_nested_ret_enum();
if r15 != 0 { ret 111; }
var r16 := test_copy_token();
if r16 != 0 { ret 112; }
var r17 := test_param_pass_token();
if r17 != 0 { ret 113; }
var r18 := test_chain_func_call();
if r18 != 0 { ret 114; }
ret 0;
}