aboutsummaryrefslogtreecommitdiff
path: root/src/ast.c
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2025-01-11 00:52:21 +0200
committerKimplul <kimi.h.kuparinen@gmail.com>2025-01-11 00:52:21 +0200
commit2d8d5ffaee9701955828413f844afa1b3767f748 (patch)
tree0eab7acec6f06b3a4da61a8207dace8524810652 /src/ast.c
parent2d90cea9adb9a3f73cd5b211a4ed9508b505729f (diff)
downloadek-2d8d5ffaee9701955828413f844afa1b3767f748.tar.gz
ek-2d8d5ffaee9701955828413f844afa1b3767f748.zip
futher struct continuation work
Diffstat (limited to 'src/ast.c')
-rw-r--r--src/ast.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/src/ast.c b/src/ast.c
index 024cebf..0571c12 100644
--- a/src/ast.c
+++ b/src/ast.c
@@ -699,7 +699,9 @@ static size_t struct_size(struct type *t)
return (size_t)t->size;
size_t size = 0;
- foreach_node(n, struct_body(t->d)) {
+
+ struct ast *base = chain_base(t->d);
+ foreach_node(n, struct_body(base)) {
if (n->k != AST_VAR_DEF)
continue;
@@ -734,7 +736,8 @@ size_t type_offsetof(struct type *t, char *m)
assert(t->k == TYPE_STRUCT);
size_t offset = 0;
- foreach_node(n, struct_body(t->d)) {
+ struct ast *base = chain_base(t->d);
+ foreach_node(n, struct_body(base)) {
if (n->k != AST_VAR_DEF)
continue;
@@ -784,3 +787,18 @@ struct ast *chain_base(struct ast *node)
return node;
}
+
+struct ast *clone_chain(struct ast *chain)
+{
+ if (!chain)
+ return NULL;
+
+ struct ast *new = clone_ast(chain);
+ if (!new)
+ return NULL;
+
+ if (chain->chain)
+ new->chain = clone_chain(chain->chain);
+
+ return new;
+}