From 82b2f46b480583150722c15fef381baa5d4c938e Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Thu, 28 Sep 2023 19:21:06 +0200 Subject: [PATCH] Post-merge tweaks for #1312 --- Source/Engine/Engine/NativeInterop.cs | 2 +- Source/Engine/Scripting/ManagedCLR/MCore.h | 2 +- Source/Engine/Scripting/Runtime/DotNet.cpp | 2 +- Source/Engine/Scripting/Runtime/Mono.cpp | 33 ++++++++++++- Source/Engine/Scripting/Runtime/None.cpp | 2 +- Source/Engine/Scripting/ScriptingObject.cpp | 53 ++------------------- Source/Engine/Scripting/ScriptingObject.h | 7 --- 7 files changed, 39 insertions(+), 62 deletions(-) diff --git a/Source/Engine/Engine/NativeInterop.cs b/Source/Engine/Engine/NativeInterop.cs index bb29a38fd..0b6aa2320 100644 --- a/Source/Engine/Engine/NativeInterop.cs +++ b/Source/Engine/Engine/NativeInterop.cs @@ -134,7 +134,7 @@ namespace FlaxEngine.Interop ref IntPtr fieldRef = ref FieldHelper.GetReferenceTypeFieldReference(unmanagedPtrFieldOffset, ref obj); fieldRef = unmanagedPtr; } - + if (idPtr != IntPtr.Zero) { ref Guid nativeId = ref Unsafe.AsRef(idPtr.ToPointer()); diff --git a/Source/Engine/Scripting/ManagedCLR/MCore.h b/Source/Engine/Scripting/ManagedCLR/MCore.h index 5a2264047..6a3f24ba8 100644 --- a/Source/Engine/Scripting/ManagedCLR/MCore.h +++ b/Source/Engine/Scripting/ManagedCLR/MCore.h @@ -196,7 +196,7 @@ public: /// struct FLAXENGINE_API ScriptingObject { - static void SetInternalValues(MObject* object, void* unmanagedPtr, const Guid* id); + static void SetInternalValues(MClass* klass, MObject* object, void* unmanagedPtr, const Guid* id); static MObject* CreateScriptingObject(MClass* klass, void* unmanagedPtr, const Guid* id); }; }; diff --git a/Source/Engine/Scripting/Runtime/DotNet.cpp b/Source/Engine/Scripting/Runtime/DotNet.cpp index 9bc4fc89d..047423994 100644 --- a/Source/Engine/Scripting/Runtime/DotNet.cpp +++ b/Source/Engine/Scripting/Runtime/DotNet.cpp @@ -1737,7 +1737,7 @@ void* GetStaticMethodPointer(const String& methodName) return fun; } -void MCore::ScriptingObject::SetInternalValues(MObject* object, void* unmanagedPtr, const Guid* id) +void MCore::ScriptingObject::SetInternalValues(MClass* klass, MObject* object, void* unmanagedPtr, const Guid* id) { static void* ScriptingObjectSetInternalValuesPtr = GetStaticMethodPointer(TEXT("ScriptingObjectSetInternalValues")); CallStaticMethod(ScriptingObjectSetInternalValuesPtr, object, unmanagedPtr, id); diff --git a/Source/Engine/Scripting/Runtime/Mono.cpp b/Source/Engine/Scripting/Runtime/Mono.cpp index 8d186c661..676453c21 100644 --- a/Source/Engine/Scripting/Runtime/Mono.cpp +++ b/Source/Engine/Scripting/Runtime/Mono.cpp @@ -2127,13 +2127,42 @@ const Array& MProperty::GetAttributes() const return _attributes; } -void MCore::ScriptingObject::SetInternalValues(MObject* object, void* unmanagedPtr, const Guid* id) +void MCore::ScriptingObject::SetInternalValues(MClass* klass, MObject* object, void* unmanagedPtr, const Guid* id) { + // Set handle to unmanaged object + const MField* monoUnmanagedPtrField = klass->GetField("__unmanagedPtr"); + if (monoUnmanagedPtrField) + { + const void* param = unmanagedPtr; + monoUnmanagedPtrField->SetValue(managedInstance, ¶m); + } + if (id != nullptr) + { + // Set object id + const MField* monoIdField = klass->GetField("__internalId"); + if (monoIdField) + { + monoIdField->SetValue(managedInstance, (void*)id); + } + } } MObject* MCore::ScriptingObject::CreateScriptingObject(MClass* klass, void* unmanagedPtr, const Guid* id) { - return nullptr; + // Ensure to have managed domain attached (this can be called from custom native thread, eg. content loader) + MCore::Thread::Attach(); + + // Allocate managed instance + MObject* managedInstance = MCore::Object::New(klass); + if (managedInstance) + { + // Set unmanaged object handle and id + MCore::ScriptingObject::SetInternalValues(klass, managedInstance, unmanagedPtr, _id); + + // Initialize managed instance (calls constructor) + MCore::Object::Init(managedInstance); + } + return managedInstance; } #endif diff --git a/Source/Engine/Scripting/Runtime/None.cpp b/Source/Engine/Scripting/Runtime/None.cpp index 073b7ca19..a25d59c59 100644 --- a/Source/Engine/Scripting/Runtime/None.cpp +++ b/Source/Engine/Scripting/Runtime/None.cpp @@ -565,7 +565,7 @@ const Array& MProperty::GetAttributes() const return _attributes; } -void MCore::ScriptingObject::SetInternalValues(MObject* object, void* unmanagedPtr, const Guid* id) +void MCore::ScriptingObject::SetInternalValues(MClass* klass, MObject* object, void* unmanagedPtr, const Guid* id) { } diff --git a/Source/Engine/Scripting/ScriptingObject.cpp b/Source/Engine/Scripting/ScriptingObject.cpp index ddd0eb07d..b6d126bca 100644 --- a/Source/Engine/Scripting/ScriptingObject.cpp +++ b/Source/Engine/Scripting/ScriptingObject.cpp @@ -181,7 +181,6 @@ ScriptingObject* ScriptingObject::ToNative(MObject* obj) if (obj) { #if USE_MONO - // TODO: cache the field offset from object and read directly from object pointer const auto ptrField = MCore::Object::GetClass(obj)->GetField(ScriptingObject_unmanagedPtr); CHECK_RETURN(ptrField, nullptr); ptrField->GetValue(obj, &ptr); @@ -279,7 +278,7 @@ bool ScriptingObject::CreateManaged() if (const auto monoClass = GetClass()) { // Reset managed to unmanaged pointer - SetInternalValues(monoClass, managedInstance, nullptr, nullptr); + MCore::ScriptingObject::SetInternalValues(monoClass, managedInstance, nullptr, nullptr); } MCore::GCHandle::Free(handle); return true; @@ -295,32 +294,6 @@ bool ScriptingObject::CreateManaged() #if USE_CSHARP -void ScriptingObject::SetInternalValues(MClass* monoClass, MObject* managedInstance, void* unmanagedPtr, const Guid* id) -{ -#if USE_MONO - // Set handle to unmanaged object - const MField* monoUnmanagedPtrField = monoClass->GetField(ScriptingObject_unmanagedPtr); - if (monoUnmanagedPtrField) - { - const void* param = unmanagedPtr; - monoUnmanagedPtrField->SetValue(managedInstance, ¶m); - } - - if (id != nullptr) - { - // Set object id - const MField* monoIdField = monoClass->GetField(ScriptingObject_id); - if (monoIdField) - { - monoIdField->SetValue(managedInstance, (void*)id); - } - } - -#else - MCore::ScriptingObject::SetInternalValues(managedInstance, unmanagedPtr, id); -#endif -} - MObject* ScriptingObject::CreateManagedInternal() { // Get class @@ -331,28 +304,11 @@ MObject* ScriptingObject::CreateManagedInternal() return nullptr; } - // Ensure to have managed domain attached (this can be called from custom native thread, eg. content loader) - MCore::Thread::Attach(); - -#if USE_MONO - // Allocate managed instance - MObject* managedInstance = MCore::Object::New(monoClass); - if (managedInstance == nullptr) - { - LOG(Warning, "Failed to create new instance of the object of type {0}", String(monoClass->GetFullName())); - } - - SetInternalValues(monoClass, managedInstance, this, &_id); - - // Initialize managed instance (calls constructor) - MCore::Object::Init(managedInstance); -#else MObject* managedInstance = MCore::ScriptingObject::CreateScriptingObject(monoClass, this, &_id); if (managedInstance == nullptr) { LOG(Warning, "Failed to create new instance of the object of type {0}", String(monoClass->GetFullName())); } -#endif return managedInstance; } @@ -370,7 +326,7 @@ void ScriptingObject::DestroyManaged() { if (const auto monoClass = GetClass()) { - SetInternalValues(monoClass, managedInstance, nullptr, nullptr); + MCore::ScriptingObject::SetInternalValues(monoClass, managedInstance, nullptr, nullptr); } } @@ -494,7 +450,7 @@ bool ManagedScriptingObject::CreateManaged() if (const auto monoClass = GetClass()) { // Reset managed to unmanaged pointer - SetInternalValues(monoClass, managedInstance, nullptr, nullptr); + MCore::ScriptingObject::SetInternalValues(monoClass, managedInstance, nullptr, nullptr); } MCore::GCHandle::Free(handle); return true; @@ -654,9 +610,8 @@ DEFINE_INTERNAL_CALL(void) ObjectInternal_ManagedInstanceCreated(MObject* manage } MClass* monoClass = obj->GetClass(); - const Guid id = obj->GetID(); - ScriptingObject::SetInternalValues(monoClass, managedInstance, obj, &id); + MCore::ScriptingObject::SetInternalValues(monoClass, managedInstance, obj, &id); // Register object if (!obj->IsRegistered()) diff --git a/Source/Engine/Scripting/ScriptingObject.h b/Source/Engine/Scripting/ScriptingObject.h index 0dfa80450..ad72a31c3 100644 --- a/Source/Engine/Scripting/ScriptingObject.h +++ b/Source/Engine/Scripting/ScriptingObject.h @@ -206,13 +206,6 @@ public: /// void UnregisterObject(); -#if USE_CSHARP - /// - /// Sets the internal values in managed object. - /// - static void SetInternalValues(MClass* monoClass, MObject* managedInstance, void* unmanagedPtr, const Guid* id); -#endif - protected: #if USE_CSHARP ///