cut should know about environment size.
This commit is contained in:
parent
09f4810b76
commit
1717b113b3
21
C/absmi.c
21
C/absmi.c
@ -2212,7 +2212,7 @@ Yap_absmi(int inp)
|
|||||||
\************************************************************************/
|
\************************************************************************/
|
||||||
|
|
||||||
/* cut */
|
/* cut */
|
||||||
Op(cut, e);
|
Op(cut, s);
|
||||||
#ifdef COROUTINING
|
#ifdef COROUTINING
|
||||||
if (FALSE) {
|
if (FALSE) {
|
||||||
CACHE_Y_AS_ENV(YREG);
|
CACHE_Y_AS_ENV(YREG);
|
||||||
@ -2221,7 +2221,7 @@ Yap_absmi(int inp)
|
|||||||
}
|
}
|
||||||
do_cut:
|
do_cut:
|
||||||
#endif
|
#endif
|
||||||
PREG = NEXTOP(NEXTOP(NEXTOP(PREG, e),Osbpp),l);
|
PREG = NEXTOP(NEXTOP(NEXTOP(PREG, s),Osbpp),l);
|
||||||
{
|
{
|
||||||
choiceptr d0;
|
choiceptr d0;
|
||||||
/* assume cut is always in stack */
|
/* assume cut is always in stack */
|
||||||
@ -2230,6 +2230,9 @@ Yap_absmi(int inp)
|
|||||||
{
|
{
|
||||||
if (SHOULD_CUT_UP_TO(B,d0))
|
if (SHOULD_CUT_UP_TO(B,d0))
|
||||||
{
|
{
|
||||||
|
ASP = (CELL *) (((char *) YREG) + PREG->u.s.s);
|
||||||
|
if (ASP > (CELL *)PROTECT_FROZEN_B(B))
|
||||||
|
ASP = (CELL *)PROTECT_FROZEN_B(B);
|
||||||
while (POP_CHOICE_POINT(d0))
|
while (POP_CHOICE_POINT(d0))
|
||||||
{
|
{
|
||||||
POP_EXECUTE();
|
POP_EXECUTE();
|
||||||
@ -2260,7 +2263,7 @@ Yap_absmi(int inp)
|
|||||||
|
|
||||||
/* cut_t */
|
/* cut_t */
|
||||||
/* cut_t does the same as cut */
|
/* cut_t does the same as cut */
|
||||||
Op(cut_t, e);
|
Op(cut_t, s);
|
||||||
#ifdef COROUTINING
|
#ifdef COROUTINING
|
||||||
if (FALSE) {
|
if (FALSE) {
|
||||||
CACHE_Y_AS_ENV(YREG);
|
CACHE_Y_AS_ENV(YREG);
|
||||||
@ -2269,7 +2272,7 @@ Yap_absmi(int inp)
|
|||||||
}
|
}
|
||||||
do_cut_t:
|
do_cut_t:
|
||||||
#endif
|
#endif
|
||||||
PREG = NEXTOP(NEXTOP(NEXTOP(PREG, e),Osbpp),l);
|
PREG = NEXTOP(NEXTOP(NEXTOP(PREG, s),Osbpp),l);
|
||||||
{
|
{
|
||||||
choiceptr d0;
|
choiceptr d0;
|
||||||
|
|
||||||
@ -2277,6 +2280,9 @@ Yap_absmi(int inp)
|
|||||||
d0 = (choiceptr)YREG[E_CB];
|
d0 = (choiceptr)YREG[E_CB];
|
||||||
#ifdef CUT_C
|
#ifdef CUT_C
|
||||||
{
|
{
|
||||||
|
ASP = (CELL *) (((char *) YREG) + PREG->u.s.s);
|
||||||
|
if (ASP > (CELL *)PROTECT_FROZEN_B(B))
|
||||||
|
ASP = (CELL *)PROTECT_FROZEN_B(B);
|
||||||
if (SHOULD_CUT_UP_TO(B,d0))
|
if (SHOULD_CUT_UP_TO(B,d0))
|
||||||
{
|
{
|
||||||
while (POP_CHOICE_POINT(d0))
|
while (POP_CHOICE_POINT(d0))
|
||||||
@ -2323,7 +2329,7 @@ Yap_absmi(int inp)
|
|||||||
ENDOp();
|
ENDOp();
|
||||||
|
|
||||||
/* cut_e */
|
/* cut_e */
|
||||||
Op(cut_e, e);
|
Op(cut_e, s);
|
||||||
#ifdef COROUTINING
|
#ifdef COROUTINING
|
||||||
if (FALSE) {
|
if (FALSE) {
|
||||||
CACHE_Y_AS_ENV(YREG);
|
CACHE_Y_AS_ENV(YREG);
|
||||||
@ -2332,7 +2338,7 @@ Yap_absmi(int inp)
|
|||||||
}
|
}
|
||||||
do_cut_e:
|
do_cut_e:
|
||||||
#endif
|
#endif
|
||||||
PREG = NEXTOP(NEXTOP(NEXTOP(PREG, e),Osbpp),l);
|
PREG = NEXTOP(NEXTOP(NEXTOP(PREG, s),Osbpp),l);
|
||||||
{
|
{
|
||||||
choiceptr d0;
|
choiceptr d0;
|
||||||
/* we assume dealloc leaves in S the previous env */
|
/* we assume dealloc leaves in S the previous env */
|
||||||
@ -2341,6 +2347,9 @@ Yap_absmi(int inp)
|
|||||||
{
|
{
|
||||||
if (SHOULD_CUT_UP_TO(B,d0))
|
if (SHOULD_CUT_UP_TO(B,d0))
|
||||||
{
|
{
|
||||||
|
ASP = (CELL *) (((char *) YREG) + PREG->u.s.s);
|
||||||
|
if (ASP > (CELL *)PROTECT_FROZEN_B(B))
|
||||||
|
ASP = (CELL *)PROTECT_FROZEN_B(B);
|
||||||
while (POP_CHOICE_POINT(d0))
|
while (POP_CHOICE_POINT(d0))
|
||||||
{
|
{
|
||||||
POP_EXECUTE();
|
POP_EXECUTE();
|
||||||
|
@ -2027,11 +2027,11 @@ a_cut(clause_info *clinfo, yamop *code_p, int pass_no, struct intermediates *cip
|
|||||||
{
|
{
|
||||||
code_p = check_alloc(clinfo, code_p, pass_no, cip);
|
code_p = check_alloc(clinfo, code_p, pass_no, cip);
|
||||||
if (clinfo->dealloc_found) {
|
if (clinfo->dealloc_found) {
|
||||||
return a_e(_cut_e, code_p, pass_no);
|
return a_n(_cut_e, -Signed(RealEnvSize) - CELLSIZE * cip->cpc->rnd2, code_p, pass_no);
|
||||||
} else if (clinfo->alloc_found == 1) {
|
} else if (clinfo->alloc_found == 1) {
|
||||||
return a_e(_cut, code_p, pass_no);
|
return a_n(_cut, -Signed(RealEnvSize) - CELLSIZE * cip->cpc->rnd2, code_p, pass_no);
|
||||||
} else {
|
} else {
|
||||||
return a_e(_cut_t, code_p, pass_no);
|
return a_n(_cut_t, -Signed(RealEnvSize) - CELLSIZE * cip->cpc->rnd2, code_p, pass_no);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1296,7 +1296,7 @@ c_bifun(basic_preds Op, Term t1, Term t2, Term t3, Term Goal, Term mod, compiler
|
|||||||
} else {
|
} else {
|
||||||
/* generate code for a temp and then unify temp with previous variable */
|
/* generate code for a temp and then unify temp with previous variable */
|
||||||
Yap_emit(f_0_op, 0, (unsigned int)Op, &cglobs->cint);
|
Yap_emit(f_0_op, 0, (unsigned int)Op, &cglobs->cint);
|
||||||
/* I have to dit here, before I do the unification */
|
/* I have to do it here, before I do the unification */
|
||||||
if (Op == _functor) {
|
if (Op == _functor) {
|
||||||
Yap_emit(empty_call_op, Zero, (unsigned int)Op, &cglobs->cint);
|
Yap_emit(empty_call_op, Zero, (unsigned int)Op, &cglobs->cint);
|
||||||
Yap_emit(restore_tmps_and_skip_op, Zero, Zero, &cglobs->cint);
|
Yap_emit(restore_tmps_and_skip_op, Zero, Zero, &cglobs->cint);
|
||||||
|
@ -32,9 +32,9 @@
|
|||||||
OPCODE(retry_and_mark ,Otapl),
|
OPCODE(retry_and_mark ,Otapl),
|
||||||
OPCODE(trust_fail ,e),
|
OPCODE(trust_fail ,e),
|
||||||
OPCODE(op_fail ,e),
|
OPCODE(op_fail ,e),
|
||||||
OPCODE(cut ,e),
|
OPCODE(cut ,s),
|
||||||
OPCODE(cut_t ,e),
|
OPCODE(cut_t ,s),
|
||||||
OPCODE(cut_e ,e),
|
OPCODE(cut_e ,s),
|
||||||
OPCODE(save_b_x ,x),
|
OPCODE(save_b_x ,x),
|
||||||
OPCODE(save_b_y ,y),
|
OPCODE(save_b_y ,y),
|
||||||
OPCODE(commit_b_x ,xp),
|
OPCODE(commit_b_x ,xp),
|
||||||
|
@ -40,7 +40,9 @@ struct cut_c_str{
|
|||||||
cut_c_str_ptr TOP = Yap_REGS.CUT_C_TOP; \
|
cut_c_str_ptr TOP = Yap_REGS.CUT_C_TOP; \
|
||||||
CPredicate func = (CPredicate)((yamop *)TOP->try_userc_cut_yamop)->u.OtapFs.f; \
|
CPredicate func = (CPredicate)((yamop *)TOP->try_userc_cut_yamop)->u.OtapFs.f; \
|
||||||
PredEntry *pred = (PredEntry *)((yamop *)TOP->try_userc_cut_yamop)->u.OtapFs.p; \
|
PredEntry *pred = (PredEntry *)((yamop *)TOP->try_userc_cut_yamop)->u.OtapFs.p; \
|
||||||
YAP_Execute(pred,func); \
|
Yap_StartSlots(); \
|
||||||
|
YAP_ExecuteOnCut(pred,func); \
|
||||||
|
Yap_CloseSlots(); \
|
||||||
cut_c_pop();
|
cut_c_pop();
|
||||||
|
|
||||||
|
|
||||||
|
@ -217,9 +217,6 @@ restore_opcodes(yamop *pc, yamop *max)
|
|||||||
case _Nstop:
|
case _Nstop:
|
||||||
case _allocate:
|
case _allocate:
|
||||||
case _copy_idb_term:
|
case _copy_idb_term:
|
||||||
case _cut:
|
|
||||||
case _cut_e:
|
|
||||||
case _cut_t:
|
|
||||||
case _expand_index:
|
case _expand_index:
|
||||||
case _index_blob:
|
case _index_blob:
|
||||||
case _index_dbref:
|
case _index_dbref:
|
||||||
@ -484,6 +481,9 @@ restore_opcodes(yamop *pc, yamop *max)
|
|||||||
pc = NEXTOP(pc,pp);
|
pc = NEXTOP(pc,pp);
|
||||||
break;
|
break;
|
||||||
/* instructions type s */
|
/* instructions type s */
|
||||||
|
case _cut:
|
||||||
|
case _cut_e:
|
||||||
|
case _cut_t:
|
||||||
case _pop_n:
|
case _pop_n:
|
||||||
case _write_n_voids:
|
case _write_n_voids:
|
||||||
pc->u.s.s = ConstantAdjust(pc->u.s.s);
|
pc->u.s.s = ConstantAdjust(pc->u.s.s);
|
||||||
|
@ -166,9 +166,6 @@
|
|||||||
case _unify_idb_term:
|
case _unify_idb_term:
|
||||||
return found_idb_clause(pc, startp, endp);
|
return found_idb_clause(pc, startp, endp);
|
||||||
case _allocate:
|
case _allocate:
|
||||||
case _cut:
|
|
||||||
case _cut_e:
|
|
||||||
case _cut_t:
|
|
||||||
case _index_blob:
|
case _index_blob:
|
||||||
case _index_dbref:
|
case _index_dbref:
|
||||||
case _index_long:
|
case _index_long:
|
||||||
@ -375,6 +372,9 @@
|
|||||||
pc = NEXTOP(pc,pp);
|
pc = NEXTOP(pc,pp);
|
||||||
break;
|
break;
|
||||||
/* instructions type s */
|
/* instructions type s */
|
||||||
|
case _cut:
|
||||||
|
case _cut_e:
|
||||||
|
case _cut_t:
|
||||||
case _pop_n:
|
case _pop_n:
|
||||||
case _write_n_voids:
|
case _write_n_voids:
|
||||||
pc = NEXTOP(pc,s);
|
pc = NEXTOP(pc,s);
|
||||||
|
Reference in New Issue
Block a user