Welcome to mirror list, hosted at ThFree Co, Russian Federation.

ObjectLayout.h « Runtime « Native « src - github.com/mono/corert.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
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;