From ba8f7c5ab4f0bac81797d2d32c03a347cb84bea3 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Wed, 29 Sep 2021 16:33:25 +0200 Subject: [PATCH] Add improvements for native interfaces usage --- Source/Engine/Content/JsonAsset.cpp | 6 +++--- Source/Engine/Scripting/BinaryModule.cpp | 6 ++---- Source/Engine/Scripting/ScriptingType.h | 4 ++-- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/Source/Engine/Content/JsonAsset.cpp b/Source/Engine/Content/JsonAsset.cpp index 5015d61d9..b39fc95f7 100644 --- a/Source/Engine/Content/JsonAsset.cpp +++ b/Source/Engine/Content/JsonAsset.cpp @@ -212,8 +212,8 @@ Asset::LoadResult JsonAsset::loadAsset() case ScriptingTypes::Class: { // Ensure that object can deserialized - const ScriptingType::InterfaceImplementation* interfaces = type.GetInterface(&ISerializable::TypeInitializer); - if (!interfaces) + const ScriptingType::InterfaceImplementation* interface = type.GetInterface(ISerializable::TypeInitializer); + if (!interface) { LOG(Warning, "Cannot deserialize {0} from Json Asset because it doesn't implement ISerializable interface.", type.ToString()); break; @@ -231,7 +231,7 @@ Asset::LoadResult JsonAsset::loadAsset() // Deserialize object auto modifier = Cache::ISerializeModifier.Get(); modifier->EngineBuild = DataEngineBuild; - ((ISerializable*)((byte*)instance + interfaces->VTableOffset))->Deserialize(*Data, modifier.Value); + ((ISerializable*)((byte*)instance + interface->VTableOffset))->Deserialize(*Data, modifier.Value); // TODO: delete object when containing BinaryModule gets unloaded break; } diff --git a/Source/Engine/Scripting/BinaryModule.cpp b/Source/Engine/Scripting/BinaryModule.cpp index d0b971aab..61633ae9a 100644 --- a/Source/Engine/Scripting/BinaryModule.cpp +++ b/Source/Engine/Scripting/BinaryModule.cpp @@ -309,14 +309,14 @@ ScriptingObject* ScriptingType::GetDefaultInstance() const return Script.DefaultInstance; } -const ScriptingType::InterfaceImplementation* ScriptingType::GetInterface(const ScriptingTypeInitializer* interfaceType) const +const ScriptingType::InterfaceImplementation* ScriptingType::GetInterface(const ScriptingTypeHandle& interfaceType) const { const InterfaceImplementation* interfaces = Interfaces; if (interfaces) { while (interfaces->InterfaceType) { - if (interfaces->InterfaceType == interfaceType) + if (*interfaces->InterfaceType == interfaceType) return interfaces; interfaces++; } @@ -639,8 +639,6 @@ void ManagedBinaryModule::OnLoaded(MAssembly* assembly) for (int32 typeIndex = 0; typeIndex < Types.Count(); typeIndex++) { ScriptingType& type = Types[typeIndex]; - if (type.Type == ScriptingTypes::Interface) - continue; // TODO: generate C# class for interfaces in API ASSERT(type.ManagedClass == nullptr); // Cache class diff --git a/Source/Engine/Scripting/ScriptingType.h b/Source/Engine/Scripting/ScriptingType.h index 1658d2231..855e7f234 100644 --- a/Source/Engine/Scripting/ScriptingType.h +++ b/Source/Engine/Scripting/ScriptingType.h @@ -121,7 +121,7 @@ struct FLAXENGINE_API ScriptingType struct InterfaceImplementation { // Pointer to the type of the implemented interface. - const ScriptingTypeInitializer* InterfaceType; + const ScriptingTypeHandle* InterfaceType; // The offset (in bytes) from the object pointer to the interface implementation. Used for casting object to the interface. int16 VTableOffset; @@ -290,7 +290,7 @@ struct FLAXENGINE_API ScriptingType /// /// Gets the pointer to the implementation of the given interface type for this scripting type (including base types). Returns null if given interface is not implemented. /// - const InterfaceImplementation* GetInterface(const ScriptingTypeInitializer* interfaceType) const; + const InterfaceImplementation* GetInterface(const ScriptingTypeHandle& interfaceType) const; String ToString() const; };