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.
7 #ifndef _RUNTIMEHANDLES_H_
8 #define _RUNTIMEHANDLES_H_
11 #include "typehandle.h"
16 typedef void* EnregisteredTypeHandle;
17 class SignatureNative;
19 // NOTE: These are defined in CallingConventions.cs.
20 typedef enum ReflectionCallConv {
21 CALLCONV_Standard = 0x0001,
22 CALLCONV_VarArgs = 0x0002,
23 CALLCONV_Any = CALLCONV_Standard | CALLCONV_VarArgs,
24 CALLCONV_HasThis = 0x0020,
25 CALLCONV_ExplicitThis = 0x0040,
26 CALLCONV_ArgIteratorFlags = 0xFFFFFF00, // PRIVATE member -- cached ArgIterator flags -- Not exposed in CallingConventions.cs
27 CALLCONV_ArgIteratorFlags_Shift = 8,
31 // Types used to expose method bodies via reflection.
33 class RuntimeExceptionHandlingClause;
34 class RuntimeMethodBody;
35 class RuntimeLocalVariableInfo;
37 #ifdef USE_CHECKED_OBJECTREFS
38 typedef REF<RuntimeExceptionHandlingClause> RUNTIMEEXCEPTIONHANDLINGCLAUSEREF;
39 typedef REF<RuntimeMethodBody> RUNTIMEMETHODBODYREF;
40 typedef REF<RuntimeLocalVariableInfo> RUNTIMELOCALVARIABLEINFOREF;
42 typedef DPTR(RuntimeExceptionHandlingClause) RUNTIMEEXCEPTIONHANDLINGCLAUSEREF;
43 typedef DPTR(RuntimeMethodBody) RUNTIMEMETHODBODYREF;
44 typedef DPTR(RuntimeLocalVariableInfo) RUNTIMELOCALVARIABLEINFOREF;
47 class RuntimeExceptionHandlingClause : Object
50 // Disallow creation and copy construction of these.
51 RuntimeExceptionHandlingClause() { }
52 RuntimeExceptionHandlingClause(RuntimeExceptionHandlingClause &r) { }
55 RUNTIMEMETHODBODYREF _methodBody;
56 CorExceptionFlag _flags;
61 mdTypeDef _catchToken;
65 class RuntimeMethodBody : Object
68 // Disallow creation and copy construction of these.
69 RuntimeMethodBody() { }
70 RuntimeMethodBody(RuntimeMethodBody &r) { }
74 PTRARRAYREF _exceptionClauses;
75 PTRARRAYREF _localVariables;
76 OBJECTREF _methodBase;
78 INT32 _localVarSigToken;
83 class RuntimeLocalVariableInfo : Object
86 // Disallow creation and copy construction of these.
87 RuntimeLocalVariableInfo() { }
88 RuntimeLocalVariableInfo(RuntimeLocalVariableInfo &r) { }
92 REFLECTCLASSBASEREF GetType()
94 return (REFLECTCLASSBASEREF)_type;
97 void SetType(OBJECTREF type)
99 SetObjectReference(&_type, type, GetAppDomain());
109 static FCDECL3(FC_BOOL_RET, EqualsCaseSensitive, LPCUTF8 szLhs, LPCUTF8 szRhs, INT32 stringNumBytes);
112 BOOL QCALLTYPE EqualsCaseInsensitive(LPCUTF8 szLhs, LPCUTF8 szRhs, INT32 stringNumBytes);
115 ULONG QCALLTYPE HashCaseInsensitive(LPCUTF8 sz, INT32 stringNumBytes);
118 class RuntimeTypeHandle;
120 typedef RuntimeTypeHandle FCALLRuntimeTypeHandle;
121 #define FCALL_RTH_TO_REFLECTCLASS(x) (x).pRuntimeTypeDONOTUSEDIRECTLY
123 class RuntimeTypeHandle {
124 ReflectClassBaseObject *pRuntimeTypeDONOTUSEDIRECTLY;
127 // Static method on RuntimeTypeHandle
128 static FCDECL1(Object*, Allocate, ReflectClassBaseObject *refType) ; //A.CI work
129 static FCDECL6(Object*, CreateInstance, ReflectClassBaseObject* refThisUNSAFE,
131 CLR_BOOL wrapExceptions,
132 CLR_BOOL *pbCanBeCached,
133 MethodDesc** pConstructor,
134 CLR_BOOL *pbHasNoDefaultCtor);
136 static FCDECL2(Object*, CreateCaInstance, ReflectClassBaseObject* refCaType, ReflectMethodObject* pCtorUNSAFE);
139 void QCALLTYPE MakeByRef(EnregisteredTypeHandle pTypeHandle, QCall::ObjectHandleOnStack retType);
142 void QCALLTYPE MakePointer(EnregisteredTypeHandle pTypeHandle, QCall::ObjectHandleOnStack retType);
145 void QCALLTYPE MakeSZArray(EnregisteredTypeHandle pTypeHandle, QCall::ObjectHandleOnStack retType);
148 void QCALLTYPE MakeArray(EnregisteredTypeHandle pTypeHandle, INT32 rank, QCall::ObjectHandleOnStack retType);
150 static BOOL QCALLTYPE IsCollectible(EnregisteredTypeHandle pTypeHandle);
152 static FCDECL1(ReflectClassBaseObject*, GetRuntimeType, void *th);
154 static FCDECL1_V(ReflectClassBaseObject*, GetTypeFromHandle, FCALLRuntimeTypeHandle th);
155 static FCDECL1_V(EnregisteredTypeHandle, GetValueInternal, FCALLRuntimeTypeHandle RTH);
157 static FCDECL2(FC_BOOL_RET, TypeEQ, Object* left, Object* right);
158 static FCDECL2(FC_BOOL_RET, TypeNEQ, Object* left, Object* right);
161 #ifdef FEATURE_COMINTEROP
162 static FCDECL1(FC_BOOL_RET, IsWindowsRuntimeObjectType, ReflectClassBaseObject *rtTypeUNSAFE);
163 static FCDECL1(FC_BOOL_RET, IsTypeExportedToWindowsRuntime, ReflectClassBaseObject *rtTypeUNSAFE);
164 #endif // FEATURE_COMINTEROP
167 void QCALLTYPE PrepareMemberInfoCache(EnregisteredTypeHandle pMemberInfoCache);
170 void QCALLTYPE ConstructName(EnregisteredTypeHandle pTypeHandle, DWORD format, QCall::StringHandleOnStack retString);
173 void QCALLTYPE GetTypeByNameUsingCARules(LPCWSTR pwzClassName, QCall::ModuleHandle pModule, QCall::ObjectHandleOnStack retType);
176 void QCALLTYPE GetTypeByName(LPCWSTR pwzClassName, BOOL bThrowOnError, BOOL bIgnoreCase,
177 QCall::StackCrawlMarkHandle pStackMark,
178 ICLRPrivBinder * pPrivHostBinder,
179 BOOL bLoadTypeFromPartialNameHack, QCall::ObjectHandleOnStack retType,
180 QCall::ObjectHandleOnStack keepAlive);
182 static FCDECL1(AssemblyBaseObject*, GetAssembly, ReflectClassBaseObject *pType);
183 static FCDECL1(ReflectClassBaseObject*, GetBaseType, ReflectClassBaseObject* pType);
184 static FCDECL1(ReflectModuleBaseObject*, GetModule, ReflectClassBaseObject* pType);
185 static FCDECL1(INT32, GetAttributes, ReflectClassBaseObject* pType);
186 static FCDECL1(INT32, GetToken, ReflectClassBaseObject* pType);
187 static FCDECL1(LPCUTF8, GetUtf8Name, ReflectClassBaseObject* pType);
188 static FCDECL1(INT32, GetArrayRank, ReflectClassBaseObject* pType);
190 static FCDECL1(ReflectMethodObject*, GetDeclaringMethod, ReflectClassBaseObject *pType);
193 void QCALLTYPE GetDefaultConstructor(EnregisteredTypeHandle pTypeHandle, QCall::ObjectHandleOnStack retMethod);
195 static FCDECL1(ReflectClassBaseObject*, GetDeclaringType, ReflectClassBaseObject* pType);
196 static FCDECL1(FC_BOOL_RET, IsValueType, ReflectClassBaseObject* pType);
197 static FCDECL1(FC_BOOL_RET, IsInterface, ReflectClassBaseObject* pType);
198 static FCDECL1(FC_BOOL_RET, IsByRefLike, ReflectClassBaseObject* pType);
201 BOOL QCALLTYPE IsVisible(EnregisteredTypeHandle pTypeHandle);
203 static FCDECL2(FC_BOOL_RET, IsComObject, ReflectClassBaseObject *pType, CLR_BOOL isGenericCOM);
204 static FCDECL2(FC_BOOL_RET, CanCastTo, ReflectClassBaseObject *pType, ReflectClassBaseObject *pTarget);
205 static FCDECL2(FC_BOOL_RET, IsInstanceOfType, ReflectClassBaseObject *pType, Object *object);
207 static FCDECL6(FC_BOOL_RET, SatisfiesConstraints, PTR_ReflectClassBaseObject pGenericParameter, TypeHandle *typeContextArgs, INT32 typeContextCount, TypeHandle *methodContextArgs, INT32 methodContextCount, PTR_ReflectClassBaseObject pGenericArgument);
209 FCDECL1(FC_BOOL_RET, HasInstantiation, PTR_ReflectClassBaseObject pType);
212 FCDECL1(FC_BOOL_RET, IsGenericTypeDefinition, PTR_ReflectClassBaseObject pType);
215 FCDECL1(FC_BOOL_RET, IsGenericVariable, PTR_ReflectClassBaseObject pType);
218 FCDECL1(INT32, GetGenericVariableIndex, PTR_ReflectClassBaseObject pType);
221 FCDECL1(FC_BOOL_RET, ContainsGenericVariables, PTR_ReflectClassBaseObject pType);
224 void QCALLTYPE GetInstantiation(EnregisteredTypeHandle pTypeHandle, QCall::ObjectHandleOnStack retType, BOOL fAsRuntimeTypeArray);
227 void QCALLTYPE Instantiate(EnregisteredTypeHandle pTypeHandle, TypeHandle * pInstArray, INT32 cInstArray, QCall::ObjectHandleOnStack retType);
230 void QCALLTYPE GetGenericTypeDefinition(EnregisteredTypeHandle pTypeHandle, QCall::ObjectHandleOnStack retType);
232 static FCDECL2(FC_BOOL_RET, CompareCanonicalHandles, PTR_ReflectClassBaseObject pLeft, PTR_ReflectClassBaseObject pRight);
234 static FCDECL1(PtrArray*, GetInterfaces, ReflectClassBaseObject *pType);
237 void QCALLTYPE GetConstraints(EnregisteredTypeHandle pTypeHandle, QCall::ObjectHandleOnStack retTypes);
240 PVOID QCALLTYPE GetGCHandle(EnregisteredTypeHandle pTypeHandle, INT32 handleType);
242 static FCDECL1(INT32, GetCorElementType, PTR_ReflectClassBaseObject pType);
243 static FCDECL1(ReflectClassBaseObject*, GetElementType, ReflectClassBaseObject* pType);
245 static FCDECL2(MethodDesc*, GetMethodAt, PTR_ReflectClassBaseObject pType, INT32 slot);
246 static FCDECL1(INT32, GetNumVirtuals, ReflectClassBaseObject *pType);
249 void QCALLTYPE VerifyInterfaceIsImplemented(EnregisteredTypeHandle pTypeHandle, EnregisteredTypeHandle pIFaceHandle);
252 MethodDesc* QCALLTYPE GetInterfaceMethodImplementation(EnregisteredTypeHandle pTypeHandle, EnregisteredTypeHandle pOwner, MethodDesc * pMD);
254 static FCDECL3(FC_BOOL_RET, GetFields, ReflectClassBaseObject *pType, INT32 **result, INT32 *pCount);
256 static FCDECL1(MethodDesc *, GetFirstIntroducedMethod, ReflectClassBaseObject* pType);
257 static FCDECL1(void, GetNextIntroducedMethod, MethodDesc **ppMethod);
259 static FCDECL2(Object*, CreateInstanceForGenericType, ReflectClassBaseObject* pType
260 , ReflectClassBaseObject* parameterType );
263 FCDECL1(IMDInternalImport*, GetMetadataImport, ReflectClassBaseObject * pModuleUNSAFE);
266 class RuntimeMethodHandle {
269 static FCDECL1(ReflectMethodObject*, GetCurrentMethod, StackCrawlMark* stackMark);
271 static FCDECL5(Object*, InvokeMethod, Object *target, PTRArray *objs, SignatureNative* pSig, CLR_BOOL fConstructor, CLR_BOOL fWrapExceptions);
273 struct StreamingContextData {
274 Object * additionalContext; // additionalContex was changed from OBJECTREF to Object to avoid having a
275 INT32 contextStates; // constructor in this struct. GCC doesn't allow structs with constructors to be
278 // *******************************************************************************************
279 // Keep these in sync with the version in bcl\system\runtime\serialization\streamingcontext.cs
280 // *******************************************************************************************
281 enum StreamingContextStates
283 CONTEXTSTATE_CrossProcess = 0x01,
284 CONTEXTSTATE_CrossMachine = 0x02,
285 CONTEXTSTATE_File = 0x04,
286 CONTEXTSTATE_Persistence = 0x08,
287 CONTEXTSTATE_Remoting = 0x10,
288 CONTEXTSTATE_Other = 0x20,
289 CONTEXTSTATE_Clone = 0x40,
290 CONTEXTSTATE_CrossAppDomain = 0x80,
291 CONTEXTSTATE_All = 0xFF
295 // STATIC IMPLEMENTATION
296 static OBJECTREF InvokeMethod_Internal(
297 MethodDesc *pMethod, OBJECTREF targetUNSAFE, INT32 attrs, OBJECTREF binderUNSAFE, PTRARRAYREF objsUNSAFE, OBJECTREF localeUNSAFE,
298 BOOL isBinderDefault, Assembly *caller, Assembly *reflectedClassAssembly, TypeHandle declaringType, SignatureNative* pSig, BOOL verifyAccess);
301 BOOL QCALLTYPE IsCAVisibleFromDecoratedType(
302 EnregisteredTypeHandle targetTypeHandle,
303 MethodDesc * pTargetCtor,
304 EnregisteredTypeHandle sourceTypeHandle,
305 QCall::ModuleHandle sourceModuleHandle);
307 static FCDECL4(void, SerializationInvoke, ReflectMethodObject *pMethodUNSAFE, Object* targetUNSAFE,
308 Object* serializationInfoUNSAFE, struct StreamingContextData * pContext);
311 void QCALLTYPE ConstructInstantiation(MethodDesc * pMethod, DWORD format, QCall::StringHandleOnStack retString);
314 void * QCALLTYPE GetFunctionPointer(MethodDesc * pMethod);
316 static BOOL QCALLTYPE GetIsCollectible(MethodDesc * pMethod);
318 static FCDECL1(INT32, GetAttributes, MethodDesc *pMethod);
319 static FCDECL1(INT32, GetImplAttributes, ReflectMethodObject *pMethodUNSAFE);
320 static FCDECL1(ReflectClassBaseObject*, GetDeclaringType, MethodDesc *pMethod);
321 static FCDECL1(INT32, GetSlot, MethodDesc *pMethod);
322 static FCDECL1(INT32, GetMethodDef, ReflectMethodObject *pMethodUNSAFE);
323 static FCDECL1(StringObject*, GetName, MethodDesc *pMethod);
324 static FCDECL1(LPCUTF8, GetUtf8Name, MethodDesc *pMethod);
325 static FCDECL2(FC_BOOL_RET, MatchesNameHash, MethodDesc * pMethod, ULONG hash);
328 void QCALLTYPE GetMethodInstantiation(MethodDesc * pMethod, QCall::ObjectHandleOnStack retTypes, BOOL fAsRuntimeTypeArray);
331 FCDECL1(FC_BOOL_RET, HasMethodInstantiation, MethodDesc *pMethod);
334 FCDECL1(FC_BOOL_RET, IsGenericMethodDefinition, MethodDesc *pMethod);
337 FCDECL1(FC_BOOL_RET, IsTypicalMethodDefinition, ReflectMethodObject *pMethodUNSAFE);
340 void QCALLTYPE GetTypicalMethodDefinition(MethodDesc * pMethod, QCall::ObjectHandleOnStack refMethod);
343 void QCALLTYPE StripMethodInstantiation(MethodDesc * pMethod, QCall::ObjectHandleOnStack refMethod);
346 FCDECL1(INT32, GetGenericParameterCount, MethodDesc * pMethod);
348 // see comment in the cpp file
349 static FCDECL3(MethodDesc*, GetStubIfNeeded, MethodDesc *pMethod, ReflectClassBaseObject *pType, PtrArray* instArray);
350 static FCDECL2(MethodDesc*, GetMethodFromCanonical, MethodDesc *pMethod, PTR_ReflectClassBaseObject pType);
353 FCDECL1(FC_BOOL_RET, IsDynamicMethod, MethodDesc * pMethod);
356 FCDECL1(Object*, GetResolver, MethodDesc * pMethod);
359 void QCALLTYPE Destroy(MethodDesc * pMethod);
362 void QCALLTYPE GetCallerType(QCall::StackCrawlMarkHandle pStackMark, QCall::ObjectHandleOnStack retType);
364 static FCDECL2(RuntimeMethodBody*, GetMethodBody, ReflectMethodObject *pMethodUNSAFE, PTR_ReflectClassBaseObject pDeclaringType);
366 static FCDECL1(FC_BOOL_RET, IsConstructor, MethodDesc *pMethod);
368 static FCDECL1(Object*, GetLoaderAllocator, MethodDesc *pMethod);
371 class RuntimeFieldHandle {
374 static FCDECL5(Object*, GetValue, ReflectFieldObject *pFieldUNSAFE, Object *instanceUNSAFE, ReflectClassBaseObject *pFieldType, ReflectClassBaseObject *pDeclaringType, CLR_BOOL *pDomainInitialized);
375 static FCDECL7(void, SetValue, ReflectFieldObject *pFieldUNSAFE, Object *targetUNSAFE, Object *valueUNSAFE, ReflectClassBaseObject *pFieldType, DWORD attr, ReflectClassBaseObject *pDeclaringType, CLR_BOOL *pDomainInitialized);
376 static FCDECL4(Object*, GetValueDirect, ReflectFieldObject *pFieldUNSAFE, ReflectClassBaseObject *pFieldType, TypedByRef *pTarget, ReflectClassBaseObject *pDeclaringType);
377 static FCDECL5(void, SetValueDirect, ReflectFieldObject *pFieldUNSAFE, ReflectClassBaseObject *pFieldType, TypedByRef *pTarget, Object *valueUNSAFE, ReflectClassBaseObject *pContextType);
378 static FCDECL1(StringObject*, GetName, ReflectFieldObject *pFieldUNSAFE);
379 static FCDECL1(LPCUTF8, GetUtf8Name, FieldDesc *pField);
380 static FCDECL2(FC_BOOL_RET, MatchesNameHash, FieldDesc * pField, ULONG hash);
382 static FCDECL1(INT32, GetAttributes, FieldDesc *pField);
383 static FCDECL1(ReflectClassBaseObject*, GetApproxDeclaringType, FieldDesc *pField);
384 static FCDECL1(INT32, GetToken, ReflectFieldObject *pFieldUNSAFE);
385 static FCDECL2(FieldDesc*, GetStaticFieldForGenericType, FieldDesc *pField, ReflectClassBaseObject *pDeclaringType);
386 static FCDECL1(FC_BOOL_RET, AcquiresContextFromThis, FieldDesc *pField);
392 static FCDECL5(ReflectMethodObject*, GetDynamicMethod, ReflectMethodObject *pMethodUNSAFE, ReflectModuleBaseObject *pModuleUNSAFE, StringObject *name, U1Array *sig, Object *resolver);
393 static FCDECL1(INT32, GetToken, ReflectModuleBaseObject *pModuleUNSAFE);
396 void QCALLTYPE GetModuleType(QCall::ModuleHandle pModule, QCall::ObjectHandleOnStack retType);
399 FCDECL1(IMDInternalImport*, GetMetadataImport, ReflectModuleBaseObject * pModuleUNSAFE);
402 BOOL QCALLTYPE ContainsPropertyMatchingHash(QCall::ModuleHandle pModule, INT32 tkProperty, ULONG hash);
405 void QCALLTYPE ResolveType(QCall::ModuleHandle pModule, INT32 tkType, TypeHandle *typeArgs, INT32 typeArgsCount, TypeHandle *methodArgs, INT32 methodArgsCount, QCall::ObjectHandleOnStack retType);
408 MethodDesc * QCALLTYPE ResolveMethod(QCall::ModuleHandle pModule, INT32 tkMemberRef, TypeHandle *typeArgs, INT32 typeArgsCount, TypeHandle *methodArgs, INT32 methodArgsCount);
411 void QCALLTYPE ResolveField(QCall::ModuleHandle pModule, INT32 tkMemberRef, TypeHandle *typeArgs, INT32 typeArgsCount, TypeHandle *methodArgs, INT32 methodArgsCount, QCall::ObjectHandleOnStack retField);
414 void QCALLTYPE GetAssembly(QCall::ModuleHandle pModule, QCall::ObjectHandleOnStack retAssembly);
417 void QCALLTYPE GetPEKind(QCall::ModuleHandle pModule, DWORD* pdwPEKind, DWORD* pdwMachine);
420 FCDECL1(INT32, GetMDStreamVersion, ReflectModuleBaseObject * pModuleUNSAFE);
423 class AssemblyHandle {
426 static FCDECL1(ReflectModuleBaseObject*, GetManifestModule, AssemblyBaseObject *pAssemblyUNSAFE);
428 static FCDECL1(INT32, GetToken, AssemblyBaseObject *pAssemblyUNSAFE);
431 class SignatureNative;
433 typedef DPTR(SignatureNative) PTR_SignatureNative;
435 #ifdef USE_CHECKED_OBJECTREFS
436 typedef REF<SignatureNative> SIGNATURENATIVEREF;
438 typedef PTR_SignatureNative SIGNATURENATIVEREF;
441 class SignatureNative : public Object
443 friend class RuntimeMethodHandle;
444 friend class ArgIteratorForMethodInvoke;
447 static FCDECL6(void, GetSignature,
448 SignatureNative* pSignatureNative,
449 PCCOR_SIGNATURE pCorSig, DWORD cCorSig,
450 FieldDesc *pFieldDesc, ReflectMethodObject *pMethodUNSAFE,
451 ReflectClassBaseObject *pDeclaringType);
452 static FCDECL3(Object *, GetCustomModifiers, SignatureNative* pSig, INT32 parameter, CLR_BOOL fRequired);
453 static FCDECL2(FC_BOOL_RET, CompareSig, SignatureNative* pLhs, SignatureNative* pRhs);
454 static FCDECL4(FC_BOOL_RET, CompareSigForAppCompat, SignatureNative* pLhs, ReflectClassBaseObject * pTypeLhs, SignatureNative* pRhs, ReflectClassBaseObject * pTypeRhs);
457 BOOL HasThis() { LIMITED_METHOD_CONTRACT; return (m_managedCallingConvention & CALLCONV_HasThis); }
458 INT32 NumFixedArgs() { WRAPPER_NO_CONTRACT; return m_PtrArrayarguments->GetNumComponents(); }
459 TypeHandle GetReturnTypeHandle()
468 return ((REFLECTCLASSBASEREF)m_returnType)->GetType();
471 PCCOR_SIGNATURE GetCorSig() { LIMITED_METHOD_CONTRACT; return m_sig; }
472 DWORD GetCorSigSize() { LIMITED_METHOD_CONTRACT; return m_cSig; }
473 Module* GetModule() { WRAPPER_NO_CONTRACT; return GetDeclaringType().GetModule(); }
475 TypeHandle GetArgumentAt(INT32 position)
484 REFLECTCLASSBASEREF refArgument = (REFLECTCLASSBASEREF)m_PtrArrayarguments->GetAt(position);
485 return refArgument->GetType();
488 DWORD GetArgIteratorFlags()
490 LIMITED_METHOD_CONTRACT;
491 return VolatileLoad(&m_managedCallingConvention) >> CALLCONV_ArgIteratorFlags_Shift;
494 INT32 GetSizeOfArgStack()
496 LIMITED_METHOD_CONTRACT;
497 return m_nSizeOfArgStack;
500 TypeHandle GetDeclaringType()
502 LIMITED_METHOD_CONTRACT;
503 return m_declaringType->GetType();
505 MethodDesc* GetMethod()
507 LIMITED_METHOD_CONTRACT;
511 const SigTypeContext * GetTypeContext(SigTypeContext *pTypeContext)
521 _ASSERTE(m_pMethod || !GetDeclaringType().IsNull());
523 return SigTypeContext::GetOptionalTypeContext(m_pMethod, GetDeclaringType(), pTypeContext);
525 return SigTypeContext::GetOptionalTypeContext(GetDeclaringType(), pTypeContext);
529 void SetReturnType(OBJECTREF returnType)
537 SetObjectReference(&m_returnType, returnType, GetAppDomain());
540 void SetKeepAlive(OBJECTREF keepAlive)
548 SetObjectReference(&m_keepalive, keepAlive, GetAppDomain());
551 void SetDeclaringType(REFLECTCLASSBASEREF declaringType)
559 SetObjectReference((OBJECTREF*)&m_declaringType, (OBJECTREF)declaringType, GetAppDomain());
562 void SetArgumentArray(PTRARRAYREF ptrArrayarguments)
570 SetObjectReference((OBJECTREF*)&m_PtrArrayarguments, (OBJECTREF)ptrArrayarguments, GetAppDomain());
573 void SetArgument(INT32 argument, OBJECTREF argumentType)
582 m_PtrArrayarguments->SetAt(argument, argumentType);
585 void SetArgIteratorFlags(DWORD flags)
587 LIMITED_METHOD_CONTRACT;
588 return VolatileStore(&m_managedCallingConvention, (INT32)(m_managedCallingConvention | (flags << CALLCONV_ArgIteratorFlags_Shift)));
591 void SetSizeOfArgStack(INT32 nSizeOfArgStack)
593 LIMITED_METHOD_CONTRACT;
594 m_nSizeOfArgStack = nSizeOfArgStack;
597 void SetCallingConvention(INT32 mdCallingConvention)
599 LIMITED_METHOD_CONTRACT;
601 if ((mdCallingConvention & IMAGE_CEE_CS_CALLCONV_MASK) == IMAGE_CEE_CS_CALLCONV_VARARG)
602 m_managedCallingConvention = CALLCONV_VarArgs;
604 m_managedCallingConvention = CALLCONV_Standard;
606 if ((mdCallingConvention & IMAGE_CEE_CS_CALLCONV_HASTHIS) != 0)
607 m_managedCallingConvention |= CALLCONV_HasThis;
609 if ((mdCallingConvention & IMAGE_CEE_CS_CALLCONV_EXPLICITTHIS) != 0)
610 m_managedCallingConvention |= CALLCONV_ExplicitThis;
613 // Mirrored in the managed world (System.Signature)
615 // this is the layout the classloader chooses by default for the managed struct.
617 PTRARRAYREF m_PtrArrayarguments;
618 REFLECTCLASSBASEREF m_declaringType;
619 OBJECTREF m_returnType;
620 OBJECTREF m_keepalive;
621 PCCOR_SIGNATURE m_sig;
622 INT32 m_managedCallingConvention;
623 INT32 m_nSizeOfArgStack;
625 MethodDesc* m_pMethod;
628 class ReflectionPointer : public Object