Merge branch 'master' of ssh://ssh.dcc.fc.up.pt:31064/home/vsc/yap

This commit is contained in:
Vitor Santos Costa 2019-01-26 12:49:32 +00:00
commit 5ec9e31eb9
4 changed files with 62 additions and 291 deletions

View File

@ -331,27 +331,6 @@ static void CloseArena(CELL *oldH, CELL *oldHB, CELL *oldASP, Term *oldArenaP,
ASP = oldASP;
}
static inline void clean_dirty_tr(tr_fr_ptr TR0 USES_REGS) {
if (TR != TR0) {
tr_fr_ptr pt = TR0;
do {
Term p = TrailTerm(pt++);
if (IsVarTerm(p)) {
RESET_VARIABLE(p);
} else {
/* copy downwards */
TrailTerm(TR0 + 1) = TrailTerm(pt);
TrailTerm(TR0) = TrailTerm(TR0 + 2) = p;
pt += 2;
TR0 += 3;
}
} while (pt != TR);
TR = TR0;
}
}
static Term CopyTermToArena(Term t, Term arena, bool share, bool copy_att_vars,
UInt arity, Term *newarena,
size_t min_grow USES_REGS) {
@ -394,106 +373,20 @@ static Term CopyTermToArena(Term t, Term arena, bool share, bool copy_att_vars,
return tn;
} else if (IsAtomOrIntTerm(t)) {
return t;
} else if (IsPairTerm(t)) {
Term tf;
CELL *ap;
} else {
CELL *Hi;
if (share && ArenaPt(arena) > RepPair(t)) {
return t;
}
Hi = HR;
HR++;
oldH = HR;
HR = HB = ArenaPt(arena);
ASP = ArenaLimit(arena);
ap = RepPair(t);
Hi = HR;
tf = AbsPair(HR);
HR += 2;
if ((res = Yap_copy_complex_term(ap - 1, ap + 1, share, NULL, copy_att_vars, Hi,
Hi PASS_REGS)) < 0) {
if ((res = Yap_copy_complex_term(&t - 1, &t, share, NULL, copy_att_vars, Hi,
HR PASS_REGS)) < 0) {
goto error_handler;
}
CloseArena(oldH, oldHB, oldASP, newarena, old_size PASS_REGS);
return tf;
} else {
Functor f;
Term tf;
CELL *HB0;
CELL *ap;
if (share && ArenaPt(arena) > RepAppl(t)) {
return t;
}
HR = HB = ArenaPt(arena);
ASP = ArenaLimit(arena);
f = FunctorOfTerm(t);
HB0 = HR;
ap = RepAppl(t);
tf = AbsAppl(HR);
HR[0] = (CELL)f;
if (IsExtensionFunctor(f)) {
switch ((CELL)f) {
case (CELL) FunctorDBRef:
CloseArena(oldH, oldHB, oldASP, newarena, old_size PASS_REGS);
return t;
case (CELL) FunctorLongInt:
if (HR > ASP - (MIN_ARENA_SIZE + 3)) {
res = -1;
goto error_handler;
}
HR[1] = ap[1];
HR[2] = EndSpecials;
HR += 3;
break;
case (CELL) FunctorDouble:
if (HR > ASP - (MIN_ARENA_SIZE + (2 + SIZEOF_DOUBLE / sizeof(CELL)))) {
res = -1;
goto error_handler;
}
HR[1] = ap[1];
#if SIZEOF_DOUBLE == 2 * SIZEOF_INT_P
HR[2] = ap[2];
HR[3] = EndSpecials;
HR += 4;
#else
HR[2] = EndSpecials;
HR += 3;
#endif
break;
case (CELL) FunctorString:
if (HR > ASP - (MIN_ARENA_SIZE + 3 + ap[1])) {
res = -1;
goto error_handler;
}
memmove(HR, ap, sizeof(CELL) * (3 + ap[1]));
HR += ap[1] + 3;
break;
default: {
UInt sz = ArenaSz(t), i;
if (HR > ASP - (MIN_ARENA_SIZE + sz)) {
res = -1;
goto error_handler;
}
for (i = 1; i < sz; i++) {
HR[i] = ap[i];
}
HR += sz;
}
}
} else {
HR += 1 + ArityOfFunctor(f);
if (HR > ASP - MIN_ARENA_SIZE) {
res = -1;
goto error_handler;
}
if ((res = Yap_copy_complex_term(ap, ap + ArityOfFunctor(f), share,
NULL, copy_att_vars, HB0 + 1, HB0 PASS_REGS)) <
0) {
goto error_handler;
}
}
CloseArena(oldH, oldHB, oldASP, newarena, old_size PASS_REGS);
return tf;
return Hi[0];
}
error_handler:
HR = HB;

View File

@ -266,7 +266,6 @@ int Yap_copy_complex_term(register CELL *pt0, register CELL *pt0_end,
continue;
}
*ptf = AbsPair(HR);
ptf++;
if (to_visit >= to_visit_max-32) {
expand_stack(to_visit0, to_visit, to_visit_max, struct cp_frame);
}
@ -274,7 +273,7 @@ int Yap_copy_complex_term(register CELL *pt0, register CELL *pt0_end,
to_visit->end_cp = pt0_end;
to_visit->to = ptf;
to_visit->curp = headp;
to_visit->oldv = head;
d0 = to_visit->oldv = head;
to_visit->ground = ground;
to_visit++;
// move to new list
@ -469,7 +468,6 @@ int Yap_copy_complex_term(register CELL *pt0, register CELL *pt0_end,
DO_TRAIL(ptd0, (CELL)ptf);
*ptd0 = (CELL)ptf;
ptf++;
continue;
}
}
@ -567,85 +565,27 @@ static Term
CopyTerm(Term inp, UInt arity, int share, int newattvs USES_REGS) {
Term t = Deref(inp);
tr_fr_ptr TR0 = TR;
if (IsVarTerm(t)) {
#if COROUTINING
if (newattvs && IsAttachedTerm(t)) {
CELL *Hi;
int res;
restart_attached:
*HR = t;
Hi = HR+1;
HR += 2;
if ((res = Yap_copy_complex_term(Hi-2, Hi-1, share, NULL, newattvs, Hi, Hi PASS_REGS)) < 0) {
HR = Hi-1;
if ((t = handle_cp_overflow(res, TR0, arity, t))== 0L)
return FALSE;
goto restart_attached;
}
return Hi[0];
}
#endif
return MkVarTerm();
} else if (IsPrimitiveTerm(t)) {
return t;
} else if (IsPairTerm(t)) {
Term tf;
CELL *ap;
CELL *Hi;
restart_list:
ap = RepPair(t);
if (IsPrimitiveTerm(t)) {
return t;
}
while( true ) {
int res;
Hi = HR;
tf = AbsPair(HR);
HR += 2;
{
int res;
if ((res = Yap_copy_complex_term(ap-1, ap+1, share, NULL, newattvs, Hi, Hi PASS_REGS)) < 0) {
HR ++;
if ((res = Yap_copy_complex_term((&t)-1, &t, share, NULL, newattvs, Hi, HR PASS_REGS)) < 0) {
HR = Hi;
if ((t = handle_cp_overflow(res, TR0, arity, t))== 0L)
return FALSE;
goto restart_list;
} else if (res && share) {
HR = Hi;
return t;
}
return Hi[0];
}
return tf;
} else {
Functor f = FunctorOfTerm(t);
Term tf;
CELL *HB0;
CELL *ap;
restart_appl:
f = FunctorOfTerm(t);
HB0 = HR;
ap = RepAppl(t);
tf = AbsAppl(HR);
HR[0] = (CELL)f;
HR += 1+ArityOfFunctor(f);
if (HR > ASP-128) {
HR = HB0;
if ((t = handle_cp_overflow(-1, TR0, arity, t))== 0L)
return FALSE;
goto restart_appl;
} else {
int res;
if ((res = Yap_copy_complex_term(ap, ap+ArityOfFunctor(f), share, NULL, newattvs, HB0+1, HB0 PASS_REGS)) < 0) {
HR = HB0;
if ((t = handle_cp_overflow(res, TR0, arity, t))== 0L)
return FALSE;
goto restart_appl;
} else if (res && share && FunctorOfTerm(t) != FunctorMutable) {
HR = HB0;
return t;
}
}
return tf;
}
return 0;
}
Term
@ -1870,25 +1810,9 @@ p_variables_in_term( USES_REGS1 ) /* variables in term t */
}
do {
Term t = Deref(ARG1);
if (IsVarTerm(t)) {
out = AbsPair(HR);
HR += 2;
RESET_VARIABLE(HR-2);
RESET_VARIABLE(HR-1);
Yap_unify((CELL)(HR-2),ARG1);
Yap_unify((CELL)(HR-1),ARG2);
} else if (IsPrimitiveTerm(t))
out = ARG2;
else if (IsPairTerm(t)) {
out = vars_in_complex_term(&t-1,
&(t), ARG2 PASS_REGS);
}
else {
Functor f = FunctorOfTerm(t);
out = vars_in_complex_term(RepAppl(t),
RepAppl(t)+
ArityOfFunctor(f), ARG2 PASS_REGS);
}
out = vars_in_complex_term(&(t)-1,
&(t),
ARG2 PASS_REGS);
if (out == 0L) {
if (!expand_vts( 3 PASS_REGS ))
return FALSE;
@ -1902,6 +1826,7 @@ p_variables_in_term( USES_REGS1 ) /* variables in term t */
static Int
p_term_variables( USES_REGS1 ) /* variables in term t */
{
Term t = Deref(ARG1);
Term out;
if (!Yap_IsListOrPartialListTerm(ARG2)) {
@ -1937,17 +1862,11 @@ Yap_TermVariables( Term t, UInt arity USES_REGS ) /* variables in term t */
t = Deref(t);
if (IsVarTerm(t)) {
return MkPairTerm(t, TermNil);
} else if (IsPrimitiveTerm(t)) {
} else if (IsPrimitiveTerm(t)) {
return TermNil;
} else if (IsPairTerm(t)) {
out = vars_in_complex_term(RepPair(t)-1,
RepPair(t)+1, TermNil PASS_REGS);
}
else {
Functor f = FunctorOfTerm(t);
out = vars_in_complex_term(RepAppl(t),
RepAppl(t)+
ArityOfFunctor(f), TermNil PASS_REGS);
} else {
out = vars_in_complex_term(&(t)-1,
&(t), TermNil PASS_REGS);
}
if (out == 0L) {
if (!expand_vts( arity PASS_REGS ))
@ -2064,8 +1983,8 @@ p_term_attvars( USES_REGS1 ) /* variables in term t */
}
if (out == 0L) {
if (!expand_vts( 3 PASS_REGS ))
return FALSE;
}
return false;
}
} while (out == 0L);
return Yap_unify(ARG2,out);
}
@ -2085,15 +2004,9 @@ p_term_variables3( USES_REGS1 ) /* variables in term t */
Yap_unify(out, ARG2);
} else if (IsPrimitiveTerm(t)) {
return Yap_unify(ARG2, ARG3);
} else if (IsPairTerm(t)) {
out = vars_in_complex_term(RepPair(t)-1,
RepPair(t)+1, ARG3 PASS_REGS);
}
else {
Functor f = FunctorOfTerm(t);
out = vars_in_complex_term(RepAppl(t),
RepAppl(t)+
ArityOfFunctor(f), ARG3 PASS_REGS);
} else {
out = vars_in_complex_term(&(t)-1,
&(t), ARG3 PASS_REGS);
}
if (out == 0L) {
if (!expand_vts( 3 PASS_REGS ))
@ -2193,21 +2106,11 @@ p_variables_within_term( USES_REGS1 ) /* variables within term t */
do {
Term t = Deref(ARG2);
if (IsVarTerm(t)) {
out = vars_within_complex_term(VarOfTerm(t)-1,
VarOfTerm(t), Deref(ARG1) PASS_REGS);
} else if (IsPrimitiveTerm(t))
if (IsPrimitiveTerm(t))
out = TermNil;
else if (IsPairTerm(t)) {
out = vars_within_complex_term(RepPair(t)-1,
RepPair(t)+1, Deref(ARG1) PASS_REGS);
}
else {
Functor f = FunctorOfTerm(t);
out = vars_within_complex_term(RepAppl(t),
RepAppl(t)+
ArityOfFunctor(f), Deref(ARG1) PASS_REGS);
else {
out = vars_within_complex_term(&(t)-1,
&(t), Deref(ARG1) PASS_REGS);
}
if (out == 0L) {
if (!expand_vts( 3 PASS_REGS ))
@ -2311,21 +2214,11 @@ p_new_variables_in_term( USES_REGS1 ) /* variables within term t */
do {
Term t = Deref(ARG2);
if (IsVarTerm(t)) {
out = new_vars_in_complex_term(VarOfTerm(t)-1,
VarOfTerm(t), Deref(ARG1) PASS_REGS);
} else if (IsPrimitiveTerm(t))
if (IsPrimitiveTerm(t))
out = TermNil;
else if (IsPairTerm(t)) {
out = new_vars_in_complex_term(RepPair(t)-1,
RepPair(t)+1, Deref(ARG1) PASS_REGS);
}
else {
Functor f = FunctorOfTerm(t);
out = new_vars_in_complex_term(RepAppl(t),
RepAppl(t)+
ArityOfFunctor(f), Deref(ARG1) PASS_REGS);
else {
out = new_vars_in_complex_term(&(t)-1,
&(t), Deref(ARG1) PASS_REGS);
}
if (out == 0L) {
if (!expand_vts( 3 PASS_REGS ))
@ -2568,21 +2461,11 @@ p_free_variables_in_term( USES_REGS1 ) /* variables within term t */
}
t = ArgOfTerm(2,t);
}
if (IsVarTerm(t)) {
out = free_vars_in_complex_term(VarOfTerm(t)-1,
VarOfTerm(t), TR0 PASS_REGS);
} else if (IsPrimitiveTerm(t))
if (IsPrimitiveTerm(t))
out = TermNil;
else if (IsPairTerm(t)) {
out = free_vars_in_complex_term(RepPair(t)-1,
RepPair(t)+1, TR0 PASS_REGS);
}
else {
Functor f = FunctorOfTerm(t);
out = free_vars_in_complex_term(RepAppl(t),
RepAppl(t)+
ArityOfFunctor(f), TR0 PASS_REGS);
out = free_vars_in_complex_term(&(t)-1,
&(t), TR0 PASS_REGS);
}
if (out == 0L) {
trail_overflow:
@ -2681,13 +2564,9 @@ p_non_singletons_in_term( USES_REGS1 ) /* non_singletons in term t */
out = ARG2;
} else if (IsPrimitiveTerm(t)) {
out = ARG2;
} else if (IsPairTerm(t)) {
out = non_singletons_in_complex_term(RepPair(t)-1,
RepPair(t)+1 PASS_REGS);
} else {
out = non_singletons_in_complex_term(RepAppl(t),
RepAppl(t)+
ArityOfFunctor(FunctorOfTerm(t)) PASS_REGS);
out = non_singletons_in_complex_term(&(t)-1,
&(t) PASS_REGS);
}
if (out != 0L) {
return Yap_unify(ARG3,out);
@ -2761,22 +2640,11 @@ bool Yap_IsGroundTerm(Term t)
return FALSE;
} else if (IsPrimitiveTerm(t)) {
return TRUE;
} else if (IsPairTerm(t)) {
if ((out =ground_complex_term(RepPair(t)-1,
RepPair(t)+1 PASS_REGS)) >= 0) {
return out != 0;
}
} else {
Functor fun = FunctorOfTerm(t);
if (IsExtensionFunctor(fun))
return TRUE;
else if ((out = ground_complex_term(RepAppl(t),
RepAppl(t)+
ArityOfFunctor(fun) PASS_REGS)) >= 0) {
if ((out =ground_complex_term(&(t)-1,
&(t) PASS_REGS)) >= 0) {
return out != 0;
}
}
if (out < 0) {
*HR++ = t;
if (!Yap_ExpandPreAllocCodeSpace(0, NULL, TRUE)) {
@ -2786,6 +2654,7 @@ bool Yap_IsGroundTerm(Term t)
t = *--HR;
}
}
}
}
static Int

View File

@ -105,6 +105,7 @@ static bool callPortray(Term t, int sno USES_REGS) {
#define PROTECT(t, F) \
{ \
F; \
t = Yap_GetFromSlot(wglb->sl); \
}
static void wrputn(Int, struct write_globs *);
static void wrputf(Float, struct write_globs *);
@ -703,7 +704,9 @@ static void write_var(CELL *t, struct write_globs *wglb,
wrputs("$AT(", wglb->stream);
write_var(t, wglb, rwt);
wrputc(',', wglb->stream);
PROTECT(*t, writeTerm(*l, 999, 1, FALSE, wglb, &nrwt));
CELL tt = (CELL)t;
PROTECT(tt, writeTerm(*l, 999, 1, FALSE, wglb, &nrwt));
t = (CELL *)tt;
attv = RepAttVar(t);
wrputc(',', wglb->stream);
l++;
@ -756,6 +759,8 @@ static void write_list__(Term t, yhandle_t sl, int direction, int depth,
break;
if (!IsPairTerm(ti))
break;
if (check_for_loops(ti,wglb)) return;
wglb->sl = Yap_InitHandle(ti);
ndirection = RepPair(ti) - RepPair(t);
/* make sure we're not trapped in loops */
if (ndirection > 0) {
@ -806,6 +811,7 @@ static void write_list(Term t, int direction, int depth,
write_list__(t, sl, direction, depth,
wglb, rwt);
Yap_PopHandle(sl);
wglb->sl = sl-1;
}
@ -849,7 +855,7 @@ static void writeTerm__(Term t, yhandle_t sl, int p, int depth, int rinfixarg,
wrputc('[', wglb->stream);
lastw = separator;
/* we assume t was already saved in the stack */
write_list(t, 0, depth, wglb, rwt);
write_list__(t, wglb->sl, 0, depth, wglb, rwt);
wrputc(']', wglb->stream);
lastw = separator;
}
@ -1125,7 +1131,8 @@ static void writeTerm(Term t, int p, int depth, int rinfixarg,
yhandle_t sl = wglb->sl = Yap_InitHandle(t);
writeTerm__(t, sl, p, depth, rinfixarg,
wglb, rwt);
Yap_PopHandle(sl);
Yap_PopHandle(sl);
wglb->sl = sl-1;
}
void Yap_plwrite(Term t, StreamDesc *mywrite, int max_depth, int flags,
@ -1176,9 +1183,9 @@ void Yap_plwrite(Term t, StreamDesc *mywrite, int max_depth, int flags,
/* protect slots for portray */
yhandle_t sl;
wglb.sl0 = (sl = wglb.sl = Yap_InitHandle(t)) -1;
wglb.protectedEntry = false; \
wglb.protectedEntry = false;
writeTerm(t, priority, 1, FALSE, &wglb, &rwt);
t = Yap_PopHandle(sl); \
t = Yap_PopHandle(sl);
if (flags & New_Line_f) {
if (flags & Fullstop_f) {
wrputc('.', wglb.stream);

View File

@ -1,11 +1,13 @@
:- X = [], copy_term(X,Y), writeln('....'), writeln(X), writeln(Y).
:- X = [_A], copy_term(X,Y), writeln('....'), writeln(X), writeln(Y).
:- X = [a,A], copy_term(X,Y), writeln('....'), writeln(X), writeln(Y).
:- X = [a,_A], copy_term(X,Y), writeln('....'), writeln(X), writeln(Y).
:- X = [X], copy_term(X,Y), writeln('....'), writeln(X), writeln(Y).
:- X = [_|X], copy_term(X,Y), writeln('....'), writeln(X), writeln(Y).
:- X= f(X), copy_term(X,Y), writeln('....'), writeln(X), writeln(Y).
:- X= f(X,X), copy_term(X,Y), writeln('....'), writeln(X), writeln(Y).
:- X= f(_,X), copy_term(X,Y), writeln('....'), writeln(X), writeln(Y).
:- X= f(A,A,X), copy_term(X,Y), writeln('....'), writeln(X), writeln(Y).
:- X= f(A,g(X,[A|A]),X), copy_term(X,Y), writeln('....'), writeln(X), writeln(Y).
:- X= f(X,[X,X]), copy_term(X,Y), writeln('....'), writeln(X), writeln(Y).
:- X= f(X,[X,g(X)]), copy_term(X,Y), writeln('....'), writeln(X), writeln(Y).
:- X=f(_,X/[X]),copy_term(X,Y), writeln('....'),writeln(X),writeln(Y).