only delete log update facts with blobs when they cannot be in stacks.
git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@930 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
parent
7be28e4098
commit
fae22bbf6b
44
C/absmi.c
44
C/absmi.c
@ -2041,37 +2041,37 @@ Yap_absmi(int inp)
|
|||||||
ALWAYS_LOOKAHEAD(pt->OpcodeOfPred);
|
ALWAYS_LOOKAHEAD(pt->OpcodeOfPred);
|
||||||
PREG = pt->CodeOfPred;
|
PREG = pt->CodeOfPred;
|
||||||
#ifdef DEPTH_LIMIT
|
#ifdef DEPTH_LIMIT
|
||||||
if (DEPTH <= MkIntTerm(1)) {/* I assume Module==0 is primitives */
|
if (DEPTH <= MkIntTerm(1)) {/* I assume Module==0 is primitives */
|
||||||
if (pt->ModuleOfPred) {
|
if (pt->ModuleOfPred) {
|
||||||
if (DEPTH == MkIntTerm(0))
|
if (DEPTH == MkIntTerm(0))
|
||||||
FAIL();
|
FAIL();
|
||||||
else DEPTH = RESET_DEPTH();
|
else DEPTH = RESET_DEPTH();
|
||||||
}
|
}
|
||||||
} else if (pt->ModuleOfPred)
|
} else if (pt->ModuleOfPred)
|
||||||
DEPTH -= MkIntConstant(2);
|
DEPTH -= MkIntConstant(2);
|
||||||
#endif /* DEPTH_LIMIT */
|
#endif /* DEPTH_LIMIT */
|
||||||
#ifdef FROZEN_STACKS
|
#ifdef FROZEN_STACKS
|
||||||
{
|
{
|
||||||
choiceptr top_b = PROTECT_FROZEN_B(B);
|
choiceptr top_b = PROTECT_FROZEN_B(B);
|
||||||
#ifdef SBA
|
#ifdef SBA
|
||||||
if (E_YREG > (CELL *) top_b || E_YREG < H) E_YREG = (CELL *) top_b;
|
if (E_YREG > (CELL *) top_b || E_YREG < H) E_YREG = (CELL *) top_b;
|
||||||
#else
|
#else
|
||||||
if (E_YREG > (CELL *) top_b) E_YREG = (CELL *) top_b;
|
if (E_YREG > (CELL *) top_b) E_YREG = (CELL *) top_b;
|
||||||
#endif /* SBA */
|
#endif /* SBA */
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
if (E_YREG > (CELL *) B) {
|
if (E_YREG > (CELL *) B) {
|
||||||
E_YREG = (CELL *) B;
|
E_YREG = (CELL *) B;
|
||||||
}
|
}
|
||||||
#endif /* FROZEN_STACKS */
|
#endif /* FROZEN_STACKS */
|
||||||
WRITEBACK_Y_AS_ENV();
|
WRITEBACK_Y_AS_ENV();
|
||||||
/* setup GB */
|
/* setup GB */
|
||||||
E_YREG[E_CB] = (CELL) B;
|
E_YREG[E_CB] = (CELL) B;
|
||||||
#ifdef YAPOR
|
#ifdef YAPOR
|
||||||
SCH_check_requests();
|
SCH_check_requests();
|
||||||
#endif /* YAPOR */
|
#endif /* YAPOR */
|
||||||
ALWAYS_GONext();
|
ALWAYS_GONext();
|
||||||
ALWAYS_END_PREFETCH();
|
ALWAYS_END_PREFETCH();
|
||||||
}
|
}
|
||||||
ENDCACHE_Y_AS_ENV();
|
ENDCACHE_Y_AS_ENV();
|
||||||
ENDBOp();
|
ENDBOp();
|
||||||
|
35
C/amasm.c
35
C/amasm.c
@ -703,6 +703,7 @@ a_rb(op_numbers opcode)
|
|||||||
code_p->u.xc.x = emit_xreg2();
|
code_p->u.xc.x = emit_xreg2();
|
||||||
code_p->u.xc.c = AbsAppl((CELL *)(Unsigned(code_addr) + label_offset[cpc->rnd1]));
|
code_p->u.xc.c = AbsAppl((CELL *)(Unsigned(code_addr) + label_offset[cpc->rnd1]));
|
||||||
}
|
}
|
||||||
|
clause_has_blobs = TRUE;
|
||||||
GONEXT(xc);
|
GONEXT(xc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2342,6 +2343,10 @@ do_pass(void)
|
|||||||
break;
|
break;
|
||||||
case cutexit_op:
|
case cutexit_op:
|
||||||
a_cut();
|
a_cut();
|
||||||
|
if (CurrentPred->PredFlags & LogUpdatePredFlag &&
|
||||||
|
clause_has_blobs &&
|
||||||
|
!alloc_found)
|
||||||
|
a_cle(_alloc_for_logical_pred);
|
||||||
a_e(_procceed);
|
a_e(_procceed);
|
||||||
#ifdef YAPOR
|
#ifdef YAPOR
|
||||||
if (pass_no)
|
if (pass_no)
|
||||||
@ -2406,6 +2411,10 @@ do_pass(void)
|
|||||||
a_l(_skip);
|
a_l(_skip);
|
||||||
break;
|
break;
|
||||||
case procceed_op:
|
case procceed_op:
|
||||||
|
if (CurrentPred->PredFlags & LogUpdatePredFlag &&
|
||||||
|
clause_has_blobs &&
|
||||||
|
!alloc_found)
|
||||||
|
a_cle(_alloc_for_logical_pred);
|
||||||
a_e(_procceed);
|
a_e(_procceed);
|
||||||
break;
|
break;
|
||||||
case call_op:
|
case call_op:
|
||||||
@ -2606,7 +2615,7 @@ do_pass(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
yamop *
|
yamop *
|
||||||
Yap_assemble(int mode)
|
Yap_assemble(int mode, Term t, PredEntry *ap, int is_fact)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* the assembly proccess is done in two passes: 1 - a first pass
|
* the assembly proccess is done in two passes: 1 - a first pass
|
||||||
@ -2636,10 +2645,26 @@ Yap_assemble(int mode)
|
|||||||
if ((CELL)code_p > size)
|
if ((CELL)code_p > size)
|
||||||
size = (CELL)code_p;
|
size = (CELL)code_p;
|
||||||
}
|
}
|
||||||
while ((code_addr = (yamop *) Yap_AllocCodeSpace(size)) == NULL) {
|
if (mode == ASSEMBLING_CLAUSE &&
|
||||||
if (!Yap_growheap(TRUE, size)) {
|
ap->PredFlags & LogUpdatePredFlag &&
|
||||||
Yap_Error_TYPE = SYSTEM_ERROR;
|
!is_fact) {
|
||||||
return NULL;
|
DBTerm *x;
|
||||||
|
LogUpdClause *cl;
|
||||||
|
while ((x = Yap_StoreTermInDBPlusExtraSpace(t, size)) == NULL) {
|
||||||
|
if (!Yap_growheap(TRUE, size)) {
|
||||||
|
Yap_Error_TYPE = SYSTEM_ERROR;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cl = (LogUpdClause *)((CODEADDR)x-(UInt)size);
|
||||||
|
cl->ClSource = x;
|
||||||
|
code_addr = (yamop *)cl;
|
||||||
|
} else {
|
||||||
|
while ((code_addr = (yamop *) Yap_AllocCodeSpace(size)) == NULL) {
|
||||||
|
if (!Yap_growheap(TRUE, size)) {
|
||||||
|
Yap_Error_TYPE = SYSTEM_ERROR;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// fprintf(stderr,"vsc: asking for %p\n",code_addr);
|
// fprintf(stderr,"vsc: asking for %p\n",code_addr);
|
||||||
|
Reference in New Issue
Block a user