/// Initializize the symbol table /// \param BuiltInStrings /// Pointer to built in strings. /// \param language /// Shading language to initialize symbol table for /// \param infoSink /// Information sink (for errors/warnings) /// \param symbolTables /// Array of symbol tables (one for each language) /// \param bUseGlobalSymbolTable /// Whether to use the global symbol table or the per-language symbol table /// \return /// True if succesfully initialized, false otherwise bool InitializeSymbolTable( TBuiltInStrings* BuiltInStrings, EShLanguage language, TInfoSink& infoSink, TSymbolTable* symbolTables, bool bUseGlobalSymbolTable ) { TIntermediate intermediate(infoSink); TSymbolTable* symbolTable; if ( bUseGlobalSymbolTable ) symbolTable = symbolTables; else symbolTable = &symbolTables[language]; TParseContext parseContext(*symbolTable, intermediate, language, infoSink); GlobalParseContext = &parseContext; setInitialState(); assert(symbolTable->isEmpty() || symbolTable->atSharedBuiltInLevel()); // // Parse the built-ins. This should only happen once per // language symbol table. // // Push the symbol table to give it an initial scope. This // push should not have a corresponding pop, so that built-ins // are preserved, and the test for an empty table fails. // symbolTable->push(); //Initialize the Preprocessor int ret = InitPreprocessor(); if (ret) { infoSink.info.message(EPrefixInternalError, "Unable to intialize the Preprocessor"); return false; } for (TBuiltInStrings::iterator i = BuiltInStrings[parseContext.language].begin(); i != BuiltInStrings[parseContext.language].end(); ++i) { const char* builtInShaders = (*i).c_str(); if (PaParseString(const_cast<char*>(builtInShaders), parseContext) != 0) { infoSink.info.message(EPrefixInternalError, "Unable to parse built-ins"); return false; } } if ( !bUseGlobalSymbolTable ) { IdentifyBuiltIns(parseContext.language, *symbolTable); } FinalizePreprocessor(); return true; }
/// Initializize the symbol table /// \param BuiltInStrings /// Pointer to built in strings. /// \param language /// Shading language to initialize symbol table for /// \param infoSink /// Information sink (for errors/warnings) /// \param symbolTables /// Array of symbol tables (one for each language) /// \param bUseGlobalSymbolTable /// Whether to use the global symbol table or the per-language symbol table /// \return /// True if succesfully initialized, false otherwise static bool InitializeSymbolTable( TBuiltInStrings* BuiltInStrings, EShLanguage language, TInfoSink& infoSink, TSymbolTable* symbolTables, bool bUseGlobalSymbolTable ) { TSymbolTable* symbolTable; if ( bUseGlobalSymbolTable ) symbolTable = symbolTables; else symbolTable = &symbolTables[language]; //@TODO: for now, we use same global symbol table for all target language versions. // This is wrong and will have to be changed at some point. TParseContext parseContext(*symbolTable, language, ETargetVersionCount, 0, infoSink); GlobalParseContext = &parseContext; setInitialState(); assert(symbolTable->isEmpty() || symbolTable->atSharedBuiltInLevel()); // // Parse the built-ins. This should only happen once per // language symbol table. // // Push the symbol table to give it an initial scope. This // push should not have a corresponding pop, so that built-ins // are preserved, and the test for an empty table fails. // symbolTable->push(); for (TBuiltInStrings::iterator i = BuiltInStrings[parseContext.language].begin(); i != BuiltInStrings[parseContext.language].end(); ++i) { const char* builtInShaders = (*i).c_str(); if (PaParseString(const_cast<char*>(builtInShaders), parseContext, NULL) != 0) { infoSink.info.message(EPrefixInternalError, "Unable to parse built-ins"); return false; } } if ( !bUseGlobalSymbolTable ) { IdentifyBuiltIns(parseContext.language, *symbolTable); } return true; }
static bool InitializeSymbolTable( const TBuiltInStrings& builtInStrings, EShLanguage language, EShSpec spec, const TBuiltInResource& resources, TInfoSink& infoSink, TSymbolTable& symbolTable) { TIntermediate intermediate(infoSink); TParseContext parseContext(symbolTable, intermediate, language, spec, infoSink); GlobalParseContext = &parseContext; setInitialState(); assert(symbolTable.isEmpty()); // // Parse the built-ins. This should only happen once per // language symbol table. // // Push the symbol table to give it an initial scope. This // push should not have a corresponding pop, so that built-ins // are preserved, and the test for an empty table fails. // symbolTable.push(); //Initialize the Preprocessor if (InitPreprocessor()) { infoSink.info.message(EPrefixInternalError, "Unable to intialize the Preprocessor"); return false; } for (TBuiltInStrings::const_iterator i = builtInStrings.begin(); i != builtInStrings.end(); ++i) { const char* builtInShaders[1]; int builtInLengths[1]; builtInShaders[0] = (*i).c_str(); builtInLengths[0] = (int) (*i).size(); if (PaParseStrings(const_cast<char**>(builtInShaders), builtInLengths, 1, parseContext) != 0) { infoSink.info.message(EPrefixInternalError, "Unable to parse built-ins"); return false; } } IdentifyBuiltIns(language, spec, resources, symbolTable); FinalizePreprocessor(); return true; }