use a macro (stack_terms_limit) to delimit the top of the auxiliary term

stack
This commit is contained in:
Ricardo Rocha 2010-04-03 16:05:38 +01:00
parent b3e2c562a2
commit 6c222b8e87
1 changed files with 42 additions and 40 deletions

View File

@ -809,13 +809,13 @@ static gt_node_ptr subgoal_search_subterm(Term t, int *subs_arity_ptr, CELL **st
#ifdef GLOBAL_TRIE
gt_node_ptr current_node = GLOBAL_root_gt;
#endif /* GLOBAL_TRIE */
CELL *stack_terms_limit = (CELL *) TR;
int subs_arity = *subs_arity_ptr;
CELL *stack_vars = *stack_vars_ptr;
#ifndef GLOBAL_TRIE_FOR_SUBTERMS
CELL *stack_terms = (CELL *) Yap_TrailTop;
#endif /* GLOBAL_TRIE_FOR_SUBTERMS */
AUX_STACK_CHECK_EXPAND(stack_terms, stack_terms_limit + 1);
CELL *stack_terms_limit = (CELL *) TR;
AUX_STACK_CHECK_EXPAND(stack_terms, stack_terms_limit + 1); /* + 1 because initially we stiil haven't done any STACK_POP_DOWN */
STACK_PUSH_UP(NULL, stack_terms);
do {
@ -931,11 +931,6 @@ static inline gt_node_ptr answer_search_subterm(Term t, int *vars_arity_ptr) {
#elif GLOBAL_TRIE_FOR_SUBTERMS
static gt_node_ptr answer_search_subterm(Term t, int *vars_arity_ptr, CELL *stack_terms) {
#endif
#ifdef TRIE_COMPACT_PAIRS
int in_new_pair = 0;
#else
#define in_new_pair 0
#endif /* TRIE_COMPACT_PAIRS */
#ifdef GLOBAL_TRIE
gt_node_ptr current_node = GLOBAL_root_gt;
#endif /* GLOBAL_TRIE */
@ -943,8 +938,14 @@ static gt_node_ptr answer_search_subterm(Term t, int *vars_arity_ptr, CELL *stac
#ifndef GLOBAL_TRIE_FOR_SUBTERMS
CELL *stack_terms = (CELL *) Yap_TrailTop;
#endif /* GLOBAL_TRIE_FOR_SUBTERMS */
CELL *stack_vars = ((CELL *) TR) + vars_arity;
AUX_STACK_CHECK_EXPAND(stack_terms, stack_vars + 1);
CELL *stack_vars_base = (CELL *) TR;
#define stack_terms_limit (stack_vars_base + vars_arity)
#ifdef TRIE_COMPACT_PAIRS
int in_new_pair = 0;
#else
#define in_new_pair 0
#endif /* TRIE_COMPACT_PAIRS */
AUX_STACK_CHECK_EXPAND(stack_terms, stack_terms_limit + 1); /* + 1 because initially we stiil haven't done any STACK_POP_DOWN */
STACK_PUSH_UP(NULL, stack_terms);
do {
@ -956,7 +957,7 @@ static gt_node_ptr answer_search_subterm(Term t, int *vars_arity_ptr, CELL *stac
} else {
if (vars_arity == MAX_TABLE_VARS)
Yap_Error(INTERNAL_ERROR, TermNil, "MAX_TABLE_VARS exceeded (answer_search_subterm)");
STACK_PUSH_DOWN(t, stack_vars);
stack_vars_base[vars_arity] = t;
*((CELL *)t) = GLOBAL_table_var_enumerator(vars_arity);
t = MakeTableVarTerm(vars_arity);
ANSWER_TOKEN_CHECK_INSERT(sg_fr, current_node, t, _trie_retry_var + in_new_pair);
@ -981,7 +982,7 @@ static gt_node_ptr answer_search_subterm(Term t, int *vars_arity_ptr, CELL *stac
if (t == TermNil) {
ANSWER_TOKEN_CHECK_INSERT(sg_fr, current_node, CompactPairEndList, _trie_retry_pair);
} else {
/* AUX_STACK_CHECK_EXPAND(stack_terms, stack_vars + 2); */
/* AUX_STACK_CHECK_EXPAND(stack_terms, stack_terms_limit + 2); */
/* AUX_STACK_CHECK_EXPAND is not necessary here because the situation of pushing **
** up 3 terms has already initially checked for the CompactPairInit term */
STACK_PUSH_UP(t, stack_terms);
@ -1000,7 +1001,7 @@ static gt_node_ptr answer_search_subterm(Term t, int *vars_arity_ptr, CELL *stac
ANSWER_TOKEN_CHECK_INSERT(sg_fr, current_node, CompactPairEndList, _trie_retry_pair);
in_new_pair = 0;
} else {
AUX_STACK_CHECK_EXPAND(stack_terms, stack_vars + 2);
AUX_STACK_CHECK_EXPAND(stack_terms, stack_terms_limit + 2);
STACK_PUSH_UP(t, stack_terms);
STACK_PUSH_UP(AbsPair(PairTermMark), stack_terms);
in_new_pair = 4;
@ -1009,7 +1010,7 @@ static gt_node_ptr answer_search_subterm(Term t, int *vars_arity_ptr, CELL *stac
}
#else
ANSWER_TOKEN_CHECK_INSERT(sg_fr, current_node, AbsPair(NULL), _trie_retry_pair);
AUX_STACK_CHECK_EXPAND(stack_terms, stack_vars + 1);
AUX_STACK_CHECK_EXPAND(stack_terms, stack_terms_limit + 1);
STACK_PUSH_UP(Deref(*(RepPair(t) + 1)), stack_terms);
STACK_PUSH_UP(Deref(*(RepPair(t))), stack_terms);
#endif /* TRIE_COMPACT_PAIRS */
@ -1037,14 +1038,13 @@ static gt_node_ptr answer_search_subterm(Term t, int *vars_arity_ptr, CELL *stac
#ifdef GLOBAL_TRIE_FOR_SUBTERMS
if (current_node != GLOBAL_root_gt) {
gt_node_ptr subterm_node = answer_subterm_search(t, &vars_arity, stack_terms);
stack_vars = ((CELL *) TR) + vars_arity;
ANSWER_TOKEN_CHECK_INSERT(sg_fr, current_node, (Term) subterm_node, _trie_retry_struct + in_new_pair);
} else
#endif /* GLOBAL_TRIE_FOR_SUBTERMS */
{
int i;
ANSWER_TOKEN_CHECK_INSERT(sg_fr, current_node, AbsAppl((Term *)f), _trie_retry_struct + in_new_pair);
AUX_STACK_CHECK_EXPAND(stack_terms, stack_vars + ArityOfFunctor(f) - 1);
AUX_STACK_CHECK_EXPAND(stack_terms, stack_terms_limit + ArityOfFunctor(f) - 1);
for (i = ArityOfFunctor(f); i >= 1; i--)
STACK_PUSH_UP(Deref(*(RepAppl(t) + i)), stack_terms);
}
@ -1060,6 +1060,8 @@ static gt_node_ptr answer_search_subterm(Term t, int *vars_arity_ptr, CELL *stac
*vars_arity_ptr = vars_arity;
return current_node;
#undef stack_terms_limit
#ifndef TRIE_COMPACT_PAIRS
#undef in_new_pair
#endif /* TRIE_COMPACT_PAIRS */
@ -1073,19 +1075,22 @@ static inline CELL *load_answer_subterm(gt_node_ptr current_node, int *vars_arit
#elif GLOBAL_TRIE_FOR_SUBTERMS
static CELL *load_answer_subterm(gt_node_ptr current_node, int *vars_arity_ptr, CELL *stack_terms) {
#endif
#ifndef GLOBAL_TRIE
int vars_arity = 0;
CELL *stack_terms = (CELL *) Yap_TrailTop;
#else /* GLOBAL_TRIE */
int vars_arity = *vars_arity_ptr;
#endif
CELL *stack_vars_base = (CELL *) TR;
#define stack_terms_limit (stack_vars_base + vars_arity)
#ifdef TRIE_COMPACT_PAIRS
#define stack_terms_base ((CELL *) Yap_TrailTop)
int stack_terms_pair_offset = 0;
#endif /* TRIE_COMPACT_PAIRS */
CELL *stack_vars_base = (CELL *) TR;
#ifdef GLOBAL_TRIE
int vars_arity = *vars_arity_ptr;
Term t = TrNode_entry(current_node);
#ifdef GLOBAL_TRIE
current_node = TrNode_parent(current_node);
#else
int vars_arity = 0;
CELL *stack_terms = (CELL *) Yap_TrailTop;
Term t = TrNode_entry(current_node);
current_node = UNTAG_ANSWER_LEAF_NODE(TrNode_parent(current_node));
#endif /* GLOBAL_TRIE */
@ -1097,7 +1102,7 @@ static CELL *load_answer_subterm(gt_node_ptr current_node, int *vars_arity_ptr,
} else
#endif /* GLOBAL_TRIE_FOR_SUBTERMS */
{ int var_index = VarIndexOfTableTerm(t);
AUX_STACK_CHECK_EXPAND(stack_terms, stack_vars_base + var_index + 1);
AUX_STACK_CHECK_EXPAND(stack_terms, stack_terms_limit - vars_arity + var_index + 1);
if (var_index >= vars_arity) {
while (vars_arity < var_index)
stack_vars_base[vars_arity++] = 0;
@ -1107,7 +1112,7 @@ static CELL *load_answer_subterm(gt_node_ptr current_node, int *vars_arity_ptr,
STACK_PUSH_UP(stack_vars_base[var_index], stack_terms);
}
} else if (IsAtomOrIntTerm(t)) {
AUX_STACK_CHECK_EXPAND(stack_terms, stack_vars_base + vars_arity);
AUX_STACK_CHECK_EXPAND(stack_terms, stack_terms_limit);
STACK_PUSH_UP(t, stack_terms);
} else if (IsPairTerm(t)) {
#ifdef TRIE_COMPACT_PAIRS
@ -1120,10 +1125,10 @@ static CELL *load_answer_subterm(gt_node_ptr current_node, int *vars_arity_ptr,
}
stack_terms = stack_terms_base - stack_terms_pair_offset;
stack_terms_pair_offset = (int) STACK_POP_DOWN(stack_terms);
STACK_PUSH_UP(tail, stack_terms);
STACK_PUSH_UP(tail, stack_terms);
} else { /* CompactPairEndList / CompactPairEndTerm */
Term last;
AUX_STACK_CHECK_EXPAND(stack_terms, stack_vars_base + vars_arity + 1);
AUX_STACK_CHECK_EXPAND(stack_terms, stack_terms_limit + 1);
last = STACK_POP_DOWN(stack_terms);
STACK_PUSH_UP(stack_terms_pair_offset, stack_terms);
stack_terms_pair_offset = (int) (stack_terms_base - stack_terms);
@ -1152,22 +1157,18 @@ static CELL *load_answer_subterm(gt_node_ptr current_node, int *vars_arity_ptr,
#endif /* SIZEOF_DOUBLE x SIZEOF_INT_P */
current_node = TrNode_parent(current_node);
t = MkFloatTerm(dbl);
AUX_STACK_CHECK_EXPAND(stack_terms, stack_vars_base + vars_arity);
STACK_PUSH_UP(t, stack_terms);
} else if (f == FunctorLongInt) {
Int li = TrNode_entry(current_node);
current_node = TrNode_parent(current_node);
current_node = TrNode_parent(current_node);
t = MkLongIntTerm(li);
AUX_STACK_CHECK_EXPAND(stack_terms, stack_vars_base + vars_arity);
STACK_PUSH_UP(t, stack_terms);
} else {
int f_arity = ArityOfFunctor(f);
t = Yap_MkApplTerm(f, f_arity, stack_terms);
stack_terms += f_arity;
AUX_STACK_CHECK_EXPAND(stack_terms, stack_vars_base + vars_arity);
STACK_PUSH_UP(t, stack_terms);
}
AUX_STACK_CHECK_EXPAND(stack_terms, stack_terms_limit);
STACK_PUSH_UP(t, stack_terms);
}
t = TrNode_entry(current_node);
current_node = TrNode_parent(current_node);
@ -1177,6 +1178,8 @@ static CELL *load_answer_subterm(gt_node_ptr current_node, int *vars_arity_ptr,
*vars_arity_ptr = vars_arity;
#endif /* GLOBAL_TRIE */
return stack_terms;
#undef stack_terms_limit
#ifdef TRIE_COMPACT_PAIRS
#undef stack_terms_base
#endif /* TRIE_COMPACT_PAIRS */
@ -1189,13 +1192,13 @@ static inline CELL *load_substitution_variable_subterm(gt_node_ptr current_node,
#elif GLOBAL_TRIE_FOR_SUBTERMS
static CELL *load_substitution_variable_subterm(gt_node_ptr current_node, CELL **stack_vars_subs_ptr, CELL *stack_terms) {
#endif
CELL *stack_vars_subs = *stack_vars_subs_ptr;
int vars_arity = *stack_vars_subs;
CELL *stack_terms_limit = (CELL *) TR;
#ifdef TRIE_COMPACT_PAIRS
#define stack_terms_base ((CELL *) Yap_TrailTop)
int stack_terms_pair_offset = 0;
#endif /* TRIE_COMPACT_PAIRS */
CELL *stack_terms_limit = (CELL *) TR;
CELL *stack_vars_subs = *stack_vars_subs_ptr;
int vars_arity = *stack_vars_subs;
Term t = TrNode_entry(current_node);
current_node = TrNode_parent(current_node);
@ -1299,22 +1302,18 @@ static CELL *load_substitution_variable_subterm(gt_node_ptr current_node, CELL *
#endif /* SIZEOF_DOUBLE x SIZEOF_INT_P */
current_node = TrNode_parent(current_node);
t = MkFloatTerm(dbl);
AUX_STACK_CHECK_EXPAND(stack_terms, stack_terms_limit);
STACK_PUSH_UP(t, stack_terms);
} else if (f == FunctorLongInt) {
Int li = TrNode_entry(current_node);
current_node = TrNode_parent(current_node);
current_node = TrNode_parent(current_node);
t = MkLongIntTerm(li);
AUX_STACK_CHECK_EXPAND(stack_terms, stack_terms_limit);
STACK_PUSH_UP(t, stack_terms);
} else {
int f_arity = ArityOfFunctor(f);
t = Yap_MkApplTerm(f, f_arity, stack_terms);
stack_terms += f_arity;
AUX_STACK_CHECK_EXPAND(stack_terms, stack_terms_limit);
STACK_PUSH_UP(t, stack_terms);
}
AUX_STACK_CHECK_EXPAND(stack_terms, stack_terms_limit);
STACK_PUSH_UP(t, stack_terms);
}
t = TrNode_entry(current_node);
current_node = TrNode_parent(current_node);
@ -1322,6 +1321,7 @@ static CELL *load_substitution_variable_subterm(gt_node_ptr current_node, CELL *
*stack_vars_subs_ptr = stack_vars_subs;
return stack_terms;
#ifdef TRIE_COMPACT_PAIRS
#undef stack_terms_base
#endif /* TRIE_COMPACT_PAIRS */
@ -2043,6 +2043,7 @@ sg_fr_ptr subgoal_search(yamop *preg, CELL **Yaddr) {
#ifdef TABLE_LOCK_AT_ENTRY_LEVEL
LOCK(TabEnt_lock(tab_ent));
#endif /* TABLE_LOCK_LEVEL */
for (i = 1; i <= pred_arity; i++) {
#ifndef GLOBAL_TRIE
current_sg_node = subgoal_search_subterm(tab_ent, current_sg_node, Deref(XREGS[i]), &subs_arity, &stack_vars);
@ -2101,6 +2102,7 @@ ans_node_ptr answer_search(sg_fr_ptr sg_fr, CELL *subs_ptr) {
vars_arity = 0;
current_ans_node = SgFr_answer_trie(sg_fr);
for (i = subs_arity; i >= 1; i--) {
#ifdef TABLING_ERRORS
if (IsNonVarTerm(subs_ptr[i]))