Ulrich Neumerkel's patch so that variables are declared in front of a block.
This commit is contained in:
127
C/absmi.c
127
C/absmi.c
@@ -610,7 +610,6 @@ char *Yap_op_names[_std_top + 1] =
|
||||
Int
|
||||
Yap_absmi(int inp)
|
||||
{
|
||||
|
||||
#if BP_FREE
|
||||
/* some function might be using bp for an internal variable, it is the
|
||||
callee's responsability to save it */
|
||||
@@ -7422,81 +7421,85 @@ Yap_absmi(int inp)
|
||||
BOp(execute_cpred, pp);
|
||||
{
|
||||
PredEntry *pt0;
|
||||
|
||||
BEGD(d0);
|
||||
CACHE_Y_AS_ENV(YREG);
|
||||
#ifdef FROZEN_STACKS
|
||||
{
|
||||
choiceptr top_b = PROTECT_FROZEN_B(B);
|
||||
{
|
||||
choiceptr top_b = PROTECT_FROZEN_B(B);
|
||||
|
||||
#ifdef SBA
|
||||
if (YREG > (CELL *) top_b || YREG < H) ASP = (CELL *)top_b;
|
||||
if (YREG > (CELL *) top_b || YREG < H) ASP = (CELL *)top_b;
|
||||
#else
|
||||
if (YREG > (CELL *) top_b) ASP = (CELL *)top_b;
|
||||
if (YREG > (CELL *) top_b) ASP = (CELL *)top_b;
|
||||
#endif /* SBA */
|
||||
else ASP = YREG+E_CB;
|
||||
}
|
||||
#else
|
||||
if (YREG > (CELL *) B) {
|
||||
ASP = (CELL *) B;
|
||||
} else {
|
||||
ASP = YREG+E_CB;
|
||||
}
|
||||
/* for slots to work */
|
||||
#endif /* FROZEN_STACKS */
|
||||
pt0 = PREG->u.pp.p;
|
||||
#ifdef LOW_LEVEL_TRACER
|
||||
if (Yap_do_low_level_trace) {
|
||||
low_level_trace(enter_pred,pt0,XREGS+1);
|
||||
}
|
||||
#endif /* LOW_LEVEL_TRACE */
|
||||
CACHE_A1();
|
||||
BEGD(d0);
|
||||
d0 = (CELL)B;
|
||||
#ifndef NO_CHECKING
|
||||
check_stack(NoStackExecute, H);
|
||||
#endif
|
||||
/* for profiler */
|
||||
save_pc();
|
||||
ENV_YREG[E_CB] = d0;
|
||||
ENDD(d0);
|
||||
#ifdef DEPTH_LIMIT
|
||||
if (DEPTH <= MkIntTerm(1)) {/* I assume Module==0 is prolog */
|
||||
if (pt0->ModuleOfPred) {
|
||||
if (DEPTH == MkIntTerm(0))
|
||||
FAIL();
|
||||
else DEPTH = RESET_DEPTH();
|
||||
else ASP = YREG+E_CB;
|
||||
}
|
||||
#else
|
||||
if (YREG > (CELL *) B) {
|
||||
ASP = (CELL *) B;
|
||||
} else {
|
||||
ASP = YREG+E_CB;
|
||||
}
|
||||
/* for slots to work */
|
||||
#endif /* FROZEN_STACKS */
|
||||
pt0 = PREG->u.pp.p;
|
||||
#ifdef LOW_LEVEL_TRACER
|
||||
if (Yap_do_low_level_trace) {
|
||||
low_level_trace(enter_pred,pt0,XREGS+1);
|
||||
}
|
||||
#endif /* LOW_LEVEL_TRACE */
|
||||
CACHE_A1();
|
||||
BEGD(d0);
|
||||
d0 = (CELL)B;
|
||||
#ifndef NO_CHECKING
|
||||
check_stack(NoStackExecute, H);
|
||||
#endif
|
||||
/* for profiler */
|
||||
save_pc();
|
||||
ENV_YREG[E_CB] = d0;
|
||||
ENDD(d0);
|
||||
#ifdef DEPTH_LIMIT
|
||||
if (DEPTH <= MkIntTerm(1)) {/* I assume Module==0 is prolog */
|
||||
if (pt0->ModuleOfPred) {
|
||||
if (DEPTH == MkIntTerm(0))
|
||||
FAIL();
|
||||
else DEPTH = RESET_DEPTH();
|
||||
}
|
||||
} else if (pt0->ModuleOfPred) {
|
||||
DEPTH -= MkIntConstant(2);
|
||||
}
|
||||
} else if (pt0->ModuleOfPred)
|
||||
DEPTH -= MkIntConstant(2);
|
||||
#endif /* DEPTH_LIMIT */
|
||||
/* now call C-Code */
|
||||
CPredicate f = PREG->u.pp.p->cs.f_code;
|
||||
yamop *oldPREG = PREG;
|
||||
saveregs();
|
||||
d0 = (f)();
|
||||
setregs();
|
||||
{
|
||||
CPredicate f = PREG->u.pp.p->cs.f_code;
|
||||
yamop *oldPREG = PREG;
|
||||
saveregs();
|
||||
d0 = (f)();
|
||||
setregs();
|
||||
#ifdef SHADOW_S
|
||||
SREG = Yap_REGS.S_;
|
||||
SREG = Yap_REGS.S_;
|
||||
#endif
|
||||
if (!d0) {
|
||||
FAIL();
|
||||
}
|
||||
if (oldPREG == PREG) {
|
||||
/* we did not update PREG */
|
||||
/* we can proceed */
|
||||
PREG = CPREG;
|
||||
ENV_YREG = ENV;
|
||||
if (!d0) {
|
||||
FAIL();
|
||||
}
|
||||
if (oldPREG == PREG) {
|
||||
/* we did not update PREG */
|
||||
/* we can proceed */
|
||||
PREG = CPREG;
|
||||
ENV_YREG = ENV;
|
||||
#ifdef DEPTH_LIMIT
|
||||
DEPTH = ENV_YREG[E_DEPTH];
|
||||
DEPTH = ENV_YREG[E_DEPTH];
|
||||
#endif
|
||||
WRITEBACK_Y_AS_ENV();
|
||||
} else {
|
||||
/* call the new code */
|
||||
CACHE_A1();
|
||||
}
|
||||
JMPNext();
|
||||
ENDCACHE_Y_AS_ENV();
|
||||
ENDD(d0);
|
||||
WRITEBACK_Y_AS_ENV();
|
||||
} else {
|
||||
/* call the new code */
|
||||
CACHE_A1();
|
||||
}
|
||||
}
|
||||
JMPNext();
|
||||
ENDCACHE_Y_AS_ENV();
|
||||
ENDD(d0);
|
||||
}
|
||||
ENDBOp();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user