summaryrefslogtreecommitdiff
path: root/src/zap/zapinnerptr.cpp
diff options
context:
space:
mode:
authordotnet-bot <dotnet-bot@microsoft.com>2015-01-30 14:14:42 -0800
committerdotnet-bot <dotnet-bot@microsoft.com>2015-01-30 14:14:42 -0800
commitef1e2ab328087c61a6878c1e84f4fc5d710aebce (patch)
treedee1bbb89e9d722e16b0d1485e3cdd1b6c8e2cfa /src/zap/zapinnerptr.cpp
downloadcoreclr-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.cpp68
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();
+ }
+}