bug in auxiliary_term_stack_size
git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@2084 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
parent
7a9e7816c9
commit
458bdd890d
@ -42,8 +42,9 @@ static void traverse_trie_print(TrNode node, YAP_Int *arity, char *str, int
|
|||||||
/* -------------------------- */
|
/* -------------------------- */
|
||||||
|
|
||||||
static TrEngine CURRENT_TRIE_ENGINE;
|
static TrEngine CURRENT_TRIE_ENGINE;
|
||||||
static YAP_Int CURRENT_TRIE_MODE, CURRENT_LOAD_VERSION, CURRENT_DEPTH, CURRENT_INDEX, USAGE_ENTRIES, USAGE_NODES, USAGE_VIRTUAL_NODES;
|
static YAP_Int USAGE_ENTRIES, USAGE_NODES, USAGE_VIRTUAL_NODES;
|
||||||
static YAP_Term AUXILIARY_TERM_STACK[AUXILIARY_TERM_STACK_SIZE];
|
static YAP_Int CURRENT_AUXILIARY_TERM_STACK_SIZE, CURRENT_TRIE_MODE, CURRENT_LOAD_VERSION, CURRENT_DEPTH, CURRENT_INDEX;
|
||||||
|
static YAP_Term *AUXILIARY_TERM_STACK;
|
||||||
static YAP_Term *stack_args, *stack_args_base, *stack_vars, *stack_vars_base;
|
static YAP_Term *stack_args, *stack_args_base, *stack_vars, *stack_vars_base;
|
||||||
static YAP_Functor FunctorComma;
|
static YAP_Functor FunctorComma;
|
||||||
static void (*DATA_SAVE_FUNCTION)(TrNode, FILE *);
|
static void (*DATA_SAVE_FUNCTION)(TrNode, FILE *);
|
||||||
@ -204,6 +205,8 @@ TrEngine trie_init_module(void) {
|
|||||||
TrEngine engine;
|
TrEngine engine;
|
||||||
|
|
||||||
if (init_once) {
|
if (init_once) {
|
||||||
|
new_struct(AUXILIARY_TERM_STACK, YAP_Term, BASE_AUXILIARY_TERM_STACK_SIZE * sizeof(YAP_Term));
|
||||||
|
CURRENT_AUXILIARY_TERM_STACK_SIZE = BASE_AUXILIARY_TERM_STACK_SIZE;
|
||||||
CURRENT_TRIE_MODE = TRIE_MODE_STANDARD;
|
CURRENT_TRIE_MODE = TRIE_MODE_STANDARD;
|
||||||
FunctorComma = YAP_MkFunctor(YAP_LookupAtom(","), 2);
|
FunctorComma = YAP_MkFunctor(YAP_LookupAtom(","), 2);
|
||||||
init_once = 0;
|
init_once = 0;
|
||||||
@ -270,7 +273,7 @@ TrNode trie_put_entry(TrEngine engine, TrNode node, YAP_Term entry, YAP_Int *dep
|
|||||||
CURRENT_TRIE_ENGINE = engine;
|
CURRENT_TRIE_ENGINE = engine;
|
||||||
CURRENT_DEPTH = 0;
|
CURRENT_DEPTH = 0;
|
||||||
stack_args_base = stack_args = AUXILIARY_TERM_STACK;
|
stack_args_base = stack_args = AUXILIARY_TERM_STACK;
|
||||||
stack_vars_base = stack_vars = AUXILIARY_TERM_STACK + AUXILIARY_TERM_STACK_SIZE - 1;
|
stack_vars_base = stack_vars = AUXILIARY_TERM_STACK + CURRENT_AUXILIARY_TERM_STACK_SIZE - 1;
|
||||||
node = put_trie(node, entry);
|
node = put_trie(node, entry);
|
||||||
if (!IS_LEAF_TRIE_NODE(node)) {
|
if (!IS_LEAF_TRIE_NODE(node)) {
|
||||||
MARK_AS_LEAF_TRIE_NODE(node);
|
MARK_AS_LEAF_TRIE_NODE(node);
|
||||||
@ -292,7 +295,7 @@ TrNode trie_check_entry(TrNode node, YAP_Term entry) {
|
|||||||
if (!TrNode_child(node))
|
if (!TrNode_child(node))
|
||||||
return NULL;
|
return NULL;
|
||||||
stack_args_base = stack_args = AUXILIARY_TERM_STACK;
|
stack_args_base = stack_args = AUXILIARY_TERM_STACK;
|
||||||
stack_vars_base = stack_vars = AUXILIARY_TERM_STACK + AUXILIARY_TERM_STACK_SIZE - 1;
|
stack_vars_base = stack_vars = AUXILIARY_TERM_STACK + CURRENT_AUXILIARY_TERM_STACK_SIZE - 1;
|
||||||
node = check_trie(node, entry);
|
node = check_trie(node, entry);
|
||||||
/* reset var terms */
|
/* reset var terms */
|
||||||
while (STACK_NOT_EMPTY(stack_vars++, stack_vars_base)) {
|
while (STACK_NOT_EMPTY(stack_vars++, stack_vars_base)) {
|
||||||
@ -307,7 +310,7 @@ inline
|
|||||||
YAP_Term trie_get_entry(TrNode node) {
|
YAP_Term trie_get_entry(TrNode node) {
|
||||||
CURRENT_INDEX = -1;
|
CURRENT_INDEX = -1;
|
||||||
stack_vars_base = stack_vars = AUXILIARY_TERM_STACK;
|
stack_vars_base = stack_vars = AUXILIARY_TERM_STACK;
|
||||||
stack_args_base = stack_args = AUXILIARY_TERM_STACK + AUXILIARY_TERM_STACK_SIZE - 1;
|
stack_args_base = stack_args = AUXILIARY_TERM_STACK + CURRENT_AUXILIARY_TERM_STACK_SIZE - 1;
|
||||||
return get_trie(node, stack_args, &node);
|
return get_trie(node, stack_args, &node);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -997,9 +1000,9 @@ void traverse_trie_save(TrNode node, FILE *file, int float_block) {
|
|||||||
if (AUXILIARY_TERM_STACK[index] == t)
|
if (AUXILIARY_TERM_STACK[index] == t)
|
||||||
break;
|
break;
|
||||||
if (index > CURRENT_INDEX) {
|
if (index > CURRENT_INDEX) {
|
||||||
CURRENT_INDEX++;
|
CURRENT_INDEX = index;
|
||||||
if (CURRENT_INDEX == AUXILIARY_TERM_STACK_SIZE)
|
if (CURRENT_INDEX == CURRENT_AUXILIARY_TERM_STACK_SIZE)
|
||||||
fprintf(stderr, "\nTries base module: term stack full");
|
expand_auxiliary_term_stack();
|
||||||
AUXILIARY_TERM_STACK[CURRENT_INDEX] = t;
|
AUXILIARY_TERM_STACK[CURRENT_INDEX] = t;
|
||||||
if (YAP_IsAtomTerm(t))
|
if (YAP_IsAtomTerm(t))
|
||||||
fprintf(file, "%lu %d %s%c ", ATOM_SAVE_MARK, index, YAP_AtomName(YAP_AtomOfTerm(t)), '\0');
|
fprintf(file, "%lu %d %s%c ", ATOM_SAVE_MARK, index, YAP_AtomName(YAP_AtomOfTerm(t)), '\0');
|
||||||
@ -1064,8 +1067,10 @@ void traverse_trie_load(TrNode parent, FILE *file) {
|
|||||||
} else if (CURRENT_LOAD_VERSION == 1) {
|
} else if (CURRENT_LOAD_VERSION == 1) {
|
||||||
fscanf(file, "%s", atom);
|
fscanf(file, "%s", atom);
|
||||||
}
|
}
|
||||||
AUXILIARY_TERM_STACK[index] = YAP_MkAtomTerm(YAP_LookupAtom(atom));
|
CURRENT_INDEX = index;
|
||||||
CURRENT_INDEX++;
|
if (CURRENT_INDEX == CURRENT_AUXILIARY_TERM_STACK_SIZE)
|
||||||
|
expand_auxiliary_term_stack();
|
||||||
|
AUXILIARY_TERM_STACK[CURRENT_INDEX] = YAP_MkAtomTerm(YAP_LookupAtom(atom));
|
||||||
}
|
}
|
||||||
t = AUXILIARY_TERM_STACK[index];
|
t = AUXILIARY_TERM_STACK[index];
|
||||||
} else if (t == FUNCTOR_SAVE_MARK) {
|
} else if (t == FUNCTOR_SAVE_MARK) {
|
||||||
@ -1075,8 +1080,10 @@ void traverse_trie_load(TrNode parent, FILE *file) {
|
|||||||
char atom[1000];
|
char atom[1000];
|
||||||
int arity;
|
int arity;
|
||||||
fscanf(file, "%s %d", atom, &arity);
|
fscanf(file, "%s %d", atom, &arity);
|
||||||
AUXILIARY_TERM_STACK[index] = ApplTag | ((YAP_Term) YAP_MkFunctor(YAP_LookupAtom(atom), arity));
|
CURRENT_INDEX = index;
|
||||||
CURRENT_INDEX++;
|
if (CURRENT_INDEX == CURRENT_AUXILIARY_TERM_STACK_SIZE)
|
||||||
|
expand_auxiliary_term_stack();
|
||||||
|
AUXILIARY_TERM_STACK[CURRENT_INDEX] = ApplTag | ((YAP_Term) YAP_MkFunctor(YAP_LookupAtom(atom), arity));
|
||||||
}
|
}
|
||||||
t = AUXILIARY_TERM_STACK[index];
|
t = AUXILIARY_TERM_STACK[index];
|
||||||
} else if (t == FLOAT_SAVE_MARK)
|
} else if (t == FLOAT_SAVE_MARK)
|
||||||
|
@ -40,7 +40,7 @@
|
|||||||
|
|
||||||
#define TRIE_MODE_STANDARD 0
|
#define TRIE_MODE_STANDARD 0
|
||||||
#define TRIE_MODE_REVERSE 1
|
#define TRIE_MODE_REVERSE 1
|
||||||
#define AUXILIARY_TERM_STACK_SIZE 100000
|
#define BASE_AUXILIARY_TERM_STACK_SIZE 1000
|
||||||
|
|
||||||
#define TRIE_PRINT_NORMAL 0
|
#define TRIE_PRINT_NORMAL 0
|
||||||
#define TRIE_PRINT_FLOAT 1
|
#define TRIE_PRINT_FLOAT 1
|
||||||
@ -136,11 +136,11 @@ typedef struct trie_hash {
|
|||||||
#define HASH_TERM(TERM, SEED) (((TERM) >> 4) & (SEED))
|
#define HASH_TERM(TERM, SEED) (((TERM) >> 4) & (SEED))
|
||||||
#define IS_HASH_NODE(NODE) (TrHash_mark(NODE) == NULL)
|
#define IS_HASH_NODE(NODE) (TrHash_mark(NODE) == NULL)
|
||||||
|
|
||||||
#define HASH_SAVE_MARK ((YAP_Term) MkTrieVar(AUXILIARY_TERM_STACK_SIZE))
|
#define BASE_SAVE_MARK 1000 /* could lead to errors if the number of different variables in a term is greater than it */
|
||||||
#define ATOM_SAVE_MARK ((YAP_Term) MkTrieVar(AUXILIARY_TERM_STACK_SIZE + 1))
|
#define HASH_SAVE_MARK ((YAP_Term) MkTrieVar(BASE_SAVE_MARK))
|
||||||
#define FUNCTOR_SAVE_MARK ((YAP_Term) MkTrieVar(AUXILIARY_TERM_STACK_SIZE + 2))
|
#define ATOM_SAVE_MARK ((YAP_Term) MkTrieVar(BASE_SAVE_MARK + 1))
|
||||||
#define FLOAT_SAVE_MARK ((YAP_Term) MkTrieVar(AUXILIARY_TERM_STACK_SIZE + 3))
|
#define FUNCTOR_SAVE_MARK ((YAP_Term) MkTrieVar(BASE_SAVE_MARK + 2))
|
||||||
|
#define FLOAT_SAVE_MARK ((YAP_Term) MkTrieVar(BASE_SAVE_MARK + 3))
|
||||||
|
|
||||||
#define STACK_NOT_EMPTY(STACK, STACK_BASE) STACK != STACK_BASE
|
#define STACK_NOT_EMPTY(STACK, STACK_BASE) STACK != STACK_BASE
|
||||||
#define POP_UP(STACK) *--STACK
|
#define POP_UP(STACK) *--STACK
|
||||||
@ -201,6 +201,17 @@ typedef struct trie_hash {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define expand_auxiliary_term_stack() \
|
||||||
|
{ YAP_Term *aux_stack; \
|
||||||
|
YAP_Int aux_size = CURRENT_AUXILIARY_TERM_STACK_SIZE * sizeof(YAP_Term); \
|
||||||
|
new_struct(aux_stack, YAP_Term, aux_size * 2); \
|
||||||
|
memcpy(aux_stack, AUXILIARY_TERM_STACK, aux_size); \
|
||||||
|
free_struct(AUXILIARY_TERM_STACK); \
|
||||||
|
AUXILIARY_TERM_STACK = aux_stack; \
|
||||||
|
CURRENT_AUXILIARY_TERM_STACK_SIZE *= 2; \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#define free_struct(STR) \
|
#define free_struct(STR) \
|
||||||
YAP_FreeSpaceFromYap((char *) (STR))
|
YAP_FreeSpaceFromYap((char *) (STR))
|
||||||
#define free_trie_node(STR) \
|
#define free_trie_node(STR) \
|
||||||
|
Reference in New Issue
Block a user