]> ocean-lang.org Git - ocean/blobdiff - csrc/oceani.mdc
oceani: discard AssignRef and DeclareRef
[ocean] / csrc / oceani.mdc
index 9d6aec94e566edb0e55de42ad7001aa5715b8d2f..543ca75a300a6ae740b19ccb15b9ff1d24a92a2a 100644 (file)
@@ -4774,8 +4774,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 =
@@ -4811,7 +4811,6 @@ be declared at any time.
 ###### print binode cases
 
        case Assign:
-       case AssignRef:
                do_indent(indent, "");
                print_exec(b->left, -1, bracket);
                printf(" = ");
@@ -4821,7 +4820,6 @@ be declared at any time.
                break;
 
        case Declare:
-       case DeclareRef:
                {
                struct variable *v = cast(var, b->left)->var;
                do_indent(indent, "");
@@ -4851,9 +4849,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.
@@ -4871,12 +4867,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))
@@ -4890,7 +4882,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) {
@@ -4912,21 +4904,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;
@@ -4936,8 +4920,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;