fixes
This commit is contained in:
parent
650653cc64
commit
700d6ae707
121
C/globals.c
121
C/globals.c
@ -331,27 +331,6 @@ static void CloseArena(CELL *oldH, CELL *oldHB, CELL *oldASP, Term *oldArenaP,
|
|||||||
ASP = oldASP;
|
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,
|
static Term CopyTermToArena(Term t, Term arena, bool share, bool copy_att_vars,
|
||||||
UInt arity, Term *newarena,
|
UInt arity, Term *newarena,
|
||||||
size_t min_grow USES_REGS) {
|
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;
|
return tn;
|
||||||
} else if (IsAtomOrIntTerm(t)) {
|
} else if (IsAtomOrIntTerm(t)) {
|
||||||
return t;
|
return t;
|
||||||
} else if (IsPairTerm(t)) {
|
} else {
|
||||||
Term tf;
|
|
||||||
CELL *ap;
|
|
||||||
CELL *Hi;
|
CELL *Hi;
|
||||||
|
|
||||||
if (share && ArenaPt(arena) > RepPair(t)) {
|
Hi = HR;
|
||||||
return t;
|
HR++;
|
||||||
}
|
oldH = HR;
|
||||||
HR = HB = ArenaPt(arena);
|
HR = HB = ArenaPt(arena);
|
||||||
ASP = ArenaLimit(arena);
|
ASP = ArenaLimit(arena);
|
||||||
ap = RepPair(t);
|
if ((res = Yap_copy_complex_term(&t - 1, &t, share, NULL, copy_att_vars, Hi,
|
||||||
Hi = HR;
|
HR PASS_REGS)) < 0) {
|
||||||
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) {
|
|
||||||
goto error_handler;
|
goto error_handler;
|
||||||
}
|
}
|
||||||
CloseArena(oldH, oldHB, oldASP, newarena, old_size PASS_REGS);
|
CloseArena(oldH, oldHB, oldASP, newarena, old_size PASS_REGS);
|
||||||
return tf;
|
return Hi[0];
|
||||||
} 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;
|
|
||||||
}
|
}
|
||||||
error_handler:
|
error_handler:
|
||||||
HR = HB;
|
HR = HB;
|
||||||
|
269
C/utilpreds.c
269
C/utilpreds.c
@ -265,7 +265,6 @@ int Yap_copy_complex_term(register CELL *pt0, register CELL *pt0_end,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
*ptf = AbsPair(HR);
|
*ptf = AbsPair(HR);
|
||||||
ptf++;
|
|
||||||
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);
|
||||||
}
|
}
|
||||||
@ -273,7 +272,7 @@ int Yap_copy_complex_term(register CELL *pt0, register CELL *pt0_end,
|
|||||||
to_visit->end_cp = pt0_end;
|
to_visit->end_cp = pt0_end;
|
||||||
to_visit->to = ptf;
|
to_visit->to = ptf;
|
||||||
to_visit->curp = headp;
|
to_visit->curp = headp;
|
||||||
to_visit->oldv = head;
|
d0 = to_visit->oldv = head;
|
||||||
to_visit->ground = ground;
|
to_visit->ground = ground;
|
||||||
to_visit++;
|
to_visit++;
|
||||||
// move to new list
|
// move to new list
|
||||||
@ -468,7 +467,6 @@ int Yap_copy_complex_term(register CELL *pt0, register CELL *pt0_end,
|
|||||||
DO_TRAIL(ptd0, (CELL)ptf);
|
DO_TRAIL(ptd0, (CELL)ptf);
|
||||||
*ptd0 = (CELL)ptf;
|
*ptd0 = (CELL)ptf;
|
||||||
ptf++;
|
ptf++;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -566,85 +564,27 @@ static Term
|
|||||||
CopyTerm(Term inp, UInt arity, int share, int newattvs USES_REGS) {
|
CopyTerm(Term inp, UInt arity, int share, int newattvs USES_REGS) {
|
||||||
Term t = Deref(inp);
|
Term t = Deref(inp);
|
||||||
tr_fr_ptr TR0 = TR;
|
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;
|
CELL *Hi;
|
||||||
|
|
||||||
restart_list:
|
if (IsPrimitiveTerm(t)) {
|
||||||
ap = RepPair(t);
|
return t;
|
||||||
|
}
|
||||||
|
while( true ) {
|
||||||
|
int res;
|
||||||
Hi = HR;
|
Hi = HR;
|
||||||
tf = AbsPair(HR);
|
HR ++;
|
||||||
HR += 2;
|
|
||||||
{
|
if ((res = Yap_copy_complex_term((&t)-1, &t, share, NULL, newattvs, Hi, HR PASS_REGS)) < 0) {
|
||||||
int res;
|
|
||||||
if ((res = Yap_copy_complex_term(ap-1, ap+1, share, NULL, newattvs, Hi, Hi PASS_REGS)) < 0) {
|
|
||||||
HR = Hi;
|
HR = Hi;
|
||||||
if ((t = handle_cp_overflow(res, TR0, arity, t))== 0L)
|
if ((t = handle_cp_overflow(res, TR0, arity, t))== 0L)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
goto restart_list;
|
|
||||||
} else if (res && share) {
|
} else if (res && share) {
|
||||||
HR = Hi;
|
HR = Hi;
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
return Hi[0];
|
||||||
}
|
}
|
||||||
return tf;
|
return 0;
|
||||||
} 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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Term
|
Term
|
||||||
@ -1866,25 +1806,9 @@ p_variables_in_term( USES_REGS1 ) /* variables in term t */
|
|||||||
}
|
}
|
||||||
do {
|
do {
|
||||||
Term t = Deref(ARG1);
|
Term t = Deref(ARG1);
|
||||||
if (IsVarTerm(t)) {
|
out = vars_in_complex_term(&(t)-1,
|
||||||
out = AbsPair(HR);
|
&(t),
|
||||||
HR += 2;
|
ARG2 PASS_REGS);
|
||||||
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(RepPair(t)-1,
|
|
||||||
RepPair(t)+1, ARG2 PASS_REGS);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Functor f = FunctorOfTerm(t);
|
|
||||||
out = vars_in_complex_term(RepAppl(t),
|
|
||||||
RepAppl(t)+
|
|
||||||
ArityOfFunctor(f), ARG2 PASS_REGS);
|
|
||||||
}
|
|
||||||
if (out == 0L) {
|
if (out == 0L) {
|
||||||
if (!expand_vts( 3 PASS_REGS ))
|
if (!expand_vts( 3 PASS_REGS ))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -1898,6 +1822,7 @@ p_variables_in_term( USES_REGS1 ) /* variables in term t */
|
|||||||
static Int
|
static Int
|
||||||
p_term_variables( USES_REGS1 ) /* variables in term t */
|
p_term_variables( USES_REGS1 ) /* variables in term t */
|
||||||
{
|
{
|
||||||
|
Term t = Deref(ARG1);
|
||||||
Term out;
|
Term out;
|
||||||
|
|
||||||
if (!Yap_IsListOrPartialListTerm(ARG2)) {
|
if (!Yap_IsListOrPartialListTerm(ARG2)) {
|
||||||
@ -1905,30 +1830,16 @@ p_term_variables( USES_REGS1 ) /* variables in term t */
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
do {
|
if (IsPrimitiveTerm(t)) {
|
||||||
Term t = Deref(ARG1);
|
|
||||||
if (IsVarTerm(t)) {
|
|
||||||
Term out = Yap_MkNewPairTerm();
|
|
||||||
return
|
|
||||||
Yap_unify(t,HeadOfTerm(out)) &&
|
|
||||||
Yap_unify(TermNil, TailOfTerm(out)) &&
|
|
||||||
Yap_unify(out, ARG2);
|
|
||||||
} else if (IsPrimitiveTerm(t)) {
|
|
||||||
return Yap_unify(TermNil, ARG2);
|
return Yap_unify(TermNil, ARG2);
|
||||||
} else if (IsPairTerm(t)) {
|
}
|
||||||
out = vars_in_complex_term(RepPair(t)-1,
|
do {
|
||||||
RepPair(t)+1, TermNil PASS_REGS);
|
out = vars_in_complex_term(&(t)-1,
|
||||||
}
|
&(t), TermNil PASS_REGS);
|
||||||
else {
|
if (out == 0L) {
|
||||||
Functor f = FunctorOfTerm(t);
|
if (!expand_vts( 3 PASS_REGS ))
|
||||||
out = vars_in_complex_term(RepAppl(t),
|
return FALSE;
|
||||||
RepAppl(t)+
|
}
|
||||||
ArityOfFunctor(f), TermNil PASS_REGS);
|
|
||||||
}
|
|
||||||
if (out == 0L) {
|
|
||||||
if (!expand_vts( 3 PASS_REGS ))
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
} while (out == 0L);
|
} while (out == 0L);
|
||||||
return Yap_unify(ARG2,out);
|
return Yap_unify(ARG2,out);
|
||||||
}
|
}
|
||||||
@ -1948,17 +1859,11 @@ Yap_TermVariables( Term t, UInt arity USES_REGS ) /* variables in term t */
|
|||||||
t = Deref(t);
|
t = Deref(t);
|
||||||
if (IsVarTerm(t)) {
|
if (IsVarTerm(t)) {
|
||||||
return MkPairTerm(t, TermNil);
|
return MkPairTerm(t, TermNil);
|
||||||
} else if (IsPrimitiveTerm(t)) {
|
} else if (IsPrimitiveTerm(t)) {
|
||||||
return TermNil;
|
return TermNil;
|
||||||
} else if (IsPairTerm(t)) {
|
} else {
|
||||||
out = vars_in_complex_term(RepPair(t)-1,
|
out = vars_in_complex_term(&(t)-1,
|
||||||
RepPair(t)+1, TermNil PASS_REGS);
|
&(t), TermNil PASS_REGS);
|
||||||
}
|
|
||||||
else {
|
|
||||||
Functor f = FunctorOfTerm(t);
|
|
||||||
out = vars_in_complex_term(RepAppl(t),
|
|
||||||
RepAppl(t)+
|
|
||||||
ArityOfFunctor(f), TermNil PASS_REGS);
|
|
||||||
}
|
}
|
||||||
if (out == 0L) {
|
if (out == 0L) {
|
||||||
if (!expand_vts( arity PASS_REGS ))
|
if (!expand_vts( arity PASS_REGS ))
|
||||||
@ -2067,29 +1972,15 @@ p_term_attvars( USES_REGS1 ) /* variables in term t */
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
Term t = Deref(ARG1);
|
Term t = Deref(ARG1);
|
||||||
if (IsVarTerm(t)) {
|
if (IsPrimitiveTerm(t)) {
|
||||||
out = attvars_in_complex_term(VarOfTerm(t)-1,
|
return Yap_unify(TermNil, ARG2);
|
||||||
VarOfTerm(t), TermNil PASS_REGS);
|
}
|
||||||
} else if (IsPrimitiveTerm(t)) {
|
out = attvars_in_complex_term(&(t)-1,
|
||||||
return Yap_unify(TermNil, ARG2);
|
&(t), TermNil PASS_REGS);
|
||||||
} else if (IsPairTerm(t)) {
|
if (out == 0L) {
|
||||||
out = attvars_in_complex_term(RepPair(t)-1,
|
|
||||||
RepPair(t)+1, TermNil PASS_REGS);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Functor f = FunctorOfTerm(t);
|
|
||||||
if (IsExtensionFunctor(f))
|
|
||||||
return Yap_unify(TermNil, ARG2);
|
|
||||||
RepAppl(t)[0] = TermNil;
|
|
||||||
out = attvars_in_complex_term(RepAppl(t),
|
|
||||||
RepAppl(t)+
|
|
||||||
ArityOfFunctor(f), TermNil PASS_REGS);
|
|
||||||
RepAppl(t)[0] = (CELL)f;
|
|
||||||
}
|
|
||||||
if (out == 0L) {
|
|
||||||
if (!expand_vts( 3 PASS_REGS ))
|
if (!expand_vts( 3 PASS_REGS ))
|
||||||
return FALSE;
|
return false;
|
||||||
}
|
}
|
||||||
} while (out == 0L);
|
} while (out == 0L);
|
||||||
return Yap_unify(ARG2,out);
|
return Yap_unify(ARG2,out);
|
||||||
}
|
}
|
||||||
@ -2109,15 +2000,9 @@ p_term_variables3( USES_REGS1 ) /* variables in term t */
|
|||||||
Yap_unify(out, ARG2);
|
Yap_unify(out, ARG2);
|
||||||
} else if (IsPrimitiveTerm(t)) {
|
} else if (IsPrimitiveTerm(t)) {
|
||||||
return Yap_unify(ARG2, ARG3);
|
return Yap_unify(ARG2, ARG3);
|
||||||
} else if (IsPairTerm(t)) {
|
} else {
|
||||||
out = vars_in_complex_term(RepPair(t)-1,
|
out = vars_in_complex_term(&(t)-1,
|
||||||
RepPair(t)+1, ARG3 PASS_REGS);
|
&(t), ARG3 PASS_REGS);
|
||||||
}
|
|
||||||
else {
|
|
||||||
Functor f = FunctorOfTerm(t);
|
|
||||||
out = vars_in_complex_term(RepAppl(t),
|
|
||||||
RepAppl(t)+
|
|
||||||
ArityOfFunctor(f), ARG3 PASS_REGS);
|
|
||||||
}
|
}
|
||||||
if (out == 0L) {
|
if (out == 0L) {
|
||||||
if (!expand_vts( 3 PASS_REGS ))
|
if (!expand_vts( 3 PASS_REGS ))
|
||||||
@ -2217,21 +2102,11 @@ p_variables_within_term( USES_REGS1 ) /* variables within term t */
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
Term t = Deref(ARG2);
|
Term t = Deref(ARG2);
|
||||||
if (IsVarTerm(t)) {
|
if (IsPrimitiveTerm(t))
|
||||||
out = vars_within_complex_term(VarOfTerm(t)-1,
|
|
||||||
VarOfTerm(t), Deref(ARG1) PASS_REGS);
|
|
||||||
|
|
||||||
} else if (IsPrimitiveTerm(t))
|
|
||||||
out = TermNil;
|
out = TermNil;
|
||||||
else if (IsPairTerm(t)) {
|
else {
|
||||||
out = vars_within_complex_term(RepPair(t)-1,
|
out = vars_within_complex_term(&(t)-1,
|
||||||
RepPair(t)+1, Deref(ARG1) PASS_REGS);
|
&(t), Deref(ARG1) PASS_REGS);
|
||||||
}
|
|
||||||
else {
|
|
||||||
Functor f = FunctorOfTerm(t);
|
|
||||||
out = vars_within_complex_term(RepAppl(t),
|
|
||||||
RepAppl(t)+
|
|
||||||
ArityOfFunctor(f), Deref(ARG1) PASS_REGS);
|
|
||||||
}
|
}
|
||||||
if (out == 0L) {
|
if (out == 0L) {
|
||||||
if (!expand_vts( 3 PASS_REGS ))
|
if (!expand_vts( 3 PASS_REGS ))
|
||||||
@ -2335,21 +2210,11 @@ p_new_variables_in_term( USES_REGS1 ) /* variables within term t */
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
Term t = Deref(ARG2);
|
Term t = Deref(ARG2);
|
||||||
if (IsVarTerm(t)) {
|
if (IsPrimitiveTerm(t))
|
||||||
out = new_vars_in_complex_term(VarOfTerm(t)-1,
|
|
||||||
VarOfTerm(t), Deref(ARG1) PASS_REGS);
|
|
||||||
|
|
||||||
} else if (IsPrimitiveTerm(t))
|
|
||||||
out = TermNil;
|
out = TermNil;
|
||||||
else if (IsPairTerm(t)) {
|
else {
|
||||||
out = new_vars_in_complex_term(RepPair(t)-1,
|
out = new_vars_in_complex_term(&(t)-1,
|
||||||
RepPair(t)+1, Deref(ARG1) PASS_REGS);
|
&(t), 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);
|
|
||||||
}
|
}
|
||||||
if (out == 0L) {
|
if (out == 0L) {
|
||||||
if (!expand_vts( 3 PASS_REGS ))
|
if (!expand_vts( 3 PASS_REGS ))
|
||||||
@ -2592,21 +2457,11 @@ p_free_variables_in_term( USES_REGS1 ) /* variables within term t */
|
|||||||
}
|
}
|
||||||
t = ArgOfTerm(2,t);
|
t = ArgOfTerm(2,t);
|
||||||
}
|
}
|
||||||
if (IsVarTerm(t)) {
|
if (IsPrimitiveTerm(t))
|
||||||
out = free_vars_in_complex_term(VarOfTerm(t)-1,
|
|
||||||
VarOfTerm(t), TR0 PASS_REGS);
|
|
||||||
|
|
||||||
} else if (IsPrimitiveTerm(t))
|
|
||||||
out = TermNil;
|
out = TermNil;
|
||||||
else if (IsPairTerm(t)) {
|
|
||||||
out = free_vars_in_complex_term(RepPair(t)-1,
|
|
||||||
RepPair(t)+1, TR0 PASS_REGS);
|
|
||||||
}
|
|
||||||
else {
|
else {
|
||||||
Functor f = FunctorOfTerm(t);
|
out = free_vars_in_complex_term(&(t)-1,
|
||||||
out = free_vars_in_complex_term(RepAppl(t),
|
&(t), TR0 PASS_REGS);
|
||||||
RepAppl(t)+
|
|
||||||
ArityOfFunctor(f), TR0 PASS_REGS);
|
|
||||||
}
|
}
|
||||||
if (out == 0L) {
|
if (out == 0L) {
|
||||||
trail_overflow:
|
trail_overflow:
|
||||||
@ -2705,13 +2560,9 @@ p_non_singletons_in_term( USES_REGS1 ) /* non_singletons in term t */
|
|||||||
out = ARG2;
|
out = ARG2;
|
||||||
} else if (IsPrimitiveTerm(t)) {
|
} else if (IsPrimitiveTerm(t)) {
|
||||||
out = ARG2;
|
out = ARG2;
|
||||||
} else if (IsPairTerm(t)) {
|
|
||||||
out = non_singletons_in_complex_term(RepPair(t)-1,
|
|
||||||
RepPair(t)+1 PASS_REGS);
|
|
||||||
} else {
|
} else {
|
||||||
out = non_singletons_in_complex_term(RepAppl(t),
|
out = non_singletons_in_complex_term(&(t)-1,
|
||||||
RepAppl(t)+
|
&(t) PASS_REGS);
|
||||||
ArityOfFunctor(FunctorOfTerm(t)) PASS_REGS);
|
|
||||||
}
|
}
|
||||||
if (out != 0L) {
|
if (out != 0L) {
|
||||||
return Yap_unify(ARG3,out);
|
return Yap_unify(ARG3,out);
|
||||||
@ -2785,22 +2636,11 @@ bool Yap_IsGroundTerm(Term t)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
} else if (IsPrimitiveTerm(t)) {
|
} else if (IsPrimitiveTerm(t)) {
|
||||||
return TRUE;
|
return TRUE;
|
||||||
} else if (IsPairTerm(t)) {
|
|
||||||
if ((out =ground_complex_term(RepPair(t)-1,
|
|
||||||
RepPair(t)+1 PASS_REGS)) >= 0) {
|
|
||||||
return out != 0;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
Functor fun = FunctorOfTerm(t);
|
if ((out =ground_complex_term(&(t)-1,
|
||||||
|
&(t) PASS_REGS)) >= 0) {
|
||||||
if (IsExtensionFunctor(fun))
|
|
||||||
return TRUE;
|
|
||||||
else if ((out = ground_complex_term(RepAppl(t),
|
|
||||||
RepAppl(t)+
|
|
||||||
ArityOfFunctor(fun) PASS_REGS)) >= 0) {
|
|
||||||
return out != 0;
|
return out != 0;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if (out < 0) {
|
if (out < 0) {
|
||||||
*HR++ = t;
|
*HR++ = t;
|
||||||
if (!Yap_ExpandPreAllocCodeSpace(0, NULL, TRUE)) {
|
if (!Yap_ExpandPreAllocCodeSpace(0, NULL, TRUE)) {
|
||||||
@ -2810,6 +2650,7 @@ bool Yap_IsGroundTerm(Term t)
|
|||||||
t = *--HR;
|
t = *--HR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static Int
|
static Int
|
||||||
|
17
C/write.c
17
C/write.c
@ -105,6 +105,7 @@ static bool callPortray(Term t, int sno USES_REGS) {
|
|||||||
#define PROTECT(t, F) \
|
#define PROTECT(t, F) \
|
||||||
{ \
|
{ \
|
||||||
F; \
|
F; \
|
||||||
|
t = Yap_GetFromSlot(wglb->sl); \
|
||||||
}
|
}
|
||||||
static void wrputn(Int, struct write_globs *);
|
static void wrputn(Int, struct write_globs *);
|
||||||
static void wrputf(Float, 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);
|
wrputs("$AT(", wglb->stream);
|
||||||
write_var(t, wglb, rwt);
|
write_var(t, wglb, rwt);
|
||||||
wrputc(',', wglb->stream);
|
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);
|
attv = RepAttVar(t);
|
||||||
wrputc(',', wglb->stream);
|
wrputc(',', wglb->stream);
|
||||||
l++;
|
l++;
|
||||||
@ -756,6 +759,8 @@ static void write_list__(Term t, yhandle_t sl, int direction, int depth,
|
|||||||
break;
|
break;
|
||||||
if (!IsPairTerm(ti))
|
if (!IsPairTerm(ti))
|
||||||
break;
|
break;
|
||||||
|
if (check_for_loops(ti,wglb)) return;
|
||||||
|
wglb->sl = Yap_InitHandle(ti);
|
||||||
ndirection = RepPair(ti) - RepPair(t);
|
ndirection = RepPair(ti) - RepPair(t);
|
||||||
/* make sure we're not trapped in loops */
|
/* make sure we're not trapped in loops */
|
||||||
if (ndirection > 0) {
|
if (ndirection > 0) {
|
||||||
@ -806,6 +811,7 @@ static void write_list(Term t, int direction, int depth,
|
|||||||
write_list__(t, sl, direction, depth,
|
write_list__(t, sl, direction, depth,
|
||||||
wglb, rwt);
|
wglb, rwt);
|
||||||
Yap_PopHandle(sl);
|
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);
|
wrputc('[', wglb->stream);
|
||||||
lastw = separator;
|
lastw = separator;
|
||||||
/* we assume t was already saved in the stack */
|
/* 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);
|
wrputc(']', wglb->stream);
|
||||||
lastw = separator;
|
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);
|
yhandle_t sl = wglb->sl = Yap_InitHandle(t);
|
||||||
writeTerm__(t, sl, p, depth, rinfixarg,
|
writeTerm__(t, sl, p, depth, rinfixarg,
|
||||||
wglb, rwt);
|
wglb, rwt);
|
||||||
Yap_PopHandle(sl);
|
Yap_PopHandle(sl);
|
||||||
|
wglb->sl = sl-1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Yap_plwrite(Term t, StreamDesc *mywrite, int max_depth, int flags,
|
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 */
|
/* protect slots for portray */
|
||||||
yhandle_t sl;
|
yhandle_t sl;
|
||||||
wglb.sl0 = (sl = wglb.sl = Yap_InitHandle(t)) -1;
|
wglb.sl0 = (sl = wglb.sl = Yap_InitHandle(t)) -1;
|
||||||
wglb.protectedEntry = false; \
|
wglb.protectedEntry = false;
|
||||||
writeTerm(t, priority, 1, FALSE, &wglb, &rwt);
|
writeTerm(t, priority, 1, FALSE, &wglb, &rwt);
|
||||||
t = Yap_PopHandle(sl); \
|
t = Yap_PopHandle(sl);
|
||||||
if (flags & New_Line_f) {
|
if (flags & New_Line_f) {
|
||||||
if (flags & Fullstop_f) {
|
if (flags & Fullstop_f) {
|
||||||
wrputc('.', wglb.stream);
|
wrputc('.', wglb.stream);
|
||||||
|
@ -1,11 +1,13 @@
|
|||||||
:- X = [], copy_term(X,Y), writeln('....'), writeln(X), writeln(Y).
|
:- X = [], copy_term(X,Y), writeln('....'), writeln(X), writeln(Y).
|
||||||
:- X = [_A], 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 = [_|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), 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,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), 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,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,g(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/[X]),copy_term(X,Y), writeln('....'),writeln(X),writeln(Y).
|
Reference in New Issue
Block a user