mirror of
https://github.com/cc65/cc65.git
synced 2024-12-25 17:29:50 +00:00
Added code that avoids infinite loops that were caused by circular references
(a symbol that was defined by referring to itself directly or indirectly). Patch by kugelfuhr.
This commit is contained in:
parent
2628a176f9
commit
800568dd58
@ -171,6 +171,25 @@ int IsFarRange (long Val)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static const ExprNode* ResolveSymbolChain(const ExprNode* E)
|
||||||
|
/* Recursive helper function for IsEasyConst */
|
||||||
|
{
|
||||||
|
if (E->Op == EXPR_SYMBOL) {
|
||||||
|
SymEntry* Sym = E->V.Sym;
|
||||||
|
|
||||||
|
if (Sym == 0 || Sym->Expr == 0 || SymHasUserMark (Sym)) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
SymMarkUser (Sym);
|
||||||
|
E = ResolveSymbolChain (Sym->Expr);
|
||||||
|
SymUnmarkUser (Sym);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return E;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int IsEasyConst (const ExprNode* E, long* Val)
|
int IsEasyConst (const ExprNode* E, long* Val)
|
||||||
/* Do some light checking if the given node is a constant. Don't care if E is
|
/* Do some light checking if the given node is a constant. Don't care if E is
|
||||||
** a complex expression. If E is a constant, return true and place its value
|
** a complex expression. If E is a constant, return true and place its value
|
||||||
@ -178,12 +197,10 @@ int IsEasyConst (const ExprNode* E, long* Val)
|
|||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
/* Resolve symbols, follow symbol chains */
|
/* Resolve symbols, follow symbol chains */
|
||||||
while (E->Op == EXPR_SYMBOL) {
|
E = ResolveSymbolChain (E);
|
||||||
E = SymResolve (E->V.Sym);
|
if (E == 0) {
|
||||||
if (E == 0) {
|
/* Could not resolve */
|
||||||
/* Could not resolve */
|
return 0;
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Symbols resolved, check for a literal */
|
/* Symbols resolved, check for a literal */
|
||||||
|
Loading…
Reference in New Issue
Block a user