1// Licensed to the .NET Foundation under one or more agreements.
2// The .NET Foundation licenses this file to you under the MIT license.
3// See the LICENSE file in the project root for more information.
4//
5// File: HotMetaData.cpp
6//
7
8//
9// Class code:MetaData::HotMetaData represents a reader of hot data in MetaData hot stream.
10//
11// ======================================================================================
12
13#include "external.h"
14
15#include "hotmetadata.h"
16#include "hotdataformat.h"
17#include "hotheapsdirectoryiterator.h"
18
19namespace MetaData
20{
21
22// --------------------------------------------------------------------------------------
23//
24// Class code:MetaData::HotMetaData represents a reader of hot data in MetaData hot stream.
25//
26__checkReturn
27HRESULT
28HotMetaData::Initialize(
29 DataBuffer data)
30{
31 m_Data = data;
32
33 return S_OK;
34} // HotMetaData::Initialize
35
36// --------------------------------------------------------------------------------------
37//
38// Returns iterator of stored hot heaps (code:HotHeap).
39//
40__checkReturn
41HRESULT
42HotMetaData::GetHeapsDirectoryIterator(
43 HotHeapsDirectoryIterator *pHeapsDirectoryIterator)
44{
45 if (m_Data.GetSize() < sizeof(struct HotMetaDataHeader))
46 {
47 Debug_ReportError("Invalid hot MetaData format - header doesn't fit into the hot data.");
48 return METADATA_E_INVALID_FORMAT;
49 }
50
51 struct HotMetaDataHeader *pHeader;
52 if (!m_Data.PeekDataAt<struct HotMetaDataHeader>(
53 m_Data.GetSize() - sizeof(struct HotMetaDataHeader),
54 &pHeader))
55 {
56 Debug_ReportInternalError("There's a bug, because previous size check succeeded.");
57 return METADATA_E_INTERNAL_ERROR;
58 }
59 // Get rid of the read header
60 DataBuffer heapsData = m_Data;
61 if (!heapsData.TruncateBySize(sizeof(struct HotMetaDataHeader)))
62 {
63 Debug_ReportInternalError("There's a bug, because previous size check succeeded.");
64 return METADATA_E_INTERNAL_ERROR;
65 }
66 DataBuffer heapsDirectoryData = heapsData;
67 if (!heapsDirectoryData.SkipToExactSize(pHeader->m_nHeapsDirectoryStart_NegativeOffset))
68 {
69 Debug_ReportError("Invalid hot MetaData format - heaps directory offset reaches in front of hot data.");
70 return METADATA_E_INVALID_FORMAT;
71 }
72 if (!heapsData.TruncateBySize(pHeader->m_nHeapsDirectoryStart_NegativeOffset))
73 {
74 Debug_ReportInternalError("There's a bug, because previous call to SkipToExactSize succeeded.");
75 return METADATA_E_INVALID_FORMAT;
76 }
77
78 pHeapsDirectoryIterator->Initialize(
79 heapsDirectoryData,
80 heapsData);
81
82 return S_OK;
83} // HotMetaData::GetHeapsDirectoryIterator
84
85}; // namespace MetaData
86