Skip to content

Commit

Permalink
[cdac][.NET9] Data descriptor changes for GetMethodDescData
Browse files Browse the repository at this point in the history
Extracted from dotnet#106413
  • Loading branch information
lambdageek committed Aug 15, 2024
1 parent cef3898 commit c44a09f
Show file tree
Hide file tree
Showing 11 changed files with 335 additions and 17 deletions.
1 change: 1 addition & 0 deletions src/coreclr/debug/runtimeinfo/contracts.jsonc
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
"EcmaMetadata" : 1,
"Exception": 1,
"Loader": 1,
"NativeCodePointers": 1,
"Object": 1,
"RuntimeTypeSystem": 1,
"Thread": 1
Expand Down
115 changes: 114 additions & 1 deletion src/coreclr/debug/runtimeinfo/datadescriptor.h
Original file line number Diff line number Diff line change
Expand Up @@ -233,8 +233,16 @@ CDAC_TYPE_END(Module)

CDAC_TYPE_BEGIN(ModuleLookupMap)
CDAC_TYPE_FIELD(ModuleLookupMap, /*pointer*/, TableData, offsetof(LookupMapBase, pTable))
CDAC_TYPE_FIELD(ModuleLookupMap, /*pointer*/, Next, offsetof(LookupMapBase, pNext))
CDAC_TYPE_FIELD(ModuleLookupMap, /*uint32*/, Count, offsetof(LookupMapBase, dwCount))
CDAC_TYPE_FIELD(ModuleLookupMap, /*nuint*/, SupportedFlagsMask, offsetof(LookupMapBase, supportedFlags))
CDAC_TYPE_END(ModuleLookupMap)

CDAC_TYPE_BEGIN(LoaderAllocator)
CDAC_TYPE_INDETERMINATE(LoaderAllocator)
CDAC_TYPE_FIELD(LoaderAllocator, /*uint8*/, IsCollectible, cdac_data<LoaderAllocator>::IsCollectible)
CDAC_TYPE_END(LoaderAllocator)

// RuntimeTypeSystem

CDAC_TYPE_BEGIN(MethodTable)
Expand Down Expand Up @@ -299,11 +307,13 @@ CDAC_TYPE_FIELD(DynamicMetadata, /*inline byte array*/, Data, cdac_data<DynamicM
CDAC_TYPE_END(DynamicMetadata)

CDAC_TYPE_BEGIN(MethodDesc)
CDAC_TYPE_INDETERMINATE(MethodDesc)
CDAC_TYPE_SIZE(sizeof(MethodDesc))
CDAC_TYPE_FIELD(MethodDesc, /*uint8*/, ChunkIndex, cdac_data<MethodDesc>::ChunkIndex)
CDAC_TYPE_FIELD(MethodDesc, /*uint16*/, Slot, cdac_data<MethodDesc>::Slot)
CDAC_TYPE_FIELD(MethodDesc, /*uint16*/, Flags, cdac_data<MethodDesc>::Flags)
CDAC_TYPE_FIELD(MethodDesc, /*uint16*/, Flags3AndTokenRemainder, cdac_data<MethodDesc>::Flags3AndTokenRemainder)
CDAC_TYPE_FIELD(MethodDesc, /*uint8*/, EntryPointFlags, cdac_data<MethodDesc>::EntryPointFlags)
CDAC_TYPE_FIELD(MethodDesc, /*pointer*/, CodeData, cdac_data<MethodDesc>::CodeData)
CDAC_TYPE_END(MethodDesc)

CDAC_TYPE_BEGIN(MethodDescChunk)
Expand Down Expand Up @@ -334,6 +344,105 @@ CDAC_TYPE_INDETERMINATE(DynamicMethodDesc)
CDAC_TYPE_FIELD(DynamicMethodDesc, /*pointer*/, MethodName, cdac_data<DynamicMethodDesc>::MethodName)
CDAC_TYPE_END(DynamicMethodDesc)

CDAC_TYPE_BEGIN(CodePointer)
CDAC_TYPE_SIZE(sizeof(PCODE))
CDAC_TYPE_END(CodePointer)

CDAC_TYPE_BEGIN(MethodDescCodeData)
CDAC_TYPE_INDETERMINATE(MethodDescCodeData)
CDAC_TYPE_FIELD(MethodDescCodeData, /*CodePointer*/, TemporaryEntryPoint, offsetof(MethodDescCodeData,TemporaryEntryPoint))
CDAC_TYPE_FIELD(MethodDescCodeData, /*pointer*/, VersioningState, offsetof(MethodDescCodeData,VersioningState))
CDAC_TYPE_END(MethodDescCodeData)

CDAC_TYPE_BEGIN(MethodDescVersioningState)
CDAC_TYPE_INDETERMINATE(MethodDescVersioningState)
CDAC_TYPE_FIELD(MethodDescVersioningState, /*pointer*/, NativeCodeVersionNode, cdac_data<MethodDescVersioningState>::NativeCodeVersionNode)
CDAC_TYPE_FIELD(MethodDescVersioningState, /*uint8*/, Flags, cdac_data<MethodDescVersioningState>::Flags)
CDAC_TYPE_END(MethodDescVersioningState)

CDAC_TYPE_BEGIN(PrecodeMachineDescriptor)
CDAC_TYPE_INDETERMINATE(PrecodeMachineDescriptor)
CDAC_TYPE_FIELD(PrecodeMachineDescriptor, /*uintptr*/, CodePointerToInstrPointerMask, offsetof(PrecodeMachineDescriptor, CodePointerToInstrPointerMask))
CDAC_TYPE_FIELD(PrecodeMachineDescriptor, /*uint8*/, ReadWidthOfPrecodeType, offsetof(PrecodeMachineDescriptor, ReadWidthOfPrecodeType))
CDAC_TYPE_FIELD(PrecodeMachineDescriptor, /*uint8*/, ShiftOfPrecodeType, offsetof(PrecodeMachineDescriptor, ShiftOfPrecodeType))
CDAC_TYPE_FIELD(PrecodeMachineDescriptor, /*uint8*/, OffsetOfPrecodeType, offsetof(PrecodeMachineDescriptor, OffsetOfPrecodeType))
CDAC_TYPE_FIELD(PrecodeMachineDescriptor, /*uint8*/, InvalidPrecodeType, offsetof(PrecodeMachineDescriptor, InvalidPrecodeType))
CDAC_TYPE_FIELD(PrecodeMachineDescriptor, /*uint8*/, StubPrecodeType, offsetof(PrecodeMachineDescriptor, StubPrecodeType))
CDAC_TYPE_FIELD(PrecodeMachineDescriptor, /*uint8*/, HasNDirectImportPrecode, offsetof(PrecodeMachineDescriptor, HasNDirectImportPrecode))
CDAC_TYPE_FIELD(PrecodeMachineDescriptor, /*uint8*/, NDirectImportPrecodeType, offsetof(PrecodeMachineDescriptor, NDirectImportPrecodeType))
CDAC_TYPE_FIELD(PrecodeMachineDescriptor, /*uint8*/, HasFixupPrecode, offsetof(PrecodeMachineDescriptor, HasFixupPrecode))
CDAC_TYPE_FIELD(PrecodeMachineDescriptor, /*uint8*/, FixupPrecodeType, offsetof(PrecodeMachineDescriptor, FixupPrecodeType))
CDAC_TYPE_FIELD(PrecodeMachineDescriptor, /*uint32*/, StubCodePageSize, offsetof(PrecodeMachineDescriptor, StubCodePageSize))
CDAC_TYPE_END(PrecodeMachineDescriptor)

CDAC_TYPE_BEGIN(StubPrecodeData)
CDAC_TYPE_INDETERMINATE(StubPrecodeData)
CDAC_TYPE_FIELD(StubPrecodeData, /*pointer*/, MethodDesc, offsetof(StubPrecodeData, MethodDesc))
CDAC_TYPE_FIELD(StubPrecodeData, /*uint8*/, Type, offsetof(StubPrecodeData, Type))
CDAC_TYPE_END(StubPrecodeData)

CDAC_TYPE_BEGIN(FixupPrecodeData)
CDAC_TYPE_INDETERMINATE(FixupPrecodeData)
CDAC_TYPE_FIELD(FixupPrecodeData, /*pointer*/, MethodDesc, offsetof(FixupPrecodeData, MethodDesc))
CDAC_TYPE_END(FixupPrecodeData)

CDAC_TYPE_BEGIN(RangeSectionMap)
CDAC_TYPE_INDETERMINATE(RangeSectionMap)
CDAC_TYPE_FIELD(RangeSectionMap, /*pointer*/, TopLevelData, cdac_data<RangeSectionMap>::TopLevelData)
CDAC_TYPE_END(RangeSectionMap)

CDAC_TYPE_BEGIN(RangeSectionFragment)
CDAC_TYPE_INDETERMINATE(RangeSectionFragment)
CDAC_TYPE_FIELD(RangeSectionFragment, /*pointer*/, RangeBegin, cdac_data<RangeSectionMap>::RangeSectionFragment::RangeBegin)
CDAC_TYPE_FIELD(RangeSectionFragment, /*pointer*/, RangeEndOpen, cdac_data<RangeSectionMap>::RangeSectionFragment::RangeEndOpen)
CDAC_TYPE_FIELD(RangeSectionFragment, /*pointer*/, RangeSection, cdac_data<RangeSectionMap>::RangeSectionFragment::RangeSection)
CDAC_TYPE_FIELD(RangeSectionFragment, /*pointer*/, Next, cdac_data<RangeSectionMap>::RangeSectionFragment::Next)
CDAC_TYPE_END(RangeSectionFragment)

CDAC_TYPE_BEGIN(RangeSection)
CDAC_TYPE_INDETERMINATE(RangeSection)
CDAC_TYPE_FIELD(RangeSection, /*pointer*/, RangeBegin, cdac_data<RangeSection>::RangeBegin)
CDAC_TYPE_FIELD(RangeSection, /*pointer*/, RangeEndOpen, cdac_data<RangeSection>::RangeEndOpen)
CDAC_TYPE_FIELD(RangeSection, /*pointer*/, NextForDelete, cdac_data<RangeSection>::NextForDelete)
CDAC_TYPE_FIELD(RangeSection, /*pointer*/, JitManager, cdac_data<RangeSection>::JitManager)
CDAC_TYPE_FIELD(RangeSection, /*int32_t*/, Flags, cdac_data<RangeSection>::Flags)
CDAC_TYPE_FIELD(RangeSection, /*pointer*/, HeapList, cdac_data<RangeSection>::HeapList)
CDAC_TYPE_FIELD(RangeSection, /*pointer*/, R2RModule, cdac_data<RangeSection>::R2RModule)
CDAC_TYPE_END(RangeSection)

CDAC_TYPE_BEGIN(RealCodeHeader)
CDAC_TYPE_INDETERMINATE(RealCodeHeader)
CDAC_TYPE_FIELD(RealCodeHeader, /*pointer*/, MethodDesc, offsetof(RealCodeHeader, phdrMDesc))
CDAC_TYPE_END(RealCodeHeader)

CDAC_TYPE_BEGIN(HeapList)
CDAC_TYPE_FIELD(HeapList, /*pointer*/, Next, offsetof(HeapList, hpNext))
CDAC_TYPE_FIELD(HeapList, /*pointer*/, StartAddress, offsetof(HeapList, startAddress))
CDAC_TYPE_FIELD(HeapList, /*pointer*/, EndAddress, offsetof(HeapList, endAddress))
CDAC_TYPE_FIELD(HeapList, /*pointer*/, MapBase, offsetof(HeapList, mapBase))
CDAC_TYPE_FIELD(HeapList, /*pointer*/, HeaderMap, offsetof(HeapList, pHdrMap))
CDAC_TYPE_END(HeapList)

CDAC_TYPE_BEGIN(ILCodeVersioningState)
CDAC_TYPE_INDETERMINATE(ILCodeVersioningState)
CDAC_TYPE_FIELD(ILCodeVersioningState, /*pointer*/, Node, cdac_data<ILCodeVersioningState>::Node)
CDAC_TYPE_FIELD(ILCodeVersioningState, /*uint32*/, ActiveVersionKind, cdac_data<ILCodeVersioningState>::ActiveVersionKind)
CDAC_TYPE_FIELD(ILCodeVersioningState, /*pointer*/, ActiveVersionNode, cdac_data<ILCodeVersioningState>::ActiveVersionNode)
CDAC_TYPE_FIELD(ILCodeVersioningState, /*pointer*/, ActiveVersionModule, cdac_data<ILCodeVersioningState>::ActiveVersionModule)
CDAC_TYPE_FIELD(ILCodeVersioningState, /*uint32*/, ActiveVersionMethodDef, cdac_data<ILCodeVersioningState>::ActiveVersionMethodDef)
CDAC_TYPE_END(ILCodeVersioningState)

CDAC_TYPE_BEGIN(NativeCodeVersionNode)
CDAC_TYPE_INDETERMINATE(NativeCodeVersionNode)
CDAC_TYPE_FIELD(NativeCodeVersionNode, /*pointer*/, Next, cdac_data<NativeCodeVersionNode>::Next)
CDAC_TYPE_FIELD(NativeCodeVersionNode, /*pointer*/, MethodDesc, cdac_data<NativeCodeVersionNode>::MethodDesc)
CDAC_TYPE_FIELD(NativeCodeVersionNode, /*pointer*/, NativeCode, cdac_data<NativeCodeVersionNode>::NativeCode)
CDAC_TYPE_END(NativeCodeVersionNode)

CDAC_TYPE_BEGIN(ProfControlBlock)
CDAC_TYPE_FIELD(ProfControlBlock, /*uint64*/, GlobalEventMask, offsetof(ProfControlBlock, globalEventMask))
CDAC_TYPE_END(ProfControlBlock)

CDAC_TYPES_END()

CDAC_GLOBALS_BEGIN()
Expand Down Expand Up @@ -363,6 +472,7 @@ CDAC_GLOBAL(DirectorySeparator, uint8, (uint8_t)DIRECTORY_SEPARATOR_CHAR_A)
CDAC_GLOBAL(MethodDescAlignment, uint64, MethodDesc::ALIGNMENT)
CDAC_GLOBAL(ObjectHeaderSize, uint64, OBJHEADER_SIZE)
CDAC_GLOBAL(SyncBlockValueToObjectOffset, uint16, OBJHEADER_SIZE - cdac_data<ObjHeader>::SyncBlockValue)
CDAC_GLOBAL(StubCodeBlockLast, uint8, STUB_CODE_BLOCK_LAST)
CDAC_GLOBAL_POINTER(ArrayBoundsZero, cdac_data<ArrayBase>::ArrayBoundsZero)
CDAC_GLOBAL_POINTER(ExceptionMethodTable, &::g_pExceptionClass)
CDAC_GLOBAL_POINTER(FreeObjectMethodTable, &::g_pFreeObjectMethodTable)
Expand All @@ -372,6 +482,9 @@ CDAC_GLOBAL_POINTER(StringMethodTable, &::g_pStringClass)
CDAC_GLOBAL_POINTER(SyncTableEntries, &::g_pSyncTable)
CDAC_GLOBAL_POINTER(MiniMetaDataBuffAddress, &::g_MiniMetaDataBuffAddress)
CDAC_GLOBAL_POINTER(MiniMetaDataBuffMaxSize, &::g_MiniMetaDataBuffMaxSize)
CDAC_GLOBAL_POINTER(PrecodeMachineDescriptor, &::g_PrecodeMachineDescriptor)
CDAC_GLOBAL_POINTER(ExecutionManagerCodeRangeMapAddress, cdac_data<ExecutionManager>::CodeRangeMapAddress)
CDAC_GLOBAL_POINTER(ProfilerControlBlock, &::g_profControlBlock)
CDAC_GLOBALS_END()

#undef CDAC_BASELINE
Expand Down
2 changes: 2 additions & 0 deletions src/coreclr/vm/appdomain.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@

#include "codeversion.h"

#include "cdacdata.h"

class BaseDomain;
class SystemDomain;
class AppDomain;
Expand Down
1 change: 1 addition & 0 deletions src/coreclr/vm/ceemain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -625,6 +625,7 @@ void EEStartupHelper()

// We cache the SystemInfo for anyone to use throughout the life of the EE.
GetSystemInfo(&g_SystemInfo);
PrecodeMachineDescriptor::Init();

// Set callbacks so that LoadStringRC knows which language our
// threads are in so that it can return the proper localized string.
Expand Down
54 changes: 48 additions & 6 deletions src/coreclr/vm/codeman.h
Original file line number Diff line number Diff line change
Expand Up @@ -555,6 +555,8 @@ class Range
{
return end;
}

template<typename T> friend struct ::cdac_data;
};

struct RangeSection
Expand Down Expand Up @@ -626,6 +628,19 @@ struct RangeSection


RangeSection* _pRangeSectionNextForDelete = NULL; // Used for adding to the cleanup list

template<typename T> friend struct ::cdac_data;
};

template<> struct cdac_data<RangeSection>
{
static constexpr size_t RangeBegin = offsetof(RangeSection, _range.begin);
static constexpr size_t RangeEndOpen = offsetof(RangeSection, _range.end);
static constexpr size_t NextForDelete = offsetof(RangeSection, _pRangeSectionNextForDelete);
static constexpr size_t JitManager = offsetof(RangeSection, _pjit);
static constexpr size_t Flags = offsetof(RangeSection, _flags);
static constexpr size_t HeapList = offsetof(RangeSection, _pHeapList);
static constexpr size_t R2RModule = offsetof(RangeSection, _pR2RModule);
};

enum class RangeSectionLockState
Expand Down Expand Up @@ -835,7 +850,7 @@ class RangeSectionMap
{
// Upgrade to non-collectible
#ifdef _DEBUG
TADDR initialValue =
TADDR initialValue =
#endif
InterlockedCompareExchangeT(&_ptr, ptr - 1, ptr);
assert(initialValue == ptr || initialValue == (ptr - 1));
Expand Down Expand Up @@ -951,7 +966,7 @@ class RangeSectionMap
auto levelNew = static_cast<decltype(&(outerLevel->VolatileLoad(NULL))[0])>(AllocateLevel());
if (levelNew == NULL)
return NULL;

if (!outerLevel->Install(levelNew, collectible))
{
// Handle race where another thread grew the table
Expand Down Expand Up @@ -1017,7 +1032,7 @@ class RangeSectionMap
auto rangeSectionL3 = rangeSectionL3Ptr->VolatileLoadWithoutBarrier(pLockState);
if (rangeSectionL3 == NULL)
return NULL;

auto rangeSectionL2Ptr = &((*rangeSectionL3)[EffectiveBitsForLevel(address, 3)]);
if (level == 2)
return rangeSectionL2Ptr;
Expand Down Expand Up @@ -1071,7 +1086,7 @@ class RangeSectionMap

// Account for the range not starting at the beginning of a last level fragment
rangeSize += pRangeSection->_range.RangeStart() & (bytesAtLastLevel - 1);

uintptr_t fragmentCount = ((rangeSize - 1) / bytesAtLastLevel) + 1;
return fragmentCount;
}
Expand Down Expand Up @@ -1314,7 +1329,7 @@ class RangeSectionMap
else
{
// Since the fragment linked lists are sorted such that the collectible ones are always after the non-collectible ones, this should never happen.
assert(!seenCollectibleRangeList);
assert(!seenCollectibleRangeList);
}
#endif
entryInMapToUpdate = &(entryInMapToUpdate->VolatileLoadWithoutBarrier(pLockState))->pRangeSectionFragmentNext;
Expand Down Expand Up @@ -1355,7 +1370,7 @@ class RangeSectionMap

if (foundMeaningfulValue)
break;

// This level is completely empty. Free it, and then null out the pointer to it.
pointerToLevelData->Uninstall();
#if defined(__GNUC__)
Expand Down Expand Up @@ -1432,6 +1447,21 @@ class RangeSectionMap
}
#endif// DACCESS_COMPILE

template<typename T> friend struct ::cdac_data;
};

template<>
struct cdac_data<RangeSectionMap>
{
static constexpr size_t TopLevelData = offsetof(RangeSectionMap, _topLevelData);

struct RangeSectionFragment
{
static constexpr size_t RangeBegin = offsetof(RangeSectionMap::RangeSectionFragment, _range.begin);
static constexpr size_t RangeEndOpen = offsetof(RangeSectionMap::RangeSectionFragment, _range.end);
static constexpr size_t RangeSection = offsetof(RangeSectionMap::RangeSectionFragment, pRangeSection);
static constexpr size_t Next = offsetof(RangeSectionMap::RangeSectionFragment, pRangeSectionFragmentNext);
};
};

struct RangeSectionMapData
Expand Down Expand Up @@ -2246,8 +2276,18 @@ class ExecutionManager
JumpStubBlockHeader * m_pBlocks;
JumpStubTable m_Table;
};

template<typename T> friend struct ::cdac_data;
};

#ifndef DACCESS_COMPILE
template<>
struct cdac_data<ExecutionManager>
{
static constexpr void* const CodeRangeMapAddress = (void*)&ExecutionManager::g_codeRangeMap.Data[0];
};
#endif

inline CodeHeader * EEJitManager::GetCodeHeader(const METHODTOKEN& MethodToken)
{
LIMITED_METHOD_DAC_CONTRACT;
Expand Down Expand Up @@ -2552,6 +2592,8 @@ class EECodeInfo
// Simple helper to return a pointer to the UNWIND_INFO given the offset to the unwind info.
UNWIND_INFO * GetUnwindInfoHelper(ULONG unwindInfoOffset);
#endif // TARGET_AMD64

template<typename T> friend struct ::cdac_data;
};

#include "codeman.inl"
Expand Down
39 changes: 39 additions & 0 deletions src/coreclr/vm/codeversion.h
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,14 @@ class ILCodeVersion
mdMethodDef m_methodDef;
} m_synthetic;
};

template<typename T> friend struct ::cdac_data;
};

template<>
struct cdac_data<ILCodeVersion>
{
// All fields are accessed via ILCodeVersioningState.m_activeVersion
};


Expand Down Expand Up @@ -316,6 +324,16 @@ class NativeCodeVersionNode
IsActiveChildFlag = 1
};
DWORD m_flags;

template<typename T> friend struct ::cdac_data;
};

template<>
struct cdac_data<NativeCodeVersionNode>
{
static constexpr size_t Next = offsetof(NativeCodeVersionNode, m_pNextMethodDescSibling);
static constexpr size_t MethodDesc = offsetof(NativeCodeVersionNode, m_pMethodDesc);
static constexpr size_t NativeCode = offsetof(NativeCodeVersionNode, m_pNativeCode);
};

class NativeCodeVersionCollection
Expand Down Expand Up @@ -473,6 +491,15 @@ class MethodDescVersioningState
BYTE m_flags;
NativeCodeVersionId m_nextId;
PTR_NativeCodeVersionNode m_pFirstVersionNode;

template<typename T> friend struct ::cdac_data;
};

template<>
struct cdac_data<MethodDescVersioningState>
{
static constexpr size_t NativeCodeVersionNode = offsetof(MethodDescVersioningState, m_pFirstVersionNode);
static constexpr size_t Flags = offsetof(MethodDescVersioningState, m_flags);
};

class ILCodeVersioningState
Expand Down Expand Up @@ -505,6 +532,18 @@ class ILCodeVersioningState
PTR_ILCodeVersionNode m_pFirstVersionNode;
PTR_Module m_pModule;
mdMethodDef m_methodDef;

template<typename T> friend struct ::cdac_data;
};

template<>
struct cdac_data<ILCodeVersioningState>
{
static constexpr size_t Node = offsetof(ILCodeVersioningState, m_pFirstVersionNode);
static constexpr size_t ActiveVersionKind = offsetof(ILCodeVersioningState, m_activeVersion.m_storageKind);
static constexpr size_t ActiveVersionNode = offsetof(ILCodeVersioningState, m_activeVersion.m_pVersionNode);
static constexpr size_t ActiveVersionModule = offsetof(ILCodeVersioningState, m_activeVersion.m_synthetic.m_pModule);
static constexpr size_t ActiveVersionMethodDef = offsetof(ILCodeVersioningState, m_activeVersion.m_synthetic.m_methodDef);
};

class CodeVersionManager
Expand Down
4 changes: 2 additions & 2 deletions src/coreclr/vm/loaderallocator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

UINT64 LoaderAllocator::cLoaderAllocatorsCreated = 1;

LoaderAllocator::LoaderAllocator(bool collectible) :
LoaderAllocator::LoaderAllocator(bool collectible) :
m_stubPrecodeRangeList(STUB_CODE_BLOCK_STUBPRECODE, collectible),
m_fixupPrecodeRangeList(STUB_CODE_BLOCK_FIXUPPRECODE, collectible)
{
Expand Down Expand Up @@ -68,7 +68,7 @@ LoaderAllocator::LoaderAllocator(bool collectible) :
m_pLastUsedCodeHeap = NULL;
m_pLastUsedDynamicCodeHeap = NULL;
m_pJumpStubCache = NULL;
m_IsCollectible = collectible;
m_IsCollectible = collectible ? 1 : 0;

m_pMarshalingData = NULL;

Expand Down
Loading

0 comments on commit c44a09f

Please sign in to comment.