1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2026-04-20 16:16:34 +00:00

More robust stack depth checking and var parsing

This commit is contained in:
David Schmenk
2017-12-24 20:35:39 -08:00
parent 70ba7d0e0e
commit 7843bc41ce
5 changed files with 774 additions and 619 deletions
+66 -36
View File
@@ -623,42 +623,15 @@ def emit_pending_seq#0
if not pending_seq; return; fin
lcl_pending = pending_seq
pending_seq = NULL
//if outflags & OPTIMIZE
// while crunch_seq(@lcl_pending, 0); loop
// while crunch_seq(@lcl_pending, 1); loop
//fin
if outflags & OPTIMIZE
while crunch_seq(@lcl_pending, 0); loop
if outflags & OPTIMIZE2
while crunch_seq(@lcl_pending, 1); loop
fin
fin
while lcl_pending
op = lcl_pending
when op->code
is NEG_CODE
is COMP_CODE
is LOGIC_NOT_CODE
is INC_CODE
is DEC_CODE
is BPTR_CODE
is WPTR_CODE
emit_unaryop(op->code)
break
is MUL_CODE
is DIV_CODE
is MOD_CODE
is ADD_CODE
is SUB_CODE
is SHL_CODE
is SHR_CODE
is AND_CODE
is OR_CODE
is EOR_CODE
is EQ_CODE
is NE_CODE
is GE_CODE
is LT_CODE
is GT_CODE
is LE_CODE
is LOGIC_OR_CODE
is LOGIC_AND_CODE
emit_op(op->code)
break
is CONST_CODE
emit_const(op=>val)
break
@@ -755,6 +728,63 @@ def emit_pending_seq#0
is CODETAG_CODE
printf("_B%03d%c\n", op->tag, LBL);
break;
is NEG_CODE
is COMP_CODE
is LOGIC_NOT_CODE
is INC_CODE
is DEC_CODE
is BPTR_CODE
is WPTR_CODE
emit_unaryop(op->code)
break
is MUL_CODE
is DIV_CODE
is MOD_CODE
is ADD_CODE
is SUB_CODE
is SHL_CODE
is SHR_CODE
is AND_CODE
is OR_CODE
is EOR_CODE
is EQ_CODE
is NE_CODE
is GE_CODE
is LT_CODE
is GT_CODE
is LE_CODE
is LOGIC_OR_CODE
is LOGIC_AND_CODE
emit_op(op->code)
break
is MUL_CODE
is DIV_CODE
is MOD_CODE
is ADD_CODE
is SUB_CODE
is SHL_CODE
is SHR_CODE
is AND_CODE
is OR_CODE
is EOR_CODE
is EQ_CODE
is NE_CODE
is GE_CODE
is LT_CODE
is GT_CODE
is LE_CODE
is LOGIC_OR_CODE
is LOGIC_AND_CODE
emit_op(op->code)
break
is NEG_CODE
is COMP_CODE
is LOGIC_NOT_CODE
is INC_CODE
is DEC_CODE
is BPTR_CODE
is WPTR_CODE
emit_unaryop(op->code)
is NOP_CODE
break
otherwise
@@ -774,10 +804,10 @@ end
def emit_seq(seq)#0
word op
byte string
string = 0
string = FALSE
op = seq
while op
if op->code == STR_CODE; string = 1; fin
if op->code == STR_CODE; string = TRUE; break; fin
op = op=>nextop
loop
pending_seq = cat_seq(pending_seq, seq)
@@ -788,6 +818,6 @@ def emit_seq(seq)#0
//
// We must also force output if the sequence includes a CS opcode, as the
// associated 'constant' is only temporarily valid.
if !(outflags & OPTIMIZE) or (outflags & NO_COMBINE) or string
if !(outflags & (OPTIMIZE|OPTIMIZE2)) or (outflags & NO_COMBINE) or string
emit_pending_seq
end