TIntermBlock *FindMainBody(TIntermBlock *root) { TIntermFunctionDefinition *main = FindMain(root); ASSERT(main != nullptr); TIntermBlock *mainBody = main->getBody(); ASSERT(mainBody != nullptr); return mainBody; }
void RunAtTheEndOfShader(TIntermBlock *root, TIntermNode *codeToRun, TSymbolTable *symbolTable) { TIntermFunctionDefinition *main = FindMain(root); if (!ContainsReturn(main)) { main->getBody()->appendStatement(codeToRun); return; } WrapMainAndAppend(root, main, codeToRun, symbolTable); }
TIntermFunctionDefinition *FindMain(TIntermBlock *root) { for (TIntermNode *node : *root->getSequence()) { TIntermFunctionDefinition *nodeFunction = node->getAsFunctionDefinition(); if (nodeFunction != nullptr && nodeFunction->getFunction()->isMain()) { return nodeFunction; } } return nullptr; }
size_t FindMainIndex(TIntermBlock *root) { const TIntermSequence &sequence = *root->getSequence(); for (size_t index = 0; index < sequence.size(); ++index) { TIntermNode *node = sequence[index]; TIntermFunctionDefinition *nodeFunction = node->getAsFunctionDefinition(); if (nodeFunction != nullptr && nodeFunction->getFunction()->isMain()) { return index; } } return std::numeric_limits<size_t>::max(); }