|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
It might seem innocuous, but the following expression is actually quite
prone to breakage:
ast->kids[i].lhs = parseexpr(ast, toks);
The reason is that parseexpr() and the other parsing functions return
indicies into the AST, however in doing so they may find that the AST
needs to grow and call astresz(). Should astresz() be called there is a
chance that we will realloc() a new buffer somewhere else in memory,
causing the left-hand side of the above expression to now be pointing to
an invalid location in memory. To combat this we’re forced to break it
up into two statements:
idx_t_ lhs = parseexpr(ast, toks);
ast->kids[i].lhs = lhs;
|