Write should not destroy the term
.
This commit is contained in:
parent
af7584e1f3
commit
d5c1ca716e
28
C/write.c
28
C/write.c
@ -85,14 +85,27 @@ typedef struct write_globs {
|
|||||||
|
|
||||||
static bool callPortray(Term t, int sno USES_REGS) {
|
static bool callPortray(Term t, int sno USES_REGS) {
|
||||||
PredEntry *pe;
|
PredEntry *pe;
|
||||||
Int b0 = LCL0 - (CELL *)B;
|
//Int b0 = LCL0 - (CELL *)B;
|
||||||
|
CELL *pt;
|
||||||
|
arity_t i, a;
|
||||||
|
Functor f;
|
||||||
|
if ((pe = RepPredProp(Yap_GetPredPropByFunc(FunctorPortray, USER_MODULE))) == NULL ||
|
||||||
|
pe->OpcodeOfPred != FAIL_OPCODE || pe->OpcodeOfPred != UNDEF_OPCODE)
|
||||||
|
return false;
|
||||||
|
if (IsApplTerm(t)) {
|
||||||
|
f = FunctorOfTerm(t);
|
||||||
|
a = ArityOfFunctor(f);
|
||||||
|
pt = RepAppl(t)+1;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
a = 2;
|
||||||
|
pt = RepPair(t);
|
||||||
|
}
|
||||||
|
for (i=0; i < a; i++) XREGS[i+1] = pt[i];
|
||||||
UNLOCK(GLOBAL_Stream[sno].streamlock);
|
UNLOCK(GLOBAL_Stream[sno].streamlock);
|
||||||
if ((pe = RepPredProp(Yap_GetPredPropByFunc(FunctorPortray, USER_MODULE))) &&
|
if (Yap_execute_pred(pe, NULL, true PASS_REGS)) {
|
||||||
pe->OpcodeOfPred != FAIL_OPCODE && pe->OpcodeOfPred != UNDEF_OPCODE &&
|
//choiceptr B0 = (choiceptr)(LCL0 - b0);
|
||||||
Yap_execute_pred(pe, &t, true PASS_REGS)) {
|
//Yap_fail_all(B0 PASS_REGS);
|
||||||
choiceptr B0 = (choiceptr)(LCL0 - b0);
|
|
||||||
Yap_fail_all(B0 PASS_REGS);
|
|
||||||
LOCK(GLOBAL_Stream[sno].streamlock);
|
LOCK(GLOBAL_Stream[sno].streamlock);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -716,10 +729,13 @@ static CELL *restore_from_write(struct rewind_term *rwt,
|
|||||||
|
|
||||||
if (wglb->Keep_terms) {
|
if (wglb->Keep_terms) {
|
||||||
ptr = Yap_GetPtrFromSlot(rwt->u_sd.s.ptr);
|
ptr = Yap_GetPtrFromSlot(rwt->u_sd.s.ptr);
|
||||||
|
// restore original term.
|
||||||
|
*ptr = Yap_GetFromSlot(rwt->u_sd.s.old);
|
||||||
Yap_RecoverSlots(2, rwt->u_sd.s.old);
|
Yap_RecoverSlots(2, rwt->u_sd.s.old);
|
||||||
// printf("leak=%d %d\n", LOCALCurSlot,rwt->u_sd.s.old) ;
|
// printf("leak=%d %d\n", LOCALCurSlot,rwt->u_sd.s.old) ;
|
||||||
} else {
|
} else {
|
||||||
ptr = rwt->u_sd.d.ptr;
|
ptr = rwt->u_sd.d.ptr;
|
||||||
|
*ptr = rwt->u_sd.d.old;
|
||||||
}
|
}
|
||||||
rwt->u_sd.s.ptr = 0;
|
rwt->u_sd.s.ptr = 0;
|
||||||
return ptr;
|
return ptr;
|
||||||
|
Reference in New Issue
Block a user