recover space after portray
This commit is contained in:
parent
4844e43704
commit
130d28ceb3
45
C/exec.c
45
C/exec.c
@ -1206,6 +1206,51 @@ Yap_exec_absmi(bool top, yap_reset_t has_reset)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Yap_fail_all( choiceptr bb USES_REGS )
|
||||||
|
{
|
||||||
|
yamop *saved_p, *saved_cp;
|
||||||
|
|
||||||
|
saved_p = P;
|
||||||
|
saved_cp = CP;
|
||||||
|
/* prune away choicepoints */
|
||||||
|
while (B && B->cp_b != bb) {
|
||||||
|
B = B->cp_b;
|
||||||
|
#ifdef YAPOR
|
||||||
|
CUT_prune_to(B);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
P = FAILCODE;
|
||||||
|
Yap_exec_absmi( true, YAP_EXEC_ABSMI);
|
||||||
|
/* recover stack space */
|
||||||
|
HR = B->cp_h;
|
||||||
|
TR = B->cp_tr;
|
||||||
|
#ifdef DEPTH_LIMIT
|
||||||
|
DEPTH = B->cp_depth;
|
||||||
|
#endif /* DEPTH_LIMIT */
|
||||||
|
YENV = ENV = B->cp_env;
|
||||||
|
/* recover local stack */
|
||||||
|
#ifdef DEPTH_LIMIT
|
||||||
|
DEPTH= ENV[E_DEPTH];
|
||||||
|
#endif
|
||||||
|
/* make sure we prune C-choicepoints */
|
||||||
|
if (POP_CHOICE_POINT(B->cp_b))
|
||||||
|
{
|
||||||
|
POP_EXECUTE();
|
||||||
|
}
|
||||||
|
ENV = (CELL *)(ENV[E_E]);
|
||||||
|
/* ASP should be set to the top of the local stack when we
|
||||||
|
did the call */
|
||||||
|
ASP = B->cp_env;
|
||||||
|
/* YENV should be set to the current environment */
|
||||||
|
YENV = ENV = (CELL *)((B->cp_env)[E_E]);
|
||||||
|
B = B->cp_b;
|
||||||
|
//SET_BB(B);
|
||||||
|
HB = PROTECT_FROZEN_H(B);
|
||||||
|
CP = saved_cp;
|
||||||
|
P = saved_p;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
Yap_execute_pred(PredEntry *ppe, CELL *pt USES_REGS)
|
Yap_execute_pred(PredEntry *ppe, CELL *pt USES_REGS)
|
||||||
{
|
{
|
||||||
|
@ -87,13 +87,16 @@ static bool
|
|||||||
callPortray(Term t, struct DB_TERM **old_EXp USES_REGS)
|
callPortray(Term t, struct DB_TERM **old_EXp USES_REGS)
|
||||||
{
|
{
|
||||||
PredEntry *pe;
|
PredEntry *pe;
|
||||||
|
Int b0 = LCL0-(CELL*)B;
|
||||||
|
|
||||||
EX = NULL;
|
EX = NULL;
|
||||||
if ( (pe = RepPredProp(Yap_GetPredPropByFunc(FunctorPortray, USER_MODULE) ) ) &&
|
if ( (pe = RepPredProp(Yap_GetPredPropByFunc(FunctorPortray, USER_MODULE) ) ) &&
|
||||||
pe->OpcodeOfPred != FAIL_OPCODE &&
|
pe->OpcodeOfPred != FAIL_OPCODE &&
|
||||||
pe->OpcodeOfPred != UNDEF_OPCODE &&
|
pe->OpcodeOfPred != UNDEF_OPCODE &&
|
||||||
Yap_execute_pred(pe, &t PASS_REGS) ) {
|
Yap_execute_pred(pe, &t PASS_REGS) ) {
|
||||||
|
choiceptr B0 = (choiceptr)(LCL0-b0);
|
||||||
if (EX && !*old_EXp) *old_EXp = EX;
|
if (EX && !*old_EXp) *old_EXp = EX;
|
||||||
|
Yap_fail_all(B0 PASS_REGS);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (EX && !*old_EXp) *old_EXp = EX;
|
if (EX && !*old_EXp) *old_EXp = EX;
|
||||||
|
@ -176,6 +176,7 @@ int Yap_SWIHandleError( const char *, ... );
|
|||||||
void Yap_InitEval(void);
|
void Yap_InitEval(void);
|
||||||
|
|
||||||
/* exec.c */
|
/* exec.c */
|
||||||
|
void Yap_fail_all( choiceptr bb USES_REGS);
|
||||||
Term Yap_ExecuteCallMetaCall(Term);
|
Term Yap_ExecuteCallMetaCall(Term);
|
||||||
void Yap_InitExecFs(void);
|
void Yap_InitExecFs(void);
|
||||||
Int Yap_JumpToEnv(Term);
|
Int Yap_JumpToEnv(Term);
|
||||||
|
Reference in New Issue
Block a user