no more need to support AttVars
This commit is contained in:
parent
43a822b41f
commit
d48be6406b
421
C/globals.c
421
C/globals.c
@ -33,16 +33,14 @@ static char SccsId[] = "%W% %G%";
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#define QUEUE_ARENA 0
|
#define QUEUE_ARENA 0
|
||||||
#define QUEUE_DELAY_ARENA 1
|
#define QUEUE_HEAD 1
|
||||||
#define QUEUE_HEAD 2
|
#define QUEUE_TAIL 2
|
||||||
#define QUEUE_TAIL 3
|
#define QUEUE_SIZE 3
|
||||||
#define QUEUE_SIZE 4
|
|
||||||
|
|
||||||
#define HEAP_SIZE 0
|
#define HEAP_SIZE 0
|
||||||
#define HEAP_MAX 1
|
#define HEAP_MAX 1
|
||||||
#define HEAP_ARENA 2
|
#define HEAP_ARENA 2
|
||||||
#define HEAP_DELAY_ARENA 3
|
#define HEAP_START 3
|
||||||
#define HEAP_START 4
|
|
||||||
|
|
||||||
#define MIN_ARENA_SIZE 1048
|
#define MIN_ARENA_SIZE 1048
|
||||||
#define MAX_ARENA_SIZE (2048*16)
|
#define MAX_ARENA_SIZE (2048*16)
|
||||||
@ -99,102 +97,6 @@ CreateNewArena(CELL *ptr, UInt size)
|
|||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if COROUTINING
|
|
||||||
|
|
||||||
/* pointer to top of an arena */
|
|
||||||
static inline attvar_record *
|
|
||||||
DelayArenaPt(Term arena)
|
|
||||||
{
|
|
||||||
return (attvar_record *)arena;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline UInt
|
|
||||||
DelayArenaSz(Term arena)
|
|
||||||
{
|
|
||||||
attvar_record *ptr = (attvar_record *)arena-1;
|
|
||||||
return 1+(ptr-(attvar_record *)ptr->Done);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
ResetDelayArena(Term old_delay_arena, Term *new_arenap)
|
|
||||||
{
|
|
||||||
attvar_record *min = (attvar_record *)*new_arenap;
|
|
||||||
Term base = min[-1].Done;
|
|
||||||
while (min < (attvar_record *)old_delay_arena) {
|
|
||||||
min->Value = (Term)(min-1);
|
|
||||||
min->Done = base;
|
|
||||||
RESET_VARIABLE(&min->Atts);
|
|
||||||
min++;
|
|
||||||
}
|
|
||||||
*new_arenap = old_delay_arena;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static Term
|
|
||||||
CreateDelayArena(attvar_record *max, attvar_record *min)
|
|
||||||
{
|
|
||||||
attvar_record *ptr = max;
|
|
||||||
while (ptr > min) {
|
|
||||||
--ptr;
|
|
||||||
ptr->Done = (CELL)min;
|
|
||||||
ptr->Value = (CELL)(ptr-1);
|
|
||||||
RESET_VARIABLE(&ptr->Atts);
|
|
||||||
}
|
|
||||||
RESET_VARIABLE(&(ptr->Value));
|
|
||||||
return (CELL)max;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Term
|
|
||||||
NewDelayArena(UInt size)
|
|
||||||
{
|
|
||||||
attvar_record *max = DelayTop(), *min = max-size;
|
|
||||||
Term out;
|
|
||||||
UInt howmuch;
|
|
||||||
|
|
||||||
while ((ADDR)min < Yap_GlobalBase+1024) {
|
|
||||||
UInt bsize = size*sizeof(attvar_record);
|
|
||||||
if ((howmuch = Yap_InsertInGlobal((CELL *)max, bsize))==0) {
|
|
||||||
Yap_Error(OUT_OF_STACK_ERROR,TermNil,"No Stack Space for Non-Backtrackable terms");
|
|
||||||
return TermNil;
|
|
||||||
}
|
|
||||||
max = DelayTop(), min = max-size;
|
|
||||||
}
|
|
||||||
out = CreateDelayArena(max, min);
|
|
||||||
SetDelayTop(min);
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Term
|
|
||||||
GrowDelayArena(Term *arenap, UInt old_size, UInt size, UInt arity)
|
|
||||||
{
|
|
||||||
Term arena = *arenap;
|
|
||||||
UInt howmuch;
|
|
||||||
|
|
||||||
DelayArenaOverflows++;
|
|
||||||
if (size == 0) {
|
|
||||||
if (old_size < 1024) {
|
|
||||||
size = old_size*2;
|
|
||||||
} else {
|
|
||||||
size = old_size+1024;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (size < 64) {
|
|
||||||
size = 64;
|
|
||||||
}
|
|
||||||
/* just make sure we are shifted up when we expand stacks */
|
|
||||||
XREGS[arity+1] = arena;
|
|
||||||
if ((howmuch = Yap_InsertInGlobal((CELL *)arena, (size-old_size)*sizeof(attvar_record)))==0) {
|
|
||||||
Yap_Error(OUT_OF_STACK_ERROR, TermNil, Yap_ErrorMessage);
|
|
||||||
return TermNil;
|
|
||||||
}
|
|
||||||
size = howmuch/sizeof(attvar_record)+old_size;
|
|
||||||
arena = XREGS[arity+1];
|
|
||||||
CreateDelayArena(DelayArenaPt(arena), DelayArenaPt(arena)-size);
|
|
||||||
return arena;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static Term
|
static Term
|
||||||
NewArena(UInt size, UInt arity, CELL *where)
|
NewArena(UInt size, UInt arity, CELL *where)
|
||||||
{
|
{
|
||||||
@ -247,9 +149,6 @@ void
|
|||||||
Yap_AllocateDefaultArena(Int gsize, Int attsize)
|
Yap_AllocateDefaultArena(Int gsize, Int attsize)
|
||||||
{
|
{
|
||||||
GlobalArena = NewArena(gsize, 2, NULL);
|
GlobalArena = NewArena(gsize, 2, NULL);
|
||||||
#if COROUTINING
|
|
||||||
GlobalDelayArena = NewDelayArena(attsize);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -314,6 +213,30 @@ GrowArena(Term arena, CELL *pt, UInt old_size, UInt size, UInt arity)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CELL *
|
||||||
|
Yap_GetFromArena(Term *arenap, UInt cells, UInt arity)
|
||||||
|
{
|
||||||
|
restart:
|
||||||
|
{
|
||||||
|
Term arena = *arenap;
|
||||||
|
CELL *max = ArenaLimit(arena);
|
||||||
|
CELL *base = ArenaPt(arena);
|
||||||
|
CELL *newH;
|
||||||
|
UInt old_sz = ArenaSz(arena), new_size;
|
||||||
|
|
||||||
|
if (base+cells > ASP-1024) {
|
||||||
|
if (!GrowArena(arena, max, old_sz, old_sz+sizeof(CELL)*1024, arity))
|
||||||
|
return NULL;
|
||||||
|
goto restart;
|
||||||
|
}
|
||||||
|
|
||||||
|
newH = base+cells;
|
||||||
|
new_size = old_sz - cells;
|
||||||
|
*arenap = CreateNewArena(newH, new_size);
|
||||||
|
return base;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
CloseArena(CELL *oldH, CELL *oldHB, CELL *oldASP, Term *oldArenaP, UInt old_size)
|
CloseArena(CELL *oldH, CELL *oldHB, CELL *oldASP, Term *oldArenaP, UInt old_size)
|
||||||
{
|
{
|
||||||
@ -349,53 +272,13 @@ clean_dirty_tr(tr_fr_ptr TR0) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if COROUTINING
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
CopyAttVar(CELL *orig, struct cp_frame **to_visit_ptr, CELL *res, Term *att_arenap)
|
copy_complex_term(register CELL *pt0, register CELL *pt0_end, int share, int copy_att_vars, CELL *ptf, CELL *HLow)
|
||||||
{
|
|
||||||
register attvar_record *attv = (attvar_record *)orig;
|
|
||||||
register attvar_record *newv;
|
|
||||||
struct cp_frame *to_visit = *to_visit_ptr;
|
|
||||||
CELL *vt;
|
|
||||||
|
|
||||||
/* add a new attributed variable */
|
|
||||||
if (DelayArenaSz(*att_arenap) < 8)
|
|
||||||
return FALSE;
|
|
||||||
newv = DelayArenaPt(*att_arenap);
|
|
||||||
newv--;
|
|
||||||
RESET_VARIABLE(&(newv->Value));
|
|
||||||
RESET_VARIABLE(&(newv->Done));
|
|
||||||
vt = &(attv->Atts);
|
|
||||||
to_visit->start_cp = vt-1;
|
|
||||||
to_visit->end_cp = vt;
|
|
||||||
if (IsVarTerm(attv->Atts)) {
|
|
||||||
newv->Atts = (CELL)H;
|
|
||||||
to_visit->to = H;
|
|
||||||
H++;
|
|
||||||
} else {
|
|
||||||
to_visit->to = &(newv->Atts);
|
|
||||||
}
|
|
||||||
to_visit->oldv = vt[-1];
|
|
||||||
/* you're coming from a variable */
|
|
||||||
to_visit->ground = FALSE;
|
|
||||||
*to_visit_ptr = to_visit+1;
|
|
||||||
*res = (CELL)&(newv->Done);
|
|
||||||
*att_arenap = (CELL)(newv);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static int
|
|
||||||
copy_complex_term(register CELL *pt0, register CELL *pt0_end, int share, int copy_att_vars, CELL *ptf, CELL *HLow, Term *att_arenap)
|
|
||||||
{
|
{
|
||||||
|
|
||||||
struct cp_frame *to_visit0, *to_visit = (struct cp_frame *)Yap_PreAllocCodeSpace();
|
struct cp_frame *to_visit0, *to_visit = (struct cp_frame *)Yap_PreAllocCodeSpace();
|
||||||
CELL *HB0 = HB;
|
CELL *HB0 = HB;
|
||||||
tr_fr_ptr TR0 = TR;
|
tr_fr_ptr TR0 = TR;
|
||||||
#ifdef COROUTINING
|
|
||||||
CELL *dvars = NULL;
|
|
||||||
#endif
|
|
||||||
int ground = TRUE;
|
int ground = TRUE;
|
||||||
|
|
||||||
HB = HLow;
|
HB = HLow;
|
||||||
@ -468,6 +351,7 @@ copy_complex_term(register CELL *pt0, register CELL *pt0_end, int share, int cop
|
|||||||
if (IsExtensionFunctor(f)) {
|
if (IsExtensionFunctor(f)) {
|
||||||
switch((CELL)f) {
|
switch((CELL)f) {
|
||||||
case (CELL)FunctorDBRef:
|
case (CELL)FunctorDBRef:
|
||||||
|
case (CELL)FunctorAttVar:
|
||||||
*ptf++ = d0;
|
*ptf++ = d0;
|
||||||
break;
|
break;
|
||||||
case (CELL)FunctorLongInt:
|
case (CELL)FunctorLongInt:
|
||||||
@ -571,45 +455,49 @@ copy_complex_term(register CELL *pt0, register CELL *pt0_end, int share, int cop
|
|||||||
*ptf++ = (CELL) ptd0;
|
*ptf++ = (CELL) ptd0;
|
||||||
} else {
|
} else {
|
||||||
#if COROUTINING
|
#if COROUTINING
|
||||||
if (IsAttachedTerm((CELL)ptd0) && copy_att_vars) {
|
if (IsAttVar(ptd0) && copy_att_vars) {
|
||||||
/* if unbound, call the standard copy term routine */
|
attvar_record *newv = (attvar_record *)H;
|
||||||
struct cp_frame *bp[1];
|
newv->AttFunc = FunctorAttVar;
|
||||||
|
RESET_VARIABLE(&newv->Done);
|
||||||
if (dvars == NULL) {
|
*ptf = AbsAttVar(newv);
|
||||||
dvars = (CELL *)DelayArenaPt(*att_arenap);
|
ptf++;
|
||||||
|
/* store the terms to visit */
|
||||||
|
#ifdef RATIONAL_TREES
|
||||||
|
if (to_visit+1 >= (struct cp_frame *)AuxSp) {
|
||||||
|
goto heap_overflow;
|
||||||
}
|
}
|
||||||
if (ptd0 < dvars &&
|
to_visit->start_cp = pt0;
|
||||||
ptd0 >= (CELL *)DelayArenaPt(*att_arenap)) {
|
to_visit->end_cp = pt0_end;
|
||||||
*ptf++ = (CELL) ptd0;
|
to_visit->to = ptf;
|
||||||
} else {
|
to_visit->oldv = *pt0;
|
||||||
tr_fr_ptr CurTR;
|
to_visit->ground = ground;
|
||||||
|
/* fool the system into thinking we had a variable there */
|
||||||
CurTR = TR;
|
*pt0 = AbsAppl(H);
|
||||||
bp[0] = to_visit;
|
to_visit ++;
|
||||||
HB = HB0;
|
#else
|
||||||
if (!CopyAttVar(ptd0, bp, ptf, att_arenap)) {
|
if (pt0 < pt0_end) {
|
||||||
goto delay_overflow;
|
if (to_visit ++ >= (CELL **)AuxSp) {
|
||||||
|
goto heap_overflow;
|
||||||
}
|
}
|
||||||
|
to_visit->start_cp = pt0;
|
||||||
|
to_visit->end_cp = pt0_end;
|
||||||
|
to_visit->to = ptf;
|
||||||
|
to_visit->ground = ground;
|
||||||
|
to_visit ++;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
pt0 = ptd0+(1-1);
|
||||||
|
pt0_end = ptd0 + (ATT_RECORD_ARITY-1);
|
||||||
|
/* store the functor for the new term */
|
||||||
|
ptf = H+2;
|
||||||
|
H = CellPtr(newv+1);
|
||||||
if (H > ASP - MIN_ARENA_SIZE) {
|
if (H > ASP - MIN_ARENA_SIZE) {
|
||||||
goto overflow;
|
goto overflow;
|
||||||
}
|
}
|
||||||
to_visit = bp[0];
|
|
||||||
HB = HLow;
|
|
||||||
ptf++;
|
|
||||||
if ((ADDR)TR > Yap_TrailTop-MIN_ARENA_SIZE)
|
|
||||||
goto trail_overflow;
|
|
||||||
Bind_and_Trail(ptd0, ptf[-1]);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
#endif
|
*ptf++ = d0;
|
||||||
/* first time we met this term */
|
|
||||||
RESET_VARIABLE(ptf);
|
|
||||||
if ((ADDR)TR > Yap_TrailTop-MIN_ARENA_SIZE)
|
|
||||||
goto trail_overflow;
|
|
||||||
Bind_and_Trail(ptd0, (CELL)ptf);
|
|
||||||
ptf++;
|
|
||||||
#ifdef COROUTINING
|
|
||||||
}
|
}
|
||||||
|
continue;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -666,64 +554,19 @@ copy_complex_term(register CELL *pt0, register CELL *pt0_end, int share, int cop
|
|||||||
#endif
|
#endif
|
||||||
reset_trail(TR0);
|
reset_trail(TR0);
|
||||||
return -2;
|
return -2;
|
||||||
|
|
||||||
|
|
||||||
#if COROUTINING
|
|
||||||
delay_overflow:
|
|
||||||
/* oops, we're in trouble */
|
|
||||||
H = HLow;
|
|
||||||
/* we've done it */
|
|
||||||
/* restore our nice, friendly, term to its original state */
|
|
||||||
HB = HB0;
|
|
||||||
#ifdef RATIONAL_TREES
|
|
||||||
while (to_visit > to_visit0) {
|
|
||||||
to_visit--;
|
|
||||||
pt0 = to_visit->start_cp;
|
|
||||||
pt0_end = to_visit->end_cp;
|
|
||||||
ptf = to_visit->to;
|
|
||||||
*pt0 = to_visit->oldv;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
reset_trail(TR0);
|
|
||||||
return -3;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
trail_overflow:
|
|
||||||
/* oops, we're in trouble */
|
|
||||||
H = HLow;
|
|
||||||
/* we've done it */
|
|
||||||
/* restore our nice, friendly, term to its original state */
|
|
||||||
HB = HB0;
|
|
||||||
#ifdef RATIONAL_TREES
|
|
||||||
while (to_visit > to_visit0) {
|
|
||||||
to_visit--;
|
|
||||||
pt0 = to_visit->start_cp;
|
|
||||||
pt0_end = to_visit->end_cp;
|
|
||||||
ptf = to_visit->to;
|
|
||||||
*pt0 = to_visit->oldv;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
reset_trail(TR0);
|
|
||||||
return -4;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static Term
|
static Term
|
||||||
CopyTermToArena(Term t, Term arena, int share, int copy_att_vars, UInt arity, Term *newarena, Term *att_arenap, UInt min_grow)
|
CopyTermToArena(Term t, Term arena, int share, int copy_att_vars, UInt arity, Term *newarena, UInt min_grow)
|
||||||
{
|
{
|
||||||
UInt old_size = ArenaSz(arena);
|
UInt old_size = ArenaSz(arena);
|
||||||
CELL *oldH = H;
|
CELL *oldH = H;
|
||||||
CELL *oldHB = HB;
|
CELL *oldHB = HB;
|
||||||
CELL *oldASP = ASP;
|
CELL *oldASP = ASP;
|
||||||
int res = 0;
|
int res = 0;
|
||||||
#if COROUTINING
|
|
||||||
Term old_delay_arena;
|
|
||||||
#endif
|
|
||||||
Term tn;
|
Term tn;
|
||||||
|
|
||||||
restart:
|
restart:
|
||||||
#if COROUTINING
|
|
||||||
old_delay_arena = *att_arenap;
|
|
||||||
#endif
|
|
||||||
t = Deref(t);
|
t = Deref(t);
|
||||||
if (IsVarTerm(t)) {
|
if (IsVarTerm(t)) {
|
||||||
ASP = ArenaLimit(arena);
|
ASP = ArenaLimit(arena);
|
||||||
@ -735,7 +578,7 @@ CopyTermToArena(Term t, Term arena, int share, int copy_att_vars, UInt arity, Te
|
|||||||
*H = t;
|
*H = t;
|
||||||
Hi = H+1;
|
Hi = H+1;
|
||||||
H += 2;
|
H += 2;
|
||||||
if ((res = copy_complex_term(Hi-2, Hi-1, share, copy_att_vars, Hi, Hi, att_arenap)) < 0)
|
if ((res = copy_complex_term(Hi-2, Hi-1, share, copy_att_vars, Hi, Hi)) < 0)
|
||||||
goto error_handler;
|
goto error_handler;
|
||||||
CloseArena(oldH, oldHB, oldASP, newarena, old_size);
|
CloseArena(oldH, oldHB, oldASP, newarena, old_size);
|
||||||
return Hi[0];
|
return Hi[0];
|
||||||
@ -768,7 +611,7 @@ CopyTermToArena(Term t, Term arena, int share, int copy_att_vars, UInt arity, Te
|
|||||||
Hi = H;
|
Hi = H;
|
||||||
tf = AbsPair(H);
|
tf = AbsPair(H);
|
||||||
H += 2;
|
H += 2;
|
||||||
if ((res = copy_complex_term(ap-1, ap+1, share, copy_att_vars, Hi, Hi, att_arenap)) < 0) {
|
if ((res = copy_complex_term(ap-1, ap+1, share, copy_att_vars, Hi, Hi)) < 0) {
|
||||||
goto error_handler;
|
goto error_handler;
|
||||||
}
|
}
|
||||||
CloseArena(oldH, oldHB, oldASP, newarena, old_size);
|
CloseArena(oldH, oldHB, oldASP, newarena, old_size);
|
||||||
@ -838,7 +681,7 @@ CopyTermToArena(Term t, Term arena, int share, int copy_att_vars, UInt arity, Te
|
|||||||
res = -1;
|
res = -1;
|
||||||
goto error_handler;
|
goto error_handler;
|
||||||
}
|
}
|
||||||
if ((res = copy_complex_term(ap, ap+ArityOfFunctor(f), share, copy_att_vars, HB0+1, HB0, att_arenap)) < 0) {
|
if ((res = copy_complex_term(ap, ap+ArityOfFunctor(f), share, copy_att_vars, HB0+1, HB0)) < 0) {
|
||||||
goto error_handler;
|
goto error_handler;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -848,14 +691,9 @@ CopyTermToArena(Term t, Term arena, int share, int copy_att_vars, UInt arity, Te
|
|||||||
error_handler:
|
error_handler:
|
||||||
H = HB;
|
H = HB;
|
||||||
CloseArena(oldH, oldHB, oldASP, newarena, old_size);
|
CloseArena(oldH, oldHB, oldASP, newarena, old_size);
|
||||||
#if COROUTINING
|
|
||||||
if (old_delay_arena != MkIntTerm(0))
|
|
||||||
ResetDelayArena(old_delay_arena, att_arenap);
|
|
||||||
#endif
|
|
||||||
XREGS[arity+1] = t;
|
XREGS[arity+1] = t;
|
||||||
XREGS[arity+2] = arena;
|
XREGS[arity+2] = arena;
|
||||||
XREGS[arity+3] = (CELL)newarena;
|
XREGS[arity+3] = (CELL)newarena;
|
||||||
XREGS[arity+4] = (CELL)att_arenap;
|
|
||||||
{
|
{
|
||||||
CELL *old_top = ArenaLimit(*newarena);
|
CELL *old_top = ArenaLimit(*newarena);
|
||||||
ASP = oldASP;
|
ASP = oldASP;
|
||||||
@ -865,29 +703,11 @@ CopyTermToArena(Term t, Term arena, int share, int copy_att_vars, UInt arity, Te
|
|||||||
case -1:
|
case -1:
|
||||||
if (arena == GlobalArena)
|
if (arena == GlobalArena)
|
||||||
GlobalArenaOverflows++;
|
GlobalArenaOverflows++;
|
||||||
if (!GrowArena(arena, old_top, old_size, min_grow, arity+4)) {
|
if (!GrowArena(arena, old_top, old_size, min_grow, arity+3)) {
|
||||||
Yap_Error(OUT_OF_STACK_ERROR, TermNil, Yap_ErrorMessage);
|
Yap_Error(OUT_OF_STACK_ERROR, TermNil, Yap_ErrorMessage);
|
||||||
return 0L;
|
return 0L;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#if COROUTINING
|
|
||||||
case -3:
|
|
||||||
/* handle delay arena overflow */
|
|
||||||
old_size = DelayArenaSz(*att_arenap);
|
|
||||||
|
|
||||||
if (!GrowDelayArena(att_arenap, old_size, 0L, arity+4)) {
|
|
||||||
Yap_Error(OUT_OF_STACK_ERROR, TermNil, Yap_ErrorMessage);
|
|
||||||
return 0L;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
case -4:
|
|
||||||
/* handle trail overflow */
|
|
||||||
if(!Yap_growtrail (sizeof(CELL) * 16 * 1024L, FALSE)) {
|
|
||||||
Yap_Error(OUT_OF_TRAIL_ERROR, TermNil, Yap_ErrorMessage);
|
|
||||||
return 0L;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default: /* temporary space overflow */
|
default: /* temporary space overflow */
|
||||||
if (!Yap_ExpandPreAllocCodeSpace(0,NULL,TRUE)) {
|
if (!Yap_ExpandPreAllocCodeSpace(0,NULL,TRUE)) {
|
||||||
Yap_Error(OUT_OF_AUXSPACE_ERROR, TermNil, Yap_ErrorMessage);
|
Yap_Error(OUT_OF_AUXSPACE_ERROR, TermNil, Yap_ErrorMessage);
|
||||||
@ -898,7 +718,6 @@ CopyTermToArena(Term t, Term arena, int share, int copy_att_vars, UInt arity, Te
|
|||||||
oldH = H;
|
oldH = H;
|
||||||
oldHB = HB;
|
oldHB = HB;
|
||||||
oldASP = ASP;
|
oldASP = ASP;
|
||||||
att_arenap = (Term *)XREGS[arity+4];
|
|
||||||
newarena = (CELL *)XREGS[arity+3];
|
newarena = (CELL *)XREGS[arity+3];
|
||||||
arena = Deref(XREGS[arity+2]);
|
arena = Deref(XREGS[arity+2]);
|
||||||
t = XREGS[arity+1];
|
t = XREGS[arity+1];
|
||||||
@ -1071,7 +890,7 @@ p_nb_setarg(void)
|
|||||||
}
|
}
|
||||||
if (pos < 1 || pos > arity)
|
if (pos < 1 || pos > arity)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
to = CopyTermToArena(ARG3, GlobalArena, FALSE, TRUE, 2, &GlobalArena, &GlobalDelayArena, garena_overflow_size(ArenaPt(GlobalArena)));
|
to = CopyTermToArena(ARG3, GlobalArena, FALSE, TRUE, 2, &GlobalArena, garena_overflow_size(ArenaPt(GlobalArena)));
|
||||||
if (to == 0L)
|
if (to == 0L)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
destp[pos] = to;
|
destp[pos] = to;
|
||||||
@ -1111,7 +930,7 @@ p_nb_set_shared_arg(void)
|
|||||||
}
|
}
|
||||||
if (pos < 1 || pos > arity)
|
if (pos < 1 || pos > arity)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
to = CopyTermToArena(ARG3, GlobalArena, TRUE, TRUE, 2, &GlobalArena, &GlobalDelayArena, garena_overflow_size(ArenaPt(GlobalArena)));
|
to = CopyTermToArena(ARG3, GlobalArena, TRUE, TRUE, 2, &GlobalArena, garena_overflow_size(ArenaPt(GlobalArena)));
|
||||||
if (to == 0L)
|
if (to == 0L)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
destp[pos] = to;
|
destp[pos] = to;
|
||||||
@ -1180,7 +999,7 @@ Yap_SetGlobalVal(Atom at, Term t0)
|
|||||||
Term to;
|
Term to;
|
||||||
GlobalEntry *ge;
|
GlobalEntry *ge;
|
||||||
ge = GetGlobalEntry(at);
|
ge = GetGlobalEntry(at);
|
||||||
to = CopyTermToArena(t0, GlobalArena, FALSE, TRUE, 2, &GlobalArena, &GlobalDelayArena, garena_overflow_size(ArenaPt(GlobalArena)));
|
to = CopyTermToArena(t0, GlobalArena, FALSE, TRUE, 2, &GlobalArena, garena_overflow_size(ArenaPt(GlobalArena)));
|
||||||
if (to == 0L)
|
if (to == 0L)
|
||||||
return to;
|
return to;
|
||||||
WRITE_LOCK(ge->GRWLock);
|
WRITE_LOCK(ge->GRWLock);
|
||||||
@ -1193,7 +1012,7 @@ Term
|
|||||||
Yap_SaveTerm(Term t0)
|
Yap_SaveTerm(Term t0)
|
||||||
{
|
{
|
||||||
Term to;
|
Term to;
|
||||||
to = CopyTermToArena(t0, GlobalArena, FALSE, TRUE, 2, &GlobalArena, &GlobalDelayArena, garena_overflow_size(ArenaPt(GlobalArena)));
|
to = CopyTermToArena(t0, GlobalArena, FALSE, TRUE, 2, &GlobalArena, garena_overflow_size(ArenaPt(GlobalArena)));
|
||||||
if (to == 0L)
|
if (to == 0L)
|
||||||
return to;
|
return to;
|
||||||
return to;
|
return to;
|
||||||
@ -1226,7 +1045,7 @@ p_nb_set_shared_val(void)
|
|||||||
return (FALSE);
|
return (FALSE);
|
||||||
}
|
}
|
||||||
ge = GetGlobalEntry(AtomOfTerm(t));
|
ge = GetGlobalEntry(AtomOfTerm(t));
|
||||||
to = CopyTermToArena(ARG2, GlobalArena, TRUE, TRUE, 2, &GlobalArena, &GlobalDelayArena, garena_overflow_size(ArenaPt(GlobalArena)));
|
to = CopyTermToArena(ARG2, GlobalArena, TRUE, TRUE, 2, &GlobalArena, garena_overflow_size(ArenaPt(GlobalArena)));
|
||||||
if (to == 0L)
|
if (to == 0L)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
WRITE_LOCK(ge->GRWLock);
|
WRITE_LOCK(ge->GRWLock);
|
||||||
@ -1463,9 +1282,6 @@ static Int
|
|||||||
nb_queue(UInt arena_sz)
|
nb_queue(UInt arena_sz)
|
||||||
{
|
{
|
||||||
Term queue_arena, queue, ar[5], *nar;
|
Term queue_arena, queue, ar[5], *nar;
|
||||||
#if COROUTINING
|
|
||||||
Term delay_queue_arena;
|
|
||||||
#endif
|
|
||||||
Term t = Deref(ARG1);
|
Term t = Deref(ARG1);
|
||||||
|
|
||||||
DepthArenas++;
|
DepthArenas++;
|
||||||
@ -1476,7 +1292,6 @@ nb_queue(UInt arena_sz)
|
|||||||
return (FunctorOfTerm(t) == FunctorNBQueue);
|
return (FunctorOfTerm(t) == FunctorNBQueue);
|
||||||
}
|
}
|
||||||
ar[QUEUE_ARENA] =
|
ar[QUEUE_ARENA] =
|
||||||
ar[QUEUE_DELAY_ARENA] =
|
|
||||||
ar[QUEUE_HEAD] =
|
ar[QUEUE_HEAD] =
|
||||||
ar[QUEUE_TAIL] =
|
ar[QUEUE_TAIL] =
|
||||||
ar[QUEUE_SIZE] =
|
ar[QUEUE_SIZE] =
|
||||||
@ -1484,24 +1299,6 @@ nb_queue(UInt arena_sz)
|
|||||||
queue = Yap_MkApplTerm(FunctorNBQueue,5,ar);
|
queue = Yap_MkApplTerm(FunctorNBQueue,5,ar);
|
||||||
if (!Yap_unify(queue,ARG1))
|
if (!Yap_unify(queue,ARG1))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
#if COROUTINING
|
|
||||||
{
|
|
||||||
UInt delay_arena_sz = 2;
|
|
||||||
if (DelayArenaOverflows) {
|
|
||||||
delay_arena_sz = ((attvar_record *)H0- DelayTop())/16;
|
|
||||||
if (delay_arena_sz <2)
|
|
||||||
delay_arena_sz = 2;
|
|
||||||
if (delay_arena_sz > 256)
|
|
||||||
delay_arena_sz = 256;
|
|
||||||
}
|
|
||||||
delay_queue_arena = NewDelayArena(delay_arena_sz);
|
|
||||||
if (delay_queue_arena == 0L) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
nar = RepAppl(Deref(ARG1))+1;
|
|
||||||
nar[QUEUE_DELAY_ARENA] = delay_queue_arena;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (arena_sz < 4*1024)
|
if (arena_sz < 4*1024)
|
||||||
arena_sz = 4*1024;
|
arena_sz = 4*1024;
|
||||||
queue_arena = NewArena(arena_sz,1,NULL);
|
queue_arena = NewArena(arena_sz,1,NULL);
|
||||||
@ -1581,19 +1378,6 @@ GetQueueArena(CELL *qd, char* caller)
|
|||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if COROUTINING
|
|
||||||
static void
|
|
||||||
RecoverDelayArena(Term delay_arena)
|
|
||||||
{
|
|
||||||
attvar_record *pt = DelayArenaPt(delay_arena),
|
|
||||||
*max = DelayTop();
|
|
||||||
if (max == pt-DelayArenaSz(delay_arena)) {
|
|
||||||
SetDelayTop(pt);
|
|
||||||
} else {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
RecoverArena(Term arena)
|
RecoverArena(Term arena)
|
||||||
{
|
{
|
||||||
@ -1622,10 +1406,6 @@ p_nb_queue_close(void)
|
|||||||
}
|
}
|
||||||
if (qp[QUEUE_ARENA] != MkIntTerm(0))
|
if (qp[QUEUE_ARENA] != MkIntTerm(0))
|
||||||
RecoverArena(qp[QUEUE_ARENA]);
|
RecoverArena(qp[QUEUE_ARENA]);
|
||||||
#if COROUTINING
|
|
||||||
if (qp[QUEUE_DELAY_ARENA] != MkIntTerm(0))
|
|
||||||
RecoverDelayArena(qp[QUEUE_DELAY_ARENA]);
|
|
||||||
#endif
|
|
||||||
if (qp[QUEUE_SIZE] == MkIntTerm(0)) {
|
if (qp[QUEUE_SIZE] == MkIntTerm(0)) {
|
||||||
return
|
return
|
||||||
Yap_unify(ARG3, ARG2);
|
Yap_unify(ARG3, ARG2);
|
||||||
@ -1635,7 +1415,6 @@ p_nb_queue_close(void)
|
|||||||
Yap_unify(ARG2, qp[QUEUE_HEAD]);
|
Yap_unify(ARG2, qp[QUEUE_HEAD]);
|
||||||
qp[-1] = (CELL)Yap_MkFunctor(AtomHeap,1);
|
qp[-1] = (CELL)Yap_MkFunctor(AtomHeap,1);
|
||||||
qp[QUEUE_ARENA] =
|
qp[QUEUE_ARENA] =
|
||||||
qp[QUEUE_DELAY_ARENA] =
|
|
||||||
qp[QUEUE_HEAD] =
|
qp[QUEUE_HEAD] =
|
||||||
qp[QUEUE_TAIL] = MkIntegerTerm(0);
|
qp[QUEUE_TAIL] = MkIntegerTerm(0);
|
||||||
return out;
|
return out;
|
||||||
@ -1662,7 +1441,7 @@ p_nb_queue_enqueue(void)
|
|||||||
} else {
|
} else {
|
||||||
min_size = 0L;
|
min_size = 0L;
|
||||||
}
|
}
|
||||||
to = CopyTermToArena(ARG2, arena, FALSE, TRUE, 2, qd+QUEUE_ARENA, qd+QUEUE_DELAY_ARENA, min_size);
|
to = CopyTermToArena(ARG2, arena, FALSE, TRUE, 2, qd+QUEUE_ARENA, min_size);
|
||||||
if (to == 0L)
|
if (to == 0L)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
qd = GetQueue(ARG1,"enqueue");
|
qd = GetQueue(ARG1,"enqueue");
|
||||||
@ -1811,9 +1590,6 @@ static Int
|
|||||||
p_nb_heap(void)
|
p_nb_heap(void)
|
||||||
{
|
{
|
||||||
Term heap_arena, heap, *ar, *nar;
|
Term heap_arena, heap, *ar, *nar;
|
||||||
#if COROUTINING
|
|
||||||
Term delay_heap_arena;
|
|
||||||
#endif
|
|
||||||
UInt hsize;
|
UInt hsize;
|
||||||
Term tsize = Deref(ARG1);
|
Term tsize = Deref(ARG1);
|
||||||
UInt arena_sz = (H-H0)/16;
|
UInt arena_sz = (H-H0)/16;
|
||||||
@ -1839,7 +1615,6 @@ p_nb_heap(void)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
ar = RepAppl(heap)+1;
|
ar = RepAppl(heap)+1;
|
||||||
ar[HEAP_ARENA] =
|
ar[HEAP_ARENA] =
|
||||||
ar[HEAP_DELAY_ARENA] =
|
|
||||||
ar[HEAP_SIZE] =
|
ar[HEAP_SIZE] =
|
||||||
MkIntTerm(0);
|
MkIntTerm(0);
|
||||||
ar[HEAP_MAX] = tsize;
|
ar[HEAP_MAX] = tsize;
|
||||||
@ -1851,19 +1626,6 @@ p_nb_heap(void)
|
|||||||
}
|
}
|
||||||
nar = RepAppl(Deref(ARG2))+1;
|
nar = RepAppl(Deref(ARG2))+1;
|
||||||
nar[HEAP_ARENA] = heap_arena;
|
nar[HEAP_ARENA] = heap_arena;
|
||||||
#if COROUTINING
|
|
||||||
arena_sz = ((attvar_record *)H0- DelayTop())/16;
|
|
||||||
if (arena_sz <2)
|
|
||||||
arena_sz = 2;
|
|
||||||
if (arena_sz > 256)
|
|
||||||
arena_sz = 256;
|
|
||||||
delay_heap_arena = NewDelayArena(arena_sz);
|
|
||||||
if (delay_heap_arena == 0L) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
nar = RepAppl(Deref(ARG2))+1;
|
|
||||||
nar[HEAP_DELAY_ARENA] = delay_heap_arena;
|
|
||||||
#endif
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1877,10 +1639,6 @@ p_nb_heap_close(void)
|
|||||||
qp = RepAppl(t)+1;
|
qp = RepAppl(t)+1;
|
||||||
if (qp[HEAP_ARENA] != MkIntTerm(0))
|
if (qp[HEAP_ARENA] != MkIntTerm(0))
|
||||||
RecoverArena(qp[HEAP_ARENA]);
|
RecoverArena(qp[HEAP_ARENA]);
|
||||||
#if COROUTINING
|
|
||||||
if (qp[HEAP_DELAY_ARENA] != MkIntTerm(0))
|
|
||||||
RecoverDelayArena(qp[HEAP_DELAY_ARENA]);
|
|
||||||
#endif
|
|
||||||
qp[-1] = (CELL)Yap_MkFunctor(AtomHeap,1);
|
qp[-1] = (CELL)Yap_MkFunctor(AtomHeap,1);
|
||||||
qp[0] = MkIntegerTerm(0);
|
qp[0] = MkIntegerTerm(0);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -1994,9 +1752,9 @@ p_nb_heap_add_to_heap(void)
|
|||||||
if (arena == 0L)
|
if (arena == 0L)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
mingrow = garena_overflow_size(ArenaPt(arena));
|
mingrow = garena_overflow_size(ArenaPt(arena));
|
||||||
key = CopyTermToArena(ARG2, arena, FALSE, TRUE, 3, qd+HEAP_ARENA, qd+HEAP_DELAY_ARENA, mingrow);
|
key = CopyTermToArena(ARG2, arena, FALSE, TRUE, 3, qd+HEAP_ARENA, mingrow);
|
||||||
arena = qd[HEAP_ARENA];
|
arena = qd[HEAP_ARENA];
|
||||||
to = CopyTermToArena(ARG3, arena, FALSE, TRUE, 3, qd+HEAP_ARENA, qd+HEAP_DELAY_ARENA, mingrow);
|
to = CopyTermToArena(ARG3, arena, FALSE, TRUE, 3, qd+HEAP_ARENA, mingrow);
|
||||||
if (key == 0 || to == 0L)
|
if (key == 0 || to == 0L)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
qd = GetHeap(ARG1,"add_to_heap");
|
qd = GetHeap(ARG1,"add_to_heap");
|
||||||
@ -2110,9 +1868,6 @@ static Int
|
|||||||
p_nb_beam(void)
|
p_nb_beam(void)
|
||||||
{
|
{
|
||||||
Term beam_arena, beam, *ar, *nar;
|
Term beam_arena, beam, *ar, *nar;
|
||||||
#if COROUTINING
|
|
||||||
Term delay_beam_arena;
|
|
||||||
#endif
|
|
||||||
UInt hsize;
|
UInt hsize;
|
||||||
Term tsize = Deref(ARG1);
|
Term tsize = Deref(ARG1);
|
||||||
UInt arena_sz = (H-H0)/16;
|
UInt arena_sz = (H-H0)/16;
|
||||||
@ -2137,7 +1892,6 @@ p_nb_beam(void)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
ar = RepAppl(beam)+1;
|
ar = RepAppl(beam)+1;
|
||||||
ar[HEAP_ARENA] =
|
ar[HEAP_ARENA] =
|
||||||
ar[HEAP_DELAY_ARENA] =
|
|
||||||
ar[HEAP_SIZE] =
|
ar[HEAP_SIZE] =
|
||||||
MkIntTerm(0);
|
MkIntTerm(0);
|
||||||
ar[HEAP_MAX] = tsize;
|
ar[HEAP_MAX] = tsize;
|
||||||
@ -2149,19 +1903,6 @@ p_nb_beam(void)
|
|||||||
}
|
}
|
||||||
nar = RepAppl(Deref(ARG2))+1;
|
nar = RepAppl(Deref(ARG2))+1;
|
||||||
nar[HEAP_ARENA] = beam_arena;
|
nar[HEAP_ARENA] = beam_arena;
|
||||||
#if COROUTINING
|
|
||||||
arena_sz = ((attvar_record *)H0- DelayTop())/16;
|
|
||||||
if (arena_sz <2)
|
|
||||||
arena_sz = 2;
|
|
||||||
if (arena_sz > 256)
|
|
||||||
arena_sz = 256;
|
|
||||||
delay_beam_arena = NewDelayArena(arena_sz);
|
|
||||||
if (delay_beam_arena == 0L) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
nar = RepAppl(Deref(ARG2))+1;
|
|
||||||
nar[HEAP_DELAY_ARENA] = delay_beam_arena;
|
|
||||||
#endif
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2397,9 +2138,9 @@ p_nb_beam_add_to_beam(void)
|
|||||||
if (arena == 0L)
|
if (arena == 0L)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
mingrow = garena_overflow_size(ArenaPt(arena));
|
mingrow = garena_overflow_size(ArenaPt(arena));
|
||||||
key = CopyTermToArena(ARG2, qd[HEAP_ARENA], FALSE, TRUE, 3, qd+HEAP_ARENA, qd+HEAP_DELAY_ARENA, mingrow);
|
key = CopyTermToArena(ARG2, qd[HEAP_ARENA], FALSE, TRUE, 3, qd+HEAP_ARENA, mingrow);
|
||||||
arena = qd[HEAP_ARENA];
|
arena = qd[HEAP_ARENA];
|
||||||
to = CopyTermToArena(ARG3, arena, FALSE, TRUE, 3, qd+HEAP_ARENA, qd+HEAP_DELAY_ARENA, mingrow);
|
to = CopyTermToArena(ARG3, arena, FALSE, TRUE, 3, qd+HEAP_ARENA, mingrow);
|
||||||
if (key == 0 || to == 0L)
|
if (key == 0 || to == 0L)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
qd = GetHeap(ARG1,"add_to_beam");
|
qd = GetHeap(ARG1,"add_to_beam");
|
||||||
|
Reference in New Issue
Block a user