6a183b134c46c5d10be87b9262ba3a2347878a59
[platform/upstream/coreclr.git] / src / vm / reflectioninvocation.h
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 FCDECL1(void, PrepareContractedDelegate, Object* delegateUNSAFE);
55     static FCDECL0(void, ProbeForSufficientStack);    
56     static FCDECL0(void, EnsureSufficientExecutionStack);
57     static FCDECL0(FC_BOOL_RET, TryEnsureSufficientExecutionStack);
58     static FCDECL3(void, ExecuteCodeWithGuaranteedCleanup, Object* pCodeDelegateUNSAFE, Object* pBackoutDelegateUNSAFE, Object* pUserDataUNSAFE);
59
60     // TypedReference functions, should go somewhere else
61     static FCDECL4(void, MakeTypedReference, TypedByRef * value, Object* targetUNSAFE, ArrayBase* fldsUNSAFE, ReflectClassBaseObject *pFieldType);
62     static FCDECL2(void, SetTypedReference, TypedByRef * target, Object* objUNSAFE);
63     static FCDECL1(Object*, TypedReferenceToObject, TypedByRef * value);
64 #ifdef _DEBUG
65     static FCDECL1(FC_BOOL_RET, IsAddressInStack, void * ptr);
66 #endif
67
68 #ifdef FEATURE_COMINTEROP
69     static FCDECL3(Object*, GetClassFromProgID, StringObject* classNameUNSAFE, StringObject* serverUNSAFE, CLR_BOOL bThrowOnError);
70     static FCDECL3(Object*, GetClassFromCLSID, GUID clsid, StringObject* serverUNSAFE, CLR_BOOL bThrowOnError);
71     static FCDECL8(Object*, InvokeDispMethod, ReflectClassBaseObject* refThisUNSAFE, StringObject* nameUNSAFE, INT32 invokeAttr, Object* targetUNSAFE, PTRArray* argsUNSAFE, PTRArray* byrefModifiersUNSAFE, LCID lcid, PTRArray* namedParametersUNSAFE);
72 #endif  // FEATURE_COMINTEROP
73     static FCDECL2(void, GetGUID, ReflectClassBaseObject* refThisUNSAFE, GUID * result);
74     static FCDECL2_IV(Object*, CreateEnum, ReflectClassBaseObject *pTypeUNSAFE, INT64 value);
75
76     // helper fcalls for invocation
77     static FCDECL1(DWORD, GetSpecialSecurityFlags, ReflectMethodObject *pMethodUNSAFE);
78     static FCDECL2(FC_BOOL_RET, CanValueSpecialCast, ReflectClassBaseObject *valueType, ReflectClassBaseObject *targetType);
79     static FCDECL3(Object*, AllocateValueType, ReflectClassBaseObject *targetType, Object *valueUNSAFE, CLR_BOOL fForceTypeChange);
80
81     static FCDECL4(void, PerformSecurityCheck, Object *target, MethodDesc *pMeth, ReflectClassBaseObject *pParent, DWORD dwFlags);
82     static FCDECL2(void, CheckArgs, PTRArray *objs, SignatureNative sig);
83
84     static void PrepareDelegateHelper(OBJECTREF* pDelegate, BOOL onlyContractedMethod);
85     static void CanCacheTargetAndCrackedSig(MethodDesc* pMD);
86 };
87
88 class ReflectionSerialization {
89 public:
90     static FCDECL1(Object*, GetUninitializedObject, ReflectClassBaseObject* objTypeUNSAFE);
91 };
92
93 class ReflectionEnum {
94 public:
95     static FCDECL1(Object *, InternalGetEnumUnderlyingType, ReflectClassBaseObject *target);
96     static FCDECL1(INT32, InternalGetCorElementType, Object *pRefThis);
97
98     static
99     void QCALLTYPE GetEnumValuesAndNames(EnregisteredTypeHandle pEnumType, QCall::ObjectHandleOnStack pReturnValues, QCall::ObjectHandleOnStack pReturnNames, BOOL fGetNames);
100
101     static FCDECL2_IV(Object*, InternalBoxEnum, ReflectClassBaseObject* pEnumType, INT64 value);
102     static FCDECL2(FC_BOOL_RET, InternalEquals, Object *pRefThis, Object* pRefTarget);
103     static FCDECL2(FC_BOOL_RET, InternalHasFlag, Object *pRefThis, Object* pRefFlags);
104     static FCDECL2(int, InternalCompareTo, Object *pRefThis, Object* pRefTarget);
105 };
106
107 class ReflectionBinder {
108 public:
109     static FCDECL2(FC_BOOL_RET, DBCanConvertPrimitive, ReflectClassBaseObject* vSource, ReflectClassBaseObject* vTarget);
110     static FCDECL2(FC_BOOL_RET, DBCanConvertObjectPrimitive, Object* vSourceObj, ReflectClassBaseObject* vTarget);
111
112
113 };
114
115 #endif // _REFLECTIONINVOCATION_H_