xref: /aosp_15_r20/external/angle/src/compiler/translator/FunctionLookup.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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