| // |
| // Copyright (c) 2018 The ANGLE Project Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| // |
| // FunctionLookup.cpp: Used for storing function calls that have not yet been resolved during |
| // parsing. |
| // |
| |
| #include "compiler/translator/FunctionLookup.h" |
| |
| namespace sh |
| { |
| |
| namespace |
| { |
| |
| const char kFunctionMangledNameSeparator = '('; |
| |
| constexpr const ImmutableString kEmptyName(""); |
| |
| } // anonymous namespace |
| |
| TFunctionLookup::TFunctionLookup(const ImmutableString &name, |
| const TType *constructorType, |
| const TSymbol *symbol) |
| : mName(name), mConstructorType(constructorType), mThisNode(nullptr), mSymbol(symbol) |
| {} |
| |
| // static |
| TFunctionLookup *TFunctionLookup::CreateConstructor(const TType *type) |
| { |
| ASSERT(type != nullptr); |
| return new TFunctionLookup(kEmptyName, type, nullptr); |
| } |
| |
| // static |
| TFunctionLookup *TFunctionLookup::CreateFunctionCall(const ImmutableString &name, |
| const TSymbol *symbol) |
| { |
| ASSERT(name != ""); |
| return new TFunctionLookup(name, nullptr, symbol); |
| } |
| |
| const ImmutableString &TFunctionLookup::name() const |
| { |
| return mName; |
| } |
| |
| ImmutableString TFunctionLookup::getMangledName() const |
| { |
| return GetMangledName(mName.data(), mArguments); |
| } |
| |
| ImmutableString TFunctionLookup::GetMangledName(const char *functionName, |
| const TIntermSequence &arguments) |
| { |
| std::string newName(functionName); |
| newName += kFunctionMangledNameSeparator; |
| |
| for (TIntermNode *argument : arguments) |
| { |
| newName += argument->getAsTyped()->getType().getMangledName(); |
| } |
| return ImmutableString(newName); |
| } |
| |
| bool TFunctionLookup::isConstructor() const |
| { |
| return mConstructorType != nullptr; |
| } |
| |
| const TType &TFunctionLookup::constructorType() const |
| { |
| return *mConstructorType; |
| } |
| |
| void TFunctionLookup::setThisNode(TIntermTyped *thisNode) |
| { |
| mThisNode = thisNode; |
| } |
| |
| TIntermTyped *TFunctionLookup::thisNode() const |
| { |
| return mThisNode; |
| } |
| |
| void TFunctionLookup::addArgument(TIntermTyped *argument) |
| { |
| mArguments.push_back(argument); |
| } |
| |
| TIntermSequence &TFunctionLookup::arguments() |
| { |
| return mArguments; |
| } |
| |
| const TSymbol *TFunctionLookup::symbol() const |
| { |
| return mSymbol; |
| } |
| |
| } // namespace sh |