summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormrb0nk500 <b0nk@b0nk.xyz>2022-08-09 11:08:57 -0300
committermrb0nk500 <b0nk@b0nk.xyz>2022-08-09 11:32:22 -0300
commite6e6699b22f6a8a067277f6d8875adf8edbf67ea (patch)
tree367789f39524e32e22380ad8c3c935fc1738cfac
parent95b4a2eff9f5d56254b42a94c2e3ee4a4dfff3d5 (diff)
rt_struct: Account for member pointers in `create_rts()`
-rw-r--r--rt_struct.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/rt_struct.c b/rt_struct.c
index 314407c..34556ca 100644
--- a/rt_struct.c
+++ b/rt_struct.c
@@ -7,6 +7,10 @@ static int is_root_type(rts_type_tag tag) {
return tag != TAG_STRUCT && tag != TAG_UNION;
}
+static int member_is_ptr(rts_member_type type) {
+ return type >= MBR_PTR && type <= MBR_PTR_ARRAY_NULL;
+}
+
int create_rts(rts_type *type) {
if (type == NULL) {
return 1;
@@ -24,11 +28,12 @@ int create_rts(rts_type *type) {
size_t remainder = 0;
size_t padding = 0;
rts_member **members = type->members;
+
for (int i = 0; members[i] != NULL; ++i) {
- rts_type *member_type = members[i]->type;
- if (create_rts(member_type)) {
+ if (create_rts(members[i]->type)) {
return 1;
} else {
+ const rts_type *member_type = (member_is_ptr(members[i]->mbr_type)) ? &RTS_TYPE_POINTER : members[i]->type;
const size_t align = member_type->alignment;
max_align = max(max_align, align);
if (type->tag == TAG_STRUCT) {