blob: 8e7e9ba850ab0d42b27bf07a78bfd7664a26c544 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
//
// Low-level types describing GC object layouts.
//
// Bits stolen from the sync block index that the GC/HandleTable knows about (currently these are at the same
// positions as the mainline runtime but we can change this below when it becomes apparent how Redhawk will
// handle sync blocks).
#define BIT_SBLK_GC_RESERVE 0x20000000
#define BIT_SBLK_FINALIZER_RUN 0x40000000
// The sync block index header (small structure that immediately precedes every object in the GC heap). Only
// the GC uses this so far, and only to store a couple of bits of information.
class ObjHeader
{
private:
#if defined(BIT64)
UInt32 m_uAlignpad;
#endif // BIT64
UInt32 m_uSyncBlockValue;
public:
UInt32 GetBits() { return m_uSyncBlockValue; }
void SetBit(UInt32 uBit);
void ClrBit(UInt32 uBit);
void SetGCBit() { m_uSyncBlockValue |= BIT_SBLK_GC_RESERVE; }
void ClrGCBit() { m_uSyncBlockValue &= ~BIT_SBLK_GC_RESERVE; }
};
//-------------------------------------------------------------------------------------------------
static UIntNative const SYNC_BLOCK_SKEW = sizeof(void *);
class EEType;
typedef DPTR(class EEType) PTR_EEType;
class MethodTable;
//-------------------------------------------------------------------------------------------------
class Object
{
friend class AsmOffsets;
PTR_EEType m_pEEType;
public:
EEType * get_EEType() const
{ return m_pEEType; }
EEType * get_SafeEEType() const
{ return dac_cast<PTR_EEType>((dac_cast<TADDR>(m_pEEType)) & ~((UIntNative)3)); }
ObjHeader * GetHeader() { return dac_cast<DPTR(ObjHeader)>(dac_cast<TADDR>(this) - SYNC_BLOCK_SKEW); }
#ifndef DACCESS_COMPILE
void set_EEType(EEType * pEEType)
{ m_pEEType = pEEType; }
void InitEEType(EEType * pEEType);
size_t GetSize();
#endif
//
// Adapter methods for GC code so that GC and runtime code can use the same type.
// These methods are deprecated -- only use from existing GC code.
//
MethodTable * RawGetMethodTable() const
{
return (MethodTable*)get_EEType();
}
MethodTable * GetGCSafeMethodTable() const
{
return (MethodTable *)get_SafeEEType();
}
void RawSetMethodTable(MethodTable * pMT)
{
m_pEEType = PTR_EEType((EEType *)pMT);
}
////// End adaptor methods
};
typedef DPTR(Object) PTR_Object;
typedef DPTR(PTR_Object) PTR_PTR_Object;
//-------------------------------------------------------------------------------------------------
static UIntNative const MIN_OBJECT_SIZE = (2 * sizeof(void*)) + sizeof(ObjHeader);
//-------------------------------------------------------------------------------------------------
static UIntNative const REFERENCE_SIZE = sizeof(Object *);
//-------------------------------------------------------------------------------------------------
class Array : public Object
{
friend class ArrayBase;
friend class AsmOffsets;
UInt32 m_Length;
#if defined(BIT64)
UInt32 m_uAlignpad;
#endif // BIT64
public:
UInt32 GetArrayLength();
void InitArrayLength(UInt32 length);
void* GetArrayData();
};
typedef DPTR(Array) PTR_Array;
//-------------------------------------------------------------------------------------------------
class String : public Object
{
friend class AsmOffsets;
friend class StringConstants;
UInt32 m_Length;
UInt16 m_FirstChar;
};
typedef DPTR(String) PTR_String;
//-------------------------------------------------------------------------------------------------
class StringConstants
{
public:
static UIntNative const ComponentSize = sizeof(((String*)0)->m_FirstChar);
static UIntNative const BaseSize = sizeof(ObjHeader) + offsetof(String, m_FirstChar) + ComponentSize;
};
//-------------------------------------------------------------------------------------------------
static UIntNative const STRING_COMPONENT_SIZE = StringConstants::ComponentSize;
//-------------------------------------------------------------------------------------------------
static UIntNative const STRING_BASE_SIZE = StringConstants::BaseSize;
|