initialize eval_set to a proper copy of involved_set
This commit is contained in:
parent
ce88a3f49d
commit
dffe47bf57
3 changed files with 22 additions and 1 deletions
|
|
@ -103,7 +103,7 @@ HParseResult* grow(HParserCacheKey *k, HParseState *state, HRecursionHead *head)
|
||||||
HParseResult *old_res = old_cached->right->result;
|
HParseResult *old_res = old_cached->right->result;
|
||||||
|
|
||||||
// reset the eval_set of the head of the recursion at each beginning of growth
|
// reset the eval_set of the head of the recursion at each beginning of growth
|
||||||
head->eval_set = head->involved_set; // BUG: this must be a copy
|
head->eval_set = h_slist_copy(head->involved_set);
|
||||||
HParseResult *tmp_res = perform_lowlevel_parse(state, k->parser);
|
HParseResult *tmp_res = perform_lowlevel_parse(state, k->parser);
|
||||||
|
|
||||||
if (tmp_res) {
|
if (tmp_res) {
|
||||||
|
|
|
||||||
|
|
@ -41,6 +41,26 @@ HSlist* h_slist_new(HArena *arena) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HSlist* h_slist_copy(HSlist *slist) {
|
||||||
|
HSlist *ret = h_slist_new(slist->arena);
|
||||||
|
HSlistNode *head = slist->head;
|
||||||
|
HSlistNode *tail;
|
||||||
|
if (head != NULL) {
|
||||||
|
h_slist_push(ret, head->elem);
|
||||||
|
tail = ret->head;
|
||||||
|
head = head->next;
|
||||||
|
}
|
||||||
|
while (head != NULL) {
|
||||||
|
// append head item to tail in a new node
|
||||||
|
HSlistNode *node = h_arena_malloc(slist->arena, sizeof(HSlistNode));
|
||||||
|
node->elem = head->elem;
|
||||||
|
node->next = NULL;
|
||||||
|
tail = tail->next = node;
|
||||||
|
head = head->next;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
void* h_slist_pop(HSlist *slist) {
|
void* h_slist_pop(HSlist *slist) {
|
||||||
HSlistNode *head = slist->head;
|
HSlistNode *head = slist->head;
|
||||||
if (!head)
|
if (!head)
|
||||||
|
|
|
||||||
|
|
@ -209,6 +209,7 @@ HCountedArray *h_carray_new(HArena * arena);
|
||||||
void h_carray_append(HCountedArray *array, void* item);
|
void h_carray_append(HCountedArray *array, void* item);
|
||||||
|
|
||||||
HSlist* h_slist_new(HArena *arena);
|
HSlist* h_slist_new(HArena *arena);
|
||||||
|
HSlist* h_slist_copy(HSlist *slist);
|
||||||
void* h_slist_pop(HSlist *slist);
|
void* h_slist_pop(HSlist *slist);
|
||||||
void h_slist_push(HSlist *slist, void* item);
|
void h_slist_push(HSlist *slist, void* item);
|
||||||
bool h_slist_find(HSlist *slist, const void* item);
|
bool h_slist_find(HSlist *slist, const void* item);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue