fix slots: have slots ready at init, even if we don't have a Prolog top-level;
don't get lost after pruning.
This commit is contained in:
parent
2a51403518
commit
11a74236dc
@ -1134,6 +1134,7 @@ YAP_cut_up(void)
|
|||||||
pointer back to where cut_up called it. Slots depend on it. */
|
pointer back to where cut_up called it. Slots depend on it. */
|
||||||
if (ENV > B->cp_env) {
|
if (ENV > B->cp_env) {
|
||||||
ASP = B->cp_env;
|
ASP = B->cp_env;
|
||||||
|
Yap_PopSlots( PASS_REGS1 );
|
||||||
}
|
}
|
||||||
#ifdef YAPOR
|
#ifdef YAPOR
|
||||||
{
|
{
|
||||||
@ -2166,6 +2167,7 @@ run_emulator(YAP_dogoalinfo *dgi)
|
|||||||
#endif /* DEPTH_LIMIT */
|
#endif /* DEPTH_LIMIT */
|
||||||
YENV = ENV = B->cp_env;
|
YENV = ENV = B->cp_env;
|
||||||
ASP = (CELL *)(B+1);
|
ASP = (CELL *)(B+1);
|
||||||
|
Yap_PopSlots( PASS_REGS1 );
|
||||||
B = B->cp_b;
|
B = B->cp_b;
|
||||||
HB = B->cp_h;
|
HB = B->cp_h;
|
||||||
} else {
|
} else {
|
||||||
@ -2210,6 +2212,7 @@ YAP_EnterGoal(PredEntry *pe, Term *ptr, YAP_dogoalinfo *dgi)
|
|||||||
B = myB;
|
B = myB;
|
||||||
HB = H;
|
HB = H;
|
||||||
ASP = YENV = (CELL *)B;
|
ASP = YENV = (CELL *)B;
|
||||||
|
Yap_PopSlots( PASS_REGS1 );
|
||||||
YENV[E_CB] = Unsigned (B);
|
YENV[E_CB] = Unsigned (B);
|
||||||
out = run_emulator(dgi);
|
out = run_emulator(dgi);
|
||||||
RECOVER_MACHINE_REGS();
|
RECOVER_MACHINE_REGS();
|
||||||
@ -2271,6 +2274,7 @@ YAP_LeaveGoal(int backtrack, YAP_dogoalinfo *dgi)
|
|||||||
}
|
}
|
||||||
/* recover local stack */
|
/* recover local stack */
|
||||||
ASP = (CELL *)(B+1);
|
ASP = (CELL *)(B+1);
|
||||||
|
Yap_PopSlots( PASS_REGS1 );
|
||||||
/* make sure we prune C-choicepoints */
|
/* make sure we prune C-choicepoints */
|
||||||
if (POP_CHOICE_POINT(B->cp_b))
|
if (POP_CHOICE_POINT(B->cp_b))
|
||||||
{
|
{
|
||||||
@ -2344,6 +2348,7 @@ YAP_RunGoalOnce(Term t)
|
|||||||
B = cut_pt;
|
B = cut_pt;
|
||||||
}
|
}
|
||||||
ASP = B->cp_env;
|
ASP = B->cp_env;
|
||||||
|
Yap_PopSlots( PASS_REGS1 );
|
||||||
ENV = (CELL *)ASP[E_E];
|
ENV = (CELL *)ASP[E_E];
|
||||||
B = (choiceptr)ASP[E_CB];
|
B = (choiceptr)ASP[E_CB];
|
||||||
#ifdef DEPTH_LIMIT
|
#ifdef DEPTH_LIMIT
|
||||||
@ -2413,6 +2418,7 @@ YAP_ShutdownGoal(int backtrack)
|
|||||||
}
|
}
|
||||||
/* we can always recover the stack */
|
/* we can always recover the stack */
|
||||||
ASP = cut_pt->cp_env;
|
ASP = cut_pt->cp_env;
|
||||||
|
Yap_PopSlots( PASS_REGS1 );
|
||||||
ENV = (CELL *)ASP[E_E];
|
ENV = (CELL *)ASP[E_E];
|
||||||
B = (choiceptr)ASP[E_CB];
|
B = (choiceptr)ASP[E_CB];
|
||||||
Yap_TrimTrail();
|
Yap_TrimTrail();
|
||||||
|
2
C/exec.c
2
C/exec.c
@ -997,7 +997,6 @@ exec_absmi(int top USES_REGS)
|
|||||||
YENV = ASP;
|
YENV = ASP;
|
||||||
YENV[E_CB] = Unsigned (B);
|
YENV[E_CB] = Unsigned (B);
|
||||||
out = Yap_absmi(0);
|
out = Yap_absmi(0);
|
||||||
Yap_StartSlots( PASS_REGS1 );
|
|
||||||
/* make sure we don't leave a FAIL signal hanging around */
|
/* make sure we don't leave a FAIL signal hanging around */
|
||||||
LOCAL_ActiveSignals &= ~YAP_FAIL_SIGNAL;
|
LOCAL_ActiveSignals &= ~YAP_FAIL_SIGNAL;
|
||||||
if (!LOCAL_ActiveSignals)
|
if (!LOCAL_ActiveSignals)
|
||||||
@ -1656,6 +1655,7 @@ Yap_InitYaamRegs(void)
|
|||||||
/* the first real choice-point will also have AP=FAIL */
|
/* the first real choice-point will also have AP=FAIL */
|
||||||
/* always have an empty slots for people to use */
|
/* always have an empty slots for people to use */
|
||||||
CurSlot = 0;
|
CurSlot = 0;
|
||||||
|
Yap_StartSlots( PASS_REGS1 );
|
||||||
LOCAL_GlobalArena = TermNil;
|
LOCAL_GlobalArena = TermNil;
|
||||||
h0var = MkVarTerm();
|
h0var = MkVarTerm();
|
||||||
#if COROUTINING
|
#if COROUTINING
|
||||||
|
12
H/Yap.h
12
H/Yap.h
@ -1217,6 +1217,18 @@ Yap_CurrentSlot( USES_REGS1 ) {
|
|||||||
return IntOfTerm(ASP[0]);
|
return IntOfTerm(ASP[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* pop slots when pruning */
|
||||||
|
static inline void
|
||||||
|
Yap_PopSlots( USES_REGS1 ) {
|
||||||
|
while (LCL0-CurSlot < ASP) {
|
||||||
|
Int old_slots;
|
||||||
|
CELL *ptr = LCL0-CurSlot;
|
||||||
|
old_slots = IntOfTerm(ptr[0]);
|
||||||
|
ptr += (old_slots+1);
|
||||||
|
CurSlot = IntOfTerm(*ptr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/************************/
|
/************************/
|
||||||
#ifdef THREADS
|
#ifdef THREADS
|
||||||
typedef struct thandle {
|
typedef struct thandle {
|
||||||
|
Reference in New Issue
Block a user