summaryrefslogtreecommitdiff
path: root/src/vm/typedesc.inl
blob: 312270edbbf05b0f78ea0cc40bf549cf23559e06 (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
// 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.
//
// File: typedesc.inl
//


//

//
// ============================================================================


#ifndef _TYPEDESC_INL_
#define _TYPEDESC_INL_

inline PTR_MethodTable  TypeDesc::GetMethodTable() {

    LIMITED_METHOD_DAC_CONTRACT;

    if (IsGenericVariable())
        return NULL;

    if (GetInternalCorElementType() == ELEMENT_TYPE_FNPTR)
        return MscorlibBinder::GetElementType(ELEMENT_TYPE_U);

    _ASSERTE(HasTypeParam());
    ParamTypeDesc* asParam = dac_cast<PTR_ParamTypeDesc>(this);
    
    if (GetInternalCorElementType() == ELEMENT_TYPE_VALUETYPE)
        return dac_cast<PTR_MethodTable>(asParam->m_Arg.AsMethodTable());
    else
        return(asParam->GetTemplateMethodTableInternal());
}

inline TypeHandle TypeDesc::GetTypeParam() {
    LIMITED_METHOD_DAC_CONTRACT;

    if (IsGenericVariable() || IsFnPtr())
        return TypeHandle();

    _ASSERTE(HasTypeParam());
    ParamTypeDesc* asParam = dac_cast<PTR_ParamTypeDesc>(this);
    return(asParam->m_Arg);
}

inline TypeHandle ParamTypeDesc::GetTypeParam() {
    LIMITED_METHOD_DAC_CONTRACT;

    return(this->m_Arg);
}

inline Instantiation TypeDesc::GetClassOrArrayInstantiation() {
    LIMITED_METHOD_DAC_CONTRACT;

    if (GetInternalCorElementType() != ELEMENT_TYPE_FNPTR)
    {
        ParamTypeDesc* asParam = dac_cast<PTR_ParamTypeDesc>(this);
        return Instantiation(&asParam->m_Arg, 1);
    }
    else
        return Instantiation();
}


#endif  // _TYPEDESC_INL_