Fix using managed arrays with Variant in dotnet7
This commit is contained in:
@@ -1200,9 +1200,10 @@ bool ManagedBinaryModule::InvokeMethod(void* method, const Variant& instance, Sp
|
||||
{
|
||||
// Box instance into C# object
|
||||
MObject* instanceObject = MUtils::BoxVariant(instance);
|
||||
const MClass* instanceObjectClass = MCore::Object::GetClass(instanceObject);
|
||||
|
||||
// Validate instance
|
||||
if (!instanceObject || !MCore::Object::GetClass(instanceObject)->IsSubClassOf(mMethod->GetParentClass(), withInterfaces))
|
||||
if (!instanceObject || !instanceObjectClass->IsSubClassOf(mMethod->GetParentClass(), withInterfaces))
|
||||
{
|
||||
if (!instanceObject)
|
||||
LOG(Error, "Failed to call method '{0}.{1}' (args count: {2}) without object instance", String(mMethod->GetParentClass()->GetFullName()), String(mMethod->GetName()), parametersCount);
|
||||
@@ -1212,7 +1213,7 @@ bool ManagedBinaryModule::InvokeMethod(void* method, const Variant& instance, Sp
|
||||
}
|
||||
|
||||
// For value-types instance is the actual boxed object data, not te object itself
|
||||
mInstance = MCore::Object::GetClass(instanceObject)->IsValueType() ? MCore::Object::Unbox(instanceObject) : instanceObject;
|
||||
mInstance = instanceObjectClass->IsValueType() ? MCore::Object::Unbox(instanceObject) : instanceObject;
|
||||
}
|
||||
|
||||
// Marshal parameters
|
||||
|
||||
@@ -389,7 +389,8 @@ Variant MUtils::UnboxVariant(MObject* value)
|
||||
case MTypes::Array:
|
||||
{
|
||||
void* ptr = MCore::Array::GetAddress((MArray*)value);
|
||||
if (klass->GetElementClass() == MCore::TypeCache::Byte)
|
||||
MClass* elementClass = klass->GetElementClass();
|
||||
if (elementClass == MCore::TypeCache::Byte)
|
||||
{
|
||||
Variant v;
|
||||
v.SetBlob(ptr, MCore::Array::GetLength((MArray*)value));
|
||||
@@ -401,7 +402,6 @@ Variant MUtils::UnboxVariant(MObject* value)
|
||||
auto& array = v.AsArray();
|
||||
array.Resize(MCore::Array::GetLength((MArray*)value));
|
||||
const StringAnsiView elementTypename(*fullname, fullname.Length() - 2);
|
||||
MClass* elementClass = klass->GetElementClass();
|
||||
const int32 elementSize = elementClass->GetInstanceSize();
|
||||
if (elementClass->IsEnum())
|
||||
{
|
||||
|
||||
@@ -374,8 +374,9 @@ MArray* MCore::Array::New(const MClass* elementKlass, int32 length)
|
||||
|
||||
MClass* MCore::Array::GetClass(MClass* elementKlass)
|
||||
{
|
||||
MISSING_CODE("TODO: MCore::Array::GetClass"); // TODO: MCore::Object::GetClass
|
||||
return nullptr;
|
||||
static void* GetArrayLengthPtr = GetStaticMethodPointer(TEXT("GetArrayTypeFromElementType"));
|
||||
void* classHandle = CallStaticMethod<void*, void*>(GetArrayLengthPtr, elementKlass->_handle);
|
||||
return GetOrCreateClass((void*)classHandle);
|
||||
}
|
||||
|
||||
int32 MCore::Array::GetLength(const MArray* obj)
|
||||
@@ -806,9 +807,8 @@ uint32 MClass::GetInstanceSize() const
|
||||
{
|
||||
if (_size != 0)
|
||||
return _size;
|
||||
uint32 align;
|
||||
static void* NativeSizeOfPtr = GetStaticMethodPointer(TEXT("NativeSizeOf"));
|
||||
_size = CallStaticMethod<int, void*, uint32*>(NativeSizeOfPtr, _handle, &align);
|
||||
_size = CallStaticMethod<int, void*>(NativeSizeOfPtr, _handle);
|
||||
return _size;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user