1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2018 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker // FunctionLookup.cpp: Used for storing function calls that have not yet been resolved during
7*8975f5c5SAndroid Build Coastguard Worker // parsing.
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker
10*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/FunctionLookup.h"
11*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/ImmutableStringBuilder.h"
12*8975f5c5SAndroid Build Coastguard Worker
13*8975f5c5SAndroid Build Coastguard Worker namespace sh
14*8975f5c5SAndroid Build Coastguard Worker {
15*8975f5c5SAndroid Build Coastguard Worker
16*8975f5c5SAndroid Build Coastguard Worker namespace
17*8975f5c5SAndroid Build Coastguard Worker {
18*8975f5c5SAndroid Build Coastguard Worker
19*8975f5c5SAndroid Build Coastguard Worker const char kFunctionMangledNameSeparator = '(';
20*8975f5c5SAndroid Build Coastguard Worker
21*8975f5c5SAndroid Build Coastguard Worker constexpr const ImmutableString kEmptyName("");
22*8975f5c5SAndroid Build Coastguard Worker
23*8975f5c5SAndroid Build Coastguard Worker } // anonymous namespace
24*8975f5c5SAndroid Build Coastguard Worker
TFunctionLookup(const ImmutableString & name,const TType * constructorType,const TSymbol * symbol)25*8975f5c5SAndroid Build Coastguard Worker TFunctionLookup::TFunctionLookup(const ImmutableString &name,
26*8975f5c5SAndroid Build Coastguard Worker const TType *constructorType,
27*8975f5c5SAndroid Build Coastguard Worker const TSymbol *symbol)
28*8975f5c5SAndroid Build Coastguard Worker : mName(name), mConstructorType(constructorType), mThisNode(nullptr), mSymbol(symbol)
29*8975f5c5SAndroid Build Coastguard Worker {}
30*8975f5c5SAndroid Build Coastguard Worker
31*8975f5c5SAndroid Build Coastguard Worker // static
CreateConstructor(const TType * type)32*8975f5c5SAndroid Build Coastguard Worker TFunctionLookup *TFunctionLookup::CreateConstructor(const TType *type)
33*8975f5c5SAndroid Build Coastguard Worker {
34*8975f5c5SAndroid Build Coastguard Worker ASSERT(type != nullptr);
35*8975f5c5SAndroid Build Coastguard Worker return new TFunctionLookup(kEmptyName, type, nullptr);
36*8975f5c5SAndroid Build Coastguard Worker }
37*8975f5c5SAndroid Build Coastguard Worker
38*8975f5c5SAndroid Build Coastguard Worker // static
CreateFunctionCall(const ImmutableString & name,const TSymbol * symbol)39*8975f5c5SAndroid Build Coastguard Worker TFunctionLookup *TFunctionLookup::CreateFunctionCall(const ImmutableString &name,
40*8975f5c5SAndroid Build Coastguard Worker const TSymbol *symbol)
41*8975f5c5SAndroid Build Coastguard Worker {
42*8975f5c5SAndroid Build Coastguard Worker ASSERT(name != "");
43*8975f5c5SAndroid Build Coastguard Worker return new TFunctionLookup(name, nullptr, symbol);
44*8975f5c5SAndroid Build Coastguard Worker }
45*8975f5c5SAndroid Build Coastguard Worker
name() const46*8975f5c5SAndroid Build Coastguard Worker const ImmutableString &TFunctionLookup::name() const
47*8975f5c5SAndroid Build Coastguard Worker {
48*8975f5c5SAndroid Build Coastguard Worker return mName;
49*8975f5c5SAndroid Build Coastguard Worker }
50*8975f5c5SAndroid Build Coastguard Worker
getMangledName() const51*8975f5c5SAndroid Build Coastguard Worker ImmutableString TFunctionLookup::getMangledName() const
52*8975f5c5SAndroid Build Coastguard Worker {
53*8975f5c5SAndroid Build Coastguard Worker return GetMangledName(mName.data(), mArguments);
54*8975f5c5SAndroid Build Coastguard Worker }
55*8975f5c5SAndroid Build Coastguard Worker
GetMangledName(const char * functionName,const TIntermSequence & arguments)56*8975f5c5SAndroid Build Coastguard Worker ImmutableString TFunctionLookup::GetMangledName(const char *functionName,
57*8975f5c5SAndroid Build Coastguard Worker const TIntermSequence &arguments)
58*8975f5c5SAndroid Build Coastguard Worker {
59*8975f5c5SAndroid Build Coastguard Worker std::string newName(functionName);
60*8975f5c5SAndroid Build Coastguard Worker newName += kFunctionMangledNameSeparator;
61*8975f5c5SAndroid Build Coastguard Worker
62*8975f5c5SAndroid Build Coastguard Worker for (TIntermNode *argument : arguments)
63*8975f5c5SAndroid Build Coastguard Worker {
64*8975f5c5SAndroid Build Coastguard Worker newName += argument->getAsTyped()->getType().getMangledName();
65*8975f5c5SAndroid Build Coastguard Worker }
66*8975f5c5SAndroid Build Coastguard Worker return ImmutableString(newName);
67*8975f5c5SAndroid Build Coastguard Worker }
68*8975f5c5SAndroid Build Coastguard Worker
isConstructor() const69*8975f5c5SAndroid Build Coastguard Worker bool TFunctionLookup::isConstructor() const
70*8975f5c5SAndroid Build Coastguard Worker {
71*8975f5c5SAndroid Build Coastguard Worker return mConstructorType != nullptr;
72*8975f5c5SAndroid Build Coastguard Worker }
73*8975f5c5SAndroid Build Coastguard Worker
constructorType() const74*8975f5c5SAndroid Build Coastguard Worker const TType &TFunctionLookup::constructorType() const
75*8975f5c5SAndroid Build Coastguard Worker {
76*8975f5c5SAndroid Build Coastguard Worker return *mConstructorType;
77*8975f5c5SAndroid Build Coastguard Worker }
78*8975f5c5SAndroid Build Coastguard Worker
setThisNode(TIntermTyped * thisNode)79*8975f5c5SAndroid Build Coastguard Worker void TFunctionLookup::setThisNode(TIntermTyped *thisNode)
80*8975f5c5SAndroid Build Coastguard Worker {
81*8975f5c5SAndroid Build Coastguard Worker mThisNode = thisNode;
82*8975f5c5SAndroid Build Coastguard Worker }
83*8975f5c5SAndroid Build Coastguard Worker
thisNode() const84*8975f5c5SAndroid Build Coastguard Worker TIntermTyped *TFunctionLookup::thisNode() const
85*8975f5c5SAndroid Build Coastguard Worker {
86*8975f5c5SAndroid Build Coastguard Worker return mThisNode;
87*8975f5c5SAndroid Build Coastguard Worker }
88*8975f5c5SAndroid Build Coastguard Worker
addArgument(TIntermTyped * argument)89*8975f5c5SAndroid Build Coastguard Worker void TFunctionLookup::addArgument(TIntermTyped *argument)
90*8975f5c5SAndroid Build Coastguard Worker {
91*8975f5c5SAndroid Build Coastguard Worker mArguments.push_back(argument);
92*8975f5c5SAndroid Build Coastguard Worker }
93*8975f5c5SAndroid Build Coastguard Worker
arguments()94*8975f5c5SAndroid Build Coastguard Worker TIntermSequence &TFunctionLookup::arguments()
95*8975f5c5SAndroid Build Coastguard Worker {
96*8975f5c5SAndroid Build Coastguard Worker return mArguments;
97*8975f5c5SAndroid Build Coastguard Worker }
98*8975f5c5SAndroid Build Coastguard Worker
symbol() const99*8975f5c5SAndroid Build Coastguard Worker const TSymbol *TFunctionLookup::symbol() const
100*8975f5c5SAndroid Build Coastguard Worker {
101*8975f5c5SAndroid Build Coastguard Worker return mSymbol;
102*8975f5c5SAndroid Build Coastguard Worker }
103*8975f5c5SAndroid Build Coastguard Worker
104*8975f5c5SAndroid Build Coastguard Worker } // namespace sh
105