#include "il2cpp-config.h" #include "il2cpp-api.h" #include "il2cpp-class-internals.h" #include "il2cpp-object-internals.h" #include "il2cpp-tabledefs.h" #include "icalls/mscorlib/System.Runtime.Remoting.Messaging/MonoMethodMessage.h" #include "vm/Exception.h" #include "vm/Atomic.h" #include "vm/Array.h" #include "vm/String.h" #include "utils/dynamic_array.h" namespace il2cpp { namespace icalls { namespace mscorlib { namespace System { namespace Runtime { namespace Remoting { namespace Messaging { void MonoMethodMessage::InitMessage(Il2CppMethodMessage *this_obj, Il2CppReflectionMethod *method, Il2CppArray *out_args) { static Il2CppClass *object_array_klass; static Il2CppClass *byte_array_klass; static Il2CppClass *string_array_klass; Il2CppString *name; Il2CppArray *arr; int i, j; unsigned char arg_type; if (!object_array_klass) { Il2CppClass *klass; klass = il2cpp_array_class_get(il2cpp_defaults.byte_class, 1); IL2CPP_ASSERT(klass); byte_array_klass = klass; klass = il2cpp_array_class_get(il2cpp_defaults.string_class, 1); IL2CPP_ASSERT(klass); string_array_klass = klass; klass = il2cpp_array_class_get(il2cpp_defaults.object_class, 1); IL2CPP_ASSERT(klass); il2cpp::vm::Atomic::ExchangePointer(&object_array_klass, klass); } IL2CPP_OBJECT_SETREF(this_obj, method, method); arr = il2cpp_array_new_specific(object_array_klass, method->method->parameters_count); IL2CPP_OBJECT_SETREF(this_obj, args, arr); arr = il2cpp_array_new_specific(byte_array_klass, method->method->parameters_count); IL2CPP_OBJECT_SETREF(this_obj, arg_types, arr); this_obj->async_result = NULL; this_obj->call_type = Il2Cpp_CallType_Sync; il2cpp::utils::dynamic_array names(method->method->parameters_count); for (int i = 0; i < method->method->parameters_count; ++i) names[i] = method->method->parameters[i].name; arr = il2cpp_array_new_specific(string_array_klass, method->method->parameters_count); IL2CPP_OBJECT_SETREF(this_obj, names, arr); for (i = 0; i < method->method->parameters_count; i++) { name = il2cpp::vm::String::New(names[i]); il2cpp_array_setref(this_obj->names, i, name); } for (i = 0, j = 0; i < method->method->parameters_count; i++) { if (method->method->parameters[i].parameter_type->byref) { if (out_args) { Il2CppObject* arg = (Il2CppObject*)il2cpp_array_get(out_args, void*, j); il2cpp_array_setref(this_obj->args, i, arg); j++; } arg_type = 2; if (!(method->method->parameters[i].parameter_type->attrs & PARAM_ATTRIBUTE_OUT)) arg_type |= 1; } else { arg_type = 1; if (method->method->parameters[i].parameter_type->attrs & PARAM_ATTRIBUTE_OUT) arg_type |= 4; } il2cpp_array_set(this_obj->arg_types, unsigned char, i, arg_type); } } } /* namespace Messaging */ } /* namespace Remoting */ } /* namespace Runtime */ } /* namespace System */ } /* namespace mscorlib */ } /* namespace icalls */ } /* namespace il2cpp */