Commit: 8360f2ed65eaf71fcc5527d7b29abaa4b858f0cc
Parent: 9ef733de1af57e348cb63627f44b1fea0e135f9f
Author: Randy Palamar
Date: Mon, 11 May 2026 14:42:05 -0600
meta: fix element count when converting to base C type
In the output library header we only use base C types so we need
to generate arrays for compound types such as M4. This requires
multiplying in an element count.
Diffstat:
| M | build.c | | | 26 | ++++++++++++++------------ |
1 file changed, 14 insertions(+), 12 deletions(-)
diff --git a/build.c b/build.c
@@ -3228,6 +3228,7 @@ typedef struct {
MetaPushStructStyle union_style;
MetaPushStructStyle element_count_style;
str8 *base_types;
+ u8 *base_type_element_count_scales;
str8 prefix;
str8 suffix;
str8 str_element_prefix;
@@ -3303,19 +3304,17 @@ meta_push_struct_body(MetaContext *ctx, MetaprogramContext *m, MetaEntity *struc
u32 resolved_element_count = meta_struct_member_elements(ctx, s, member);
- if (p.union_style == MetaPushStructStyle_MATLAB) {
- if (type_reference) {
- MetaEntity *re = ctx->entities.data + type_id;
- MetaStruct *rs = ctx->struct_infos + re->table.struct_info_id;
- if (member_name.len == 0) {
- assert(rs->flags & MetaStructFlag_Union);
- member_name = s8("data");
- }
- if (rs->flags & MetaStructFlag_Union)
- resolved_element_count *= rs->byte_size;
- } else {
- resolved_element_count *= meta_kind_elements[type_id];
+ if (type_reference && p.union_style == MetaPushStructStyle_MATLAB) {
+ MetaEntity *re = ctx->entities.data + type_id;
+ MetaStruct *rs = ctx->struct_infos + re->table.struct_info_id;
+ if (member_name.len == 0) {
+ assert(rs->flags & MetaStructFlag_Union);
+ member_name = s8("data");
}
+ if (rs->flags & MetaStructFlag_Union)
+ resolved_element_count *= rs->byte_size;
+ } else if (!type_reference && p.base_type_element_count_scales) {
+ resolved_element_count *= p.base_type_element_count_scales[type_id];
}
if (resolved_element_count > 1 || p.element_count_style == MetaPushStructStyle_MATLAB) {
@@ -3409,6 +3408,7 @@ meta_push_matlab_properties(MetaprogramContext *m, MetaContext *ctx, MetaStruct
.base_types = meta_kind_matlab_types,
.suffix = str8(""),
.str_element_prefix = str8(MATLAB_NAMESPACE META_NAMESPACE_UPPER),
+ .base_type_element_count_scales = meta_kind_elements,
});
} meta_end_scope(m, s8("end"));
}
@@ -4301,6 +4301,7 @@ metagen_emit_helper_library_header(MetaContext *ctx, Arena arena)
.base_types = meta_kind_base_c_types,
.suffix = str8(";"),
.str_element_prefix = str8(META_NAMESPACE_UPPER),
+ .base_type_element_count_scales = meta_kind_elements,
});
} meta_end_scope(m, s8("} " META_NAMESPACE_UPPER), ctx->entity_names.data[ids[it]], s8(";\n"));
}break;
@@ -4345,6 +4346,7 @@ metagen_emit_helper_library_header(MetaContext *ctx, Arena arena)
.base_types = meta_kind_base_c_types,
.suffix = str8(";"),
.str_element_prefix = str8(META_NAMESPACE_UPPER),
+ .base_type_element_count_scales = meta_kind_elements,
});
} meta_end_scope(m, s8("} " META_NAMESPACE_UPPER), ctx->entity_names.data[ids[it]], s8(";\n"));
}break;