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"
15 #include "constrainedexecutionregion.h"
17 typedef void* EnregisteredTypeHandle;
18 class SignatureNative;
20 // NOTE: These are defined in CallingConventions.cs.
21 typedef enum ReflectionCallConv {
22 CALLCONV_Standard = 0x0001,
23 CALLCONV_VarArgs = 0x0002,
24 CALLCONV_Any = CALLCONV_Standard | CALLCONV_VarArgs,
25 CALLCONV_HasThis = 0x0020,
26 CALLCONV_ExplicitThis = 0x0040,
27 CALLCONV_ArgIteratorFlags = 0xFFFFFF00, // PRIVATE member -- cached ArgIterator flags -- Not exposed in CallingConventions.cs
28 CALLCONV_ArgIteratorFlags_Shift = 8,
32 // Types used to expose method bodies via reflection.
34 class ExceptionHandlingClause;
36 class LocalVariableInfo;
38 #ifdef USE_CHECKED_OBJECTREFS
39 typedef REF<ExceptionHandlingClause> EXCEPTIONHANDLINGCLAUSEREF;
40 typedef REF<MethodBody> METHODBODYREF;
41 typedef REF<LocalVariableInfo> LOCALVARIABLEINFOREF;
43 typedef DPTR(ExceptionHandlingClause) EXCEPTIONHANDLINGCLAUSEREF;
44 typedef DPTR(MethodBody) METHODBODYREF;
45 typedef DPTR(LocalVariableInfo) LOCALVARIABLEINFOREF;
48 class ExceptionHandlingClause : Object
51 // Disallow creation and copy construction of these.
52 ExceptionHandlingClause() { }
53 ExceptionHandlingClause(ExceptionHandlingClause &r) { }
56 METHODBODYREF m_methodBody;
57 CorExceptionFlag m_flags;
60 INT32 m_handlerOffset;
61 INT32 m_handlerLength;
62 mdTypeDef m_catchToken;
66 class MethodBody : Object
69 // Disallow creation and copy construction of these.
71 MethodBody(MethodBody &r) { }
75 PTRARRAYREF m_exceptionClauses;
76 PTRARRAYREF m_localVariables;
77 OBJECTREF m_methodBase;
79 INT32 m_localVarSigToken;
81 CLR_BOOL m_initLocals;
84 class LocalVariableInfo : Object
87 // Disallow creation and copy construction of these.
88 LocalVariableInfo() { }
89 LocalVariableInfo(LocalVariableInfo &r) { }
93 REFLECTCLASSBASEREF GetType()
95 return (REFLECTCLASSBASEREF)m_type;
98 void SetType(OBJECTREF type)
100 SetObjectReference(&m_type, type, GetAppDomain());
110 static FCDECL3(FC_BOOL_RET, EqualsCaseSensitive, LPCUTF8 szLhs, LPCUTF8 szRhs, INT32 stringNumBytes);
113 BOOL QCALLTYPE EqualsCaseInsensitive(LPCUTF8 szLhs, LPCUTF8 szRhs, INT32 stringNumBytes);
116 ULONG QCALLTYPE HashCaseInsensitive(LPCUTF8 sz, INT32 stringNumBytes);
119 class RuntimeTypeHandle;
121 typedef RuntimeTypeHandle FCALLRuntimeTypeHandle;
122 #define FCALL_RTH_TO_REFLECTCLASS(x) (x).pRuntimeTypeDONOTUSEDIRECTLY
124 class RuntimeTypeHandle {
125 ReflectClassBaseObject *pRuntimeTypeDONOTUSEDIRECTLY;
128 // Static method on RuntimeTypeHandle
129 static FCDECL1(Object*, Allocate, ReflectClassBaseObject *refType) ; //A.CI work
130 static FCDECL6(Object*, CreateInstance, ReflectClassBaseObject* refThisUNSAFE,
132 CLR_BOOL securityOff,
133 CLR_BOOL *pbCanBeCached,
134 MethodDesc** pConstructor,
135 CLR_BOOL *pbNeedSecurityCheck);
137 static FCDECL2(Object*, CreateCaInstance, ReflectClassBaseObject* refCaType, ReflectMethodObject* pCtorUNSAFE);
140 void QCALLTYPE MakeByRef(EnregisteredTypeHandle pTypeHandle, QCall::ObjectHandleOnStack retType);
143 void QCALLTYPE MakePointer(EnregisteredTypeHandle pTypeHandle, QCall::ObjectHandleOnStack retType);
146 void QCALLTYPE MakeSZArray(EnregisteredTypeHandle pTypeHandle, QCall::ObjectHandleOnStack retType);
149 void QCALLTYPE MakeArray(EnregisteredTypeHandle pTypeHandle, INT32 rank, QCall::ObjectHandleOnStack retType);
151 static BOOL QCALLTYPE IsCollectible(EnregisteredTypeHandle pTypeHandle);
153 static FCDECL1(ReflectClassBaseObject*, GetRuntimeType, void *th);
155 static FCDECL1_V(ReflectClassBaseObject*, GetTypeFromHandle, FCALLRuntimeTypeHandle th);
156 static FCDECL1_V(EnregisteredTypeHandle, GetValueInternal, FCALLRuntimeTypeHandle RTH);
158 static FCDECL2(FC_BOOL_RET, TypeEQ, Object* left, Object* right);
159 static FCDECL2(FC_BOOL_RET, TypeNEQ, Object* left, Object* right);
162 #ifdef FEATURE_COMINTEROP
163 static FCDECL1(FC_BOOL_RET, IsWindowsRuntimeObjectType, ReflectClassBaseObject *rtTypeUNSAFE);
164 static FCDECL1(FC_BOOL_RET, IsTypeExportedToWindowsRuntime, ReflectClassBaseObject *rtTypeUNSAFE);
165 #endif // FEATURE_COMINTEROP
168 void QCALLTYPE PrepareMemberInfoCache(EnregisteredTypeHandle pMemberInfoCache);
171 void QCALLTYPE ConstructName(EnregisteredTypeHandle pTypeHandle, DWORD format, QCall::StringHandleOnStack retString);
174 void QCALLTYPE GetTypeByNameUsingCARules(LPCWSTR pwzClassName, QCall::ModuleHandle pModule, QCall::ObjectHandleOnStack retType);
177 void QCALLTYPE GetTypeByName(LPCWSTR pwzClassName, BOOL bThrowOnError, BOOL bIgnoreCase, BOOL bReflectionOnly,
178 QCall::StackCrawlMarkHandle pStackMark,
179 ICLRPrivBinder * pPrivHostBinder,
180 BOOL bLoadTypeFromPartialNameHack, QCall::ObjectHandleOnStack retType,
181 QCall::ObjectHandleOnStack keepAlive);
183 static FCDECL1(AssemblyBaseObject*, GetAssembly, ReflectClassBaseObject *pType);
184 static FCDECL1(ReflectClassBaseObject*, GetBaseType, ReflectClassBaseObject* pType);
185 static FCDECL1(ReflectModuleBaseObject*, GetModule, ReflectClassBaseObject* pType);
186 static FCDECL1(INT32, GetAttributes, ReflectClassBaseObject* pType);
187 static FCDECL1(INT32, GetToken, ReflectClassBaseObject* pType);
188 static FCDECL1(LPCUTF8, GetUtf8Name, ReflectClassBaseObject* pType);
189 static FCDECL1(INT32, GetArrayRank, ReflectClassBaseObject* pType);
191 static FCDECL1(ReflectMethodObject*, GetDeclaringMethod, ReflectClassBaseObject *pType);
194 void QCALLTYPE GetDefaultConstructor(EnregisteredTypeHandle pTypeHandle, QCall::ObjectHandleOnStack retMethod);
196 static FCDECL1(ReflectClassBaseObject*, GetDeclaringType, ReflectClassBaseObject* pType);
197 #ifdef FEATURE_REMOTING
198 static FCDECL1(FC_BOOL_RET, IsContextful, ReflectClassBaseObject* pType);
200 static FCDECL1(FC_BOOL_RET, IsValueType, ReflectClassBaseObject* pType);
201 static FCDECL1(FC_BOOL_RET, IsInterface, ReflectClassBaseObject* pType);
204 BOOL QCALLTYPE IsVisible(EnregisteredTypeHandle pTypeHandle);
207 BOOL QCALLTYPE IsSecurityCritical(EnregisteredTypeHandle pTypeHandle);
210 BOOL QCALLTYPE IsSecuritySafeCritical(EnregisteredTypeHandle pTypeHandle);
213 BOOL QCALLTYPE IsSecurityTransparent(EnregisteredTypeHandle pTypeHandle);
215 static FCDECL1(FC_BOOL_RET, HasProxyAttribute, ReflectClassBaseObject *pType);
216 static FCDECL2(FC_BOOL_RET, IsComObject, ReflectClassBaseObject *pType, CLR_BOOL isGenericCOM);
217 static FCDECL2(FC_BOOL_RET, CanCastTo, ReflectClassBaseObject *pType, ReflectClassBaseObject *pTarget);
218 static FCDECL2(FC_BOOL_RET, IsInstanceOfType, ReflectClassBaseObject *pType, Object *object);
220 static FCDECL6(FC_BOOL_RET, SatisfiesConstraints, PTR_ReflectClassBaseObject pGenericParameter, TypeHandle *typeContextArgs, INT32 typeContextCount, TypeHandle *methodContextArgs, INT32 methodContextCount, PTR_ReflectClassBaseObject pGenericArgument);
222 FCDECL1(FC_BOOL_RET, HasInstantiation, PTR_ReflectClassBaseObject pType);
225 FCDECL1(FC_BOOL_RET, IsGenericTypeDefinition, PTR_ReflectClassBaseObject pType);
228 FCDECL1(FC_BOOL_RET, IsGenericVariable, PTR_ReflectClassBaseObject pType);
231 FCDECL1(INT32, GetGenericVariableIndex, PTR_ReflectClassBaseObject pType);
234 FCDECL1(FC_BOOL_RET, ContainsGenericVariables, PTR_ReflectClassBaseObject pType);
237 void QCALLTYPE GetInstantiation(EnregisteredTypeHandle pTypeHandle, QCall::ObjectHandleOnStack retType, BOOL fAsRuntimeTypeArray);
240 void QCALLTYPE Instantiate(EnregisteredTypeHandle pTypeHandle, TypeHandle * pInstArray, INT32 cInstArray, QCall::ObjectHandleOnStack retType);
243 void QCALLTYPE GetGenericTypeDefinition(EnregisteredTypeHandle pTypeHandle, QCall::ObjectHandleOnStack retType);
245 static FCDECL2(FC_BOOL_RET, CompareCanonicalHandles, PTR_ReflectClassBaseObject pLeft, PTR_ReflectClassBaseObject pRight);
247 static FCDECL1(PtrArray*, GetInterfaces, ReflectClassBaseObject *pType);
250 void QCALLTYPE GetConstraints(EnregisteredTypeHandle pTypeHandle, QCall::ObjectHandleOnStack retTypes);
253 PVOID QCALLTYPE GetGCHandle(EnregisteredTypeHandle pTypeHandle, INT32 handleType);
255 static FCDECL1(INT32, GetCorElementType, PTR_ReflectClassBaseObject pType);
256 static FCDECL1(ReflectClassBaseObject*, GetElementType, ReflectClassBaseObject* pType);
258 static FCDECL2(MethodDesc*, GetMethodAt, PTR_ReflectClassBaseObject pType, INT32 slot);
259 static FCDECL1(INT32, GetNumVirtuals, ReflectClassBaseObject *pType);
262 void QCALLTYPE VerifyInterfaceIsImplemented(EnregisteredTypeHandle pTypeHandle, EnregisteredTypeHandle pIFaceHandle);
265 INT32 QCALLTYPE GetInterfaceMethodImplementationSlot(EnregisteredTypeHandle pTypeHandle, EnregisteredTypeHandle pOwner, MethodDesc * pMD);
267 static FCDECL3(FC_BOOL_RET, GetFields, ReflectClassBaseObject *pType, INT32 **result, INT32 *pCount);
269 static FCDECL1(MethodDesc *, GetFirstIntroducedMethod, ReflectClassBaseObject* pType);
270 static FCDECL1(void, GetNextIntroducedMethod, MethodDesc **ppMethod);
272 static FCDECL2(Object*, CreateInstanceForGenericType, ReflectClassBaseObject* pType
273 , ReflectClassBaseObject* parameterType );
276 FCDECL1(IMDInternalImport*, GetMetadataImport, ReflectClassBaseObject * pModuleUNSAFE);
279 class RuntimeMethodHandle {
282 static FCDECL1(ReflectMethodObject*, GetCurrentMethod, StackCrawlMark* stackMark);
284 static FCDECL4(Object*, InvokeMethod, Object *target, PTRArray *objs, SignatureNative* pSig, CLR_BOOL fConstructor);
286 struct StreamingContextData {
287 Object * additionalContext; // additionalContex was changed from OBJECTREF to Object to avoid having a
288 INT32 contextStates; // constructor in this struct. GCC doesn't allow structs with constructors to be
291 // *******************************************************************************************
292 // Keep these in sync with the version in bcl\system\runtime\serialization\streamingcontext.cs
293 // *******************************************************************************************
294 enum StreamingContextStates
296 CONTEXTSTATE_CrossProcess = 0x01,
297 CONTEXTSTATE_CrossMachine = 0x02,
298 CONTEXTSTATE_File = 0x04,
299 CONTEXTSTATE_Persistence = 0x08,
300 CONTEXTSTATE_Remoting = 0x10,
301 CONTEXTSTATE_Other = 0x20,
302 CONTEXTSTATE_Clone = 0x40,
303 CONTEXTSTATE_CrossAppDomain = 0x80,
304 CONTEXTSTATE_All = 0xFF
308 // STATIC IMPLEMENTATION
309 static OBJECTREF InvokeMethod_Internal(
310 MethodDesc *pMethod, OBJECTREF targetUNSAFE, INT32 attrs, OBJECTREF binderUNSAFE, PTRARRAYREF objsUNSAFE, OBJECTREF localeUNSAFE,
311 BOOL isBinderDefault, Assembly *caller, Assembly *reflectedClassAssembly, TypeHandle declaringType, SignatureNative* pSig, BOOL verifyAccess);
314 BOOL QCALLTYPE IsSecurityCritical(MethodDesc *pMD);
317 BOOL QCALLTYPE IsSecuritySafeCritical(MethodDesc *pMD);
320 BOOL QCALLTYPE IsSecurityTransparent(MethodDesc *pMD);
322 static FCDECL2(FC_BOOL_RET, IsTokenSecurityTransparent, ReflectModuleBaseObject *pModuleUNSAFE, INT32 tkToken);
325 BOOL QCALLTYPE IsCAVisibleFromDecoratedType(
326 EnregisteredTypeHandle targetTypeHandle,
327 MethodDesc * pTargetCtor,
328 EnregisteredTypeHandle sourceTypeHandle,
329 QCall::ModuleHandle sourceModuleHandle);
331 static FCDECL3(void, CheckLinktimeDemands, ReflectMethodObject *pMethodUNSAFE, ReflectModuleBaseObject *pModuleUNSAFE, CLR_BOOL isDecoratedTargetSecurityTransparent);
332 static FCDECL4(void, SerializationInvoke, ReflectMethodObject *pMethodUNSAFE, Object* targetUNSAFE,
333 Object* serializationInfoUNSAFE, struct StreamingContextData * pContext);
336 void QCALLTYPE ConstructInstantiation(MethodDesc * pMethod, DWORD format, QCall::StringHandleOnStack retString);
339 void * QCALLTYPE GetFunctionPointer(MethodDesc * pMethod);
341 static FCDECL1(INT32, GetAttributes, MethodDesc *pMethod);
342 static FCDECL1(INT32, GetImplAttributes, ReflectMethodObject *pMethodUNSAFE);
343 static FCDECL1(ReflectClassBaseObject*, GetDeclaringType, MethodDesc *pMethod);
344 static FCDECL1(INT32, GetSlot, MethodDesc *pMethod);
345 static FCDECL1(INT32, GetMethodDef, ReflectMethodObject *pMethodUNSAFE);
346 static FCDECL1(StringObject*, GetName, MethodDesc *pMethod);
347 static FCDECL1(LPCUTF8, GetUtf8Name, MethodDesc *pMethod);
348 static FCDECL2(FC_BOOL_RET, MatchesNameHash, MethodDesc * pMethod, ULONG hash);
351 void QCALLTYPE GetMethodInstantiation(MethodDesc * pMethod, QCall::ObjectHandleOnStack retTypes, BOOL fAsRuntimeTypeArray);
354 FCDECL1(FC_BOOL_RET, HasMethodInstantiation, MethodDesc *pMethod);
357 FCDECL1(FC_BOOL_RET, IsGenericMethodDefinition, MethodDesc *pMethod);
360 FCDECL1(FC_BOOL_RET, IsTypicalMethodDefinition, ReflectMethodObject *pMethodUNSAFE);
363 void QCALLTYPE GetTypicalMethodDefinition(MethodDesc * pMethod, QCall::ObjectHandleOnStack refMethod);
366 void QCALLTYPE StripMethodInstantiation(MethodDesc * pMethod, QCall::ObjectHandleOnStack refMethod);
368 // see comment in the cpp file
369 static FCDECL3(MethodDesc*, GetStubIfNeeded, MethodDesc *pMethod, ReflectClassBaseObject *pType, PtrArray* instArray);
370 static FCDECL2(MethodDesc*, GetMethodFromCanonical, MethodDesc *pMethod, PTR_ReflectClassBaseObject pType);
373 FCDECL1(FC_BOOL_RET, IsDynamicMethod, MethodDesc * pMethod);
376 FCDECL1(Object*, GetResolver, MethodDesc * pMethod);
379 void QCALLTYPE Destroy(MethodDesc * pMethod);
382 void QCALLTYPE GetCallerType(QCall::StackCrawlMarkHandle pStackMark, QCall::ObjectHandleOnStack retType);
384 static FCDECL2(MethodBody*, GetMethodBody, ReflectMethodObject *pMethodUNSAFE, PTR_ReflectClassBaseObject pDeclaringType);
386 static FCDECL1(FC_BOOL_RET, IsConstructor, MethodDesc *pMethod);
388 static FCDECL1(Object*, GetLoaderAllocator, MethodDesc *pMethod);
391 class RuntimeFieldHandle {
394 static FCDECL5(Object*, GetValue, ReflectFieldObject *pFieldUNSAFE, Object *instanceUNSAFE, ReflectClassBaseObject *pFieldType, ReflectClassBaseObject *pDeclaringType, CLR_BOOL *pDomainInitialized);
395 static FCDECL7(void, SetValue, ReflectFieldObject *pFieldUNSAFE, Object *targetUNSAFE, Object *valueUNSAFE, ReflectClassBaseObject *pFieldType, DWORD attr, ReflectClassBaseObject *pDeclaringType, CLR_BOOL *pDomainInitialized);
396 static FCDECL4(Object*, GetValueDirect, ReflectFieldObject *pFieldUNSAFE, ReflectClassBaseObject *pFieldType, TypedByRef *pTarget, ReflectClassBaseObject *pDeclaringType);
397 static FCDECL5(void, SetValueDirect, ReflectFieldObject *pFieldUNSAFE, ReflectClassBaseObject *pFieldType, TypedByRef *pTarget, Object *valueUNSAFE, ReflectClassBaseObject *pContextType);
398 static FCDECL1(StringObject*, GetName, ReflectFieldObject *pFieldUNSAFE);
399 static FCDECL1(LPCUTF8, GetUtf8Name, FieldDesc *pField);
400 static FCDECL2(FC_BOOL_RET, MatchesNameHash, FieldDesc * pField, ULONG hash);
402 static FCDECL1(INT32, GetAttributes, FieldDesc *pField);
403 static FCDECL1(ReflectClassBaseObject*, GetApproxDeclaringType, FieldDesc *pField);
404 static FCDECL1(INT32, GetToken, ReflectFieldObject *pFieldUNSAFE);
405 static FCDECL2(FieldDesc*, GetStaticFieldForGenericType, FieldDesc *pField, ReflectClassBaseObject *pDeclaringType);
406 static FCDECL1(FC_BOOL_RET, AcquiresContextFromThis, FieldDesc *pField);
409 BOOL QCALLTYPE IsSecurityCritical(FieldDesc *pFD);
412 BOOL QCALLTYPE IsSecuritySafeCritical(FieldDesc *pFD);
415 BOOL QCALLTYPE IsSecurityTransparent(FieldDesc *pFD);
418 void QCALLTYPE CheckAttributeAccess(FieldDesc *pFD, QCall::ModuleHandle pModule);
424 static FCDECL5(ReflectMethodObject*, GetDynamicMethod, ReflectMethodObject *pMethodUNSAFE, ReflectModuleBaseObject *pModuleUNSAFE, StringObject *name, U1Array *sig, Object *resolver);
425 static FCDECL1(INT32, GetToken, ReflectModuleBaseObject *pModuleUNSAFE);
428 void QCALLTYPE GetModuleType(QCall::ModuleHandle pModule, QCall::ObjectHandleOnStack retType);
431 FCDECL1(IMDInternalImport*, GetMetadataImport, ReflectModuleBaseObject * pModuleUNSAFE);
434 BOOL QCALLTYPE ContainsPropertyMatchingHash(QCall::ModuleHandle pModule, INT32 tkProperty, ULONG hash);
437 void QCALLTYPE ResolveType(QCall::ModuleHandle pModule, INT32 tkType, TypeHandle *typeArgs, INT32 typeArgsCount, TypeHandle *methodArgs, INT32 methodArgsCount, QCall::ObjectHandleOnStack retType);
440 MethodDesc * QCALLTYPE ResolveMethod(QCall::ModuleHandle pModule, INT32 tkMemberRef, TypeHandle *typeArgs, INT32 typeArgsCount, TypeHandle *methodArgs, INT32 methodArgsCount);
443 void QCALLTYPE ResolveField(QCall::ModuleHandle pModule, INT32 tkMemberRef, TypeHandle *typeArgs, INT32 typeArgsCount, TypeHandle *methodArgs, INT32 methodArgsCount, QCall::ObjectHandleOnStack retField);
446 void QCALLTYPE GetAssembly(QCall::ModuleHandle pModule, QCall::ObjectHandleOnStack retAssembly);
449 void QCALLTYPE GetPEKind(QCall::ModuleHandle pModule, DWORD* pdwPEKind, DWORD* pdwMachine);
452 FCDECL1(INT32, GetMDStreamVersion, ReflectModuleBaseObject * pModuleUNSAFE);
455 class AssemblyHandle {
458 static FCDECL1(ReflectModuleBaseObject*, GetManifestModule, AssemblyBaseObject *pAssemblyUNSAFE);
460 static FCDECL1(INT32, GetToken, AssemblyBaseObject *pAssemblyUNSAFE);
463 class SignatureNative;
465 typedef DPTR(SignatureNative) PTR_SignatureNative;
467 #ifdef USE_CHECKED_OBJECTREFS
468 typedef REF<SignatureNative> SIGNATURENATIVEREF;
470 typedef PTR_SignatureNative SIGNATURENATIVEREF;
473 class SignatureNative : public Object
475 friend class RuntimeMethodHandle;
476 friend class ArgIteratorForMethodInvoke;
479 static FCDECL6(void, GetSignature,
480 SignatureNative* pSignatureNative,
481 PCCOR_SIGNATURE pCorSig, DWORD cCorSig,
482 FieldDesc *pFieldDesc, ReflectMethodObject *pMethodUNSAFE,
483 ReflectClassBaseObject *pDeclaringType);
484 static FCDECL3(Object *, GetCustomModifiers, SignatureNative* pSig, INT32 parameter, CLR_BOOL fRequired);
485 static FCDECL2(FC_BOOL_RET, CompareSig, SignatureNative* pLhs, SignatureNative* pRhs);
486 static FCDECL4(FC_BOOL_RET, CompareSigForAppCompat, SignatureNative* pLhs, ReflectClassBaseObject * pTypeLhs, SignatureNative* pRhs, ReflectClassBaseObject * pTypeRhs);
489 BOOL HasThis() { LIMITED_METHOD_CONTRACT; return (m_managedCallingConvention & CALLCONV_HasThis); }
490 INT32 NumFixedArgs() { WRAPPER_NO_CONTRACT; return m_PtrArrayarguments->GetNumComponents(); }
491 TypeHandle GetReturnTypeHandle()
500 return ((REFLECTCLASSBASEREF)m_returnType)->GetType();
503 PCCOR_SIGNATURE GetCorSig() { LIMITED_METHOD_CONTRACT; return m_sig; }
504 DWORD GetCorSigSize() { LIMITED_METHOD_CONTRACT; return m_cSig; }
505 Module* GetModule() { WRAPPER_NO_CONTRACT; return GetDeclaringType().GetModule(); }
507 TypeHandle GetArgumentAt(INT32 position)
516 REFLECTCLASSBASEREF refArgument = (REFLECTCLASSBASEREF)m_PtrArrayarguments->GetAt(position);
517 return refArgument->GetType();
520 DWORD GetArgIteratorFlags()
522 LIMITED_METHOD_CONTRACT;
523 return VolatileLoad(&m_managedCallingConvention) >> CALLCONV_ArgIteratorFlags_Shift;
526 INT32 GetSizeOfArgStack()
528 LIMITED_METHOD_CONTRACT;
529 return m_nSizeOfArgStack;
532 TypeHandle GetDeclaringType()
534 LIMITED_METHOD_CONTRACT;
535 return m_declaringType->GetType();
537 MethodDesc* GetMethod()
539 LIMITED_METHOD_CONTRACT;
543 const SigTypeContext * GetTypeContext(SigTypeContext *pTypeContext)
553 _ASSERTE(m_pMethod || !GetDeclaringType().IsNull());
555 return SigTypeContext::GetOptionalTypeContext(m_pMethod, GetDeclaringType(), pTypeContext);
557 return SigTypeContext::GetOptionalTypeContext(GetDeclaringType(), pTypeContext);
561 void SetReturnType(OBJECTREF returnType)
569 SetObjectReference(&m_returnType, returnType, GetAppDomain());
572 void SetKeepAlive(OBJECTREF keepAlive)
580 SetObjectReference(&m_keepalive, keepAlive, GetAppDomain());
583 void SetDeclaringType(REFLECTCLASSBASEREF declaringType)
591 SetObjectReference((OBJECTREF*)&m_declaringType, (OBJECTREF)declaringType, GetAppDomain());
594 void SetArgumentArray(PTRARRAYREF ptrArrayarguments)
602 SetObjectReference((OBJECTREF*)&m_PtrArrayarguments, (OBJECTREF)ptrArrayarguments, GetAppDomain());
605 void SetArgument(INT32 argument, OBJECTREF argumentType)
614 m_PtrArrayarguments->SetAt(argument, argumentType);
617 void SetArgIteratorFlags(DWORD flags)
619 LIMITED_METHOD_CONTRACT;
620 return VolatileStore(&m_managedCallingConvention, (INT32)(m_managedCallingConvention | (flags << CALLCONV_ArgIteratorFlags_Shift)));
623 void SetSizeOfArgStack(INT32 nSizeOfArgStack)
625 LIMITED_METHOD_CONTRACT;
626 m_nSizeOfArgStack = nSizeOfArgStack;
629 void SetCallingConvention(INT32 mdCallingConvention)
631 LIMITED_METHOD_CONTRACT;
633 if ((mdCallingConvention & IMAGE_CEE_CS_CALLCONV_MASK) == IMAGE_CEE_CS_CALLCONV_VARARG)
634 m_managedCallingConvention = CALLCONV_VarArgs;
636 m_managedCallingConvention = CALLCONV_Standard;
638 if ((mdCallingConvention & IMAGE_CEE_CS_CALLCONV_HASTHIS) != 0)
639 m_managedCallingConvention |= CALLCONV_HasThis;
641 if ((mdCallingConvention & IMAGE_CEE_CS_CALLCONV_EXPLICITTHIS) != 0)
642 m_managedCallingConvention |= CALLCONV_ExplicitThis;
645 // Mirrored in the managed world (System.Signature)
647 // this is the layout the classloader chooses by default for the managed struct.
649 PTRARRAYREF m_PtrArrayarguments;
650 REFLECTCLASSBASEREF m_declaringType;
651 OBJECTREF m_returnType;
652 OBJECTREF m_keepalive;
653 PCCOR_SIGNATURE m_sig;
654 INT32 m_managedCallingConvention;
655 INT32 m_nSizeOfArgStack;
657 MethodDesc* m_pMethod;
660 class ReflectionPointer : public Object