fix slot handling
This commit is contained in:
parent
2812ad5704
commit
d0adb0b910
15
C/absmi.c
15
C/absmi.c
@ -623,8 +623,8 @@ stack_overflow( CELL *env, yamop *cp USES_REGS )
|
|||||||
if ((Int)(Unsigned(YREG) - Unsigned(HR)) < StackGap( PASS_REGS1 ) ||
|
if ((Int)(Unsigned(YREG) - Unsigned(HR)) < StackGap( PASS_REGS1 ) ||
|
||||||
Yap_undo_signal( YAP_STOVF_SIGNAL )) {
|
Yap_undo_signal( YAP_STOVF_SIGNAL )) {
|
||||||
if (!Yap_gc(((PredEntry *)(S))->ArityOfPE, env, cp)) {
|
if (!Yap_gc(((PredEntry *)(S))->ArityOfPE, env, cp)) {
|
||||||
Yap_NilError(OUT_OF_STACK_ERROR,LOCAL_ErrorMessage);
|
Yap_NilError(OUT_OF_STACK_ERROR,LOCAL_ErrorMessage);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -783,6 +783,7 @@ interrupt_handler_either( USES_REGS1 )
|
|||||||
/* ARG0 has an extra argument for suspended cuts */
|
/* ARG0 has an extra argument for suspended cuts */
|
||||||
ARG2 = XREGS[0];
|
ARG2 = XREGS[0];
|
||||||
YENV[E_CB] = (CELL) B;
|
YENV[E_CB] = (CELL) B;
|
||||||
|
SET_ASP(YENV, E_CB*sizeof(CELL));
|
||||||
return interrupt_handler( PASS_REGS1 );
|
return interrupt_handler( PASS_REGS1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -874,9 +875,7 @@ interrupt_pexecute( PredEntry *pen USES_REGS )
|
|||||||
if (Yap_only_has_signal(YAP_CREEP_SIGNAL))
|
if (Yap_only_has_signal(YAP_CREEP_SIGNAL))
|
||||||
return 2; /* keep on creeping */
|
return 2; /* keep on creeping */
|
||||||
S = (CELL *) pen;
|
S = (CELL *) pen;
|
||||||
ASP = YENV;
|
SET_ASP(YENV, E_CB*sizeof(CELL));
|
||||||
if (ASP > (CELL *)PROTECT_FROZEN_B(B))
|
|
||||||
ASP = (CELL *)PROTECT_FROZEN_B(B);
|
|
||||||
/* setup GB */
|
/* setup GB */
|
||||||
YENV[E_CB] = (CELL) B;
|
YENV[E_CB] = (CELL) B;
|
||||||
if ((v = code_overflow(YENV PASS_REGS)) >= 0) return v;
|
if ((v = code_overflow(YENV PASS_REGS)) >= 0) return v;
|
||||||
@ -914,11 +913,7 @@ interrupt_deallocate( USES_REGS1 )
|
|||||||
PP = PREVOP(P,p)->u.p.p;
|
PP = PREVOP(P,p)->u.p.p;
|
||||||
ASP = YENV+E_CB;
|
ASP = YENV+E_CB;
|
||||||
/* cut_e */
|
/* cut_e */
|
||||||
if (YENV <= ASP) {
|
SET_ASP(YENV, E_CB*sizeof(CELL));
|
||||||
ASP = YENV-EnvSizeInCells;
|
|
||||||
}
|
|
||||||
if (ASP > (CELL *)PROTECT_FROZEN_B(B))
|
|
||||||
ASP = (CELL *)PROTECT_FROZEN_B(B);
|
|
||||||
if ((v = code_overflow(YENV PASS_REGS)) >= 0) return v;
|
if ((v = code_overflow(YENV PASS_REGS)) >= 0) return v;
|
||||||
if (Yap_has_a_signal()) {
|
if (Yap_has_a_signal()) {
|
||||||
if (Yap_op_from_opcode(P->opc) == _cut_e) {
|
if (Yap_op_from_opcode(P->opc) == _cut_e) {
|
||||||
|
@ -2516,9 +2516,13 @@ YAP_RunGoal(Term t)
|
|||||||
ENV = B->cp_env;
|
ENV = B->cp_env;
|
||||||
ENV = (CELL *)ENV[E_E];
|
ENV = (CELL *)ENV[E_E];
|
||||||
CP = old_CP;
|
CP = old_CP;
|
||||||
|
HR = B->cp_h;
|
||||||
|
TR = B->cp_tr;
|
||||||
B = B->cp_b;
|
B = B->cp_b;
|
||||||
LOCAL_AllowRestart = FALSE;
|
LOCAL_AllowRestart = FALSE;
|
||||||
ASP = ENV;
|
SET_ASP(ENV, E_CB*sizeof(CELL));
|
||||||
|
// make sure the slots are ok.
|
||||||
|
ASP = LCL0-(CurSlot+2+IntOfTerm(LCL0[-CurSlot-1]));
|
||||||
LOCAL_CurSlot = CurSlot;
|
LOCAL_CurSlot = CurSlot;
|
||||||
}
|
}
|
||||||
RECOVER_MACHINE_REGS();
|
RECOVER_MACHINE_REGS();
|
||||||
|
@ -391,7 +391,7 @@ toggle_low_level_trace(void)
|
|||||||
|
|
||||||
static Int p_start_low_level_trace( USES_REGS1 )
|
static Int p_start_low_level_trace( USES_REGS1 )
|
||||||
{
|
{
|
||||||
GLOBAL_stderr = Sopen_file("TRACER_LOG", "w");
|
GLOBAL_stderr = Serror; //Sopen_file("TRACER_LOG", "w");
|
||||||
Yap_do_low_level_trace = TRUE;
|
Yap_do_low_level_trace = TRUE;
|
||||||
return(TRUE);
|
return(TRUE);
|
||||||
}
|
}
|
||||||
|
9
H/Regs.h
Normal file → Executable file
9
H/Regs.h
Normal file → Executable file
@ -722,3 +722,12 @@ CalculateStackGap( USES_REGS1 )
|
|||||||
CreepFlag = EventFlag = StackGap( PASS_REGS1 );
|
CreepFlag = EventFlag = StackGap( PASS_REGS1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define SET_ASP(Y,S) SET_ASP__(Y,S PASS_REGS)
|
||||||
|
|
||||||
|
static inline
|
||||||
|
void SET_ASP__(CELL *yreg, Int sz USES_REGS) {
|
||||||
|
ASP = (CELL *) (((char *) yreg) + sz);
|
||||||
|
if (ASP > (CELL *)PROTECT_FROZEN_B(B))
|
||||||
|
ASP = (CELL *)PROTECT_FROZEN_B(B);
|
||||||
|
}
|
||||||
|
|
||||||
|
0
H/YapHandles.h
Normal file → Executable file
0
H/YapHandles.h
Normal file → Executable file
9
H/absmi.h
Normal file → Executable file
9
H/absmi.h
Normal file → Executable file
@ -1588,15 +1588,6 @@ prune(choiceptr cp USES_REGS)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define SET_ASP(Y,S) SET_ASP__(Y,S PASS_REGS)
|
|
||||||
|
|
||||||
static inline
|
|
||||||
void SET_ASP__(CELL *yreg, Int sz USES_REGS) {
|
|
||||||
ASP = (CELL *) (((char *) yreg) + sz);
|
|
||||||
if (ASP > (CELL *)PROTECT_FROZEN_B(B))
|
|
||||||
ASP = (CELL *)PROTECT_FROZEN_B(B);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if YAPOR
|
#if YAPOR
|
||||||
#define INITIALIZE_PERMVAR(PTR, V) Bind_Local((PTR), (V))
|
#define INITIALIZE_PERMVAR(PTR, V) Bind_Local((PTR), (V))
|
||||||
#else
|
#else
|
||||||
|
Reference in New Issue
Block a user