support for space reservation (goal: call gc before trying to insert very large terms).
This commit is contained in:
28
C/absmi.c
28
C/absmi.c
@@ -1670,6 +1670,34 @@ Yap_absmi(int inp)
|
||||
ENDBOp();
|
||||
|
||||
|
||||
/*****************************************************************
|
||||
* check for enough room *
|
||||
*****************************************************************/
|
||||
|
||||
/* ensure_space */
|
||||
BOp(ensure_space, ip);
|
||||
{
|
||||
Int sz = PREG->u.ip.i;
|
||||
fprintf(stderr,"ensuring %ld\n", sz);
|
||||
PREG = NEXTOP(PREG,ip);
|
||||
if (Unsigned(H) + sz > Unsigned(YREG)-CreepFlag) {
|
||||
ASP = YREG+E_CB;
|
||||
if (ASP > (CELL *)PROTECT_FROZEN_B(B))
|
||||
ASP = (CELL *)PROTECT_FROZEN_B(B);
|
||||
saveregs();
|
||||
if (!Yap_gcl(sz, 0, ENV, NEXTOP(PREG,ip))) {
|
||||
PREG = NEXTOP(PREG,ip);
|
||||
Yap_Error(OUT_OF_STACK_ERROR,TermNil,Yap_ErrorMessage);
|
||||
setregs();
|
||||
FAIL();
|
||||
} else {
|
||||
setregs();
|
||||
}
|
||||
}
|
||||
}
|
||||
JMPNext();
|
||||
ENDBOp();
|
||||
|
||||
/*****************************************************************
|
||||
* try and retry of dynamic predicates *
|
||||
*****************************************************************/
|
||||
|
||||
Reference in New Issue
Block a user