| 778 | } |
| 779 | |
| 780 | ScriptingObject* 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 |
nothing calls this directly
no test coverage detected