fix creeping over dealloc, even it requires duplicating some code
This commit is contained in:
parent
97feeda48a
commit
8c7c258492
34
C/absmi.c
34
C/absmi.c
@ -1062,6 +1062,39 @@ interrupt_pexecute( PredEntry *pen USES_REGS )
|
|||||||
return interrupt_handler( pen PASS_REGS );
|
return interrupt_handler( pen PASS_REGS );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
execute_dealloc( USES_REGS1 )
|
||||||
|
{
|
||||||
|
/* other instructions do depend on S being set by deallocate
|
||||||
|
:-( */
|
||||||
|
CELL *ENV_YREG = YENV;
|
||||||
|
S = ENV_YREG;
|
||||||
|
CP = (yamop *) ENV_YREG[E_CP];
|
||||||
|
ENV = ENV_YREG = (CELL *) ENV_YREG[E_E];
|
||||||
|
#ifdef DEPTH_LIMIT
|
||||||
|
DEPTH = ENV_YREG[E_DEPTH];
|
||||||
|
#endif /* DEPTH_LIMIT */
|
||||||
|
#ifdef FROZEN_STACKS
|
||||||
|
{
|
||||||
|
choiceptr top_b = PROTECT_FROZEN_B(B);
|
||||||
|
#ifdef YAPOR_SBA
|
||||||
|
if (ENV_YREG > (CELL *) top_b || ENV_YREG < HR) ENV_YREG = (CELL *) top_b;
|
||||||
|
#else
|
||||||
|
if (ENV_YREG > (CELL *) top_b) ENV_YREG = (CELL *) top_b;
|
||||||
|
#endif /* YAPOR_SBA */
|
||||||
|
else ENV_YREG = (CELL *)((CELL) ENV_YREG + ENV_Size(CP));
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if (ENV_YREG > (CELL *) B)
|
||||||
|
ENV_YREG = (CELL *) B;
|
||||||
|
else
|
||||||
|
ENV_YREG = (CELL *) ((CELL) ENV_YREG + ENV_Size(CP));
|
||||||
|
#endif /* FROZEN_STACKS */
|
||||||
|
YENV = ENV_YREG;
|
||||||
|
P = NEXTOP(P,p);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/* don't forget I cannot creep at deallocate (where to?) */
|
/* don't forget I cannot creep at deallocate (where to?) */
|
||||||
/* also, this is unusual in that I have already done deallocate,
|
/* also, this is unusual in that I have already done deallocate,
|
||||||
so I don't need to redo it.
|
so I don't need to redo it.
|
||||||
@ -1085,6 +1118,7 @@ interrupt_deallocate( USES_REGS1 )
|
|||||||
/* keep on going if there is something else */
|
/* keep on going if there is something else */
|
||||||
(P->opc != Yap_opcode(_procceed) &&
|
(P->opc != Yap_opcode(_procceed) &&
|
||||||
P->opc != Yap_opcode(_cut_e))) {
|
P->opc != Yap_opcode(_cut_e))) {
|
||||||
|
execute_dealloc( PASS_REGS1 );
|
||||||
return 1;
|
return 1;
|
||||||
} else {
|
} else {
|
||||||
CELL cut_b = LCL0-(CELL *)(S[E_CB]);
|
CELL cut_b = LCL0-(CELL *)(S[E_CB]);
|
||||||
|
Reference in New Issue
Block a user