1904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo//
2904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
3904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo// Use of this source code is governed by a BSD-style license that can be
4904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo// found in the LICENSE file.
5904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo//
6904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo
7904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo#if defined(_MSC_VER)
8904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo#pragma warning(disable: 4718)
9904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo#endif
10904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo
11904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo#include "compiler/translator/Types.h"
12904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo
13487456a36db90e0ee3a05f012c6485c5b637e02eGeoff Lang#include <algorithm>
14904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo#include <climits>
15904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo
161c28e1f069264b8702db779ace2b9a1c727f00fdJamie Madillconst char* getBasicString(TBasicType t)
171c28e1f069264b8702db779ace2b9a1c727f00fdJamie Madill{
181c28e1f069264b8702db779ace2b9a1c727f00fdJamie Madill    switch (t)
191c28e1f069264b8702db779ace2b9a1c727f00fdJamie Madill    {
201c28e1f069264b8702db779ace2b9a1c727f00fdJamie Madill      case EbtVoid:                 return "void";                 break;
211c28e1f069264b8702db779ace2b9a1c727f00fdJamie Madill      case EbtFloat:                return "float";                break;
221c28e1f069264b8702db779ace2b9a1c727f00fdJamie Madill      case EbtInt:                  return "int";                  break;
231c28e1f069264b8702db779ace2b9a1c727f00fdJamie Madill      case EbtUInt:                 return "uint";                 break;
241c28e1f069264b8702db779ace2b9a1c727f00fdJamie Madill      case EbtBool:                 return "bool";                 break;
251c28e1f069264b8702db779ace2b9a1c727f00fdJamie Madill      case EbtSampler2D:            return "sampler2D";            break;
261c28e1f069264b8702db779ace2b9a1c727f00fdJamie Madill      case EbtSampler3D:            return "sampler3D";            break;
271c28e1f069264b8702db779ace2b9a1c727f00fdJamie Madill      case EbtSamplerCube:          return "samplerCube";          break;
281c28e1f069264b8702db779ace2b9a1c727f00fdJamie Madill      case EbtSamplerExternalOES:   return "samplerExternalOES";   break;
291c28e1f069264b8702db779ace2b9a1c727f00fdJamie Madill      case EbtSampler2DRect:        return "sampler2DRect";        break;
301c28e1f069264b8702db779ace2b9a1c727f00fdJamie Madill      case EbtSampler2DArray:       return "sampler2DArray";       break;
311c28e1f069264b8702db779ace2b9a1c727f00fdJamie Madill      case EbtISampler2D:           return "isampler2D";           break;
321c28e1f069264b8702db779ace2b9a1c727f00fdJamie Madill      case EbtISampler3D:           return "isampler3D";           break;
331c28e1f069264b8702db779ace2b9a1c727f00fdJamie Madill      case EbtISamplerCube:         return "isamplerCube";         break;
341c28e1f069264b8702db779ace2b9a1c727f00fdJamie Madill      case EbtISampler2DArray:      return "isampler2DArray";      break;
351c28e1f069264b8702db779ace2b9a1c727f00fdJamie Madill      case EbtUSampler2D:           return "usampler2D";           break;
361c28e1f069264b8702db779ace2b9a1c727f00fdJamie Madill      case EbtUSampler3D:           return "usampler3D";           break;
371c28e1f069264b8702db779ace2b9a1c727f00fdJamie Madill      case EbtUSamplerCube:         return "usamplerCube";         break;
381c28e1f069264b8702db779ace2b9a1c727f00fdJamie Madill      case EbtUSampler2DArray:      return "usampler2DArray";      break;
391c28e1f069264b8702db779ace2b9a1c727f00fdJamie Madill      case EbtSampler2DShadow:      return "sampler2DShadow";      break;
401c28e1f069264b8702db779ace2b9a1c727f00fdJamie Madill      case EbtSamplerCubeShadow:    return "samplerCubeShadow";    break;
411c28e1f069264b8702db779ace2b9a1c727f00fdJamie Madill      case EbtSampler2DArrayShadow: return "sampler2DArrayShadow"; break;
421c28e1f069264b8702db779ace2b9a1c727f00fdJamie Madill      case EbtStruct:               return "structure";            break;
431c28e1f069264b8702db779ace2b9a1c727f00fdJamie Madill      case EbtInterfaceBlock:       return "interface block";      break;
441c28e1f069264b8702db779ace2b9a1c727f00fdJamie Madill      default: UNREACHABLE();       return "unknown type";
451c28e1f069264b8702db779ace2b9a1c727f00fdJamie Madill    }
461c28e1f069264b8702db779ace2b9a1c727f00fdJamie Madill}
471c28e1f069264b8702db779ace2b9a1c727f00fdJamie Madill
48904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao MoTType::TType(const TPublicType &p)
49904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo    : type(p.type), precision(p.precision), qualifier(p.qualifier), layoutQualifier(p.layoutQualifier),
50904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo      primarySize(p.primarySize), secondarySize(p.secondarySize), array(p.array), arraySize(p.arraySize),
51904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo      interfaceBlock(0), structure(0)
52904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo{
53904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo    if (p.userDef)
54904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo        structure = p.userDef->getStruct();
55904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo}
56904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo
57c8f7232e419a3c593bcff57eb5231b52c96288beZhenyao Mobool TStructure::equals(const TStructure &other) const
58c8f7232e419a3c593bcff57eb5231b52c96288beZhenyao Mo{
5901f85ac8529f2458f7b2b13cde9056656dacc62eJamie Madill    return (uniqueId() == other.uniqueId());
60904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo}
61904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo
62904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo//
63904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo// Recursively generate mangled names.
64904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo//
65904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao MoTString TType::buildMangledName() const
66904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo{
67904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo    TString mangledName;
68904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo    if (isMatrix())
69904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo        mangledName += 'm';
70904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo    else if (isVector())
71904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo        mangledName += 'v';
72904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo
73904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo    switch (type)
74904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo    {
759eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo      case EbtFloat:
769eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        mangledName += 'f';
779eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        break;
789eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo      case EbtInt:
799eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        mangledName += 'i';
809eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        break;
819eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo      case EbtUInt:
829eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        mangledName += 'u';
839eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        break;
849eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo      case EbtBool:
859eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        mangledName += 'b';
869eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        break;
879eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo      case EbtSampler2D:
889eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        mangledName += "s2";
899eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        break;
909eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo      case EbtSampler3D:
919eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        mangledName += "s3";
929eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        break;
939eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo      case EbtSamplerCube:
949eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        mangledName += "sC";
959eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        break;
969eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo      case EbtSampler2DArray:
979eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        mangledName += "s2a";
989eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        break;
999eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo      case EbtSamplerExternalOES:
1009eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        mangledName += "sext";
1019eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        break;
1029eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo      case EbtSampler2DRect:
1039eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        mangledName += "s2r";
1049eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        break;
1059eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo      case EbtISampler2D:
1069eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        mangledName += "is2";
1079eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        break;
1089eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo      case EbtISampler3D:
1099eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        mangledName += "is3";
1109eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        break;
1119eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo      case EbtISamplerCube:
1129eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        mangledName += "isC";
1139eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        break;
1149eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo      case EbtISampler2DArray:
1159eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        mangledName += "is2a";
1169eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        break;
1179eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo      case EbtUSampler2D:
1189eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        mangledName += "us2";
1199eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        break;
1209eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo      case EbtUSampler3D:
1219eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        mangledName += "us3";
1229eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        break;
1239eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo      case EbtUSamplerCube:
1249eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        mangledName += "usC";
1259eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        break;
1269eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo      case EbtUSampler2DArray:
1279eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        mangledName += "us2a";
1289eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        break;
1299eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo      case EbtSampler2DShadow:
1309eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        mangledName += "s2s";
1319eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        break;
1329eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo      case EbtSamplerCubeShadow:
1339eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        mangledName += "sCs";
1349eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        break;
1359eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo      case EbtSampler2DArrayShadow:
1369eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        mangledName += "s2as";
1379eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        break;
1389eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo      case EbtStruct:
1399eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        mangledName += structure->mangledName();
1409eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        break;
1419eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo      case EbtInterfaceBlock:
1429eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        mangledName += interfaceBlock->mangledName();
1439eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        break;
1449eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo      default:
1459eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        UNREACHABLE();
146904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo    }
147904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo
148904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo    if (isMatrix())
149904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo    {
150904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo        mangledName += static_cast<char>('0' + getCols());
151904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo        mangledName += static_cast<char>('x');
152904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo        mangledName += static_cast<char>('0' + getRows());
153904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo    }
154904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo    else
155904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo    {
156904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo        mangledName += static_cast<char>('0' + getNominalSize());
157904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo    }
158904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo
159904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo    if (isArray())
160904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo    {
161904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo        char buf[20];
162904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo        snprintf(buf, sizeof(buf), "%d", arraySize);
163904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo        mangledName += '[';
164904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo        mangledName += buf;
165904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo        mangledName += ']';
166904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo    }
167904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo    return mangledName;
168904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo}
169904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo
170904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mosize_t TType::getObjectSize() const
171904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo{
172904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo    size_t totalSize;
173904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo
174904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo    if (getBasicType() == EbtStruct)
175904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo        totalSize = structure->objectSize();
176904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo    else
177904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo        totalSize = primarySize * secondarySize;
178904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo
179904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo    if (isArray())
180904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo    {
181904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo        size_t arraySize = getArraySize();
182904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo        if (arraySize > INT_MAX / totalSize)
183904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo            totalSize = INT_MAX;
184904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo        else
185904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo            totalSize *= arraySize;
186904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo    }
187904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo
188904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo    return totalSize;
189904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo}
190904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo
191904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mobool TStructure::containsArrays() const
192904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo{
1939eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo    for (size_t i = 0; i < mFields->size(); ++i)
1949eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo    {
1959eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo        const TType *fieldType = (*mFields)[i]->type();
196904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo        if (fieldType->isArray() || fieldType->isStructureContainingArrays())
197904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo            return true;
198904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo    }
199904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo    return false;
200904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo}
201904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo
202904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao MoTString TFieldListCollection::buildMangledName() const
203904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo{
204904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo    TString mangledName(mangledNamePrefix());
205904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo    mangledName += *mName;
206904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo    for (size_t i = 0; i < mFields->size(); ++i)
207904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo    {
208904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo        mangledName += '-';
209904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo        mangledName += (*mFields)[i]->type()->getMangledName();
210904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo    }
211904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo    return mangledName;
212904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo}
213904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo
214904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mosize_t TFieldListCollection::calculateObjectSize() const
215904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo{
216904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo    size_t size = 0;
2179eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo    for (size_t i = 0; i < mFields->size(); ++i)
2189eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo    {
219904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo        size_t fieldSize = (*mFields)[i]->type()->getObjectSize();
220904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo        if (fieldSize > INT_MAX - size)
221904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo            size = INT_MAX;
222904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo        else
223904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo            size += fieldSize;
224904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo    }
225904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo    return size;
226904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo}
227904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo
228904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Moint TStructure::calculateDeepestNesting() const
229904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo{
230904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo    int maxNesting = 0;
2319eedea031cc0d900e34349f9a0ae166e303f7a96Zhenyao Mo    for (size_t i = 0; i < mFields->size(); ++i)
232904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo        maxNesting = std::max(maxNesting, (*mFields)[i]->type()->getDeepestStructNesting());
233904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo    return 1 + maxNesting;
234904a91641a02eea7d48021fbeb763cccac0ba690Zhenyao Mo}
235