Post-merge tweaks for #1312

This commit is contained in:
Wojtek Figat
2023-09-28 19:21:06 +02:00
parent 30482f62e2
commit 82b2f46b48
7 changed files with 39 additions and 62 deletions

View File

@@ -196,7 +196,7 @@ public:
/// </summary> /// </summary>
struct FLAXENGINE_API ScriptingObject 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); static MObject* CreateScriptingObject(MClass* klass, void* unmanagedPtr, const Guid* id);
}; };
}; };

View File

@@ -1737,7 +1737,7 @@ void* GetStaticMethodPointer(const String& methodName)
return fun; 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")); static void* ScriptingObjectSetInternalValuesPtr = GetStaticMethodPointer(TEXT("ScriptingObjectSetInternalValues"));
CallStaticMethod<void, MObject*, void*, const Guid*>(ScriptingObjectSetInternalValuesPtr, object, unmanagedPtr, id); CallStaticMethod<void, MObject*, void*, const Guid*>(ScriptingObjectSetInternalValuesPtr, object, unmanagedPtr, id);

View File

@@ -2127,13 +2127,42 @@ const Array<MObject*>& MProperty::GetAttributes() const
return _attributes; 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, &param);
}
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) 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 #endif

View File

@@ -565,7 +565,7 @@ const Array<MObject*>& MProperty::GetAttributes() const
return _attributes; 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)
{ {
} }

View File

@@ -181,7 +181,6 @@ ScriptingObject* ScriptingObject::ToNative(MObject* obj)
if (obj) if (obj)
{ {
#if USE_MONO #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); const auto ptrField = MCore::Object::GetClass(obj)->GetField(ScriptingObject_unmanagedPtr);
CHECK_RETURN(ptrField, nullptr); CHECK_RETURN(ptrField, nullptr);
ptrField->GetValue(obj, &ptr); ptrField->GetValue(obj, &ptr);
@@ -279,7 +278,7 @@ bool ScriptingObject::CreateManaged()
if (const auto monoClass = GetClass()) if (const auto monoClass = GetClass())
{ {
// Reset managed to unmanaged pointer // Reset managed to unmanaged pointer
SetInternalValues(monoClass, managedInstance, nullptr, nullptr); MCore::ScriptingObject::SetInternalValues(monoClass, managedInstance, nullptr, nullptr);
} }
MCore::GCHandle::Free(handle); MCore::GCHandle::Free(handle);
return true; return true;
@@ -295,32 +294,6 @@ bool ScriptingObject::CreateManaged()
#if USE_CSHARP #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, &param);
}
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() MObject* ScriptingObject::CreateManagedInternal()
{ {
// Get class // Get class
@@ -331,28 +304,11 @@ MObject* ScriptingObject::CreateManagedInternal()
return nullptr; 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); MObject* managedInstance = MCore::ScriptingObject::CreateScriptingObject(monoClass, this, &_id);
if (managedInstance == nullptr) if (managedInstance == nullptr)
{ {
LOG(Warning, "Failed to create new instance of the object of type {0}", String(monoClass->GetFullName())); LOG(Warning, "Failed to create new instance of the object of type {0}", String(monoClass->GetFullName()));
} }
#endif
return managedInstance; return managedInstance;
} }
@@ -370,7 +326,7 @@ void ScriptingObject::DestroyManaged()
{ {
if (const auto monoClass = GetClass()) 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()) if (const auto monoClass = GetClass())
{ {
// Reset managed to unmanaged pointer // Reset managed to unmanaged pointer
SetInternalValues(monoClass, managedInstance, nullptr, nullptr); MCore::ScriptingObject::SetInternalValues(monoClass, managedInstance, nullptr, nullptr);
} }
MCore::GCHandle::Free(handle); MCore::GCHandle::Free(handle);
return true; return true;
@@ -654,9 +610,8 @@ DEFINE_INTERNAL_CALL(void) ObjectInternal_ManagedInstanceCreated(MObject* manage
} }
MClass* monoClass = obj->GetClass(); MClass* monoClass = obj->GetClass();
const Guid id = obj->GetID(); const Guid id = obj->GetID();
ScriptingObject::SetInternalValues(monoClass, managedInstance, obj, &id); MCore::ScriptingObject::SetInternalValues(monoClass, managedInstance, obj, &id);
// Register object // Register object
if (!obj->IsRegistered()) if (!obj->IsRegistered())

View File

@@ -206,13 +206,6 @@ public:
/// </summary> /// </summary>
void UnregisterObject(); void UnregisterObject();
#if USE_CSHARP
/// <summary>
/// Sets the internal values in managed object.
/// </summary>
static void SetInternalValues(MClass* monoClass, MObject* managedInstance, void* unmanagedPtr, const Guid* id);
#endif
protected: protected:
#if USE_CSHARP #if USE_CSHARP
/// <summary> /// <summary>