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: clsload.inl
6//
7
8//
9
10//
11// ============================================================================
12
13
14#ifndef _CLSLOAD_INL_
15#define _CLSLOAD_INL_
16
17inline PTR_Assembly ClassLoader::GetAssembly()
18{
19 LIMITED_METHOD_CONTRACT;
20 SUPPORTS_DAC;
21 return m_pAssembly;
22}
23
24inline PTR_Module ClassLoader::ComputeLoaderModuleForFunctionPointer(TypeHandle* pRetAndArgTypes, DWORD NumArgsPlusRetType)
25{
26 CONTRACTL
27 {
28 NOTHROW;
29 GC_NOTRIGGER;
30 MODE_ANY;
31 SUPPORTS_DAC;
32 }
33 CONTRACTL_END;
34 return ComputeLoaderModuleWorker(NULL,
35 0,
36 Instantiation(pRetAndArgTypes, NumArgsPlusRetType),
37 Instantiation());
38}
39
40inline PTR_Module ClassLoader::ComputeLoaderModuleForParamType(TypeHandle paramType)
41{
42 CONTRACTL
43 {
44 NOTHROW;
45 GC_NOTRIGGER;
46 MODE_ANY;
47 SUPPORTS_DAC;
48 }
49 CONTRACTL_END;
50
51 //
52 // Call GetLoaderModule directly instead of ComputeLoaderModuleWorker to avoid exponential recursion for collectible types
53 //
54 // It is safe to do it even during NGen because of we do not create duplicate copies of arrays and other param types
55 // (see code:CEEPreloader::TriageTypeForZap).
56 //
57 return paramType.GetLoaderModule();
58}
59
60//******************************************************************************
61
62inline void AccessCheckOptions::Initialize(
63 AccessCheckType accessCheckType,
64 BOOL throwIfTargetIsInaccessible,
65 MethodTable * pTargetMT,
66 MethodDesc * pTargetMethod,
67 FieldDesc * pTargetField)
68{
69 CONTRACTL
70 {
71 SO_TOLERANT;
72 THROWS;
73 GC_TRIGGERS;
74 MODE_ANY;
75 // At most one of these can be non-NULL. They can all be NULL if:
76 // 1. we are doing a normal accessibility check, or
77 // 2. we are not going to throw an exception if the accessibility check fails
78 PRECONDITION(accessCheckType == kNormalAccessibilityChecks ||
79 !throwIfTargetIsInaccessible ||
80 ((pTargetMT ? 1 : 0) + (pTargetMethod ? 1 : 0) + (pTargetField ? 1 : 0)) == 1);
81 // m_pAccessContext can only be set for kRestrictedMemberAccess
82 PRECONDITION(m_pAccessContext == NULL ||
83 accessCheckType == AccessCheckOptions::kRestrictedMemberAccess);
84 }
85 CONTRACTL_END;
86
87 m_accessCheckType = accessCheckType;
88 m_fThrowIfTargetIsInaccessible = throwIfTargetIsInaccessible;
89 m_pTargetMT = pTargetMT;
90 m_pTargetMethod = pTargetMethod;
91 m_pTargetField = pTargetField;
92}
93
94//******************************************************************************
95
96inline AccessCheckOptions::AccessCheckOptions(
97 AccessCheckType accessCheckType,
98 DynamicResolver * pAccessContext,
99 BOOL throwIfTargetIsInaccessible,
100 MethodTable * pTargetMT) :
101 m_pAccessContext(pAccessContext)
102{
103 WRAPPER_NO_CONTRACT;
104
105 Initialize(
106 accessCheckType,
107 throwIfTargetIsInaccessible,
108 pTargetMT,
109 NULL,
110 NULL);
111}
112
113inline AccessCheckOptions::AccessCheckOptions(
114 AccessCheckType accessCheckType,
115 DynamicResolver * pAccessContext,
116 BOOL throwIfTargetIsInaccessible,
117 MethodDesc * pTargetMethod) :
118 m_pAccessContext(pAccessContext)
119{
120 WRAPPER_NO_CONTRACT;
121
122 Initialize(
123 accessCheckType,
124 throwIfTargetIsInaccessible,
125 NULL,
126 pTargetMethod,
127 NULL);
128}
129
130inline AccessCheckOptions::AccessCheckOptions(
131 AccessCheckType accessCheckType,
132 DynamicResolver * pAccessContext,
133 BOOL throwIfTargetIsInaccessible,
134 FieldDesc * pTargetField) :
135 m_pAccessContext(pAccessContext)
136{
137 WRAPPER_NO_CONTRACT;
138
139 Initialize(
140 accessCheckType,
141 throwIfTargetIsInaccessible,
142 NULL,
143 NULL,
144 pTargetField);
145}
146
147#endif // _CLSLOAD_INL_
148
149