]> ocean-lang.org Git - ocean/blobdiff - csrc/oceani.mdc
oceani-tests: Add testing for --bracket printing.
[ocean] / csrc / oceani.mdc
index 3dbe0b19340f4a73fab60591bedc42768385e2cd..910d0953572c639ed76f985e764c0402eec8a482 100644 (file)
@@ -1157,7 +1157,7 @@ A separate function encoding these cases will simplify some code later.
        {
                int cmp;
                if (tl != tr)
-                       return tl - tr; // NOTEST
+                       return tl - tr;
                switch (tl->vtype) {
                case Vlabel: cmp = left->label == right->label ? 0 : 1; break;
                case Vnum: cmp = mpq_cmp(left->num, right->num); break;
@@ -2398,16 +2398,16 @@ with a const size by whether they are prepared at parse time or not.
                struct value *vsize;
                mpz_t q;
                if (type->array.static_size)
-                       return 1;       // UNTESTED
+                       return 1;       // NOTEST - guard against reentry
                if (type->array.unspec && parse_time)
-                       return 1;       // UNTESTED
+                       return 1;       // NOTEST - unspec is still incomplete
                if (parse_time && type->array.vsize && !type->array.vsize->global)
-                       return 1;       // UNTESTED
+                       return 1;       // NOTEST - should be impossible
 
                if (type->array.vsize) {
                        vsize = var_value(c, type->array.vsize);
                        if (!vsize)
-                               return 1;       // UNTESTED
+                               return 1;       // NOTEST - should be impossible
                        mpz_init(q);
                        mpz_tdiv_q(q, mpq_numref(vsize->num), mpq_denref(vsize->num));
                        type->array.size = mpz_get_si(q);
@@ -2416,7 +2416,7 @@ with a const size by whether they are prepared at parse time or not.
                if (!parse_time)
                        return 1;
                if (type->array.member->size <= 0)
-                       return 0;       // UNTESTED
+                       return 0;       // NOTEST - error caught before here
 
                type->array.static_size = 1;
                type->size = type->array.size * type->array.member->size;
@@ -2470,13 +2470,13 @@ with a const size by whether they are prepared at parse time or not.
                        return 0;
                if (have->array.unspec && require->array.unspec &&
                    have->array.size != require->array.size)
-                       return 0;       // UNTESTED
+                       return 0;       // NOTEST
                if (have->array.unspec || require->array.unspec)
                        return 1;
                if (require->array.vsize == NULL && have->array.vsize == NULL)
                        return require->array.size == have->array.size;
 
-               return require->array.vsize == have->array.vsize;       // UNTESTED
+               return require->array.vsize == have->array.vsize;
        }
 
        static void array_print_type(struct type *type, FILE *f)
@@ -2969,10 +2969,17 @@ function will be needed.
        | SimpleFieldList EOL ${ $0 = $<SFL; }$
 
        FieldLines -> SimpleFieldList Newlines ${ $0 = $<SFL; }$
-       | FieldLines SimpleFieldList Newlines ${
-               $SFL->prev = $<FL;
-               $0 = $<SFL;
-       }$
+       | FieldLines SimpleFieldList Newlines ${ {
+               struct fieldlist *f = $<SFL;
+
+               if (f) {
+                       $0 = f;
+                       while (f->prev)
+                               f = f->prev;
+                       f->prev = $<FL;
+               } else
+                       $0 = $<FL;
+       } }$
 
        SimpleFieldList -> Field ${ $0 = $<F; }$
        | SimpleFieldList ; Field ${
@@ -3380,7 +3387,7 @@ anything in the heap or on the stack.  A reference can be assigned
        case AddressOf:
                /* left must be lval, we create reference to it */
                if (!type || type->free != reference_free)
-                       t = propagate_types(b->left, c, perr, type, 0); // UNTESTED
+                       t = propagate_types(b->left, c, perr, type, 0); // NOTEST impossible
                else
                        t = propagate_types(b->left, c, perr,
                                            type->reference.referent, 0);
@@ -3545,6 +3552,7 @@ further detailed when Expression Lists are introduced.
 
        static void function_print(struct type *type, struct value *val, FILE *f)
        {
+               fprintf(f, "\n");
                print_exec(val->function, 1, 0);
        }
 
@@ -3578,7 +3586,6 @@ further detailed when Expression Lists are introduced.
                        } else
                                type_print(type->function.return_type, f);
                }
-               fprintf(f, "\n");
        }
 
        static void function_free_type(struct type *t)
@@ -4306,9 +4313,10 @@ parentheses around an expression converts it into a Term,
                if (bracket) printf(")");
                break;
        case Bracket:
-               printf("(");
+               /* Avoid double brackets... */
+               if (!bracket) printf("(");
                print_exec(b->right, indent, bracket);
-               printf(")");
+               if (!bracket) printf(")");
                break;
 
 ###### propagate binode cases
@@ -4546,7 +4554,8 @@ the common header for all reductions to use.
        Block -> { IN OptNL Statementlist OUT OptNL } ${ $0 = $<Sl; }$
        |        { SimpleStatements } ${ $0 = reorder_bilist($<SS); }$
        |        SimpleStatements ; ${ $0 = reorder_bilist($<SS); }$
-       |        SimpleStatements EOL ${ $0 = reorder_bilist($<SS); }$
+       |        SimpleStatements EOL ${ $0 = reorder_bilist($<SS); 
+               }$
        |        IN OptNL Statementlist OUT ${ $0 = $<Sl; }$
 
        OpenBlock -> OpenScope { IN OptNL Statementlist OUT OptNL } ${ $0 = $<Sl; }$
@@ -4555,7 +4564,7 @@ the common header for all reductions to use.
        |        OpenScope SimpleStatements EOL ${ $0 = reorder_bilist($<SS); }$
        |        IN OpenScope OptNL Statementlist OUT ${ $0 = $<Sl; }$
 
-       UseBlock -> { OpenScope IN OptNL Statementlist OUT OptNL } ${ $0 = $<Sl; }$
+       UseBlock -> { IN OpenScope OptNL Statementlist OUT OptNL } ${ $0 = $<Sl; }$
        |        { OpenScope SimpleStatements } ${ $0 = reorder_bilist($<SS); }$
        |        IN OpenScope OptNL Statementlist OUT ${ $0 = $<Sl; }$
 
@@ -4569,7 +4578,7 @@ the common header for all reductions to use.
 
        ComplexStatements -> ComplexStatements ComplexStatement ${
                if ($2 == NULL) {
-                       $0 = $<1;
+                       $0 = $<1;       // NOTEST - impossible
                } else {
                        $0 = new(binode);
                        $0->op = Block;
@@ -4579,7 +4588,7 @@ the common header for all reductions to use.
        }$
        | ComplexStatement ${
                if ($1 == NULL) {
-                       $0 = NULL;
+                       $0 = NULL;      // NOTEST - impossible
                } else {
                        $0 = new(binode);
                        $0->op = Block;
@@ -4766,8 +4775,8 @@ it is declared, it is assumed to be a global constant which are allowed to
 be declared at any time.
 
 ###### Binode types
-       Assign, AssignRef,
-       Declare, DeclareRef,
+       Assign,
+       Declare,
 
 ###### declare terminals
        $TERM =
@@ -4803,7 +4812,6 @@ be declared at any time.
 ###### print binode cases
 
        case Assign:
-       case AssignRef:
                do_indent(indent, "");
                print_exec(b->left, -1, bracket);
                printf(" = ");
@@ -4813,7 +4821,6 @@ be declared at any time.
                break;
 
        case Declare:
-       case DeclareRef:
                {
                struct variable *v = cast(var, b->left)->var;
                do_indent(indent, "");
@@ -4843,9 +4850,7 @@ be declared at any time.
 ###### propagate binode cases
 
        case Assign:
-       case AssignRef:
        case Declare:
-       case DeclareRef:
                /* Both must match, or left may be ref and right an lval
                 * Type must support 'dup',
                 * For Assign, left must not be constant.
@@ -4863,12 +4868,8 @@ be declared at any time.
                                ; // No more effort needed
                        else if (t->free == reference_free &&
                                 t->reference.referent == t2 &&
-                                !(*perr_local & Erval)) {
-                               if (b->op == Assign)
-                                       b->op = AssignRef;
-                               if (b->op == Declare)
-                                       b->op = DeclareRef;
-                       }
+                                !(*perr_local & Erval))
+                               b->right = take_addr(b->right);
                        else if (t->free == reference_free &&
                                 t->reference.referent == t2 &&
                                 (*perr_local & Erval))
@@ -4882,7 +4883,7 @@ be declared at any time.
                if (*perr & Erval)
                        type_err(c, "error: cannot assign to an rval", b,
                                 NULL, 0, NULL);
-               else if ((b->op == Assign || b->op == AssignRef) && (*perr & Econst)) {
+               else if (b->op == Assign && (*perr & Econst)) {
                        type_err(c, "error: Cannot assign to a constant: %v",
                                 b->left, NULL, 0, NULL);
                        if (b->left->type == Xvar) {
@@ -4904,21 +4905,13 @@ be declared at any time.
 ###### interp binode cases
 
        case Assign:
-       case AssignRef:
                lleft = linterp_exec(c, b->left, &ltype);
-               if (!lleft)
-                       // FIXME lleft==NULL probably means illegal array ref
-                       // should that cause a runtime error
-                       ;
-               else if (b->op == AssignRef)
-                       lleft->ref = linterp_exec(c, b->right, &rtype);
-               else
+               if (lleft)
                        dinterp_exec(c, b->right, lleft, ltype, 1);
                ltype = Tnone;
                break;
 
        case Declare:
-       case DeclareRef:
        {
                struct variable *v = cast(var, b->left)->var;
                struct value *val;
@@ -4928,8 +4921,6 @@ be declared at any time.
                        v->type->prepare_type(c, v->type, 0);
                if (!b->right)
                        val_init(v->type, val);
-               else if (b->op == DeclareRef)
-                       val->ref = linterp_exec(c, b->right, &rtype);
                else
                        dinterp_exec(c, b->right, val, v->type, 0);
                break;
@@ -5812,10 +5803,13 @@ is a bit more interesting at this level.
                                struct value *val = var_value(&context, v);
                                printf("func %.*s", v->name->name.len, v->name->name.txt);
                                v->type->print_type_decl(v->type, stdout);
-                               if (brackets)
-                                       print_exec(val->function, 0, brackets);
-                               else
+                               if (brackets) {
+                                       printf(" {\n");
+                                       print_exec(val->function, 1, brackets);
+                                       printf("}\n");
+                               } else {
                                        print_value(v->type, val, stdout);
+                               }
                                printf("/* frame size %d */\n", v->type->function.local_size);
                                target -= 1;
                        }