summaryrefslogtreecommitdiff
path: root/copy.c
diff options
context:
space:
mode:
Diffstat (limited to 'copy.c')
-rw-r--r--copy.c32
1 files changed, 17 insertions, 15 deletions
diff --git a/copy.c b/copy.c
index e57dc51..a68b6e5 100644
--- a/copy.c
+++ b/copy.c
@@ -90,22 +90,30 @@ static void copy_val_full(Copier *c, Value *out, Value in, Type *t) {
static void copy_struct(Copier *c, StructDef *out, StructDef *in) {
*out = *in;
- size_t nfields = arr_len(in->fields);
- out->fields = NULL;
-
out->scope = in->scope;
idents_create(&out->scope.idents, c->allocr, &out->scope);
Block *prev = c->block;
copy_block(c, &out->scope, &in->scope, 0);
c->block = &out->scope;
+ if (in->flags & STRUCT_DEF_RESOLVED) {
+ size_t nfields = arr_len(in->fields);
+ out->fields = NULL;
- arr_set_lena(&out->fields, nfields, c->allocr);
- for (size_t i = 0; i < nfields; ++i) {
- Field *fout = &out->fields[i];
- Field *fin = &in->fields[i];
- *fout = *fin;
- copy_type(c, &fout->type, &fin->type);
+ arr_set_lena(&out->fields, nfields, c->allocr);
+ for (size_t i = 0; i < nfields; ++i) {
+ Field *fout = &out->fields[i];
+ Field *fin = &in->fields[i];
+ *fout = *fin;
+ fout->type = copy_type_(c, fin->type);
+ }
+ out->constants = NULL;
+ size_t nconstants = arr_len(in->constants);
+ arr_set_lena(&out->constants, nconstants, c->allocr);
+ for (size_t i = 0; i < nconstants; ++i) {
+ copy_decl(c, out->constants[i] = allocr_malloc(c->allocr, sizeof *out->constants[i]),
+ in->constants[i]);
+ }
}
size_t nparams = arr_len(in->params);
out->params = NULL;
@@ -113,12 +121,6 @@ static void copy_struct(Copier *c, StructDef *out, StructDef *in) {
for (size_t i = 0; i < nparams; ++i) {
copy_decl(c, &out->params[i], &in->params[i]);
}
- out->constants = NULL;
- size_t nconstants = arr_len(in->constants);
- arr_set_lena(&out->constants, nconstants, c->allocr);
- for (size_t i = 0; i < nconstants; ++i) {
- copy_decl(c, &out->constants[i], &in->constants[i]);
- }
c->block = prev;
}