From: NeilBrown Date: Tue, 30 Nov 2021 22:52:47 +0000 (+1100) Subject: oceani: move all array size calculation to prepare_type X-Git-Url: https://ocean-lang.org/code/?p=ocean;a=commitdiff_plain;h=36e687aa5a84b52dc4add6ae2dc5f7abe71e3e2d oceani: move all array size calculation to prepare_type This makes the code more uniform - array size and alignment is only set in one place. Signed-off-by: NeilBrown --- diff --git a/csrc/oceani.mdc b/csrc/oceani.mdc index 7371535..282cd30 100644 --- a/csrc/oceani.mdc +++ b/csrc/oceani.mdc @@ -2228,16 +2228,22 @@ with a const size by whether they are prepared at parse time or not. { struct value *vsize; mpz_t q; - if (!type->array.vsize || type->array.static_size) - return; + if (type->array.static_size) + return; // NOTEST + if (type->array.unspec && parse_time) + return; // NOTEST - vsize = var_value(c, type->array.vsize); - mpz_init(q); - mpz_tdiv_q(q, mpq_numref(vsize->num), mpq_denref(vsize->num)); - type->array.size = mpz_get_si(q); - mpz_clear(q); + if (type->array.vsize) { + vsize = var_value(c, type->array.vsize); + if (!vsize) + return; // NOTEST + mpz_init(q); + mpz_tdiv_q(q, mpq_numref(vsize->num), mpq_denref(vsize->num)); + type->array.size = mpz_get_si(q); + mpz_clear(q); + } - if (parse_time) { + if (parse_time && type->array.member->size) { type->array.static_size = 1; type->size = type->array.size * type->array.member->size; type->align = type->array.member->align; @@ -2356,9 +2362,6 @@ with a const size by whether they are prepared at parse time or not. t->array.size = elements; t->array.member = $<4; t->array.vsize = NULL; - t->array.static_size = 1; - t->size = t->array.size * t->array.member->size; - t->align = t->array.member->align; } }$ | [ IDENTIFIER ] Type ${ {