ovfl
This commit is contained in:
parent
91a79d778b
commit
874f621477
16
C/globals.c
16
C/globals.c
@ -285,7 +285,6 @@ static Term GrowArena(Term arena, CELL *pt, size_t old_size, size_t size,
|
|||||||
if (size < 4*MIN_ARENA_SIZE) {
|
if (size < 4*MIN_ARENA_SIZE) {
|
||||||
size = 4*MIN_ARENA_SIZE;
|
size = 4*MIN_ARENA_SIZE;
|
||||||
}
|
}
|
||||||
exit_cell_space(cspace);
|
|
||||||
while (HR + size > ASP - MIN_ARENA_SIZE) {
|
while (HR + size > ASP - MIN_ARENA_SIZE) {
|
||||||
XREGS[arity + 1] = arena;
|
XREGS[arity + 1] = arena;
|
||||||
if (!Yap_gcl(size * sizeof(CELL), arity + 1, ENV, gc_P(P, CP))) {
|
if (!Yap_gcl(size * sizeof(CELL), arity + 1, ENV, gc_P(P, CP))) {
|
||||||
@ -295,10 +294,10 @@ static Term GrowArena(Term arena, CELL *pt, size_t old_size, size_t size,
|
|||||||
arena = XREGS[arity + 1];
|
arena = XREGS[arity + 1];
|
||||||
adjust_cps(size PASS_REGS);
|
adjust_cps(size PASS_REGS);
|
||||||
}
|
}
|
||||||
pt = ArenaLimit(arena)+1;
|
pt = ArenaLimit(arena);
|
||||||
sz = old_size + size;
|
sz = old_size + size;
|
||||||
if (pt == HR) {
|
if (pt == HR) {
|
||||||
HR += size+1;
|
HR += size;
|
||||||
HR[ - 1] = EndSpecials;
|
HR[ - 1] = EndSpecials;
|
||||||
} else {
|
} else {
|
||||||
if ((sz = Yap_InsertInGlobal(pt, size * sizeof(CELL))) == 0) {
|
if ((sz = Yap_InsertInGlobal(pt, size * sizeof(CELL))) == 0) {
|
||||||
@ -669,12 +668,13 @@ static Term CopyTermToArena(Term t, Term arena, bool share, bool copy_att_vars,
|
|||||||
size_t min_grow USES_REGS) {
|
size_t min_grow USES_REGS) {
|
||||||
size_t old_size = ArenaSz(arena);
|
size_t old_size = ArenaSz(arena);
|
||||||
cell_space_t cspace;
|
cell_space_t cspace;
|
||||||
enter_cell_space( & cspace);
|
|
||||||
int res = 0;
|
int res = 0;
|
||||||
Term tn;
|
Term tn;
|
||||||
|
int restarts = 0;
|
||||||
|
|
||||||
restart:
|
restart:
|
||||||
t = Deref(t);
|
t = Deref(t);
|
||||||
|
enter_cell_space( & cspace);
|
||||||
if (IsVarTerm(t)) {
|
if (IsVarTerm(t)) {
|
||||||
ASP = ArenaLimit(arena);
|
ASP = ArenaLimit(arena);
|
||||||
HR = HB = ArenaPt(arena);
|
HR = HB = ArenaPt(arena);
|
||||||
@ -819,6 +819,8 @@ error_handler:
|
|||||||
case -1:
|
case -1:
|
||||||
if (arena == LOCAL_GlobalArena)
|
if (arena == LOCAL_GlobalArena)
|
||||||
LOCAL_GlobalArenaOverflows++;
|
LOCAL_GlobalArenaOverflows++;
|
||||||
|
restarts++;
|
||||||
|
min_grow += (restarts < 16 ? 16*1024*restarts*restarts : 128*1024*1024);
|
||||||
if ((arena=GrowArena(arena, old_top, old_size, min_grow, arity + 3, &cspace PASS_REGS))==0) {
|
if ((arena=GrowArena(arena, old_top, old_size, min_grow, arity + 3, &cspace PASS_REGS))==0) {
|
||||||
Yap_Error(RESOURCE_ERROR_STACK, TermNil, LOCAL_ErrorMessage);
|
Yap_Error(RESOURCE_ERROR_STACK, TermNil, LOCAL_ErrorMessage);
|
||||||
return 0L;
|
return 0L;
|
||||||
@ -1678,8 +1680,10 @@ static Int p_nb_queue_enqueue(USES_REGS1) {
|
|||||||
if (!qd)
|
if (!qd)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
arena = GetQueueArena(qd, "enqueue");
|
arena = GetQueueArena(qd, "enqueue");
|
||||||
if (arena == 0L)
|
if (arena == 0L) {
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
if (IsPairTerm(qd[QUEUE_HEAD])) {
|
if (IsPairTerm(qd[QUEUE_HEAD])) {
|
||||||
min_size = ArenaPt(arena) - RepPair(qd[QUEUE_HEAD]);
|
min_size = ArenaPt(arena) - RepPair(qd[QUEUE_HEAD]);
|
||||||
} else {
|
} else {
|
||||||
|
6
C/grow.c
6
C/grow.c
@ -896,9 +896,6 @@ static_growglobal(size_t request, CELL **ptr, CELL *hsplit USES_REGS)
|
|||||||
Int size = request/sizeof(CELL);
|
Int size = request/sizeof(CELL);
|
||||||
char vb_msg1 = '\0', *vb_msg2;
|
char vb_msg1 = '\0', *vb_msg2;
|
||||||
bool do_grow = true;
|
bool do_grow = true;
|
||||||
|
|
||||||
printf("request=%ld at %p, shift %p, %ld <-> %ld\n",request, hsplit, ptr,hsplit-H0,HR-hsplit);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
request is the amount of memory we requesd, in bytes;
|
request is the amount of memory we requesd, in bytes;
|
||||||
base_move is the shift in global stacks we had to do
|
base_move is the shift in global stacks we had to do
|
||||||
@ -911,8 +908,6 @@ static_growglobal(size_t request, CELL **ptr, CELL *hsplit USES_REGS)
|
|||||||
if (hsplit < H0 ||
|
if (hsplit < H0 ||
|
||||||
hsplit > HR)
|
hsplit > HR)
|
||||||
return false;
|
return false;
|
||||||
if (hsplit == H0)
|
|
||||||
hsplit = NULL;
|
|
||||||
if (hsplit == HR && Unsigned(HR)+request < Unsigned(ASP)-StackGap( PASS_REGS1 )) {
|
if (hsplit == HR && Unsigned(HR)+request < Unsigned(ASP)-StackGap( PASS_REGS1 )) {
|
||||||
return request;
|
return request;
|
||||||
}
|
}
|
||||||
@ -1533,7 +1528,6 @@ UInt
|
|||||||
Yap_InsertInGlobal(CELL *where, size_t howmuch)
|
Yap_InsertInGlobal(CELL *where, size_t howmuch)
|
||||||
{
|
{
|
||||||
CACHE_REGS
|
CACHE_REGS
|
||||||
printf("where=%p, hm=%d\n",where,howmuch);
|
|
||||||
if ((howmuch = static_growglobal(howmuch, NULL, where PASS_REGS)) == 0)
|
if ((howmuch = static_growglobal(howmuch, NULL, where PASS_REGS)) == 0)
|
||||||
return 0;
|
return 0;
|
||||||
#ifdef TABLING
|
#ifdef TABLING
|
||||||
|
141
C/terms.c
141
C/terms.c
@ -82,25 +82,20 @@ typedef struct non_single_struct_t {
|
|||||||
|
|
||||||
#define WALK_COMPLEX_TERM__(LIST0, STRUCT0, PRIMI0) \
|
#define WALK_COMPLEX_TERM__(LIST0, STRUCT0, PRIMI0) \
|
||||||
\
|
\
|
||||||
int lvl = push_text_stack();\
|
reset:\
|
||||||
CELL *pt0, *pt0_end; \
|
lvl = push_text_stack();\
|
||||||
size_t auxsz = 1024 * sizeof(struct non_single_struct_t);\
|
to_visit0 = Malloc(auxsz); \
|
||||||
struct non_single_struct_t *to_visit0=NULL, *to_visit,* to_visit_max;\
|
pt0 = pt0_; pt0_end = pt0_end_; \
|
||||||
CELL *InitialH = HR;\
|
to_visit = to_visit0, \
|
||||||
tr_fr_ptr TR0 = TR;\
|
to_visit_max = to_visit + auxsz/sizeof(struct non_single_struct_t);\
|
||||||
if (TR > (tr_fr_ptr)LOCAL_TrailTop - 256) { \
|
\
|
||||||
|
if (TR > (tr_fr_ptr)LOCAL_TrailTop - 256) { \
|
||||||
/* Trail overflow */\
|
/* Trail overflow */\
|
||||||
goto trail_overflow;\
|
goto trail_overflow;\
|
||||||
}\
|
}\
|
||||||
if (HR + 1024 > ASP) { \
|
if (HR + 1024 > ASP) { \
|
||||||
goto global_overflow;\
|
goto global_overflow;\
|
||||||
}\
|
}\
|
||||||
reset:\
|
|
||||||
to_visit0 = Realloc(to_visit0,auxsz); \
|
|
||||||
pt0 = pt0_; pt0_end = pt0_end_; \
|
|
||||||
to_visit = to_visit0, \
|
|
||||||
to_visit_max = to_visit + auxsz/sizeof(struct non_single_struct_t);\
|
|
||||||
\
|
|
||||||
while (to_visit >= to_visit0) { \
|
while (to_visit >= to_visit0) { \
|
||||||
CELL d0; \
|
CELL d0; \
|
||||||
CELL *ptd0; \
|
CELL *ptd0; \
|
||||||
@ -193,7 +188,8 @@ aux_overflow : { \
|
|||||||
} \
|
} \
|
||||||
clean_tr(TR0 PASS_REGS); \
|
clean_tr(TR0 PASS_REGS); \
|
||||||
auxsz += auxsz;\
|
auxsz += auxsz;\
|
||||||
goto reset; }
|
pop_text_stack(lvl); \
|
||||||
|
goto reset; }
|
||||||
|
|
||||||
#define def_trail_overflow() \
|
#define def_trail_overflow() \
|
||||||
trail_overflow: { \
|
trail_overflow: { \
|
||||||
@ -221,6 +217,7 @@ global_overflow : { \
|
|||||||
*ptd0 = to_visit->d0; \
|
*ptd0 = to_visit->d0; \
|
||||||
} \
|
} \
|
||||||
clean_tr(TR0 PASS_REGS); \
|
clean_tr(TR0 PASS_REGS); \
|
||||||
|
pop_text_stack(lvl); \
|
||||||
HR = InitialH; \
|
HR = InitialH; \
|
||||||
LOCAL_Error_TYPE = RESOURCE_ERROR_STACK; \
|
LOCAL_Error_TYPE = RESOURCE_ERROR_STACK; \
|
||||||
size_t expand = 0L; \
|
size_t expand = 0L; \
|
||||||
@ -228,7 +225,7 @@ global_overflow : { \
|
|||||||
Yap_ThrowError(RESOURCE_ERROR_STACK, TermNil, sizeof(CELL)*(HR-H0)); \
|
Yap_ThrowError(RESOURCE_ERROR_STACK, TermNil, sizeof(CELL)*(HR-H0)); \
|
||||||
return false;\
|
return false;\
|
||||||
}\
|
}\
|
||||||
goto reset;\
|
goto reset;\
|
||||||
}
|
}
|
||||||
|
|
||||||
#define CYC_LIST \
|
#define CYC_LIST \
|
||||||
@ -261,6 +258,13 @@ if (IS_VISIT_MARKER) { \
|
|||||||
@brief routine to locate all variables in a term, and its applications */
|
@brief routine to locate all variables in a term, and its applications */
|
||||||
|
|
||||||
static Term cyclic_complex_term(CELL *pt0_, CELL *pt0_end_ USES_REGS) {
|
static Term cyclic_complex_term(CELL *pt0_, CELL *pt0_end_ USES_REGS) {
|
||||||
|
CELL *pt0, *pt0_end;
|
||||||
|
int lvl;
|
||||||
|
size_t auxsz = 1024 * sizeof(struct non_single_struct_t);
|
||||||
|
struct non_single_struct_t *to_visit0, *to_visit,* to_visit_max;
|
||||||
|
CELL *InitialH = HR;
|
||||||
|
tr_fr_ptr TR0 = TR;
|
||||||
|
|
||||||
WALK_COMPLEX_TERM__(CYC_LIST, CYC_APPL, {});
|
WALK_COMPLEX_TERM__(CYC_LIST, CYC_APPL, {});
|
||||||
/* leave an empty slot to fill in later */
|
/* leave an empty slot to fill in later */
|
||||||
END_WALK();
|
END_WALK();
|
||||||
@ -308,21 +312,22 @@ static Term BREAK_LOOP(CELL d0,struct non_single_struct_t *to_visit ) {
|
|||||||
static int cycles_in_complex_term( CELL *pt0_, CELL *pt0_end_ USES_REGS) {
|
static int cycles_in_complex_term( CELL *pt0_, CELL *pt0_end_ USES_REGS) {
|
||||||
|
|
||||||
CELL *pt0, *pt0_end;
|
CELL *pt0, *pt0_end;
|
||||||
int lvl = push_text_stack();
|
|
||||||
size_t auxsz = 1024 * sizeof(struct non_single_struct_t);
|
size_t auxsz = 1024 * sizeof(struct non_single_struct_t);
|
||||||
struct non_single_struct_t *to_visit0=NULL, *to_visit, *to_visit_max;
|
struct non_single_struct_t *to_visit0, *to_visit, *to_visit_max;
|
||||||
|
int lvl;
|
||||||
|
|
||||||
|
reset:
|
||||||
|
lvl = push_text_stack();
|
||||||
|
pt0 = pt0_, pt0_end = pt0_end_;
|
||||||
|
to_visit0 = Malloc(auxsz);
|
||||||
|
to_visit= to_visit0;
|
||||||
|
to_visit_max = to_visit0 + auxsz/sizeof(struct non_single_struct_t);
|
||||||
CELL *InitialH = HR;
|
CELL *InitialH = HR;
|
||||||
tr_fr_ptr TR0 = TR;
|
tr_fr_ptr TR0 = TR;
|
||||||
if (TR > (tr_fr_ptr)LOCAL_TrailTop - 256) { \
|
if (TR > (tr_fr_ptr)LOCAL_TrailTop - 256) { \
|
||||||
/* Trail overflow */\
|
/* Trail overflow */\
|
||||||
goto trail_overflow;\
|
goto trail_overflow;\
|
||||||
}\
|
}\
|
||||||
|
|
||||||
reset:
|
|
||||||
pt0 = pt0_, pt0_end = pt0_end_;
|
|
||||||
to_visit0 = Realloc(to_visit0,auxsz);
|
|
||||||
to_visit= to_visit0;
|
|
||||||
to_visit_max = to_visit0 + auxsz/sizeof(struct non_single_struct_t);
|
|
||||||
auxsz *= 2;
|
auxsz *= 2;
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
CELL *ptf;
|
CELL *ptf;
|
||||||
@ -467,6 +472,12 @@ static Int cycles_in_term(USES_REGS1) /* cyclic_term(+T) */
|
|||||||
@brief routine to locate all variables in a term, and its applications */
|
@brief routine to locate all variables in a term, and its applications */
|
||||||
|
|
||||||
static bool ground_complex_term(CELL * pt0_, CELL * pt0_end_ USES_REGS) {
|
static bool ground_complex_term(CELL * pt0_, CELL * pt0_end_ USES_REGS) {
|
||||||
|
CELL *pt0, *pt0_end;
|
||||||
|
int lvl;
|
||||||
|
size_t auxsz = 1024 * sizeof(struct non_single_struct_t);
|
||||||
|
struct non_single_struct_t *to_visit0, *to_visit,* to_visit_max;
|
||||||
|
CELL *InitialH = HR;
|
||||||
|
tr_fr_ptr TR0 = TR;
|
||||||
|
|
||||||
WALK_COMPLEX_TERM();
|
WALK_COMPLEX_TERM();
|
||||||
/* leave an empty slot to fill in later */
|
/* leave an empty slot to fill in later */
|
||||||
@ -515,6 +526,12 @@ static Int ground(USES_REGS1) /* ground(+T) */
|
|||||||
|
|
||||||
static Int var_in_complex_term(CELL *pt0_, CELL *pt0_end_ ,
|
static Int var_in_complex_term(CELL *pt0_, CELL *pt0_end_ ,
|
||||||
Term v USES_REGS) {
|
Term v USES_REGS) {
|
||||||
|
CELL *pt0, *pt0_end;
|
||||||
|
int lvl;
|
||||||
|
size_t auxsz = 1024 * sizeof(struct non_single_struct_t);
|
||||||
|
struct non_single_struct_t *to_visit0, *to_visit,* to_visit_max;
|
||||||
|
CELL *InitialH = HR;
|
||||||
|
tr_fr_ptr TR0 = TR;
|
||||||
|
|
||||||
WALK_COMPLEX_TERM();
|
WALK_COMPLEX_TERM();
|
||||||
|
|
||||||
@ -596,7 +613,14 @@ static Term vars_in_complex_term(CELL *pt0_, CELL *pt0_end_ ,
|
|||||||
}
|
}
|
||||||
|
|
||||||
CELL output = AbsPair(HR);
|
CELL output = AbsPair(HR);
|
||||||
WALK_COMPLEX_TERM();
|
CELL *pt0, *pt0_end;
|
||||||
|
int lvl;
|
||||||
|
size_t auxsz = 1024 * sizeof(struct non_single_struct_t);
|
||||||
|
struct non_single_struct_t *to_visit0, *to_visit,* to_visit_max;
|
||||||
|
CELL *InitialH = HR;
|
||||||
|
tr_fr_ptr TR0 = TR;
|
||||||
|
|
||||||
|
WALK_COMPLEX_TERM();
|
||||||
/* do or pt2 are unbound */
|
/* do or pt2 are unbound */
|
||||||
|
|
||||||
if (HR + 1024 > ASP) {
|
if (HR + 1024 > ASP) {
|
||||||
@ -756,6 +780,12 @@ typedef struct att_rec {
|
|||||||
|
|
||||||
static Term attvars_in_complex_term(
|
static Term attvars_in_complex_term(
|
||||||
CELL *pt0_, CELL *pt0_end_ , Term inp USES_REGS) {
|
CELL *pt0_, CELL *pt0_end_ , Term inp USES_REGS) {
|
||||||
|
CELL *pt0, *pt0_end;
|
||||||
|
int lvl;
|
||||||
|
size_t auxsz = 1024 * sizeof(struct non_single_struct_t);
|
||||||
|
struct non_single_struct_t *to_visit0, *to_visit,* to_visit_max;
|
||||||
|
CELL *InitialH = HR;
|
||||||
|
tr_fr_ptr TR0 = TR;
|
||||||
CELL output = inp;
|
CELL output = inp;
|
||||||
WALK_COMPLEX_TERM();
|
WALK_COMPLEX_TERM();
|
||||||
if (IsAttVar(ptd0)) {
|
if (IsAttVar(ptd0)) {
|
||||||
@ -821,27 +851,36 @@ static Int term_attvars(USES_REGS1) /* variables in term t */
|
|||||||
*/
|
*/
|
||||||
static Term new_vars_in_complex_term(
|
static Term new_vars_in_complex_term(
|
||||||
CELL *pt0_, CELL *pt0_end_ , Term inp USES_REGS) {
|
CELL *pt0_, CELL *pt0_end_ , Term inp USES_REGS) {
|
||||||
|
CELL *pt0, *pt0_end;
|
||||||
|
int lvl;
|
||||||
|
size_t auxsz = 1024 * sizeof(struct non_single_struct_t);
|
||||||
|
struct non_single_struct_t *to_visit0, *to_visit,* to_visit_max;
|
||||||
|
CELL *InitialH = HR;
|
||||||
|
tr_fr_ptr TR0 = TR;
|
||||||
Int n=0;
|
Int n=0;
|
||||||
CELL output = TermNil;
|
CELL output = TermNil;
|
||||||
{
|
Term inp0 = inp;
|
||||||
int lvl = push_text_stack();
|
|
||||||
while (!IsVarTerm(inp) && IsPairTerm(inp)) {
|
while (!IsVarTerm(inp) && IsPairTerm(inp)) {
|
||||||
Term t = HeadOfTerm(inp);
|
Term t = HeadOfTerm(inp);
|
||||||
if (IsVarTerm(t)) {
|
if (IsVarTerm(t)) {
|
||||||
n++;
|
n++;
|
||||||
TrailTerm(TR++) = t;
|
TrailTerm(TR++) = t;
|
||||||
*VarOfTerm(t) = TermFoundVar;
|
*VarOfTerm(t) = TermFoundVar;
|
||||||
if ((tr_fr_ptr)LOCAL_TrailTop - TR < 1024) {
|
if ((tr_fr_ptr)LOCAL_TrailTop - TR < 1024) {
|
||||||
|
size_t expand = (tr_fr_ptr)LOCAL_TrailTop - TR;
|
||||||
if (!Yap_growtrail(n * sizeof(tr_fr_ptr *), true)) {
|
clean_tr(TR0 PASS_REGS);
|
||||||
goto trail_overflow;
|
*HR++ = inp0;
|
||||||
}
|
/* Trail overflow */
|
||||||
}
|
if (!Yap_growtrail(expand, false)) {
|
||||||
}
|
Yap_ThrowError(RESOURCE_ERROR_TRAIL, TermNil, expand);
|
||||||
inp = TailOfTerm(inp);
|
}
|
||||||
}
|
inp = *--HR;
|
||||||
pop_text_stack(lvl);
|
continue;
|
||||||
}
|
}
|
||||||
|
inp = TailOfTerm(inp);
|
||||||
|
}
|
||||||
|
}
|
||||||
WALK_COMPLEX_TERM();
|
WALK_COMPLEX_TERM();
|
||||||
output = MkPairTerm((CELL)ptd0, output);
|
output = MkPairTerm((CELL)ptd0, output);
|
||||||
TrailTerm(TR++) = *ptd0;
|
TrailTerm(TR++) = *ptd0;
|
||||||
@ -904,6 +943,12 @@ static Term vars_within_complex_term(
|
|||||||
CELL *pt0_, CELL *pt0_end_, Term inp USES_REGS) {
|
CELL *pt0_, CELL *pt0_end_, Term inp USES_REGS) {
|
||||||
Int n=0;
|
Int n=0;
|
||||||
CELL output = AbsPair(HR);
|
CELL output = AbsPair(HR);
|
||||||
|
CELL *pt0, *pt0_end;
|
||||||
|
int lvl;
|
||||||
|
size_t auxsz = 1024 * sizeof(struct non_single_struct_t);
|
||||||
|
struct non_single_struct_t *to_visit0, *to_visit,* to_visit_max;
|
||||||
|
CELL *InitialH = HR;
|
||||||
|
tr_fr_ptr TR0 = TR;
|
||||||
|
|
||||||
while (!IsVarTerm(inp) && IsPairTerm(inp)) {
|
while (!IsVarTerm(inp) && IsPairTerm(inp)) {
|
||||||
Term t = HeadOfTerm(inp);
|
Term t = HeadOfTerm(inp);
|
||||||
@ -1012,6 +1057,12 @@ return Yap_unify(ARG2, t) && Yap_unify(ARG3, out);
|
|||||||
|
|
||||||
static Term non_singletons_in_complex_term(CELL * pt0_,
|
static Term non_singletons_in_complex_term(CELL * pt0_,
|
||||||
CELL * pt0_end_ USES_REGS) {
|
CELL * pt0_end_ USES_REGS) {
|
||||||
|
CELL *pt0, *pt0_end;
|
||||||
|
int lvl;
|
||||||
|
size_t auxsz = 1024 * sizeof(struct non_single_struct_t);
|
||||||
|
struct non_single_struct_t *to_visit0, *to_visit,* to_visit_max;
|
||||||
|
CELL *InitialH = HR;
|
||||||
|
tr_fr_ptr TR0 = TR;
|
||||||
|
|
||||||
WALK_COMPLEX_TERM__({}, {}, FOUND_VAR_AGAIN());
|
WALK_COMPLEX_TERM__({}, {}, FOUND_VAR_AGAIN());
|
||||||
/* do or pt2 are unbound */
|
/* do or pt2 are unbound */
|
||||||
@ -1080,6 +1131,12 @@ if (singles) { \
|
|||||||
|
|
||||||
static Int numbervars_in_complex_term(CELL * pt0_, CELL * pt0_end_, Int numbv,
|
static Int numbervars_in_complex_term(CELL * pt0_, CELL * pt0_end_, Int numbv,
|
||||||
int singles USES_REGS) {
|
int singles USES_REGS) {
|
||||||
|
CELL *pt0, *pt0_end;
|
||||||
|
int lvl;
|
||||||
|
size_t auxsz = 1024 * sizeof(struct non_single_struct_t);
|
||||||
|
struct non_single_struct_t *to_visit0, *to_visit,* to_visit_max;
|
||||||
|
CELL *InitialH = HR;
|
||||||
|
tr_fr_ptr TR0 = TR;
|
||||||
|
|
||||||
WALK_COMPLEX_TERM__({}, {}, {});
|
WALK_COMPLEX_TERM__({}, {}, {});
|
||||||
|
|
||||||
@ -1162,6 +1219,12 @@ if (FunctorOfTerm(d0) == FunctorDollarVar) { \
|
|||||||
|
|
||||||
static int max_numbered_var(CELL * pt0_, CELL * pt0_end_,
|
static int max_numbered_var(CELL * pt0_, CELL * pt0_end_,
|
||||||
Int * maxp USES_REGS) {
|
Int * maxp USES_REGS) {
|
||||||
|
CELL *pt0, *pt0_end;
|
||||||
|
int lvl;
|
||||||
|
size_t auxsz = 1024 * sizeof(struct non_single_struct_t);
|
||||||
|
struct non_single_struct_t *to_visit0, *to_visit,* to_visit_max;
|
||||||
|
CELL *InitialH = HR;
|
||||||
|
tr_fr_ptr TR0 = TR;
|
||||||
|
|
||||||
WALK_COMPLEX_TERM__({}, MAX_NUMBERED, {});
|
WALK_COMPLEX_TERM__({}, MAX_NUMBERED, {});
|
||||||
END_WALK();
|
END_WALK();
|
||||||
|
3
C/text.c
3
C/text.c
@ -195,7 +195,8 @@ void *Realloc(void *pt, size_t sz USES_REGS) {
|
|||||||
if (!pt)
|
if (!pt)
|
||||||
return Malloc(sz PASS_REGS);
|
return Malloc(sz PASS_REGS);
|
||||||
old--;
|
old--;
|
||||||
sz = ALIGN_BY_TYPE(sz + sizeof(struct mblock), Yap_Max(CELLSIZE,sizeof(struct mblock)));
|
sz = ALIGN_BY_TYPE(sz, Yap_Max(CELLSIZE,sizeof(struct mblock)));
|
||||||
|
sz += 2*sizeof(struct mblock);
|
||||||
o = realloc(old, sz);
|
o = realloc(old, sz);
|
||||||
if (o->next) {
|
if (o->next) {
|
||||||
o->next->prev = o;
|
o->next->prev = o;
|
||||||
|
@ -151,7 +151,8 @@ clean_complex_tr(tr_fr_ptr TR0 USES_REGS) {
|
|||||||
|
|
||||||
#define expand_stack(S0,SP,SF,TYPE) \
|
#define expand_stack(S0,SP,SF,TYPE) \
|
||||||
{ size_t sz = SF-S0, used = SP-S0; \
|
{ size_t sz = SF-S0, used = SP-S0; \
|
||||||
S0 = Realloc(S0, (1024+sz)*sizeof(TYPE) PASS_REGS); \
|
sz += 1024;\
|
||||||
|
S0 = Realloc(S0, sz*sizeof(TYPE) PASS_REGS); \
|
||||||
SP = S0+used; SF = S0+sz; }
|
SP = S0+used; SF = S0+sz; }
|
||||||
|
|
||||||
#define MIN_ARENA_SIZE (1048L)
|
#define MIN_ARENA_SIZE (1048L)
|
||||||
@ -206,6 +207,8 @@ int Yap_copy_complex_term(register CELL *pt0, register CELL *pt0_end,
|
|||||||
to_visit++;
|
to_visit++;
|
||||||
// move to new list
|
// move to new list
|
||||||
d0 = *headp;
|
d0 = *headp;
|
||||||
|
if ((ADDR)TR > LOCAL_TrailTop - MIN_ARENA_SIZE)
|
||||||
|
goto trail_overflow;
|
||||||
TrailedMaBind(headp, AbsPair(HR));
|
TrailedMaBind(headp, AbsPair(HR));
|
||||||
pt0 = headp;
|
pt0 = headp;
|
||||||
pt0_end = headp + 1;
|
pt0_end = headp + 1;
|
||||||
@ -305,6 +308,8 @@ int Yap_copy_complex_term(register CELL *pt0, register CELL *pt0_end,
|
|||||||
if (++to_visit >= to_visit_max-32) {
|
if (++to_visit >= to_visit_max-32) {
|
||||||
expand_stack(to_visit0, to_visit, to_visit_max, struct cp_frame);
|
expand_stack(to_visit0, to_visit, to_visit_max, struct cp_frame);
|
||||||
}
|
}
|
||||||
|
if ((ADDR)TR > LOCAL_TrailTop - MIN_ARENA_SIZE)
|
||||||
|
goto trail_overflow;
|
||||||
TrailedMaBind(headp,AbsAppl(HR));
|
TrailedMaBind(headp,AbsAppl(HR));
|
||||||
ptf = HR;
|
ptf = HR;
|
||||||
*ptf++ = (CELL)f;
|
*ptf++ = (CELL)f;
|
||||||
@ -344,18 +349,14 @@ int Yap_copy_complex_term(register CELL *pt0, register CELL *pt0_end,
|
|||||||
}
|
}
|
||||||
to_visit = bp;
|
to_visit = bp;
|
||||||
new = *ptf;
|
new = *ptf;
|
||||||
if (TR > (tr_fr_ptr)LOCAL_TrailTop - 256) {
|
if ((ADDR)TR > LOCAL_TrailTop - MIN_ARENA_SIZE)
|
||||||
/* Trail overflow */
|
goto trail_overflow;
|
||||||
if (!Yap_growtrail((TR - TR0) * sizeof(tr_fr_ptr *), TRUE)) {
|
|
||||||
goto trail_overflow;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
TrailedMaBind(ptd0, new);
|
TrailedMaBind(ptd0, new);
|
||||||
ptf++;
|
ptf++;
|
||||||
} else {
|
} else {
|
||||||
/* first time we met this term */
|
/* first time we met this term */
|
||||||
RESET_VARIABLE(ptf);
|
RESET_VARIABLE(ptf);
|
||||||
if ((ADDR)TR > LOCAL_TrailTop - MIN_ARENA_SIZE)
|
if ((ADDR)TR > LOCAL_TrailTop - MIN_ARENA_SIZE)
|
||||||
goto trail_overflow;
|
goto trail_overflow;
|
||||||
TrailedMaBind(ptd0, (CELL)ptf);
|
TrailedMaBind(ptd0, (CELL)ptf);
|
||||||
ptf++;
|
ptf++;
|
||||||
|
Reference in New Issue
Block a user