CheckConstructors: Handle recursion better. Don't hang.

This commit is contained in:
Daniel Marjamäki 2008-10-19 15:21:18 +00:00
parent 65da6b3cd7
commit 69700da5e1
1 changed files with 13 additions and 6 deletions

View File

@ -154,10 +154,11 @@ static void InitVar(struct VAR *varlist, const char varname[])
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
static void ClassChecking_VarList_Initialize(const TOKEN *ftok, struct VAR *varlist, const char classname[]) static void ClassChecking_VarList_Initialize(const TOKEN *ftok, struct VAR *varlist, const char classname[], std::list<std::string> &callstack)
{ {
bool Assign = false; bool Assign = false;
unsigned int indentlevel = 0; unsigned int indentlevel = 0;
for (; ftok; ftok = ftok->next) for (; ftok; ftok = ftok->next)
{ {
if (!ftok->next) if (!ftok->next)
@ -203,9 +204,14 @@ static void ClassChecking_VarList_Initialize(const TOKEN *ftok, struct VAR *varl
// Calling member function? // Calling member function?
else if (Match(ftok, "%var% (")) else if (Match(ftok, "%var% ("))
{ {
unsigned int i = 0; // No recursive calls!
const TOKEN *ftok2 = FindClassFunction( tokens, classname, ftok->str, i ); if ( std::find(callstack.begin(),callstack.end(),ftok->str) == callstack.end() )
ClassChecking_VarList_Initialize(ftok2, varlist, classname); {
callstack.push_back( ftok->str );
unsigned int i = 0;
const TOKEN *ftok2 = FindClassFunction( tokens, classname, ftok->str, i );
ClassChecking_VarList_Initialize(ftok2, varlist, classname, callstack);
}
} }
// Assignment of member variable? // Assignment of member variable?
@ -284,7 +290,8 @@ void CheckConstructors()
unsigned int indentlevel = 0; unsigned int indentlevel = 0;
constructor_token = FindClassFunction( tokens, classname, classname, indentlevel ); constructor_token = FindClassFunction( tokens, classname, classname, indentlevel );
ClassChecking_VarList_Initialize(constructor_token, varlist, classname); std::list<std::string> callstack;
ClassChecking_VarList_Initialize(constructor_token, varlist, classname, callstack);
while ( constructor_token ) while ( constructor_token )
{ {
// Check if any variables are uninitialized // Check if any variables are uninitialized
@ -310,7 +317,7 @@ void CheckConstructors()
var->init = false; var->init = false;
constructor_token = FindClassFunction( constructor_token->next, classname, classname, indentlevel ); constructor_token = FindClassFunction( constructor_token->next, classname, classname, indentlevel );
ClassChecking_VarList_Initialize(constructor_token, varlist, classname); ClassChecking_VarList_Initialize(constructor_token, varlist, classname, callstack);
} }
// Delete the varlist.. // Delete the varlist..