diff options
author | dotnet-bot <dotnet-bot@microsoft.com> | 2015-01-30 14:14:42 -0800 |
---|---|---|
committer | dotnet-bot <dotnet-bot@microsoft.com> | 2015-01-30 14:14:42 -0800 |
commit | ef1e2ab328087c61a6878c1e84f4fc5d710aebce (patch) | |
tree | dee1bbb89e9d722e16b0d1485e3cdd1b6c8e2cfa /src/zap/zapinnerptr.cpp | |
download | coreclr-ef1e2ab328087c61a6878c1e84f4fc5d710aebce.tar.gz coreclr-ef1e2ab328087c61a6878c1e84f4fc5d710aebce.tar.bz2 coreclr-ef1e2ab328087c61a6878c1e84f4fc5d710aebce.zip |
Initial commit to populate CoreCLR repo
[tfs-changeset: 1407945]
Diffstat (limited to 'src/zap/zapinnerptr.cpp')
-rw-r--r-- | src/zap/zapinnerptr.cpp | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/src/zap/zapinnerptr.cpp b/src/zap/zapinnerptr.cpp new file mode 100644 index 0000000000..c8b44f7a4d --- /dev/null +++ b/src/zap/zapinnerptr.cpp @@ -0,0 +1,68 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// +// +// ZapInnerPtr.h +// + +// +// ZapNode that points into middle of other ZapNode +// +// ====================================================================================== + +#include "common.h" + +#include "zapinnerptr.h" + +ZapNode * ZapInnerPtrTable::Get(ZapNode * pBase, SSIZE_T offset) +{ + // Nothing to do if the offset is zero + if (offset == 0) + return pBase; + + // Flatten the hiearchy of inner ptrs. Inner ptrs pointing to other inner ptrs + // would not work well during the Resolve phase + while (pBase->GetType() == ZapNodeType_InnerPtr) + { + ZapInnerPtr * pWrapper = (ZapInnerPtr *)pBase; + + offset += pWrapper->GetOffset(); + pBase = pWrapper->GetBase(); + } + + ZapInnerPtr * pInnerPtr = m_entries.Lookup(InnerPtrKey(pBase, offset)); + + if (pInnerPtr != NULL) + return pInnerPtr; + + switch (offset) + { + case 1: + pInnerPtr = new (m_pWriter->GetHeap()) InnerPtrConst<1>(pBase); + break; + case 2: + pInnerPtr = new (m_pWriter->GetHeap()) InnerPtrConst<2>(pBase); + break; + case 4: + pInnerPtr = new (m_pWriter->GetHeap()) InnerPtrConst<4>(pBase); + break; + case 8: + pInnerPtr = new (m_pWriter->GetHeap()) InnerPtrConst<8>(pBase); + break; + default: + pInnerPtr = new (m_pWriter->GetHeap()) InnerPtrVar(pBase, offset); + break; + } + + m_entries.Add(pInnerPtr); + return pInnerPtr; +} + +void ZapInnerPtrTable::Resolve() +{ + for (InnerPtrTable::Iterator i = m_entries.Begin(), end = m_entries.End(); i != end; i++) + { + (*i)->Resolve(); + } +} |