blob: ee575a84a4697f9d6e0a2a507047763cdbf35366 [file] [log] [blame]
//
// 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 = '(';
} // anonymous namespace
TFunctionLookup::TFunctionLookup(const TString *name, const TType *constructorType)
: mName(name), mConstructorType(constructorType), mThisNode(nullptr)
{
}
// static
TFunctionLookup *TFunctionLookup::CreateConstructor(const TType *type)
{
ASSERT(type != nullptr);
return new TFunctionLookup(nullptr, type);
}
// static
TFunctionLookup *TFunctionLookup::CreateFunctionCall(const TString *name)
{
ASSERT(name != nullptr);
return new TFunctionLookup(name, nullptr);
}
const TString &TFunctionLookup::name() const
{
return *mName;
}
const TString &TFunctionLookup::getMangledName() const
{
return GetMangledName(*mName, mArguments);
}
const TString &TFunctionLookup::GetMangledName(const TString &functionName,
const TIntermSequence &arguments)
{
std::string newName = functionName.c_str();
newName += kFunctionMangledNameSeparator;
for (TIntermNode *argument : arguments)
{
newName += argument->getAsTyped()->getType().getMangledName();
}
return *NewPoolTString(newName.c_str());
}
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;
}
} // namespace sh