allow peeking in dbterm queues.
This commit is contained in:
parent
e668908a6f
commit
69d8b57776
15
C/dbase.c
15
C/dbase.c
@ -5224,8 +5224,12 @@ bool
|
|||||||
Yap_dequeue_tqueue(db_queue *father_key, Term t, bool first, bool release USES_REGS)
|
Yap_dequeue_tqueue(db_queue *father_key, Term t, bool first, bool release USES_REGS)
|
||||||
{
|
{
|
||||||
Term TDB;
|
Term TDB;
|
||||||
|
CELL *oldH = HR ;
|
||||||
|
tr_fr_ptr oldTR = TR;
|
||||||
QueueEntry * cur_instance = father_key->FirstInQueue, *prev = NULL;
|
QueueEntry * cur_instance = father_key->FirstInQueue, *prev = NULL;
|
||||||
while (cur_instance) {
|
while (cur_instance) {
|
||||||
|
HR = oldH;
|
||||||
|
HB = LCL0;
|
||||||
while ((TDB = GetDBTerm(cur_instance->DBT, false PASS_REGS)) == 0L) {
|
while ((TDB = GetDBTerm(cur_instance->DBT, false PASS_REGS)) == 0L) {
|
||||||
if (LOCAL_Error_TYPE == OUT_OF_ATTVARS_ERROR) {
|
if (LOCAL_Error_TYPE == OUT_OF_ATTVARS_ERROR) {
|
||||||
LOCAL_Error_TYPE = YAP_NO_ERROR;
|
LOCAL_Error_TYPE = YAP_NO_ERROR;
|
||||||
@ -5240,6 +5244,8 @@ Yap_dequeue_tqueue(db_queue *father_key, Term t, bool first, bool release USES_R
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
oldTR = TR;
|
||||||
|
oldH = HR;
|
||||||
}
|
}
|
||||||
if (Yap_unify(t, TDB)) {
|
if (Yap_unify(t, TDB)) {
|
||||||
if (release) {
|
if (release) {
|
||||||
@ -5257,6 +5263,15 @@ Yap_dequeue_tqueue(db_queue *father_key, Term t, bool first, bool release USES_R
|
|||||||
ErasePendingRefs(cur_instance->DBT PASS_REGS);
|
ErasePendingRefs(cur_instance->DBT PASS_REGS);
|
||||||
FreeDBSpace((char *) cur_instance->DBT);
|
FreeDBSpace((char *) cur_instance->DBT);
|
||||||
FreeDBSpace((char *) cur_instance);
|
FreeDBSpace((char *) cur_instance);
|
||||||
|
} else {
|
||||||
|
// undo if you'rejust peeking
|
||||||
|
while (oldTR < TR) {
|
||||||
|
CELL d1 = TrailTerm(TR-1);
|
||||||
|
TR--;
|
||||||
|
/* normal variable */
|
||||||
|
RESET_VARIABLE(d1);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
|
Reference in New Issue
Block a user