mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-27 05:03:07 +00:00
lalr: don't overbook memory
I never understood why we book ngotos+1 slots for relations between gotos: there are at most ngotos images, not ngotos+1 (and "includes" does have cases where a goto is in relation with itself, so it's not ngotos-1). Maybebbf37f2534explains the +1: a bug left us register a goto several times on occasion, and the +1 might have been a means to avoid this problem in most cases. Now that this bug is addressed, we should no longer overbook memory, if only for the clarity of the code ("why ngotos+1 instead of ngotos?"). * src/lalr.c: A goto has at most ngotos images, not ngotos+1. While at it, avoid useless repeated call to map_goto introduced inbbf37f2534.
This commit is contained in:
10
src/lalr.c
10
src/lalr.c
@@ -192,7 +192,7 @@ static void
|
|||||||
initialize_goto_follows (void)
|
initialize_goto_follows (void)
|
||||||
{
|
{
|
||||||
goto_number **reads = xnmalloc (ngotos, sizeof *reads);
|
goto_number **reads = xnmalloc (ngotos, sizeof *reads);
|
||||||
goto_number *edge = xnmalloc (ngotos + 1, sizeof *edge);
|
goto_number *edge = xnmalloc (ngotos, sizeof *edge);
|
||||||
goto_number nedges = 0;
|
goto_number nedges = 0;
|
||||||
|
|
||||||
goto_follows = bitsetv_create (ngotos, ntokens, BITSET_FIXED);
|
goto_follows = bitsetv_create (ngotos, ntokens, BITSET_FIXED);
|
||||||
@@ -211,7 +211,7 @@ initialize_goto_follows (void)
|
|||||||
symbol_number sym = TRANSITION_SYMBOL (trans, j);
|
symbol_number sym = TRANSITION_SYMBOL (trans, j);
|
||||||
if (nullable[sym - ntokens])
|
if (nullable[sym - ntokens])
|
||||||
{
|
{
|
||||||
assert (nedges < ngotos + 1);
|
assert (nedges < ngotos);
|
||||||
edge[nedges++] = map_goto (dst, sym);
|
edge[nedges++] = map_goto (dst, sym);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -309,7 +309,7 @@ add_lookback_edge (state *s, rule const *r, goto_number gotono)
|
|||||||
static void
|
static void
|
||||||
build_relations (void)
|
build_relations (void)
|
||||||
{
|
{
|
||||||
goto_number *edge = xnmalloc (ngotos + 1, sizeof *edge);
|
goto_number *edge = xnmalloc (ngotos, sizeof *edge);
|
||||||
state_number *path = xnmalloc (ritem_longest_rhs () + 1, sizeof *path);
|
state_number *path = xnmalloc (ritem_longest_rhs () + 1, sizeof *path);
|
||||||
|
|
||||||
includes = xnmalloc (ngotos, sizeof *includes);
|
includes = xnmalloc (ngotos, sizeof *includes);
|
||||||
@@ -361,8 +361,8 @@ build_relations (void)
|
|||||||
found = edge[j] == g;
|
found = edge[j] == g;
|
||||||
if (!found)
|
if (!found)
|
||||||
{
|
{
|
||||||
assert (nedges < ngotos + 1);
|
assert (nedges < ngotos);
|
||||||
edge[nedges++] = map_goto (path[p], sym);
|
edge[nedges++] = g;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!nullable[sym - ntokens])
|
if (!nullable[sym - ntokens])
|
||||||
|
|||||||
Reference in New Issue
Block a user