// // Copyright (C) 2002-2005 3Dlabs Inc. Ltd. // Copyright (C) 2016 Google, Inc. // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // // Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following // disclaimer in the documentation and/or other materials provided // with the distribution. // // Neither the name of 3Dlabs Inc. Ltd. nor the names of its // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS // FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE // COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, // BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN // ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Implement the TParseContextBase class. #include <cstdarg> #include "ParseHelper.h" extern int yyparse(glslang::TParseContext*); namespace glslang { // // Used to output syntax, parsing, and semantic errors. // void TParseContextBase::outputMessage(const TSourceLoc& loc, const char* szReason, const char* szToken, const char* szExtraInfoFormat, TPrefixType prefix, va_list args) { … } void C_DECL TParseContextBase::error(const TSourceLoc& loc, const char* szReason, const char* szToken, const char* szExtraInfoFormat, ...) { … } void C_DECL TParseContextBase::warn(const TSourceLoc& loc, const char* szReason, const char* szToken, const char* szExtraInfoFormat, ...) { … } void C_DECL TParseContextBase::ppError(const TSourceLoc& loc, const char* szReason, const char* szToken, const char* szExtraInfoFormat, ...) { … } void C_DECL TParseContextBase::ppWarn(const TSourceLoc& loc, const char* szReason, const char* szToken, const char* szExtraInfoFormat, ...) { … } // // Both test and if necessary, spit out an error, to see if the node is really // an l-value that can be operated on this way. // // Returns true if there was an error. // bool TParseContextBase::lValueErrorCheck(const TSourceLoc& loc, const char* op, TIntermTyped* node) { … } // Test for and give an error if the node can't be read from. void TParseContextBase::rValueErrorCheck(const TSourceLoc& loc, const char* op, TIntermTyped* node) { … } // Add 'symbol' to the list of deferred linkage symbols, which // are later processed in finish(), at which point the symbol // must still be valid. // It is okay if the symbol's type will be subsequently edited; // the modifications will be tracked. // Order is preserved, to avoid creating novel forward references. void TParseContextBase::trackLinkage(TSymbol& symbol) { … } // Ensure index is in bounds, correct if necessary. // Give an error if not. void TParseContextBase::checkIndex(const TSourceLoc& loc, const TType& type, int& index) { … } // Make a shared symbol have a non-shared version that can be edited by the current // compile, such that editing its type will not change the shared version and will // effect all nodes already sharing it (non-shallow type), // or adopting its full type after being edited (shallow type). void TParseContextBase::makeEditable(TSymbol*& symbol) { … } // Return a writable version of the variable 'name'. // // Return nullptr if 'name' is not found. This should mean // something is seriously wrong (e.g., compiler asking self for // built-in that doesn't exist). TVariable* TParseContextBase::getEditableVariable(const char* name) { … } // Select the best matching function for 'call' from 'candidateList'. // // Assumptions // // There is no exact match, so a selection algorithm needs to run. That is, the // language-specific handler should check for exact match first, to // decide what to do, before calling this selector. // // Input // // * list of candidate signatures to select from // * the call // * a predicate function convertible(from, to) that says whether or not type // 'from' can implicitly convert to type 'to' (it includes the case of what // the calling language would consider a matching type with no conversion // needed) // * a predicate function better(from1, from2, to1, to2) that says whether or // not a conversion from <-> to2 is considered better than a conversion // from <-> to1 (both in and out directions need testing, as declared by the // formal parameter) // // Output // // * best matching candidate (or none, if no viable candidates found) // * whether there was a tie for the best match (ambiguous overload selection, // caller's choice for how to report) // const TFunction* TParseContextBase::selectFunction( const TVector<const TFunction*> candidateList, const TFunction& call, std::function<bool(const TType& from, const TType& to, TOperator op, int arg)> convertible, std::function<bool(const TType& from, const TType& to1, const TType& to2)> better, /* output */ bool& tie) { … } // // Look at a '.' field selector string and change it into numerical selectors // for a vector or scalar. // // Always return some form of swizzle, so the result is always usable. // void TParseContextBase::parseSwizzleSelector(const TSourceLoc& loc, const TString& compString, int vecSize, TSwizzleSelectors<TVectorSelector>& selector) { … } // // Make the passed-in variable information become a member of the // global uniform block. If this doesn't exist yet, make it. // void TParseContextBase::growGlobalUniformBlock(const TSourceLoc& loc, TType& memberType, const TString& memberName, TTypeList* typeList) { … } void TParseContextBase::growAtomicCounterBlock(int binding, const TSourceLoc& loc, TType& memberType, const TString& memberName, TTypeList* typeList) { … } void TParseContextBase::finish() { … } } // end namespace glslang