1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
|
#ifndef _SCRIPTINGTYPES_H_
#define _SCRIPTINGTYPES_H_
#if ENABLE_MONO
struct MonoObject;
struct MonoString;
struct MonoArray;
struct MonoType;
struct MonoClass;
struct MonoException;
struct MonoMethod;
struct MonoClassField;
typedef MonoObject ScriptingObject;
typedef MonoString ScriptingString;
typedef MonoArray ScriptingArray;
typedef MonoClass ScriptingType;
typedef MonoClass ScriptingClass;
typedef MonoException ScriptingException;
typedef MonoClassField ScriptingField;
struct ScriptingMethod;
typedef MonoMethod* BackendNativeMethod;
typedef MonoClass* BackendNativeType;
#elif UNITY_FLASH
struct ScriptingObject;
struct ScriptingString;
struct ScriptingArray;
struct ScriptingClass;
typedef ScriptingClass ScriptingType;
struct ScriptingException;
struct ScriptingMethod;
struct ScriptingField;
struct MonoImage;
//hack to not have to change everything in one go.
struct MonoMethod;
struct MonoObject;
typedef ScriptingType MonoClass;
typedef void* BackendNativeType;
typedef void* BackendNativeMethod;
#elif UNITY_WINRT && ENABLE_SCRIPTING
struct WinRTNullPtrImplementation
{
inline operator long long()
{
return -1;
}
inline operator decltype(__nullptr)()
{
return nullptr;
}
};
// Implemented in WinRTUtility.cpp
class WinRTScriptingObjectWrapper
{
public:
// Must be in sync with WinRTBridge\GCHandledObjects.cs, would be nice to somehow get those values directly...
static const int kMaxHandlesShift = 11;
static const int kMaxHandlesPerBlock = 1 << kMaxHandlesShift;
static const int kHandleMask = kMaxHandlesPerBlock - 1;
public:
WinRTScriptingObjectWrapper();
WinRTScriptingObjectWrapper(decltype(__nullptr));
WinRTScriptingObjectWrapper(long long handleId);
WinRTScriptingObjectWrapper(const WinRTNullPtrImplementation& interopParam);
WinRTScriptingObjectWrapper(const WinRTScriptingObjectWrapper& handleId);
~WinRTScriptingObjectWrapper();
const WinRTScriptingObjectWrapper &operator = (const WinRTScriptingObjectWrapper &ptr);
WinRTScriptingObjectWrapper& operator=(decltype(__nullptr));
WinRTScriptingObjectWrapper& operator=(const WinRTNullPtrImplementation& nullptrimpl);
inline operator bool () const
{
return m_Handle != -1;
}
inline operator long long() const
{
return m_Handle;
}
int GetReferenceCount() const;
// Converters
bool ToBool();
inline long long GetHandle() const { return m_Handle;}
inline int GetBlockId() const {return m_BlockId; }
inline int GetHandleInBlock() const { return m_HandleInBlock; }
void Validate();
static void FreeHandles();
static void ClearCache();
static void ValidateCache();
private:
friend bool operator == (const WinRTScriptingObjectWrapper& a, decltype(__nullptr));
friend bool operator != (const WinRTScriptingObjectWrapper& a, decltype(__nullptr));
friend bool operator == (const WinRTScriptingObjectWrapper& a, const WinRTNullPtrImplementation& b);
friend bool operator != (const WinRTScriptingObjectWrapper& a, const WinRTNullPtrImplementation& b);
static int* GetPtrToReferences(int blockId);
void Init(long long handleId);
void InternalAddRef();
void InternalRelease();
long long m_Handle;
int m_BlockId;
int m_HandleInBlock;
int* m_PtrToReferences;
static const int kMaxCachedPtrToReferences = 4096;
static int* m_CachedPtrToReferences[kMaxCachedPtrToReferences];
static int m_CachedBlockCount;
};
bool operator == (const WinRTScriptingObjectWrapper& a, decltype(__nullptr));
bool operator != (const WinRTScriptingObjectWrapper& a, decltype(__nullptr));
bool operator == (const WinRTScriptingObjectWrapper& a, const WinRTNullPtrImplementation& b);
bool operator != (const WinRTScriptingObjectWrapper& a, const WinRTNullPtrImplementation& b);
// Don't implement this, as same objects can have different handle ids, so currently there's no way of effectively comparing them
//bool operator == (const WinRTScriptingObjectWrapper& a, const WinRTScriptingObjectWrapper& b);
struct ScriptingObject;
struct ScriptingString;
typedef Platform::Object ScriptingArray;
//struct ScriptingArray;
struct ScriptingType;
typedef ScriptingType ScriptingClass;
struct ScriptingException;
typedef int BackendNativeMethod;
typedef BridgeInterface::IScriptingClassWrapper^ BackendNativeType;
struct ScriptingMethod;
struct ScriptingField;
struct MonoImage;
//hack to not have to change everything in one go.
struct MonoMethod;
struct MonoObject;
typedef ScriptingType MonoClass;
#else
struct ScriptingObject;
struct ScriptingString;
struct ScriptingException;
struct ScriptingMethod;
struct ScriptingField;
struct ScriptingString;
struct ScriptingClass;
struct ScriptingType;
struct ScriptingArray;
struct ScriptingString;
struct MonoMethod;
struct MonoObject;
struct MonoClass;
typedef void* BackendNativeType;
typedef void* BackendNativeMethod;
#endif
#if UNITY_WINRT && ENABLE_SCRIPTING
typedef WinRTScriptingObjectWrapper ScriptingObjectPtr;
typedef Platform::Object^ ScriptingStringPtr;
typedef WinRTScriptingObjectWrapper ScriptingArrayPtr;
typedef WinRTScriptingObjectWrapper ScriptingPinnedArrayPtr;
typedef WinRTScriptingObjectWrapper const ScriptingArrayConstPtr;
typedef WinRTScriptingObjectWrapper ScriptingPinnedArrayConstPtr;
typedef ScriptingType* ScriptingTypePtr;
typedef ScriptingClass* ScriptingClassPtr;
typedef ScriptingException* ScriptingExceptionPtr;
typedef ScriptingMethod* ScriptingMethodPtr;
typedef ScriptingField* ScriptingFieldPtr;
//typedef Platform::Array<Platform::Object^> ScriptingParams;
//typedef ScriptingParams^ ScriptingParamsPtr;
typedef long long ScriptingParams;
typedef long long* ScriptingParamsPtr;
#define ScriptingBool bool
#define SCRIPTING_NULL WinRTNullPtrImplementation()
#define ScriptingObjectComPtr(Type) Microsoft::WRL::ComPtr<IInspectable>
#define ScriptingObjectToComPtr(Object) reinterpret_cast<IInspectable*>(Object)
#define ScriptingComPtrToObject(Type, Object) reinterpret_cast<Type>((Object).Get())
#else
typedef ScriptingObject* ScriptingObjectPtr;
typedef ScriptingString* ScriptingStringPtr;
typedef ScriptingArray* ScriptingArrayPtr;
typedef ScriptingType* ScriptingTypePtr;
typedef ScriptingClass* ScriptingClassPtr;
typedef ScriptingException* ScriptingExceptionPtr;
typedef ScriptingMethod* ScriptingMethodPtr;
typedef ScriptingField* ScriptingFieldPtr;
typedef void* ScriptingParams;
typedef ScriptingParams* ScriptingParamsPtr;
#define ScriptingBool short
#define SCRIPTING_NULL NULL
#define ScriptingObjectComPtr(Type) Type
#define ScriptingObjectToComPtr(Object) Object
#define ScriptingComPtrToObject(Type, Object) Object
#endif
#endif
|