]> ocean-lang.org Git - ocean/commitdiff
oceani: move all array size calculation to prepare_type
authorNeilBrown <neil@brown.name>
Tue, 30 Nov 2021 22:52:47 +0000 (09:52 +1100)
committerNeilBrown <neil@brown.name>
Fri, 3 Dec 2021 08:12:49 +0000 (19:12 +1100)
This makes the code more uniform - array size and alignment is
only set in one place.

Signed-off-by: NeilBrown <neil@brown.name>
csrc/oceani.mdc

index 7371535bf7c555ec127028eb89f3113901be0561..282cd3054518430936cf0b82238db1a77e1d712d 100644 (file)
@@ -2228,16 +2228,22 @@ with a const size by whether they are prepared at parse time or not.
        {
                struct value *vsize;
                mpz_t q;
        {
                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;
                        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.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 ${ {
        } }$
 
        | [ IDENTIFIER ] Type ${ {