I believe that the backpatching before the and and or are wrong
This commit is contained in:
@ -617,6 +617,7 @@ compound_statement:
|
|||||||
emit_goto(*(int*)(S_Pop(stack)));
|
emit_goto(*(int*)(S_Pop(stack)));
|
||||||
emit_label(l);
|
emit_label(l);
|
||||||
}
|
}
|
||||||
|
// IF L_PAREN expression R_PAREN THEN sblock ELSE sblock
|
||||||
| IF L_PAREN {
|
| IF L_PAREN {
|
||||||
S_Push(TrueList, S_Init(), 0);
|
S_Push(TrueList, S_Init(), 0);
|
||||||
S_Push(FalseList, S_Init(), 0);
|
S_Push(FalseList, S_Init(), 0);
|
||||||
@ -680,7 +681,9 @@ simple_statement:
|
|||||||
} ASSIGN expression
|
} ASSIGN expression
|
||||||
{
|
{
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
emit_label(label_gen());
|
if ( getTypeEntry((TableNode*)$4) == boo ) {
|
||||||
|
emit_label(label_gen());
|
||||||
|
}
|
||||||
emit_backpatch(S_Pop(TrueList), getLabel(current));
|
emit_backpatch(S_Pop(TrueList), getLabel(current));
|
||||||
emit_backpatch(S_Pop(FalseList), getLabel(current));
|
emit_backpatch(S_Pop(FalseList), getLabel(current));
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@ -921,8 +924,8 @@ expression:
|
|||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
uint_least8_t b = 0;
|
uint_least8_t b = 0;
|
||||||
emit_assignment(node, tn_or_const(BOOLEAN,&b));
|
emit_assignment(node, tn_or_const(BOOLEAN,&b));
|
||||||
emit_label(label_gen());
|
// emit_label(label_gen());
|
||||||
emit_backpatch(S_Pop(TrueList), getLabel(current));
|
// emit_backpatch(S_Pop(TrueList), getLabel(current));
|
||||||
emit_conditional_jump(E_IF_X_FALSE, 0, tn_or_const(NODE, $1));
|
emit_conditional_jump(E_IF_X_FALSE, 0, tn_or_const(NODE, $1));
|
||||||
Stack * t1 = S_Peek(FalseList);
|
Stack * t1 = S_Peek(FalseList);
|
||||||
if(t1==NULL){
|
if(t1==NULL){
|
||||||
@ -974,8 +977,8 @@ expression:
|
|||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
uint_least8_t b = 1;
|
uint_least8_t b = 1;
|
||||||
emit_assignment(node, tn_or_const(BOOLEAN,&b));
|
emit_assignment(node, tn_or_const(BOOLEAN,&b));
|
||||||
emit_label(label_gen());
|
// emit_label(label_gen());
|
||||||
emit_backpatch(S_Pop(TrueList), getLabel(current));
|
// emit_backpatch(S_Pop(TrueList), getLabel(current));
|
||||||
emit_conditional_jump(E_IF_X_TRUE, 0, tn_or_const(NODE, $1));
|
emit_conditional_jump(E_IF_X_TRUE, 0, tn_or_const(NODE, $1));
|
||||||
Stack * t1 = S_Peek(TrueList);
|
Stack * t1 = S_Peek(TrueList);
|
||||||
if(t1==NULL){
|
if(t1==NULL){
|
||||||
|
@ -13,8 +13,8 @@ bar (r,s) := {
|
|||||||
|
|
||||||
entry (arg) := {
|
entry (arg) := {
|
||||||
[ integer: r ; integer: s; Boolean: x]
|
[ integer: r ; integer: s; Boolean: x]
|
||||||
x := (r < s) & x;
|
(* x := (r < s) & x; *)
|
||||||
if ( r < s ) then {
|
if ( ( r < s ) & (s = r) ) then {
|
||||||
r := 5;
|
r := 5;
|
||||||
} else {
|
} else {
|
||||||
r := 7;
|
r := 7;
|
||||||
|
Reference in New Issue
Block a user