X-Git-Url: https://ocean-lang.org/code/?p=ocean;a=blobdiff_plain;f=csrc%2Foceani.mdc;fp=csrc%2Foceani.mdc;h=543ca75a300a6ae740b19ccb15b9ff1d24a92a2a;hp=9d6aec94e566edb0e55de42ad7001aa5715b8d2f;hb=c1571dc004d832a6656664e814c238deb0f00513;hpb=631d5279eef7fe755d9df27ce16b416ba976154b diff --git a/csrc/oceani.mdc b/csrc/oceani.mdc index 9d6aec9..543ca75 100644 --- a/csrc/oceani.mdc +++ b/csrc/oceani.mdc @@ -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, <ype); - 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;