evaluate switch-expression on a different spot,
authorceriel <none@none>
Mon, 23 Jan 1989 15:37:57 +0000 (15:37 +0000)
committerceriel <none@none>
Mon, 23 Jan 1989 15:37:57 +0000 (15:37 +0000)
allow for *STRING expressions

lang/cem/cemcom/ch7mon.c
lang/cem/cemcom/eval.c
lang/cem/cemcom/switch.c
lang/cem/cemcom/switch.str

index a5a3ad1..cff0b80 100644 (file)
@@ -40,7 +40,7 @@ ch7mon(oper, expp)
                }
                else {
                        expr = *expp;
-                       if (expr->ex_lvalue == 0)
+                       if (expr->ex_lvalue == 0 && expr->ex_class != String)
                                /* dereference in administration only */
                                expr->ex_type = expr->ex_type->tp_up;
                        else    /* runtime code */
index 04264e1..aa32e84 100644 (file)
@@ -198,8 +198,12 @@ EVAL(expr, val, code, true_label, false_label)
                        }
                        break;
                case '*':
-                       if (left == 0) /* unary */
+                       if (left == 0) /* unary */
                                EVAL(right, RVAL, gencode, NO_LABEL, NO_LABEL);
+                               if (gencode && right->ex_class == String) {
+                                       C_loi((arith)1);
+                               }
+                       }
                        else { /* binary */
                                EVAL(left, RVAL, gencode, NO_LABEL, NO_LABEL);
                                EVAL(right, RVAL, gencode, NO_LABEL, NO_LABEL);
index bfc40ce..859766c 100644 (file)
@@ -79,10 +79,9 @@ code_startswitch(expp)
        sh->sh_type = (*expp)->ex_type; /* the expression switched      */
        sh->sh_lowerbd = sh->sh_upperbd = (arith)0;     /* immaterial ??? */
        sh->sh_entries = (struct case_entry *) 0; /* case-entry list    */
+       sh->sh_expr = *expp;
        sh->next = switch_stack;        /* push onto switch-stack       */
        switch_stack = sh;
-       /* evaluate the switch expr.    */
-       code_expr(*expp, RVAL, TRUE, NO_LABEL, NO_LABEL);
        C_bra(l_table);                 /* goto start of switch_table   */
 }
 
@@ -96,6 +95,8 @@ code_endswitch()
                sh->sh_default = sh->sh_break;
        C_bra(sh->sh_break);            /* skip the switch table now    */
        C_df_ilb(sh->sh_table);         /* switch table entry           */
+       /* evaluate the switch expr.    */
+       code_expr(sh->sh_expr, RVAL, TRUE, NO_LABEL, NO_LABEL);
        tablabel = data_label();        /* the rom must have a label    */
        C_df_dlb(tablabel);
        C_rom_ilb(sh->sh_default);
index 6442a39..a8c118f 100644 (file)
@@ -12,6 +12,7 @@ struct switch_hdr     {
        label sh_table;
        int sh_nrofentries;
        struct type *sh_type;
+       struct expr *sh_expr;
        arith sh_lowerbd;
        arith sh_upperbd;
        struct case_entry *sh_entries;