MCPcopy Create free account
hub / github.com/FlaxEngine/FlaxEngine / ManagedObjectSpawn

Method ManagedObjectSpawn

Source/Engine/Scripting/BinaryModule.cpp:780–826  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

778}
779
780ScriptingObject* ManagedBinaryModule::ManagedObjectSpawn(const ScriptingObjectSpawnParams& params)
781{
782 PROFILE_MEM(ScriptingCSharp);
783
784 // Create native object
785 ScriptingTypeHandle managedTypeHandle = params.Type;
786 const ScriptingType* managedTypePtr = &managedTypeHandle.GetType();
787 if (managedTypePtr->ManagedClass && managedTypePtr->ManagedClass->IsAbstract())
788 {
789 LOG(Error, "Failed to spawn abstract type '{}'", managedTypePtr->ToString());
790 return nullptr;
791 }
792 while (managedTypePtr->Script.Spawn != &ManagedObjectSpawn)
793 {
794 managedTypeHandle = managedTypePtr->GetBaseType();
795 managedTypePtr = &managedTypeHandle.GetType();
796 }
797 ScriptingType& managedType = (ScriptingType&)*managedTypePtr;
798 ScriptingTypeHandle nativeTypeHandle = managedType.GetBaseType();
799 const ScriptingType* nativeTypePtr = &nativeTypeHandle.GetType();
800 while (nativeTypePtr->Script.Spawn == &ManagedObjectSpawn)
801 {
802 nativeTypeHandle = nativeTypePtr->GetBaseType();
803 nativeTypePtr = &nativeTypeHandle.GetType();
804 }
805 ScriptingObject* object = nativeTypePtr->Script.Spawn(params);
806 if (!object)
807 {
808 LOG(Error, "Failed to spawn object of type {0} with native base type {1}.", managedTypePtr->ToString(), nativeTypePtr->ToString());
809 return nullptr;
810 }
811
812 // Beware! Hacking vtables incoming! Undefined behaviors exploits! Low-level programming!
813 managedType.HackObjectVTable(object, nativeTypeHandle, 0);
814
815 // Mark as managed type
816 object->Flags |= ObjectFlags::IsManagedType;
817
818 // Initialize managed instance (ScriptingObject ctor copies managed object handle)
819 if (!params.Managed)
820 {
821 // Invoke managed ctor (to match C++ logic)
822 object->CreateManaged();
823 }
824
825 return object;
826}
827
828#if !COMPILE_WITHOUT_CSHARP
829

Callers

nothing calls this directly

Calls 5

HackObjectVTableMethod · 0.80
GetTypeMethod · 0.45
ToStringMethod · 0.45
SpawnMethod · 0.45
CreateManagedMethod · 0.45

Tested by

no test coverage detected