stage1 支持更多语法 修复更多问题 暂时stage1功能结束

This commit is contained in:
zzy committed 2026-09-17 13:37:59 +08:00
1 parent 54425a50c7
commit acfbbeee8b
11 files changed
+802 -183

No files matched your search

+20 -4
View File
@@ -24,13 +24,17 @@ static usize ir_type_size(spl_ir2vm_t *ctx, spl_type_id_t tid) {
return ir_type_size(ctx, tn->array_type.element) * tn->array_type.len;
case SPL_TYPE_ENUM: {
usize tag_sz = ir_type_size(ctx, tn->agg_type.tag_type);
usize max_payload = 0;
usize payload_align = 1;
usize payload_size = 0;
for (usize i = 0; i < vec_size(tn->agg_type.variants); ++i) {
usize vs = ir_type_size(ctx, vec_at(tn->agg_type.variants, i).type_id);
if (vs > max_payload)
max_payload = vs;
if (vs > payload_align)
payload_align = vs;
if (vs > payload_size)
payload_size = vs;
}
return align_up(tag_sz, 8) + max_payload;
usize payload_off = align_up(tag_sz, payload_align);
return align_up(payload_off + payload_size, payload_align);
}
case SPL_TYPE_STRUCT:
case SPL_TYPE_UNION: {
@@ -102,6 +106,18 @@ static usize ir_agg_field_off(spl_ir2vm_t *ctx, spl_type_id_t tid, usize idx) {
}
if (tn->kind == SPL_TYPE_ARRAY)
return idx * ir_type_size(ctx, tn->array_type.element);
if (tn->kind == SPL_TYPE_ENUM) {
if (idx == 0)
return 0;
usize tag_sz = ir_type_size(ctx, tn->agg_type.tag_type);
usize payload_align = 1;
for (usize i = 0; i < vec_size(tn->agg_type.variants); ++i) {
usize vs = ir_type_size(ctx, vec_at(tn->agg_type.variants, i).type_id);
if (vs > payload_align)
payload_align = vs;
}
return align_up(tag_sz, payload_align);
}
return 0;
}