stage1 支持更多语法 修复更多问题 暂时stage1功能结束
This commit is contained in:
1 parent
54425a50c7
commit
acfbbeee8b
11 files changed
+802
-183
No files matched your search
+20
-4
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user