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 | |
6 | // |
7 | |
8 | #ifndef _REFLECTIONINVOCATION_H_ |
9 | #define _REFLECTIONINVOCATION_H_ |
10 | |
11 | #include "object.h" |
12 | #include "fcall.h" |
13 | #include "field.h" |
14 | #include "stackwalktypes.h" |
15 | #include "runtimehandles.h" |
16 | #include "invokeutil.h" |
17 | |
18 | // NOTE: The following constants are defined in BindingFlags.cs |
19 | #define BINDER_IgnoreCase 0x01 |
20 | #define BINDER_DeclaredOnly 0x02 |
21 | #define BINDER_Instance 0x04 |
22 | #define BINDER_Static 0x08 |
23 | #define BINDER_Public 0x10 |
24 | #define BINDER_NonPublic 0x20 |
25 | #define BINDER_FlattenHierarchy 0x40 |
26 | |
27 | #define BINDER_InvokeMethod 0x00100 |
28 | #define BINDER_CreateInstance 0x00200 |
29 | #define BINDER_GetField 0x00400 |
30 | #define BINDER_SetField 0x00800 |
31 | #define BINDER_GetProperty 0x01000 |
32 | #define BINDER_SetProperty 0x02000 |
33 | #define BINDER_PutDispProperty 0x04000 |
34 | #define BINDER_PutRefDispProperty 0x08000 |
35 | |
36 | #define BINDER_ExactBinding 0x010000 |
37 | #define BINDER_SuppressChangeType 0x020000 |
38 | #define BINDER_OptionalParamBinding 0x040000 |
39 | |
40 | #define BINDER_IgnoreReturn 0x1000000 |
41 | #define BINDER_DoNotWrapExceptions 0x2000000 |
42 | |
43 | #define BINDER_DefaultLookup (BINDER_Instance | BINDER_Static | BINDER_Public) |
44 | #define BINDER_AllLookup (BINDER_Instance | BINDER_Static | BINDER_Public | BINDER_Instance) |
45 | |
46 | class ReflectionInvocation { |
47 | |
48 | public: |
49 | static |
50 | void QCALLTYPE CompileMethod(MethodDesc * pMD); |
51 | |
52 | static FCDECL1(void, RunClassConstructor, ReflectClassBaseObject *pTypeUNSAFE); |
53 | static FCDECL1(void, RunModuleConstructor, ReflectModuleBaseObject *pModuleUNSAFE); |
54 | static FCDECL3(void, PrepareMethod, ReflectMethodObject* pMethodUNSAFE, TypeHandle *pInstantiation, UINT32 cInstantiation); |
55 | static FCDECL1(void, PrepareDelegate, Object* delegateUNSAFE); |
56 | static FCDECL1(void, PrepareContractedDelegate, Object* delegateUNSAFE); |
57 | static FCDECL0(void, ProbeForSufficientStack); |
58 | static FCDECL0(void, EnsureSufficientExecutionStack); |
59 | static FCDECL0(FC_BOOL_RET, TryEnsureSufficientExecutionStack); |
60 | static FCDECL3(void, ExecuteCodeWithGuaranteedCleanup, Object* pCodeDelegateUNSAFE, Object* pBackoutDelegateUNSAFE, Object* pUserDataUNSAFE); |
61 | |
62 | // TypedReference functions, should go somewhere else |
63 | static FCDECL4(void, MakeTypedReference, TypedByRef * value, Object* targetUNSAFE, ArrayBase* fldsUNSAFE, ReflectClassBaseObject *pFieldType); |
64 | static FCDECL2(void, SetTypedReference, TypedByRef * target, Object* objUNSAFE); |
65 | static FCDECL1(Object*, TypedReferenceToObject, TypedByRef * value); |
66 | |
67 | #ifdef FEATURE_COMINTEROP |
68 | static FCDECL3(Object*, GetClassFromProgID, StringObject* classNameUNSAFE, StringObject* serverUNSAFE, CLR_BOOL bThrowOnError); |
69 | static FCDECL3(Object*, GetClassFromCLSID, GUID clsid, StringObject* serverUNSAFE, CLR_BOOL bThrowOnError); |
70 | static FCDECL8(Object*, InvokeDispMethod, ReflectClassBaseObject* refThisUNSAFE, StringObject* nameUNSAFE, INT32 invokeAttr, Object* targetUNSAFE, PTRArray* argsUNSAFE, PTRArray* byrefModifiersUNSAFE, LCID lcid, PTRArray* namedParametersUNSAFE); |
71 | #endif // FEATURE_COMINTEROP |
72 | static FCDECL2(void, GetGUID, ReflectClassBaseObject* refThisUNSAFE, GUID * result); |
73 | static FCDECL2_IV(Object*, CreateEnum, ReflectClassBaseObject *pTypeUNSAFE, INT64 value); |
74 | |
75 | // helper fcalls for invocation |
76 | static FCDECL2(FC_BOOL_RET, CanValueSpecialCast, ReflectClassBaseObject *valueType, ReflectClassBaseObject *targetType); |
77 | static FCDECL3(Object*, AllocateValueType, ReflectClassBaseObject *targetType, Object *valueUNSAFE, CLR_BOOL fForceTypeChange); |
78 | |
79 | static FCDECL4(void, PerformSecurityCheck, Object *target, MethodDesc *pMeth, ReflectClassBaseObject *pParent, DWORD dwFlags); |
80 | static FCDECL2(void, CheckArgs, PTRArray *objs, SignatureNative sig); |
81 | |
82 | static void PrepareDelegateHelper(OBJECTREF* pDelegate, BOOL onlyContractedMethod); |
83 | static void CanCacheTargetAndCrackedSig(MethodDesc* pMD); |
84 | }; |
85 | |
86 | class ReflectionSerialization { |
87 | public: |
88 | static FCDECL1(Object*, GetUninitializedObject, ReflectClassBaseObject* objTypeUNSAFE); |
89 | }; |
90 | |
91 | class ReflectionEnum { |
92 | public: |
93 | static FCDECL1(Object *, InternalGetEnumUnderlyingType, ReflectClassBaseObject *target); |
94 | static FCDECL1(INT32, InternalGetCorElementType, Object *pRefThis); |
95 | |
96 | static |
97 | void QCALLTYPE GetEnumValuesAndNames(EnregisteredTypeHandle pEnumType, QCall::ObjectHandleOnStack pReturnValues, QCall::ObjectHandleOnStack pReturnNames, BOOL fGetNames); |
98 | |
99 | static FCDECL2_IV(Object*, InternalBoxEnum, ReflectClassBaseObject* pEnumType, INT64 value); |
100 | static FCDECL2(FC_BOOL_RET, InternalEquals, Object *pRefThis, Object* pRefTarget); |
101 | static FCDECL2(FC_BOOL_RET, InternalHasFlag, Object *pRefThis, Object* pRefFlags); |
102 | static FCDECL2(int, InternalCompareTo, Object *pRefThis, Object* pRefTarget); |
103 | }; |
104 | |
105 | class ReflectionBinder { |
106 | public: |
107 | static FCDECL2(FC_BOOL_RET, DBCanConvertPrimitive, ReflectClassBaseObject* vSource, ReflectClassBaseObject* vTarget); |
108 | static FCDECL2(FC_BOOL_RET, DBCanConvertObjectPrimitive, Object* vSourceObj, ReflectClassBaseObject* vTarget); |
109 | |
110 | |
111 | }; |
112 | |
113 | #endif // _REFLECTIONINVOCATION_H_ |
114 | |