// Recursively assigns indices to a sub DAG InitResult assignIndicesInternal(CreatorFunctionData *function) { ASSERT(function); if (!function->node) { *mCreationInfo << "Undefined function '" << function->name << ")' used in the following call chain:"; return INITDAG_UNDEFINED; } if (function->indexAssigned) { return INITDAG_SUCCESS; } if (function->visiting) { if (mCreationInfo) { *mCreationInfo << "Recursive function call in the following call chain:" << function->name; } return INITDAG_RECURSION; } function->visiting = true; for (auto &callee : function->callees) { InitResult result = assignIndicesInternal(callee); if (result != INITDAG_SUCCESS) { // We know that there is an issue with the call chain in the AST, // print the link of the chain we were processing. if (mCreationInfo) { *mCreationInfo << " <- " << function->name << ")"; } return result; } } function->index = mCurrentIndex++; function->indexAssigned = true; function->visiting = false; return INITDAG_SUCCESS; }
InitResult assignIndices() { int skipped = 0; for (auto &it : mFunctions) { // Skip unimplemented functions if (it.second.node) { InitResult result = assignIndicesInternal(&it.second); if (result != INITDAG_SUCCESS) { return result; } } else { skipped++; } } ASSERT(mFunctions.size() == mCurrentIndex + skipped); return INITDAG_SUCCESS; }