summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormrb0nk500 <b0nk@b0nk.xyz>2022-08-09 11:13:22 -0300
committermrb0nk500 <b0nk@b0nk.xyz>2022-08-09 11:32:22 -0300
commit2fbace4c5dc21a4d59b14f4451de68dacd8271a4 (patch)
tree468e342bdec7e4c132a9ef2ba7807209755693cd
parente6e6699b22f6a8a067277f6d8875adf8edbf67ea (diff)
rt_struct: Account for member arrays in `create_rts()`
Now, when the member is a fixed array, we multiply the type size by the size of each dimension.
-rw-r--r--rt_struct.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/rt_struct.c b/rt_struct.c
index 34556ca..4117def 100644
--- a/rt_struct.c
+++ b/rt_struct.c
@@ -11,6 +11,21 @@ static int member_is_ptr(rts_member_type type) {
return type >= MBR_PTR && type <= MBR_PTR_ARRAY_NULL;
}
+static int member_is_fixed_array(rts_member_type type) {
+ return type == MBR_ARRAY || type == MBR_PTR_ARRAY;
+}
+
+static size_t member_size(rts_member *member) {
+ const rts_type *type = (member_is_ptr(member->mbr_type)) ? &RTS_TYPE_POINTER : member->type;
+ size_t size = type->size;
+ if (member_is_fixed_array(member->mbr_type)) {
+ for (int i = 0; i < member->dim_count && member->dim_sizes[i]; ++i) {
+ size *= member->dim_sizes[i];
+ }
+ }
+ return size;
+}
+
int create_rts(rts_type *type) {
if (type == NULL) {
return 1;
@@ -41,7 +56,7 @@ int create_rts(rts_type *type) {
padding = (remainder) ? align - remainder : 0;
offset += padding;
type->offsets[i] = offset;
- offset += member_type->size;
+ offset += member_size(members[i]);
}
}
}