#include "il2cpp-config.h"
|
#include "RuntimeFieldHandle.h"
|
#include "icalls/mscorlib/System.Reflection/MonoField.h"
|
#include "vm/Exception.h"
|
#include "vm/Field.h"
|
#include "vm/Object.h"
|
#include "vm/Type.h"
|
|
namespace il2cpp
|
{
|
namespace icalls
|
{
|
namespace mscorlib
|
{
|
namespace System
|
{
|
void RuntimeFieldHandle::SetValueDirect(Il2CppReflectionField* field, Il2CppObject* fieldType, Il2CppTypedRef* typedRef, Il2CppObject* value, Il2CppObject* contextType)
|
{
|
IL2CPP_ASSERT(field);
|
IL2CPP_ASSERT(typedRef);
|
IL2CPP_ASSERT(value);
|
|
FieldInfo* f = field->field;
|
if (!vm::Type::IsStruct(&f->parent->byval_arg))
|
{
|
std::string errorMessage = "The type ";
|
errorMessage += vm::Type::GetName(&f->parent->byval_arg, IL2CPP_TYPE_NAME_FORMAT_FULL_NAME);
|
errorMessage += " is not struct";
|
vm::Exception::Raise(vm::Exception::GetNotSupportedException(errorMessage.c_str()));
|
return;
|
}
|
|
if (vm::Type::IsReference(f->type))
|
vm::Field::SetValueRaw(f->type, (uint8_t*)typedRef->value + f->offset - sizeof(Il2CppObject), value, false);
|
else
|
vm::Field::SetValueRaw(f->type, (uint8_t*)typedRef->value + f->offset - sizeof(Il2CppObject), vm::Object::Unbox(value), false);
|
}
|
|
void RuntimeFieldHandle::SetValueInternal(Il2CppReflectionField* fi, Il2CppObject* obj, Il2CppObject* value)
|
{
|
// In mono's icall-def.h file, this maps to the same icall as MonoField.SetValueInternal
|
// so our implementation will do the same
|
Reflection::MonoField::SetValueInternal(fi, obj, value);
|
}
|
} // namespace System
|
} // namespace mscorlib
|
} // namespace icalls
|
} // namespace il2cpp
|