1380 lines
37 KiB
C
1380 lines
37 KiB
C
#define TRUST_FAIL_INSTINIT
|
|
|
|
#ifdef CUT_C
|
|
#define TRUST_FAIL_CUT_C \
|
|
while (POP_CHOICE_POINT(B->cp_b)) \
|
|
POP_EXECUTE();
|
|
#endif
|
|
|
|
#ifdef YAPOR
|
|
#define TRUST_FAIL_YAPOR \
|
|
choiceptr cut_pt; \
|
|
cut_pt = B->cp_b; \
|
|
CUT_prune_to(cut_pt); \
|
|
B = cut_pt;
|
|
#else
|
|
#define TRUST_FAIL_NOYAPOR \
|
|
B = B->cp_b; \
|
|
return external_labels[0];
|
|
#endif
|
|
|
|
#ifdef YAPOR
|
|
#define LBL_SHARED_FAIL \
|
|
B = Get_LOCAL_top_cp(); \
|
|
SET_BB(PROTECT_FROZEN_B(B));
|
|
#endif
|
|
|
|
#define OP_FAIL_INSTINIT \
|
|
if (PP) { \
|
|
UNLOCK(PP->PELock); \
|
|
PP = NULL; \
|
|
}
|
|
|
|
#ifdef LOW_LEVEL_TRACER
|
|
#if defined(YAPOR) || defined(THREADS)
|
|
#define LBL_FAIL_INSTINIT \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
{ \
|
|
register tr_fr_ptr pt0 = TR; \
|
|
if (PP) { \
|
|
UNLOCK(PP->PELock); \
|
|
PP = NULL; \
|
|
} \
|
|
(*_PREG) = B->cp_ap; \
|
|
save_pc(); \
|
|
CACHE_TR(B->cp_tr); \
|
|
PREFETCH_OP((*_PREG)); \
|
|
while (1) { \
|
|
if (pt0 == S_TR) { \
|
|
SP = SP0; \
|
|
LBL_FAIL_LOW_LEVEL_TRACER
|
|
#else
|
|
#define LBL_FAIL_INSTINIT \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
{ \
|
|
register tr_fr_ptr pt0 = TR; \
|
|
(*_PREG) = B->cp_ap; \
|
|
save_pc(); \
|
|
CACHE_TR(B->cp_tr); \
|
|
PREFETCH_OP((*_PREG)); \
|
|
while (1) { \
|
|
if (pt0 == S_TR) { \
|
|
SP = SP0; \
|
|
LBL_FAIL_LOW_LEVEL_TRACER
|
|
#endif
|
|
#else /* LOW_LEVEL_TRACER */
|
|
#if defined(YAPOR) || defined(THREADS)
|
|
#define LBL_FAIL_INSTINIT \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
{ \
|
|
register tr_fr_ptr pt0 = TR; \
|
|
if (PP) { \
|
|
UNLOCK(PP->PELock); \
|
|
PP = NULL; \
|
|
} \
|
|
(*_PREG) = B->cp_ap; \
|
|
save_pc(); \
|
|
CACHE_TR(B->cp_tr); \
|
|
PREFETCH_OP((*_PREG)); \
|
|
while (1) { \
|
|
if (pt0 == S_TR) { \
|
|
SP = SP0; \
|
|
LBL_FAIL_POST_LOW_LEVEL_TRACER
|
|
#else
|
|
#define LBL_FAIL_INSTINIT \
|
|
BLOCKADDRESS = (CELL)(*_PREG); \
|
|
{ \
|
|
register tr_fr_ptr pt0 = TR; \
|
|
(*_PREG) = B->cp_ap; \
|
|
save_pc(); \
|
|
CACHE_TR(B->cp_tr); \
|
|
PREFETCH_OP((*_PREG)); \
|
|
while (1) { \
|
|
if (pt0 == S_TR) { \
|
|
SP = SP0; \
|
|
LBL_FAIL_POST_LOW_LEVEL_TRACER
|
|
#endif
|
|
#endif /* LOW_LEVEL_TRACER */
|
|
|
|
#ifdef LOW_LEVEL_TRACER
|
|
#ifdef TABLING
|
|
#ifdef THREADS_CONSUMER_SHARING
|
|
#ifdef DETERMINISTIC_TABLING
|
|
#define LBL_FAIL_LOW_LEVEL_TRACER \
|
|
if (Yap_do_low_level_trace) { \
|
|
int go_on = TRUE; \
|
|
yamop *ipc = (*_(*_PREG)); \
|
|
while (go_on) { \
|
|
op_numbers opnum = Yap_op_from_opcode(ipc->opc); \
|
|
go_on = FALSE; \
|
|
switch (opnum) { \
|
|
case _table_load_answer: \
|
|
{ \
|
|
low_level_trace(retry_table_loader, LOAD_CP(B)->cp_pred_entry, NULL); \
|
|
break; \
|
|
} \
|
|
case _table_try_answer: \
|
|
case _table_retry_me: \
|
|
case _table_trust_me: \
|
|
case _table_retry: \
|
|
case _table_trust: \
|
|
case _table_completion: \
|
|
case _table_answer_resolution_completion: \
|
|
if (IS_DET_GEN_CP(B)) { \
|
|
low_level_trace(retry_table_generator, DET_GEN_CP(B)->cp_pred_entry, NULL); \
|
|
} else \
|
|
{ \
|
|
low_level_trace(retry_table_generator, GEN_CP(B)->cp_pred_entry, (CELL *)(GEN_CP(B) + 1)); \
|
|
} \
|
|
break; \
|
|
case _table_answer_resolution: \
|
|
{ \
|
|
low_level_trace(retry_table_consumer, CONS_CP(B)->cp_pred_entry, NULL); \
|
|
break; \
|
|
} \
|
|
case _trie_trust_var: \
|
|
case _trie_retry_var: \
|
|
case _trie_trust_var_in_pair: \
|
|
case _trie_retry_var_in_pair: \
|
|
case _trie_trust_val: \
|
|
case _trie_retry_val: \
|
|
case _trie_trust_val_in_pair: \
|
|
case _trie_retry_val_in_pair: \
|
|
case _trie_trust_atom: \
|
|
case _trie_retry_atom: \
|
|
case _trie_trust_atom_in_pair: \
|
|
case _trie_retry_atom_in_pair: \
|
|
case _trie_trust_null: \
|
|
case _trie_retry_null: \
|
|
case _trie_trust_null_in_pair: \
|
|
case _trie_retry_null_in_pair: \
|
|
case _trie_trust_pair: \
|
|
case _trie_retry_pair: \
|
|
case _trie_trust_appl: \
|
|
case _trie_retry_appl: \
|
|
case _trie_trust_appl_in_pair: \
|
|
case _trie_retry_appl_in_pair: \
|
|
case _trie_trust_extension: \
|
|
case _trie_retry_extension: \
|
|
case _trie_trust_double: \
|
|
case _trie_retry_double: \
|
|
case _trie_trust_longint: \
|
|
case _trie_retry_longint: \
|
|
case _trie_trust_gterm: \
|
|
case _trie_retry_gterm: \
|
|
{ \
|
|
low_level_trace(retry_table_loader, UndefCode, NULL); \
|
|
break; \
|
|
} \
|
|
LBL_FAIL_POST_LOW_LEVEL_TRACER
|
|
#else /* DETERMINISTIC_TABLING */
|
|
#define LBL_FAIL_LOW_LEVEL_TRACER \
|
|
if (Yap_do_low_level_trace) { \
|
|
int go_on = TRUE; \
|
|
yamop *ipc = (*_PREG); \
|
|
while (go_on) { \
|
|
op_numbers opnum = Yap_op_from_opcode(ipc->opc); \
|
|
go_on = FALSE; \
|
|
switch (opnum) { \
|
|
case _table_load_answer: \
|
|
{ \
|
|
low_level_trace(retry_table_loader, LOAD_CP(B)->cp_pred_entry, NULL); \
|
|
break; \
|
|
} \
|
|
case _table_try_answer: \
|
|
case _table_retry_me: \
|
|
case _table_trust_me: \
|
|
case _table_retry: \
|
|
case _table_trust: \
|
|
case _table_completion: \
|
|
case _table_answer_resolution_completion: \
|
|
{ \
|
|
low_level_trace(retry_table_generator, GEN_CP(B)->cp_pred_entry, (CELL *)(GEN_CP(B) + 1)); \
|
|
} \
|
|
break; \
|
|
case _table_answer_resolution: \
|
|
{ \
|
|
low_level_trace(retry_table_consumer, CONS_CP(B)->cp_pred_entry, NULL); \
|
|
break; \
|
|
} \
|
|
case _trie_trust_var: \
|
|
case _trie_retry_var: \
|
|
case _trie_trust_var_in_pair: \
|
|
case _trie_retry_var_in_pair: \
|
|
case _trie_trust_val: \
|
|
case _trie_retry_val: \
|
|
case _trie_trust_val_in_pair: \
|
|
case _trie_retry_val_in_pair: \
|
|
case _trie_trust_atom: \
|
|
case _trie_retry_atom: \
|
|
case _trie_trust_atom_in_pair: \
|
|
case _trie_retry_atom_in_pair: \
|
|
case _trie_trust_null: \
|
|
case _trie_retry_null: \
|
|
case _trie_trust_null_in_pair: \
|
|
case _trie_retry_null_in_pair: \
|
|
case _trie_trust_pair: \
|
|
case _trie_retry_pair: \
|
|
case _trie_trust_appl: \
|
|
case _trie_retry_appl: \
|
|
case _trie_trust_appl_in_pair: \
|
|
case _trie_retry_appl_in_pair: \
|
|
case _trie_trust_extension: \
|
|
case _trie_retry_extension: \
|
|
case _trie_trust_double: \
|
|
case _trie_retry_double: \
|
|
case _trie_trust_longint: \
|
|
case _trie_retry_longint: \
|
|
case _trie_trust_gterm: \
|
|
case _trie_retry_gterm: \
|
|
{ \
|
|
low_level_trace(retry_table_loader, UndefCode, NULL); \
|
|
break; \
|
|
} \
|
|
LBL_FAIL_POST_LOW_LEVEL_TRACER
|
|
#endif /* DETERMINISTIC_TABLING */
|
|
#else /* THREADS_CONSUMER_SHARING */
|
|
#ifdef DETERMINISTIC_TABLING
|
|
#define LBL_FAIL_LOW_LEVEL_TRACER \
|
|
if (Yap_do_low_level_trace) { \
|
|
int go_on = TRUE; \
|
|
yamop *ipc = (*_PREG); \
|
|
while (go_on) { \
|
|
op_numbers opnum = Yap_op_from_opcode(ipc->opc); \
|
|
go_on = FALSE; \
|
|
switch (opnum) { \
|
|
case _table_load_answer: \
|
|
{ \
|
|
low_level_trace(retry_table_loader, LOAD_CP(B)->cp_pred_entry, NULL); \
|
|
break; \
|
|
} \
|
|
case _table_try_answer: \
|
|
case _table_retry_me: \
|
|
case _table_trust_me: \
|
|
case _table_retry: \
|
|
case _table_trust: \
|
|
case _table_completion: \
|
|
if (IS_DET_GEN_CP(B)) { \
|
|
low_level_trace(retry_table_generator, DET_GEN_CP(B)->cp_pred_entry, NULL); \
|
|
} else \
|
|
{ \
|
|
low_level_trace(retry_table_generator, GEN_CP(B)->cp_pred_entry, (CELL *)(GEN_CP(B) + 1)); \
|
|
} \
|
|
break; \
|
|
case _table_answer_resolution: \
|
|
{ \
|
|
low_level_trace(retry_table_consumer, CONS_CP(B)->cp_pred_entry, NULL); \
|
|
break; \
|
|
} \
|
|
case _trie_trust_var: \
|
|
case _trie_retry_var: \
|
|
case _trie_trust_var_in_pair: \
|
|
case _trie_retry_var_in_pair: \
|
|
case _trie_trust_val: \
|
|
case _trie_retry_val: \
|
|
case _trie_trust_val_in_pair: \
|
|
case _trie_retry_val_in_pair: \
|
|
case _trie_trust_atom: \
|
|
case _trie_retry_atom: \
|
|
case _trie_trust_atom_in_pair: \
|
|
case _trie_retry_atom_in_pair: \
|
|
case _trie_trust_null: \
|
|
case _trie_retry_null: \
|
|
case _trie_trust_null_in_pair: \
|
|
case _trie_retry_null_in_pair: \
|
|
case _trie_trust_pair: \
|
|
case _trie_retry_pair: \
|
|
case _trie_trust_appl: \
|
|
case _trie_retry_appl: \
|
|
case _trie_trust_appl_in_pair: \
|
|
case _trie_retry_appl_in_pair: \
|
|
case _trie_trust_extension: \
|
|
case _trie_retry_extension: \
|
|
case _trie_trust_double: \
|
|
case _trie_retry_double: \
|
|
case _trie_trust_longint: \
|
|
case _trie_retry_longint: \
|
|
case _trie_trust_gterm: \
|
|
case _trie_retry_gterm: \
|
|
{ \
|
|
low_level_trace(retry_table_loader, UndefCode, NULL); \
|
|
break; \
|
|
} \
|
|
LBL_FAIL_POST_LOW_LEVEL_TRACER
|
|
#else /* DETERMINISTIC_TABLING */
|
|
#define LBL_FAIL_LOW_LEVEL_TRACER \
|
|
if (Yap_do_low_level_trace) { \
|
|
int go_on = TRUE; \
|
|
yamop *ipc = (*_PREG); \
|
|
while (go_on) { \
|
|
op_numbers opnum = Yap_op_from_opcode(ipc->opc); \
|
|
go_on = FALSE; \
|
|
switch (opnum) { \
|
|
case _table_load_answer: \
|
|
{ \
|
|
low_level_trace(retry_table_loader, LOAD_CP(B)->cp_pred_entry, NULL); \
|
|
break; \
|
|
} \
|
|
case _table_try_answer: \
|
|
case _table_retry_me: \
|
|
case _table_trust_me: \
|
|
case _table_retry: \
|
|
case _table_trust: \
|
|
case _table_completion: \
|
|
{ \
|
|
low_level_trace(retry_table_generator, GEN_CP(B)->cp_pred_entry, (CELL *)(GEN_CP(B) + 1)); \
|
|
} \
|
|
break; \
|
|
case _table_answer_resolution: \
|
|
{ \
|
|
low_level_trace(retry_table_consumer, CONS_CP(B)->cp_pred_entry, NULL); \
|
|
break; \
|
|
} \
|
|
case _trie_trust_var: \
|
|
case _trie_retry_var: \
|
|
case _trie_trust_var_in_pair: \
|
|
case _trie_retry_var_in_pair: \
|
|
case _trie_trust_val: \
|
|
case _trie_retry_val: \
|
|
case _trie_trust_val_in_pair: \
|
|
case _trie_retry_val_in_pair: \
|
|
case _trie_trust_atom: \
|
|
case _trie_retry_atom: \
|
|
case _trie_trust_atom_in_pair: \
|
|
case _trie_retry_atom_in_pair: \
|
|
case _trie_trust_null: \
|
|
case _trie_retry_null: \
|
|
case _trie_trust_null_in_pair: \
|
|
case _trie_retry_null_in_pair: \
|
|
case _trie_trust_pair: \
|
|
case _trie_retry_pair: \
|
|
case _trie_trust_appl: \
|
|
case _trie_retry_appl: \
|
|
case _trie_trust_appl_in_pair: \
|
|
case _trie_retry_appl_in_pair: \
|
|
case _trie_trust_extension: \
|
|
case _trie_retry_extension: \
|
|
case _trie_trust_double: \
|
|
case _trie_retry_double: \
|
|
case _trie_trust_longint: \
|
|
case _trie_retry_longint: \
|
|
case _trie_trust_gterm: \
|
|
case _trie_retry_gterm: \
|
|
{ \
|
|
low_level_trace(retry_table_loader, UndefCode, NULL); \
|
|
break; \
|
|
} \
|
|
LBL_FAIL_POST_LOW_LEVEL_TRACER
|
|
#endif /* DETERMINISTIC_TABLING */
|
|
#endif /* THREADS_CONSUMER_SHARING */
|
|
#endif /* TABLING */
|
|
#define LBL_FAIL_LOW_LEVEL_TRACER \
|
|
if (Yap_do_low_level_trace) { \
|
|
int go_on = TRUE; \
|
|
yamop *ipc = (*_PREG); \
|
|
while (go_on) { \
|
|
op_numbers opnum = Yap_op_from_opcode(ipc->opc); \
|
|
go_on = FALSE; \
|
|
switch (opnum) { \
|
|
case _or_else: \
|
|
case _or_last: \
|
|
{ \
|
|
low_level_trace(retry_or, (PredEntry *)ipc, &(B->cp_a1)); \
|
|
break; \
|
|
} \
|
|
case _retry2: \
|
|
case _retry3: \
|
|
case _retry4: \
|
|
{ \
|
|
ipc = NEXTOP(ipc,l); \
|
|
go_on = TRUE; \
|
|
break; \
|
|
} \
|
|
case _jump: \
|
|
{ \
|
|
ipc = ipc->y_u.l.l; \
|
|
go_on = TRUE; \
|
|
break; \
|
|
} \
|
|
case _retry_c: \
|
|
case _retry_userc: \
|
|
{ \
|
|
low_level_trace(retry_pred, ipc->y_u.OtapFs.p, B->cp_args); \
|
|
break; \
|
|
} \
|
|
case _retry_profiled: \
|
|
case _count_retry: \
|
|
{ \
|
|
ipc = NEXTOP(ipc,p); \
|
|
go_on = TRUE; \
|
|
break; \
|
|
} \
|
|
case _retry_me: \
|
|
case _trust_me: \
|
|
case _count_retry_me: \
|
|
case _count_trust_me: \
|
|
case _profiled_retry_me: \
|
|
case _profiled_trust_me: \
|
|
case _retry_and_mark: \
|
|
case _profiled_retry_and_mark: \
|
|
case _retry: \
|
|
case _trust: \
|
|
{ \
|
|
low_level_trace(retry_pred, ipc->y_u.Otapl.p, B->cp_args); \
|
|
break; \
|
|
} \
|
|
case _try_logical: \
|
|
case _retry_logical: \
|
|
case _profiled_retry_logical: \
|
|
case _count_retry_logical: \
|
|
case _trust_logical: \
|
|
case _profiled_trust_logical: \
|
|
case _count_trust_logical: \
|
|
{ \
|
|
low_level_trace(retry_pred, ipc->y_u.OtILl.d->ClPred, B->cp_args); \
|
|
break; \
|
|
} \
|
|
case _Nstop: \
|
|
case _Ystop: \
|
|
{ \
|
|
low_level_trace(retry_pred, NULL, B->cp_args); \
|
|
break; \
|
|
} \
|
|
default: \
|
|
break; \
|
|
} \
|
|
} \
|
|
} \
|
|
LBL_FAIL_POST_LOW_LEVEL_TRACER
|
|
#endif /* LOW_LEVEL_TRACER */
|
|
|
|
#ifdef FROZEN_STACKS
|
|
#ifdef YAPOR_SBA
|
|
#define LBL_FAIL_POST_LOW_LEVEL_TRACER \
|
|
if (pt0 < TR_FZ || pt0 > (ADDR)CurrentTrailTop+MinTrailGap) \
|
|
{ \
|
|
TR = TR_FZ; \
|
|
TRAIL_LINK(pt0); \
|
|
} else \
|
|
{ \
|
|
RESTORE_TR(); \
|
|
} \
|
|
GONext(); \
|
|
break; \
|
|
} \
|
|
register CELL d1; \
|
|
d1 = TrailTerm(pt0-1); \
|
|
pt0--; \
|
|
LBL_FAIL_VARTERM
|
|
#else /* YAPOR_SBA */
|
|
#define LBL_FAIL_POST_LOW_LEVEL_TRACER \
|
|
if (pt0 < TR_FZ) \
|
|
{ \
|
|
TR = TR_FZ; \
|
|
TRAIL_LINK(pt0); \
|
|
} else \
|
|
{ \
|
|
RESTORE_TR(); \
|
|
} \
|
|
break; \
|
|
} \
|
|
register CELL d1; \
|
|
d1 = TrailTerm(pt0-1); \
|
|
pt0--; \
|
|
LBL_FAIL_VARTERM
|
|
#endif /* YAPOR_SBA */
|
|
#else /* FROZEN_STACKS */
|
|
#define LBL_FAIL_POST_LOW_LEVEL_TRACER \
|
|
{ \
|
|
RESTORE_TR(); \
|
|
} \
|
|
break; \
|
|
} \
|
|
register CELL d1; \
|
|
d1 = TrailTerm(pt0-1); \
|
|
pt0--; \
|
|
LBL_FAIL_VARTERM
|
|
#endif /* FROZEN_STACKS */
|
|
|
|
#if defined(YAPOR_SBA) && defined(YAPOR)
|
|
#define LBL_FAIL_VARTERM \
|
|
if (IsVarTerm(d1)) { \
|
|
if (Unsigned((Int)(d1)-(Int)(H_FZ)) > \
|
|
Unsigned((Int)(B_FZ)-(Int)(H_FZ))) { \
|
|
RESET_VARIABLE(STACK_TO_SBA(d1)); \
|
|
} else \
|
|
{ \
|
|
RESET_VARIABLE(d1); \
|
|
} \
|
|
continue; \
|
|
} \
|
|
LBL_FAIL_PAIRTERM_INIT
|
|
#else /* defined(YAPOR_SBA) && defined(YAPOR) */
|
|
#define LBL_FAIL_VARTERM \
|
|
if (IsVarTerm(d1)) { \
|
|
{ \
|
|
RESET_VARIABLE(d1); \
|
|
} \
|
|
continue; \
|
|
} \
|
|
LBL_FAIL_PAIRTERM_INIT
|
|
#endif /* defined(YAPOR_SBA) && defined(YAPOR) */
|
|
|
|
#if defined(TERM_EXTENSIONS) || defined(FROZEN_STACKS) || defined(MULTI_ASSIGNMENT_VARIABLES)
|
|
#ifdef LIMIT_TABLING
|
|
#ifdef FROZEN_STACKS
|
|
#ifdef YAPOR_SBA
|
|
#define LBL_FAIL_PAIRTERM_INIT \
|
|
if (IsPairTerm(d1)) \
|
|
{ \
|
|
register CELL flags; \
|
|
CELL *pt1 = RepPair(d1); \
|
|
if ((ADDR) pt1 == LOCAL_TrailBase) { \
|
|
sg_fr_ptr sg_fr = (sg_fr_ptr) TrailVal(pt0); \
|
|
TrailTerm(pt0) = AbsPair((CELL *)(pt0 - 1)); \
|
|
SgFr_state(sg_fr)--; \
|
|
insert_into_global_sg_fr_list(sg_fr); \
|
|
continue; \
|
|
} \
|
|
if ( \
|
|
(ADDR) pt1 >= HeapTop \
|
|
) \
|
|
{ \
|
|
pt0 = (tr_fr_ptr) pt1; \
|
|
continue; \
|
|
} else \
|
|
if (IN_BETWEEN(H0,pt1,HR)) { \
|
|
if (IsAttVar(pt1)) { \
|
|
continue; \
|
|
} else if (*pt1 == (CELL)FunctorBigInt) { \
|
|
Yap_CleanOpaqueVariable(pt1); \
|
|
} \
|
|
} \
|
|
if (pt0 < TR_FZ) { \
|
|
continue; \
|
|
} \
|
|
LBL_FAIL_PAIRTERM_END_APPL
|
|
#else /* YAPOR_SBA */
|
|
#define LBL_FAIL_PAIRTERM_INIT \
|
|
if (IsPairTerm(d1)) \
|
|
{ \
|
|
register CELL flags; \
|
|
CELL *pt1 = RepPair(d1); \
|
|
if ((ADDR) pt1 == LOCAL_TrailBase) { \
|
|
sg_fr_ptr sg_fr = (sg_fr_ptr) TrailVal(pt0); \
|
|
TrailTerm(pt0) = AbsPair((CELL *)(pt0 - 1)); \
|
|
SgFr_state(sg_fr)--; \
|
|
insert_into_global_sg_fr_list(sg_fr); \
|
|
continue; \
|
|
} \
|
|
if ( \
|
|
IN_BETWEEN(LOCAL_TrailBase, pt1, (ADDR)CurrentTrailTop+MinTrailGap) \
|
|
) \
|
|
{ \
|
|
pt0 = (tr_fr_ptr) pt1; \
|
|
continue; \
|
|
} else \
|
|
if (IN_BETWEEN(H0,pt1,HR)) { \
|
|
if (IsAttVar(pt1)) { \
|
|
continue; \
|
|
} else if (*pt1 == (CELL)FunctorBigInt) { \
|
|
Yap_CleanOpaqueVariable(pt1); \
|
|
} \
|
|
} \
|
|
if (pt0 < TR_FZ) { \
|
|
continue; \
|
|
} \
|
|
LBL_FAIL_PAIRTERM_END_APPL
|
|
#endif /* YAPOR_SBA */
|
|
#else /* FROZEN_STACKS */
|
|
#define LBL_FAIL_PAIRTERM_INIT \
|
|
if (IsPairTerm(d1)) \
|
|
{ \
|
|
register CELL flags; \
|
|
CELL *pt1 = RepPair(d1); \
|
|
if ((ADDR) pt1 == LOCAL_TrailBase) { \
|
|
sg_fr_ptr sg_fr = (sg_fr_ptr) TrailVal(pt0); \
|
|
TrailTerm(pt0) = AbsPair((CELL *)(pt0 - 1)); \
|
|
SgFr_state(sg_fr)--; \
|
|
insert_into_global_sg_fr_list(sg_fr); \
|
|
continue; \
|
|
} \
|
|
if (IN_BETWEEN(H0,pt1,HR)) { \
|
|
if (IsAttVar(pt1)) { \
|
|
continue; \
|
|
} else if (*pt1 == (CELL)FunctorBigInt) { \
|
|
Yap_CleanOpaqueVariable(pt1); \
|
|
} \
|
|
} \
|
|
LBL_FAIL_PAIRTERM_END_APPL
|
|
#endif /* FROZEN_STACKS */
|
|
#else /* LIMIT_TABLING */
|
|
#ifdef FROZEN_STACKS
|
|
#ifdef YAPOR_SBA
|
|
#define LBL_FAIL_PAIRTERM_INIT \
|
|
if (IsPairTerm(d1)) \
|
|
{ \
|
|
register CELL flags; \
|
|
CELL *pt1 = RepPair(d1); \
|
|
if ( \
|
|
(ADDR) pt1 >= HeapTop \
|
|
) \
|
|
{ \
|
|
pt0 = (tr_fr_ptr) pt1; \
|
|
continue; \
|
|
} else \
|
|
if (IN_BETWEEN(H0,pt1,HR)) { \
|
|
if (IsAttVar(pt1)) { \
|
|
continue; \
|
|
} else if (*pt1 == (CELL)FunctorBigInt) { \
|
|
Yap_CleanOpaqueVariable(pt1); \
|
|
} \
|
|
} \
|
|
if (pt0 < TR_FZ) { \
|
|
continue; \
|
|
} \
|
|
LBL_FAIL_PAIRTERM_END_APPL
|
|
#else /* YAPOR_SBA */
|
|
#define LBL_FAIL_PAIRTERM_INIT \
|
|
if (IsPairTerm(d1)) \
|
|
{ \
|
|
register CELL flags; \
|
|
CELL *pt1 = RepPair(d1); \
|
|
if ( \
|
|
IN_BETWEEN(LOCAL_TrailBase, pt1, (ADDR)CurrentTrailTop+MinTrailGap) \
|
|
) \
|
|
{ \
|
|
pt0 = (tr_fr_ptr) pt1; \
|
|
continue; \
|
|
} else \
|
|
if (IN_BETWEEN(H0,pt1,HR)) { \
|
|
if (IsAttVar(pt1)) { \
|
|
continue; \
|
|
} else if (*pt1 == (CELL)FunctorBigInt) { \
|
|
Yap_CleanOpaqueVariable(pt1); \
|
|
} \
|
|
} \
|
|
if (pt0 < TR_FZ) { \
|
|
continue; \
|
|
} \
|
|
LBL_FAIL_PAIRTERM_END_APPL
|
|
#endif /* YAPOR_SBA */
|
|
#else /* FROZEN_STACKS */
|
|
#define LBL_FAIL_PAIRTERM_INIT \
|
|
if (IsPairTerm(d1)) \
|
|
{ \
|
|
register CELL flags; \
|
|
CELL *pt1 = RepPair(d1); \
|
|
if (IN_BETWEEN(H0,pt1,HR)) { \
|
|
if (IsAttVar(pt1)) { \
|
|
continue; \
|
|
} else if (*pt1 == (CELL)FunctorBigInt) { \
|
|
Yap_CleanOpaqueVariable(pt1); \
|
|
} \
|
|
} \
|
|
LBL_FAIL_PAIRTERM_END_APPL
|
|
#endif /* FROZEN_STACKS */
|
|
#endif /* LIMIT_TABLING */
|
|
#else /* defined(TERM_EXTENSIONS) || defined(FROZEN_STACKS) || defined(MULTI_ASSIGNMENT_VARIABLES) */
|
|
#ifdef LIMIT_TABLING
|
|
#ifdef FROZEN_STACKS
|
|
#ifdef YAPOR_SBA
|
|
#define LBL_FAIL_PAIRTERM_INIT \
|
|
{ \
|
|
register CELL flags; \
|
|
CELL *pt1 = RepPair(d1); \
|
|
if ((ADDR) pt1 == LOCAL_TrailBase) { \
|
|
sg_fr_ptr sg_fr = (sg_fr_ptr) TrailVal(pt0); \
|
|
TrailTerm(pt0) = AbsPair((CELL *)(pt0 - 1)); \
|
|
SgFr_state(sg_fr)--; \
|
|
insert_into_global_sg_fr_list(sg_fr); \
|
|
continue; \
|
|
} \
|
|
if ( \
|
|
(ADDR) pt1 >= HeapTop \
|
|
) \
|
|
{ \
|
|
pt0 = (tr_fr_ptr) pt1; \
|
|
continue; \
|
|
} else \
|
|
if (IN_BETWEEN(H0,pt1,HR)) { \
|
|
if (IsAttVar(pt1)) { \
|
|
continue; \
|
|
} else if (*pt1 == (CELL)FunctorBigInt) { \
|
|
Yap_CleanOpaqueVariable(pt1); \
|
|
} \
|
|
} \
|
|
if (pt0 < TR_FZ) { \
|
|
continue; \
|
|
} \
|
|
LBL_FAIL_PAIRTERM_END_APPL
|
|
#else /* YAPOR_SBA */
|
|
#define LBL_FAIL_PAIRTERM_INIT \
|
|
{ \
|
|
register CELL flags; \
|
|
CELL *pt1 = RepPair(d1); \
|
|
if ((ADDR) pt1 == LOCAL_TrailBase) { \
|
|
sg_fr_ptr sg_fr = (sg_fr_ptr) TrailVal(pt0); \
|
|
TrailTerm(pt0) = AbsPair((CELL *)(pt0 - 1)); \
|
|
SgFr_state(sg_fr)--; \
|
|
insert_into_global_sg_fr_list(sg_fr); \
|
|
continue; \
|
|
} \
|
|
if ( \
|
|
IN_BETWEEN(LOCAL_TrailBase, pt1, (ADDR)CurrentTrailTop+MinTrailGap) \
|
|
) \
|
|
{ \
|
|
pt0 = (tr_fr_ptr) pt1; \
|
|
continue; \
|
|
} else \
|
|
if (IN_BETWEEN(H0,pt1,HR)) { \
|
|
if (IsAttVar(pt1)) { \
|
|
continue; \
|
|
} else if (*pt1 == (CELL)FunctorBigInt) { \
|
|
Yap_CleanOpaqueVariable(pt1); \
|
|
} \
|
|
} \
|
|
if (pt0 < TR_FZ) { \
|
|
continue; \
|
|
} \
|
|
LBL_FAIL_PAIRTERM_END_APPL
|
|
#endif /* YAPOR_SBA */
|
|
#else /* FROZEN_STACKS */
|
|
#define LBL_FAIL_PAIRTERM_INIT \
|
|
{ \
|
|
register CELL flags; \
|
|
CELL *pt1 = RepPair(d1); \
|
|
if ((ADDR) pt1 == LOCAL_TrailBase) { \
|
|
sg_fr_ptr sg_fr = (sg_fr_ptr) TrailVal(pt0); \
|
|
TrailTerm(pt0) = AbsPair((CELL *)(pt0 - 1)); \
|
|
SgFr_state(sg_fr)--; \
|
|
insert_into_global_sg_fr_list(sg_fr); \
|
|
continue; \
|
|
} \
|
|
if (IN_BETWEEN(H0,pt1,HR)) { \
|
|
if (IsAttVar(pt1)) { \
|
|
continue; \
|
|
} else if (*pt1 == (CELL)FunctorBigInt) { \
|
|
Yap_CleanOpaqueVariable(pt1); \
|
|
} \
|
|
} \
|
|
LBL_FAIL_PAIRTERM_END_APPL
|
|
#endif /* FROZEN_STACKS */
|
|
#else /* LIMIT_TABLING */
|
|
#ifdef FROZEN_STACKS
|
|
#ifdef YAPOR_SBA
|
|
#define LBL_FAIL_PAIRTERM_INIT \
|
|
{ \
|
|
register CELL flags; \
|
|
CELL *pt1 = RepPair(d1); \
|
|
if ( \
|
|
(ADDR) pt1 >= HeapTop \
|
|
) \
|
|
{ \
|
|
pt0 = (tr_fr_ptr) pt1; \
|
|
continue; \
|
|
} else \
|
|
if (IN_BETWEEN(H0,pt1,HR)) { \
|
|
if (IsAttVar(pt1)) { \
|
|
continue; \
|
|
} else if (*pt1 == (CELL)FunctorBigInt) { \
|
|
Yap_CleanOpaqueVariable(pt1); \
|
|
} \
|
|
} \
|
|
if (pt0 < TR_FZ) { \
|
|
continue; \
|
|
} \
|
|
LBL_FAIL_PAIRTERM_END_APPL
|
|
#else /* YAPOR_SBA */
|
|
#define LBL_FAIL_PAIRTERM_INIT \
|
|
{ \
|
|
register CELL flags; \
|
|
CELL *pt1 = RepPair(d1); \
|
|
if ( \
|
|
IN_BETWEEN(LOCAL_TrailBase, pt1, (ADDR)CurrentTrailTop+MinTrailGap) \
|
|
) \
|
|
{ \
|
|
pt0 = (tr_fr_ptr) pt1; \
|
|
continue; \
|
|
} else \
|
|
if (IN_BETWEEN(H0,pt1,HR)) { \
|
|
if (IsAttVar(pt1)) { \
|
|
continue; \
|
|
} else if (*pt1 == (CELL)FunctorBigInt) { \
|
|
Yap_CleanOpaqueVariable(pt1); \
|
|
} \
|
|
} \
|
|
if (pt0 < TR_FZ) { \
|
|
continue; \
|
|
} \
|
|
LBL_FAIL_PAIRTERM_END_APPL
|
|
#endif /* YAPOR_SBA */
|
|
#else /* FROZEN_STACKS */
|
|
#define LBL_FAIL_PAIRTERM_INIT \
|
|
{ \
|
|
register CELL flags; \
|
|
CELL *pt1 = RepPair(d1); \
|
|
if (IN_BETWEEN(H0,pt1,HR)) { \
|
|
if (IsAttVar(pt1)) { \
|
|
continue; \
|
|
} else if (*pt1 == (CELL)FunctorBigInt) { \
|
|
Yap_CleanOpaqueVariable(pt1); \
|
|
} \
|
|
} \
|
|
LBL_FAIL_PAIRTERM_END_APPL
|
|
#endif /* FROZEN_STACKS */
|
|
#endif /* LIMIT_TABLING */
|
|
#endif /* defined(TERM_EXTENSIONS) || defined(FROZEN_STACKS) || defined(MULTI_ASSIGNMENT_VARIABLES) */
|
|
|
|
#if MULTIPLE_STACKS
|
|
#if PARALLEL_YAP
|
|
#ifdef MULTI_ASSIGNMENT_VARIABLES
|
|
#ifdef FROZEN_STACKS
|
|
#define LBL_FAIL_PAIRTERM_END_APPL \
|
|
flags = *pt1; \
|
|
if (FlagOn(DBClMask, flags)) { \
|
|
DBRef dbr = DBStructFlagsToDBStruct(pt1); \
|
|
int erase; \
|
|
LOCK(dbr->lock); \
|
|
DEC_DBREF_COUNT(dbr); \
|
|
erase = (dbr->Flags & ErasedMask) && (dbr->ref_count == 0); \
|
|
UNLOCK(dbr->lock); \
|
|
if (erase) { \
|
|
saveregs(); \
|
|
Yap_ErDBE(dbr); \
|
|
setregs(); \
|
|
} \
|
|
} else { \
|
|
if (flags & LogUpdMask) { \
|
|
if (flags & IndexMask) { \
|
|
LogUpdIndex *cl = ClauseFlagsToLogUpdIndex(pt1); \
|
|
int erase; \
|
|
PredEntry *ap = cl->ClPred; \
|
|
PELOCK(8,ap); \
|
|
DEC_CLREF_COUNT(cl); \
|
|
erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); \
|
|
if (erase) { \
|
|
saveregs(); \
|
|
Yap_ErLogUpdIndex(cl); \
|
|
setregs(); \
|
|
} else if (cl->ClFlags & DirtyMask) { \
|
|
saveregs(); \
|
|
Yap_CleanUpIndex(cl); \
|
|
setregs(); \
|
|
} \
|
|
UNLOCK(ap->PELock); \
|
|
} else { \
|
|
LogUpdClause *cl = ClauseFlagsToLogUpdClause(pt1); \
|
|
int erase; \
|
|
PredEntry *ap = cl->ClPred; \
|
|
PELOCK(9,ap); \
|
|
DEC_CLREF_COUNT(cl); \
|
|
erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); \
|
|
if (erase) { \
|
|
saveregs(); \
|
|
Yap_ErLogUpdCl(cl); \
|
|
setregs(); \
|
|
} \
|
|
UNLOCK(ap->PELock); \
|
|
} \
|
|
} else { \
|
|
DynamicClause *cl = ClauseFlagsToDynamicClause(pt1); \
|
|
int erase; \
|
|
LOCK(cl->ClLock); \
|
|
DEC_CLREF_COUNT(cl); \
|
|
erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); \
|
|
UNLOCK(cl->ClLock); \
|
|
if (erase) { \
|
|
saveregs(); \
|
|
Yap_ErCl(cl); \
|
|
setregs(); \
|
|
} \
|
|
} \
|
|
} \
|
|
continue; \
|
|
} \
|
|
else { \
|
|
CELL *pt = RepAppl(d1); \
|
|
--pt0; \
|
|
pt[0] = TrailVal(pt0); \
|
|
pt[0] = TrailTerm(pt0-1); \
|
|
pt0 -= 2; \
|
|
continue; \
|
|
} \
|
|
ENDCACHE_TR(); \
|
|
} \
|
|
}
|
|
#else /* FROZEN_STACKS */
|
|
#define LBL_FAIL_PAIRTERM_END_APPL \
|
|
flags = *pt1; \
|
|
if (FlagOn(DBClMask, flags)) { \
|
|
DBRef dbr = DBStructFlagsToDBStruct(pt1); \
|
|
int erase; \
|
|
LOCK(dbr->lock); \
|
|
DEC_DBREF_COUNT(dbr); \
|
|
erase = (dbr->Flags & ErasedMask) && (dbr->ref_count == 0); \
|
|
UNLOCK(dbr->lock); \
|
|
if (erase) { \
|
|
saveregs(); \
|
|
Yap_ErDBE(dbr); \
|
|
setregs(); \
|
|
} \
|
|
} else { \
|
|
if (flags & LogUpdMask) { \
|
|
if (flags & IndexMask) { \
|
|
LogUpdIndex *cl = ClauseFlagsToLogUpdIndex(pt1); \
|
|
int erase; \
|
|
PredEntry *ap = cl->ClPred; \
|
|
PELOCK(8,ap); \
|
|
DEC_CLREF_COUNT(cl); \
|
|
erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); \
|
|
if (erase) { \
|
|
saveregs(); \
|
|
Yap_ErLogUpdIndex(cl); \
|
|
setregs(); \
|
|
} else if (cl->ClFlags & DirtyMask) { \
|
|
saveregs(); \
|
|
Yap_CleanUpIndex(cl); \
|
|
setregs(); \
|
|
} \
|
|
UNLOCK(ap->PELock); \
|
|
} else { \
|
|
LogUpdClause *cl = ClauseFlagsToLogUpdClause(pt1); \
|
|
int erase; \
|
|
PredEntry *ap = cl->ClPred; \
|
|
PELOCK(9,ap); \
|
|
DEC_CLREF_COUNT(cl); \
|
|
erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); \
|
|
if (erase) { \
|
|
saveregs(); \
|
|
Yap_ErLogUpdCl(cl); \
|
|
setregs(); \
|
|
} \
|
|
UNLOCK(ap->PELock); \
|
|
} \
|
|
} else { \
|
|
DynamicClause *cl = ClauseFlagsToDynamicClause(pt1); \
|
|
int erase; \
|
|
LOCK(cl->ClLock); \
|
|
DEC_CLREF_COUNT(cl); \
|
|
erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); \
|
|
UNLOCK(cl->ClLock); \
|
|
if (erase) { \
|
|
saveregs(); \
|
|
Yap_ErCl(cl); \
|
|
setregs(); \
|
|
} \
|
|
} \
|
|
} \
|
|
continue; \
|
|
} \
|
|
else { \
|
|
CELL *pt = RepAppl(d1); \
|
|
pt[0] = TrailTerm(pt0-1); \
|
|
pt0 -= 2; \
|
|
continue; \
|
|
} \
|
|
ENDCACHE_TR(); \
|
|
} \
|
|
}
|
|
#endif /* FROZEN_STACKS */
|
|
#else /* MULTI_ASSIGNMENT_VARIABLES */
|
|
#define LBL_FAIL_PAIRTERM_END_APPL \
|
|
flags = *pt1; \
|
|
if (FlagOn(DBClMask, flags)) { \
|
|
DBRef dbr = DBStructFlagsToDBStruct(pt1); \
|
|
int erase; \
|
|
LOCK(dbr->lock); \
|
|
DEC_DBREF_COUNT(dbr); \
|
|
erase = (dbr->Flags & ErasedMask) && (dbr->ref_count == 0); \
|
|
UNLOCK(dbr->lock); \
|
|
if (erase) { \
|
|
saveregs(); \
|
|
Yap_ErDBE(dbr); \
|
|
setregs(); \
|
|
} \
|
|
} else { \
|
|
if (flags & LogUpdMask) { \
|
|
if (flags & IndexMask) { \
|
|
LogUpdIndex *cl = ClauseFlagsToLogUpdIndex(pt1); \
|
|
int erase; \
|
|
PredEntry *ap = cl->ClPred; \
|
|
PELOCK(8,ap); \
|
|
DEC_CLREF_COUNT(cl); \
|
|
erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); \
|
|
if (erase) { \
|
|
saveregs(); \
|
|
Yap_ErLogUpdIndex(cl); \
|
|
setregs(); \
|
|
} else if (cl->ClFlags & DirtyMask) { \
|
|
saveregs(); \
|
|
Yap_CleanUpIndex(cl); \
|
|
setregs(); \
|
|
} \
|
|
UNLOCK(ap->PELock); \
|
|
} else { \
|
|
LogUpdClause *cl = ClauseFlagsToLogUpdClause(pt1); \
|
|
int erase; \
|
|
PredEntry *ap = cl->ClPred; \
|
|
PELOCK(9,ap); \
|
|
DEC_CLREF_COUNT(cl); \
|
|
erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); \
|
|
if (erase) { \
|
|
saveregs(); \
|
|
Yap_ErLogUpdCl(cl); \
|
|
setregs(); \
|
|
} \
|
|
UNLOCK(ap->PELock); \
|
|
} \
|
|
} else { \
|
|
DynamicClause *cl = ClauseFlagsToDynamicClause(pt1); \
|
|
int erase; \
|
|
LOCK(cl->ClLock); \
|
|
DEC_CLREF_COUNT(cl); \
|
|
erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); \
|
|
UNLOCK(cl->ClLock); \
|
|
if (erase) { \
|
|
saveregs(); \
|
|
Yap_ErCl(cl); \
|
|
setregs(); \
|
|
} \
|
|
} \
|
|
} \
|
|
continue; \
|
|
} \
|
|
ENDCACHE_TR(); \
|
|
} \
|
|
}
|
|
#endif /* MULTI_ASSIGNMENT_VARIABLES */
|
|
#else /* PARALLEL_YAP */
|
|
#ifdef MULTI_ASSIGNMENT_VARIABLES
|
|
#ifdef FROZEN_STACKS
|
|
#define LBL_FAIL_PAIRTERM_END_APPL \
|
|
flags = *pt1; \
|
|
if (FlagOn(DBClMask, flags)) { \
|
|
DBRef dbr = DBStructFlagsToDBStruct(pt1); \
|
|
int erase; \
|
|
LOCK(dbr->lock); \
|
|
DEC_DBREF_COUNT(dbr); \
|
|
erase = (dbr->Flags & ErasedMask) && (dbr->ref_count == 0); \
|
|
UNLOCK(dbr->lock); \
|
|
if (erase) { \
|
|
saveregs(); \
|
|
Yap_ErDBE(dbr); \
|
|
setregs(); \
|
|
} \
|
|
} else { \
|
|
if (flags & LogUpdMask) { \
|
|
if (flags & IndexMask) { \
|
|
LogUpdIndex *cl = ClauseFlagsToLogUpdIndex(pt1); \
|
|
int erase; \
|
|
PELOCK(8,ap); \
|
|
DEC_CLREF_COUNT(cl); \
|
|
erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); \
|
|
if (erase) { \
|
|
saveregs(); \
|
|
Yap_ErLogUpdIndex(cl); \
|
|
setregs(); \
|
|
} else if (cl->ClFlags & DirtyMask) { \
|
|
saveregs(); \
|
|
Yap_CleanUpIndex(cl); \
|
|
setregs(); \
|
|
} \
|
|
UNLOCK(ap->PELock); \
|
|
} else { \
|
|
LogUpdClause *cl = ClauseFlagsToLogUpdClause(pt1); \
|
|
int erase; \
|
|
PELOCK(9,ap); \
|
|
DEC_CLREF_COUNT(cl); \
|
|
erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); \
|
|
if (erase) { \
|
|
saveregs(); \
|
|
Yap_ErLogUpdCl(cl); \
|
|
setregs(); \
|
|
} \
|
|
UNLOCK(ap->PELock); \
|
|
} \
|
|
} else { \
|
|
DynamicClause *cl = ClauseFlagsToDynamicClause(pt1); \
|
|
int erase; \
|
|
LOCK(cl->ClLock); \
|
|
DEC_CLREF_COUNT(cl); \
|
|
erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); \
|
|
UNLOCK(cl->ClLock); \
|
|
if (erase) { \
|
|
saveregs(); \
|
|
Yap_ErCl(cl); \
|
|
setregs(); \
|
|
} \
|
|
} \
|
|
} \
|
|
continue; \
|
|
} \
|
|
else { \
|
|
CELL *pt = RepAppl(d1); \
|
|
--pt0; \
|
|
pt[0] = TrailVal(pt0); \
|
|
continue; \
|
|
} \
|
|
ENDCACHE_TR(); \
|
|
} \
|
|
}
|
|
#else /* FROZEN_STACKS */
|
|
#define LBL_FAIL_PAIRTERM_END_APPL \
|
|
flags = *pt1; \
|
|
if (FlagOn(DBClMask, flags)) { \
|
|
DBRef dbr = DBStructFlagsToDBStruct(pt1); \
|
|
int erase; \
|
|
LOCK(dbr->lock); \
|
|
DEC_DBREF_COUNT(dbr); \
|
|
erase = (dbr->Flags & ErasedMask) && (dbr->ref_count == 0); \
|
|
UNLOCK(dbr->lock); \
|
|
if (erase) { \
|
|
saveregs(); \
|
|
Yap_ErDBE(dbr); \
|
|
setregs(); \
|
|
} \
|
|
} else { \
|
|
if (flags & LogUpdMask) { \
|
|
if (flags & IndexMask) { \
|
|
LogUpdIndex *cl = ClauseFlagsToLogUpdIndex(pt1); \
|
|
int erase; \
|
|
PELOCK(8,ap); \
|
|
DEC_CLREF_COUNT(cl); \
|
|
erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); \
|
|
if (erase) { \
|
|
saveregs(); \
|
|
Yap_ErLogUpdIndex(cl); \
|
|
setregs(); \
|
|
} else if (cl->ClFlags & DirtyMask) { \
|
|
saveregs(); \
|
|
Yap_CleanUpIndex(cl); \
|
|
setregs(); \
|
|
} \
|
|
UNLOCK(ap->PELock); \
|
|
} else { \
|
|
LogUpdClause *cl = ClauseFlagsToLogUpdClause(pt1); \
|
|
int erase; \
|
|
PELOCK(9,ap); \
|
|
DEC_CLREF_COUNT(cl); \
|
|
erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); \
|
|
if (erase) { \
|
|
saveregs(); \
|
|
Yap_ErLogUpdCl(cl); \
|
|
setregs(); \
|
|
} \
|
|
UNLOCK(ap->PELock); \
|
|
} \
|
|
} else { \
|
|
DynamicClause *cl = ClauseFlagsToDynamicClause(pt1); \
|
|
int erase; \
|
|
LOCK(cl->ClLock); \
|
|
DEC_CLREF_COUNT(cl); \
|
|
erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); \
|
|
UNLOCK(cl->ClLock); \
|
|
if (erase) { \
|
|
saveregs(); \
|
|
Yap_ErCl(cl); \
|
|
setregs(); \
|
|
} \
|
|
} \
|
|
} \
|
|
continue; \
|
|
} \
|
|
else { \
|
|
CELL *pt = RepAppl(d1); \
|
|
pt[0] = TrailTerm(pt0-1); \
|
|
pt0 -= 2; \
|
|
continue; \
|
|
} \
|
|
ENDCACHE_TR(); \
|
|
} \
|
|
}
|
|
#endif /* FROZEN_STACKS */
|
|
#else /* MULTI_ASSIGNMENT_VARIABLES */
|
|
#define LBL_FAIL_PAIRTERM_END_APPL \
|
|
flags = *pt1; \
|
|
if (FlagOn(DBClMask, flags)) { \
|
|
DBRef dbr = DBStructFlagsToDBStruct(pt1); \
|
|
int erase; \
|
|
LOCK(dbr->lock); \
|
|
DEC_DBREF_COUNT(dbr); \
|
|
erase = (dbr->Flags & ErasedMask) && (dbr->ref_count == 0); \
|
|
UNLOCK(dbr->lock); \
|
|
if (erase) { \
|
|
saveregs(); \
|
|
Yap_ErDBE(dbr); \
|
|
setregs(); \
|
|
} \
|
|
} else { \
|
|
if (flags & LogUpdMask) { \
|
|
if (flags & IndexMask) { \
|
|
LogUpdIndex *cl = ClauseFlagsToLogUpdIndex(pt1); \
|
|
int erase; \
|
|
PELOCK(8,ap); \
|
|
DEC_CLREF_COUNT(cl); \
|
|
erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); \
|
|
if (erase) { \
|
|
saveregs(); \
|
|
Yap_ErLogUpdIndex(cl); \
|
|
setregs(); \
|
|
} else if (cl->ClFlags & DirtyMask) { \
|
|
saveregs(); \
|
|
Yap_CleanUpIndex(cl); \
|
|
setregs(); \
|
|
} \
|
|
UNLOCK(ap->PELock); \
|
|
} else { \
|
|
LogUpdClause *cl = ClauseFlagsToLogUpdClause(pt1); \
|
|
int erase; \
|
|
PELOCK(9,ap); \
|
|
DEC_CLREF_COUNT(cl); \
|
|
erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); \
|
|
if (erase) { \
|
|
saveregs(); \
|
|
Yap_ErLogUpdCl(cl); \
|
|
setregs(); \
|
|
} \
|
|
UNLOCK(ap->PELock); \
|
|
} \
|
|
} else { \
|
|
DynamicClause *cl = ClauseFlagsToDynamicClause(pt1); \
|
|
int erase; \
|
|
LOCK(cl->ClLock); \
|
|
DEC_CLREF_COUNT(cl); \
|
|
erase = (cl->ClFlags & ErasedMask) && !(cl->ClRefCount); \
|
|
UNLOCK(cl->ClLock); \
|
|
if (erase) { \
|
|
saveregs(); \
|
|
Yap_ErCl(cl); \
|
|
setregs(); \
|
|
} \
|
|
} \
|
|
} \
|
|
continue; \
|
|
} \
|
|
ENDCACHE_TR(); \
|
|
} \
|
|
}
|
|
#endif /* MULTI_ASSIGNMENT_VARIABLES */
|
|
#endif /* PARALLEL_YAP */
|
|
#else /* MULTIPLE_STACKS */
|
|
#ifdef MULTI_ASSIGNMENT_VARIABLES
|
|
#ifdef FROZEN_STACKS
|
|
#define LBL_FAIL_PAIRTERM_END_APPL \
|
|
flags = *pt1; \
|
|
ResetFlag(InUseMask, flags); \
|
|
*pt1 = flags; \
|
|
if (FlagOn((ErasedMask|DirtyMask), flags)) { \
|
|
if (FlagOn(DBClMask, flags)) { \
|
|
saveregs(); \
|
|
Yap_ErDBE(DBStructFlagsToDBStruct(pt1)); \
|
|
setregs(); \
|
|
} else { \
|
|
saveregs(); \
|
|
if (flags & LogUpdMask) { \
|
|
if (flags & IndexMask) { \
|
|
if (FlagOn(ErasedMask, flags)) { \
|
|
Yap_ErLogUpdIndex(ClauseFlagsToLogUpdIndex(pt1)); \
|
|
} else { \
|
|
Yap_CleanUpIndex(ClauseFlagsToLogUpdIndex(pt1)); \
|
|
} \
|
|
} else { \
|
|
Yap_ErLogUpdCl(ClauseFlagsToLogUpdClause(pt1)); \
|
|
} \
|
|
} else { \
|
|
Yap_ErCl(ClauseFlagsToDynamicClause(pt1)); \
|
|
} \
|
|
setregs(); \
|
|
} \
|
|
} \
|
|
continue; \
|
|
} \
|
|
else { \
|
|
CELL *pt = RepAppl(d1); \
|
|
--pt0; \
|
|
pt[0] = TrailVal(pt0); \
|
|
continue; \
|
|
} \
|
|
ENDCACHE_TR(); \
|
|
} \
|
|
}
|
|
#else /* FROZEN_STACKS */
|
|
#define LBL_FAIL_PAIRTERM_END_APPL \
|
|
flags = *pt1; \
|
|
ResetFlag(InUseMask, flags); \
|
|
*pt1 = flags; \
|
|
if (FlagOn((ErasedMask|DirtyMask), flags)) { \
|
|
if (FlagOn(DBClMask, flags)) { \
|
|
saveregs(); \
|
|
Yap_ErDBE(DBStructFlagsToDBStruct(pt1)); \
|
|
setregs(); \
|
|
} else { \
|
|
saveregs(); \
|
|
if (flags & LogUpdMask) { \
|
|
if (flags & IndexMask) { \
|
|
if (FlagOn(ErasedMask, flags)) { \
|
|
Yap_ErLogUpdIndex(ClauseFlagsToLogUpdIndex(pt1)); \
|
|
} else { \
|
|
Yap_CleanUpIndex(ClauseFlagsToLogUpdIndex(pt1)); \
|
|
} \
|
|
} else { \
|
|
Yap_ErLogUpdCl(ClauseFlagsToLogUpdClause(pt1)); \
|
|
} \
|
|
} else { \
|
|
Yap_ErCl(ClauseFlagsToDynamicClause(pt1)); \
|
|
} \
|
|
setregs(); \
|
|
} \
|
|
} \
|
|
continue; \
|
|
} \
|
|
else { \
|
|
CELL *pt = RepAppl(d1); \
|
|
pt[0] = TrailTerm(pt0-1); \
|
|
pt0 -= 2; \
|
|
continue; \
|
|
} \
|
|
ENDCACHE_TR(); \
|
|
} \
|
|
}
|
|
#endif /* FROZEN_STACKS */
|
|
#else /* MULTI_ASSIGNMENT_VARIABLES */
|
|
#define LBL_FAIL_PAIRTERM_END_APPL \
|
|
flags = *pt1; \
|
|
ResetFlag(InUseMask, flags); \
|
|
*pt1 = flags; \
|
|
if (FlagOn((ErasedMask|DirtyMask), flags)) { \
|
|
if (FlagOn(DBClMask, flags)) { \
|
|
saveregs(); \
|
|
Yap_ErDBE(DBStructFlagsToDBStruct(pt1)); \
|
|
setregs(); \
|
|
} else { \
|
|
saveregs(); \
|
|
if (flags & LogUpdMask) { \
|
|
if (flags & IndexMask) { \
|
|
if (FlagOn(ErasedMask, flags)) { \
|
|
Yap_ErLogUpdIndex(ClauseFlagsToLogUpdIndex(pt1)); \
|
|
} else { \
|
|
Yap_CleanUpIndex(ClauseFlagsToLogUpdIndex(pt1)); \
|
|
} \
|
|
} else { \
|
|
Yap_ErLogUpdCl(ClauseFlagsToLogUpdClause(pt1)); \
|
|
} \
|
|
} else { \
|
|
Yap_ErCl(ClauseFlagsToDynamicClause(pt1)); \
|
|
} \
|
|
setregs(); \
|
|
} \
|
|
} \
|
|
continue; \
|
|
} \
|
|
ENDCACHE_TR(); \
|
|
} \
|
|
}
|
|
#endif /* MULTI_ASSIGNMENT_VARIABLES */
|
|
#endif /* MULTIPLE_STACKS */
|
|
|
|
#define LBL_FAIL_END \
|
|
BLOCK = (CELL)LBL_FAIL_END;
|