evaluate switch-expression on a different spot,
allow for *STRING expressions
This commit is contained in:
parent
11843b44a1
commit
cc55ab947d
4 changed files with 10 additions and 4 deletions
|
@ -40,7 +40,7 @@ ch7mon(oper, expp)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
expr = *expp;
|
expr = *expp;
|
||||||
if (expr->ex_lvalue == 0)
|
if (expr->ex_lvalue == 0 && expr->ex_class != String)
|
||||||
/* dereference in administration only */
|
/* dereference in administration only */
|
||||||
expr->ex_type = expr->ex_type->tp_up;
|
expr->ex_type = expr->ex_type->tp_up;
|
||||||
else /* runtime code */
|
else /* runtime code */
|
||||||
|
|
|
@ -198,8 +198,12 @@ EVAL(expr, val, code, true_label, false_label)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case '*':
|
case '*':
|
||||||
if (left == 0) /* unary */
|
if (left == 0) { /* unary */
|
||||||
EVAL(right, RVAL, gencode, NO_LABEL, NO_LABEL);
|
EVAL(right, RVAL, gencode, NO_LABEL, NO_LABEL);
|
||||||
|
if (gencode && right->ex_class == String) {
|
||||||
|
C_loi((arith)1);
|
||||||
|
}
|
||||||
|
}
|
||||||
else { /* binary */
|
else { /* binary */
|
||||||
EVAL(left, RVAL, gencode, NO_LABEL, NO_LABEL);
|
EVAL(left, RVAL, gencode, NO_LABEL, NO_LABEL);
|
||||||
EVAL(right, RVAL, gencode, NO_LABEL, NO_LABEL);
|
EVAL(right, RVAL, gencode, NO_LABEL, NO_LABEL);
|
||||||
|
|
|
@ -79,10 +79,9 @@ code_startswitch(expp)
|
||||||
sh->sh_type = (*expp)->ex_type; /* the expression switched */
|
sh->sh_type = (*expp)->ex_type; /* the expression switched */
|
||||||
sh->sh_lowerbd = sh->sh_upperbd = (arith)0; /* immaterial ??? */
|
sh->sh_lowerbd = sh->sh_upperbd = (arith)0; /* immaterial ??? */
|
||||||
sh->sh_entries = (struct case_entry *) 0; /* case-entry list */
|
sh->sh_entries = (struct case_entry *) 0; /* case-entry list */
|
||||||
|
sh->sh_expr = *expp;
|
||||||
sh->next = switch_stack; /* push onto switch-stack */
|
sh->next = switch_stack; /* push onto switch-stack */
|
||||||
switch_stack = sh;
|
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 */
|
C_bra(l_table); /* goto start of switch_table */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,6 +95,8 @@ code_endswitch()
|
||||||
sh->sh_default = sh->sh_break;
|
sh->sh_default = sh->sh_break;
|
||||||
C_bra(sh->sh_break); /* skip the switch table now */
|
C_bra(sh->sh_break); /* skip the switch table now */
|
||||||
C_df_ilb(sh->sh_table); /* switch table entry */
|
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 */
|
tablabel = data_label(); /* the rom must have a label */
|
||||||
C_df_dlb(tablabel);
|
C_df_dlb(tablabel);
|
||||||
C_rom_ilb(sh->sh_default);
|
C_rom_ilb(sh->sh_default);
|
||||||
|
|
|
@ -12,6 +12,7 @@ struct switch_hdr {
|
||||||
label sh_table;
|
label sh_table;
|
||||||
int sh_nrofentries;
|
int sh_nrofentries;
|
||||||
struct type *sh_type;
|
struct type *sh_type;
|
||||||
|
struct expr *sh_expr;
|
||||||
arith sh_lowerbd;
|
arith sh_lowerbd;
|
||||||
arith sh_upperbd;
|
arith sh_upperbd;
|
||||||
struct case_entry *sh_entries;
|
struct case_entry *sh_entries;
|
||||||
|
|
Loading…
Reference in a new issue