stage1 支持聚合类型方法
This commit is contained in:
1 parent
9bdb7f892e
commit
5073c2b3ea
10 files changed
+387
-148
No files matched your search
+33
-1
@@ -130,6 +130,39 @@ static usize round_up_bits(usize x, usize align_bits) {
|
||||
|
||||
static bool layout_agg(spl_layout_t *layout, spl_type_node_t *tn, spl_layout_info_t *out) {
|
||||
usize n = vec_size(tn->agg_type.variants);
|
||||
|
||||
if (tn->kind == SPL_TYPE_ENUM) {
|
||||
spl_type_id_t tag_tid = tn->agg_type.tag_type;
|
||||
if (!tag_tid)
|
||||
return false;
|
||||
spl_layout_info_t *tag_info = infos_at(layout, tag_tid);
|
||||
if (!tag_info || !tag_info->resolved)
|
||||
return false;
|
||||
|
||||
usize tag_align_bits = tag_info->align_bits ? tag_info->align_bits : 8;
|
||||
usize payload_align_bits = 8;
|
||||
usize payload_size_bits = 0;
|
||||
|
||||
for (usize i = 0; i < n; ++i) {
|
||||
spl_type_member_t *m = &vec_at(tn->agg_type.variants, i);
|
||||
spl_layout_info_t *fi = infos_at(layout, m->type_id);
|
||||
if (!fi || !fi->resolved)
|
||||
return false;
|
||||
usize fa = fi->align_bits ? fi->align_bits : 8;
|
||||
if (fa > payload_align_bits)
|
||||
payload_align_bits = fa;
|
||||
if (fi->size_bits > payload_size_bits)
|
||||
payload_size_bits = fi->size_bits;
|
||||
}
|
||||
|
||||
usize payload_off = round_up_bits(tag_info->size_bits, payload_align_bits);
|
||||
usize final_align_bits =
|
||||
tag_align_bits > payload_align_bits ? tag_align_bits : payload_align_bits;
|
||||
out->size_bits = round_up_bits(payload_off + payload_size_bits, final_align_bits);
|
||||
out->align_bits = final_align_bits;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (n == 0) {
|
||||
out->size_bits = 0;
|
||||
out->align_bits = 8;
|
||||
@@ -163,7 +196,6 @@ static bool layout_agg(spl_layout_t *layout, spl_type_node_t *tn, spl_layout_inf
|
||||
max_align_bits = field_align_bits;
|
||||
}
|
||||
|
||||
/* 聚合对齐策略 */
|
||||
usize final_align_bits = max_align_bits;
|
||||
if (layout->aggregate.align_rule == ALIGN_FIXED) {
|
||||
final_align_bits = layout->aggregate.fixed_align * 8;
|
||||
|
||||
Reference in new issue
Block a user