summaryrefslogtreecommitdiff
path: root/Runtime/Scripting/Backend/ScriptingTypes.h
diff options
context:
space:
mode:
Diffstat (limited to 'Runtime/Scripting/Backend/ScriptingTypes.h')
-rw-r--r--Runtime/Scripting/Backend/ScriptingTypes.h202
1 files changed, 202 insertions, 0 deletions
diff --git a/Runtime/Scripting/Backend/ScriptingTypes.h b/Runtime/Scripting/Backend/ScriptingTypes.h
new file mode 100644
index 0000000..45911b0
--- /dev/null
+++ b/Runtime/Scripting/Backend/ScriptingTypes.h
@@ -0,0 +1,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