[runtime] MonoError-ize mono_array_new
authorAleksey Kliger <aleksey@xamarin.com>
Thu, 7 Apr 2016 23:25:53 +0000 (19:25 -0400)
committerAleksey Kliger <aleksey@xamarin.com>
Tue, 19 Apr 2016 22:07:21 +0000 (18:07 -0400)
Mark it external only.

Runtime should use mono_array_new_checked.
The icall is ves_icall_array_new.

21 files changed:
mono/metadata/appdomain.c
mono/metadata/attach.c
mono/metadata/console-unix.c
mono/metadata/file-io.c
mono/metadata/icall-def.h
mono/metadata/icall.c
mono/metadata/locales.c
mono/metadata/mono-perfcounters.c
mono/metadata/mono-security.c
mono/metadata/object-internals.h
mono/metadata/object.c
mono/metadata/object.h
mono/metadata/process.c
mono/metadata/reflection.c
mono/metadata/socket-io.c
mono/metadata/threads.c
mono/mini/decompose.c
mono/mini/driver.c
mono/mini/method-to-ir.c
mono/mini/mini-exceptions.c
mono/mini/mini-runtime.c

index 0d8e577c9d4400e57a7b020d18b11bfc20f7b500..3c52aa7da3ac9004b9fed79f168516418514a163 100644 (file)
@@ -989,7 +989,9 @@ ves_icall_System_AppDomain_GetAssemblies (MonoAppDomain *ad, MonoBoolean refonly
        }
        mono_domain_assemblies_unlock (domain);
 
-       res = mono_array_new (domain, mono_class_get_assembly_class (), assemblies->len);
+       res = mono_array_new_checked (domain, mono_class_get_assembly_class (), assemblies->len, &error);
+       if (!is_ok (&error))
+               goto leave;
        for (i = 0; i < assemblies->len; ++i) {
                ass = (MonoAssembly *)g_ptr_array_index (assemblies, i);
                MonoReflectionAssembly *ass_obj = mono_assembly_get_object_checked (domain, ass, &error);
@@ -2206,8 +2208,10 @@ ves_icall_System_AppDomain_ExecuteAssembly (MonoAppDomain *ad,
        if (!method)
                g_error ("No entry point method found in %s due to %s", image->name, mono_error_get_message (&error));
 
-       if (!args)
-               args = (MonoArray *) mono_array_new (ad->data, mono_defaults.string_class, 0);
+       if (!args) {
+               args = (MonoArray *) mono_array_new_checked (ad->data, mono_defaults.string_class, 0, &error);
+               mono_error_assert_ok (&error);
+       }
 
        return mono_runtime_exec_main (method, (MonoArray *)args, NULL);
 }
index 301492e8e5aea29adc140c77aa9fe0b66077ced5..5e1605fd972295a21362b31a4be27f3d4f7d61a7 100644 (file)
@@ -302,13 +302,20 @@ mono_attach_load_agent (MonoDomain *domain, char *agent, char *args, MonoObject
                return 1;
        }
        
+       
+       main_args = (MonoArray*)mono_array_new_checked (domain, mono_defaults.string_class, (args == NULL) ? 0 : 1, &error);
+       if (main_args == NULL) {
+               g_print ("Could not allocate main method args due to %s\n", mono_error_get_message (&error));
+               mono_error_cleanup (&error);
+               g_free (agent);
+               return 1;
+       }
+
        if (args) {
-               main_args = (MonoArray*)mono_array_new (domain, mono_defaults.string_class, 1);
                mono_array_set (main_args, MonoString*, 0, mono_string_new (domain, args));
-       } else {
-               main_args = (MonoArray*)mono_array_new (domain, mono_defaults.string_class, 0);
        }
 
+
        pa [0] = main_args;
        mono_runtime_try_invoke (method, NULL, pa, exc, &error);
        if (!is_ok (&error)) {
index 5c46a85a9419339be30cb6df72122ac618d40ecc..29ce37fc141bc4b8a92049e55590f10c7eef16b4 100644 (file)
@@ -445,6 +445,8 @@ set_control_chars (MonoArray *control_chars, const guchar *cc)
 MonoBoolean
 ves_icall_System_ConsoleDriver_TtySetup (MonoString *keypad, MonoString *teardown, MonoArray **control_chars, int **size)
 {
+       MonoError error;
+
        int dims;
 
        dims = terminal_get_dimensions ();
@@ -470,7 +472,10 @@ ves_icall_System_ConsoleDriver_TtySetup (MonoString *keypad, MonoString *teardow
 
        /* 17 is the number of entries set in set_control_chars() above.
         * NCCS is the total size, but, by now, we only care about those 17 values*/
-       mono_gc_wbarrier_generic_store (control_chars, (MonoObject*) mono_array_new (mono_domain_get (), mono_defaults.byte_class, 17));
+       MonoArray *control_chars_arr = mono_array_new_checked (mono_domain_get (), mono_defaults.byte_class, 17, &error);
+       if (mono_error_set_pending_exception (&error))
+               return FALSE;
+       mono_gc_wbarrier_generic_store (control_chars, (MonoObject*) control_chars_arr);
        if (tcgetattr (STDIN_FILENO, &initial_attr) == -1)
                return FALSE;
 
index a713e4e39f8e262080bcdaf0edfde8de0e6ada42..c10b1fee8d934b8249c8ca70b32497e0c5a174dc 100644 (file)
@@ -394,31 +394,38 @@ MonoArray *
 ves_icall_System_IO_MonoIO_GetFileSystemEntries (MonoString *path,
                                                 MonoString *path_with_pattern,
                                                 gint attrs, gint mask,
-                                                gint32 *error)
+                                                gint32 *ioerror)
 {
+       MonoError error;
        MonoDomain *domain = mono_domain_get ();
        MonoArray *result;
        int i;
        GPtrArray *names;
        
-       *error = ERROR_SUCCESS;
+       *ioerror = ERROR_SUCCESS;
 
        MONO_PREPARE_BLOCKING;
-       names = get_filesystem_entries (mono_string_chars (path), mono_string_chars (path_with_pattern), attrs, mask, error);
+       names = get_filesystem_entries (mono_string_chars (path), mono_string_chars (path_with_pattern), attrs, mask, ioerror);
        MONO_FINISH_BLOCKING;
 
        if (!names) {
                // If there's no array and no error, then return an empty array.
-               if (*error == ERROR_SUCCESS)
-                       return mono_array_new (domain, mono_defaults.string_class, 0);
+               if (*ioerror == ERROR_SUCCESS) {
+                       MonoArray *arr = mono_array_new_checked (domain, mono_defaults.string_class, 0, &error);
+                       mono_error_set_pending_exception (&error);
+                       return arr;
+               }
                return NULL;
        }
 
-       result = mono_array_new (domain, mono_defaults.string_class, names->len);
+       result = mono_array_new_checked (domain, mono_defaults.string_class, names->len, &error);
+       if (mono_error_set_pending_exception (&error))
+               goto leave;
        for (i = 0; i < names->len; i++) {
                mono_array_setref (result, i, mono_string_new (domain, (const char *)g_ptr_array_index (names, i)));
                g_free (g_ptr_array_index (names, i));
        }
+leave:
        g_ptr_array_free (names, TRUE);
        return result;
 }
@@ -1168,13 +1175,16 @@ invalid_path_chars [] = {
 MonoArray *
 ves_icall_System_IO_MonoIO_get_InvalidPathChars ()
 {
+       MonoError error;
        MonoArray *chars;
        MonoDomain *domain;
        int i, n;
 
        domain = mono_domain_get ();
        n = sizeof (invalid_path_chars) / sizeof (gunichar2);
-       chars = mono_array_new (domain, mono_defaults.char_class, n);
+       chars = mono_array_new_checked (domain, mono_defaults.char_class, n, &error);
+       if (mono_error_set_pending_exception (&error))
+               return NULL;
 
        for (i = 0; i < n; ++ i)
                mono_array_set (chars, gunichar2, i, invalid_path_chars [i]);
index 62c90886f1701b396147d7bdbb8994bff9f37904..9c345a269cde4a0e5a36d7b234a9450695c4a004 100644 (file)
@@ -224,7 +224,7 @@ ICALL(ENUM_7, "get_value", ves_icall_System_Enum_get_value)
 
 ICALL_TYPE(ENV, "System.Environment", ENV_1)
 ICALL(ENV_1, "Exit", ves_icall_System_Environment_Exit)
-ICALL(ENV_2, "GetCommandLineArgs", mono_runtime_get_main_args)
+ICALL(ENV_2, "GetCommandLineArgs", ves_icall_System_Environment_GetCoomandLineArgs)
 ICALL(ENV_3, "GetEnvironmentVariableNames", ves_icall_System_Environment_GetEnvironmentVariableNames)
 ICALL(ENV_31, "GetIs64BitOperatingSystem", ves_icall_System_Environment_GetIs64BitOperatingSystem)
 ICALL(ENV_4, "GetLogicalDrivesInternal", ves_icall_System_Environment_GetLogicalDrives )
index 3f08f45358c38e19310aa04256662f0ec6da2eb8..b134243ca3d939d77df5bcea4535da3e3fe54668 100644 (file)
@@ -1060,7 +1060,10 @@ ves_icall_System_ValueType_InternalGetHashCode (MonoObject *this_obj, MonoArray
 
        if (values) {
                int i;
-               mono_gc_wbarrier_generic_store (fields, (MonoObject*) mono_array_new (mono_domain_get (), mono_defaults.object_class, count));
+               MonoArray *fields_arr = mono_array_new_checked (mono_domain_get (), mono_defaults.object_class, count, &error);
+               if (mono_error_set_pending_exception (&error))
+                       return 0;
+               mono_gc_wbarrier_generic_store (fields, (MonoObject*) fields_arr);
                for (i = 0; i < count; ++i)
                        mono_array_setref (*fields, i, values [i]);
        } else {
@@ -1179,7 +1182,10 @@ ves_icall_System_ValueType_Equals (MonoObject *this_obj, MonoObject *that, MonoA
 
        if (values) {
                int i;
-               mono_gc_wbarrier_generic_store (fields, (MonoObject*) mono_array_new (mono_domain_get (), mono_defaults.object_class, count));
+               MonoArray *fields_arr = mono_array_new_checked (mono_domain_get (), mono_defaults.object_class, count, &error);
+               if (mono_error_set_pending_exception (&error))
+                       return FALSE;
+               mono_gc_wbarrier_generic_store (fields, (MonoObject*) fields_arr);
                for (i = 0; i < count; ++i)
                        mono_array_setref_fast (*fields, i, values [i]);
                return FALSE;
@@ -2312,7 +2318,10 @@ ves_icall_MonoEventInfo_get_event_info (MonoReflectionMonoEvent *event, MonoEven
                int i, n = 0;
                while (event->event->other [n])
                        n++;
-               MONO_STRUCT_SETREF (info, other_methods, mono_array_new (domain, mono_defaults.method_info_class, n));
+               MonoArray *info_arr = mono_array_new_checked (domain, mono_defaults.method_info_class, n, &error);
+               if (mono_error_set_pending_exception (&error))
+                       return;
+               MONO_STRUCT_SETREF (info, other_methods, info_arr);
 
                for (i = 0; i < n; i++) {
                        rm = mono_method_get_object_checked (domain, event->event->other [i], NULL, &error);
@@ -2465,8 +2474,14 @@ ves_icall_Type_GetInterfaceMapData (MonoReflectionType *type, MonoReflectionType
 
        len = mono_class_num_methods (iclass);
        domain = mono_object_domain (type);
-       mono_gc_wbarrier_generic_store (targets, (MonoObject*) mono_array_new (domain, mono_defaults.method_info_class, len));
-       mono_gc_wbarrier_generic_store (methods, (MonoObject*) mono_array_new (domain, mono_defaults.method_info_class, len));
+       MonoArray *targets_arr = mono_array_new_checked (domain, mono_defaults.method_info_class, len, &error);
+       if (mono_error_set_pending_exception (&error))
+               return;
+       mono_gc_wbarrier_generic_store (targets, (MonoObject*) targets_arr);
+       MonoArray *methods_arr = mono_array_new_checked (domain, mono_defaults.method_info_class, len, &error);
+       if (mono_error_set_pending_exception (&error))
+               return;
+       mono_gc_wbarrier_generic_store (methods, (MonoObject*) methods_arr);
        iter = NULL;
        while ((method = mono_class_get_methods (iclass, &iter))) {
                member = mono_method_get_object_checked (domain, method, iclass, &error);
@@ -2694,11 +2709,9 @@ ves_icall_RuntimeTypeHandle_GetArrayRank (MonoReflectionType *type)
 }
 
 static MonoArray*
-create_type_array (MonoDomain *domain, MonoBoolean runtimeTypeArray, int count)
+create_type_array (MonoDomain *domain, MonoBoolean runtimeTypeArray, int count, MonoError *error)
 {
-       MonoArray *res;
-       res = mono_array_new (domain, runtimeTypeArray ? mono_defaults.runtimetype_class : mono_defaults.systemtype_class, count);
-       return res;
+       return mono_array_new_checked (domain, runtimeTypeArray ? mono_defaults.runtimetype_class : mono_defaults.systemtype_class, count, error);
 }
 
 ICALL_EXPORT MonoArray*
@@ -2715,7 +2728,9 @@ ves_icall_MonoType_GetGenericArguments (MonoReflectionType *type, MonoBoolean ru
 
        if (klass->generic_container) {
                MonoGenericContainer *container = klass->generic_container;
-               res = create_type_array (domain, runtimeTypeArray, container->type_argc);
+               res = create_type_array (domain, runtimeTypeArray, container->type_argc, &error);
+               if (mono_error_set_pending_exception (&error))
+                       return NULL;
                for (i = 0; i < container->type_argc; ++i) {
                        pklass = mono_class_from_generic_parameter_internal (mono_generic_container_get_param (container, i));
 
@@ -2727,7 +2742,9 @@ ves_icall_MonoType_GetGenericArguments (MonoReflectionType *type, MonoBoolean ru
                }
        } else if (klass->generic_class) {
                MonoGenericInst *inst = klass->generic_class->context.class_inst;
-               res = create_type_array (domain, runtimeTypeArray, inst->type_argc);
+               res = create_type_array (domain, runtimeTypeArray, inst->type_argc, &error);
+               if (mono_error_set_pending_exception (&error))
+                       return NULL;
                for (i = 0; i < inst->type_argc; ++i) {
                        rt = mono_type_get_object_checked (domain, inst->type_argv [i], &error);
                        if (mono_error_set_pending_exception (&error))
@@ -2884,7 +2901,9 @@ ves_icall_Type_GetGenericParameterConstraints (MonoReflectionType *type)
        for (count = 0, ptr = param_info->constraints; ptr && *ptr; ptr++, count++)
                ;
 
-       res = mono_array_new (domain, mono_defaults.monotype_class, count);
+       res = mono_array_new_checked (domain, mono_defaults.monotype_class, count, &error);
+       if (mono_error_set_pending_exception (&error))
+               return NULL;
        for (i = 0; i < count; i++) {
                rt = mono_type_get_object_checked (domain, &param_info->constraints [i]->byval_arg, &error);
                if (mono_error_set_pending_exception (&error))
@@ -3109,7 +3128,9 @@ ves_icall_MonoMethod_GetGenericArguments (MonoReflectionMethod *method)
 
                if (inst) {
                        count = inst->type_argc;
-                       res = mono_array_new (domain, mono_defaults.systemtype_class, count);
+                       res = mono_array_new_checked (domain, mono_defaults.systemtype_class, count, &error);
+                       if (mono_error_set_pending_exception (&error))
+                               return NULL;
 
                        for (i = 0; i < count; i++) {
                                rt = mono_type_get_object_checked (domain, inst->type_argv [i], &error);
@@ -3124,7 +3145,9 @@ ves_icall_MonoMethod_GetGenericArguments (MonoReflectionMethod *method)
        }
 
        count = mono_method_signature (method->method)->generic_param_count;
-       res = mono_array_new (domain, mono_defaults.systemtype_class, count);
+       res = mono_array_new_checked (domain, mono_defaults.systemtype_class, count, &error);
+       if (mono_error_set_pending_exception (&error))
+               return NULL;
 
        for (i = 0; i < count; i++) {
                MonoGenericContainer *container = mono_method_get_generic_container (method->method);
@@ -3316,18 +3339,20 @@ ves_icall_InternalExecute (MonoReflectionMethod *method, MonoObject *this_arg, M
                        do {
                                MonoClassField* field = mono_class_get_field_from_name (k, str);
                                if (field) {
+                                       g_free (str);
                                        MonoClass *field_klass =  mono_class_from_mono_type (field->type);
                                        if (field_klass->valuetype) {
                                                result = mono_value_box_checked (domain, field_klass, (char *)this_arg + field->offset, &error);
-                                               mono_error_set_pending_exception (&error);
-                                               /* fallthru to cleanup */
+                                               if (mono_error_set_pending_exception (&error))
+                                                       return NULL;
                                        } else 
                                                result = (MonoObject *)*((gpointer *)((char *)this_arg + field->offset));
                                
-                                       out_args = mono_array_new (domain, mono_defaults.object_class, 1);
+                                       out_args = mono_array_new_checked (domain, mono_defaults.object_class, 1, &error);
+                                       if (mono_error_set_pending_exception (&error))
+                                               return NULL;
                                        mono_gc_wbarrier_generic_store (outArgs, (MonoObject*) out_args);
                                        mono_array_setref (out_args, 0, result);
-                                       g_free (str);
                                        return NULL;
                                }
                                k = k->parent;
@@ -3357,6 +3382,7 @@ ves_icall_InternalExecute (MonoReflectionMethod *method, MonoObject *this_arg, M
                        do {
                                MonoClassField* field = mono_class_get_field_from_name (k, str);
                                if (field) {
+                                       g_free (str);
                                        MonoClass *field_klass =  mono_class_from_mono_type (field->type);
                                        MonoObject *val = (MonoObject *)mono_array_get (params, gpointer, 2);
 
@@ -3368,10 +3394,11 @@ ves_icall_InternalExecute (MonoReflectionMethod *method, MonoObject *this_arg, M
                                                mono_gc_wbarrier_set_field (this_arg, (char*)this_arg + field->offset, val);
                                        }
                                
-                                       out_args = mono_array_new (domain, mono_defaults.object_class, 0);
+                                       out_args = mono_array_new_checked (domain, mono_defaults.object_class, 0, &error);
+                                       if (mono_error_set_pending_exception (&error))
+                                               return NULL;
                                        mono_gc_wbarrier_generic_store (outArgs, (MonoObject*) out_args);
 
-                                       g_free (str);
                                        return NULL;
                                }
                                
@@ -3389,8 +3416,10 @@ ves_icall_InternalExecute (MonoReflectionMethod *method, MonoObject *this_arg, M
                        outarg_count++;
        }
 
-       out_args = mono_array_new (domain, mono_defaults.object_class, outarg_count);
-       
+       out_args = mono_array_new_checked (domain, mono_defaults.object_class, outarg_count, &error);
+       if (mono_error_set_pending_exception (&error))
+               return NULL;
+
        /* handle constructors only for objects already allocated */
        if (!strcmp (method->method->name, ".ctor"))
                g_assert (this_arg);
@@ -3677,8 +3706,12 @@ ves_icall_System_Enum_GetEnumValuesAndNames (MonoReflectionType *type, MonoArray
        base_type = mono_class_enum_basetype (enumc)->type;
 
        nvalues = mono_class_num_fields (enumc) ? mono_class_num_fields (enumc) - 1 : 0;
-       *names = mono_array_new (domain, mono_defaults.string_class, nvalues);
-       *values = mono_array_new (domain, mono_defaults.uint64_class, nvalues);
+       *names = mono_array_new_checked (domain, mono_defaults.string_class, nvalues, &error);
+       if (mono_error_set_pending_exception (&error))
+               return FALSE;
+       *values = mono_array_new_checked (domain, mono_defaults.uint64_class, nvalues, &error);
+       if (mono_error_set_pending_exception (&error))
+               return FALSE;
 
        iter = NULL;
        while ((field = mono_class_get_fields (enumc, &iter))) {
@@ -3744,8 +3777,11 @@ ves_icall_Type_GetFields_internal (MonoReflectionType *type, MonoString *name, g
        MonoPtrArray tmp_array;
 
        domain = ((MonoObject *)type)->vtable->domain;
-       if (type->type->byref)
-               return mono_array_new (domain, mono_defaults.field_info_class, 0);
+       if (type->type->byref) {
+               MonoArray *result = mono_array_new_checked (domain, mono_defaults.field_info_class, 0, &error);
+               mono_error_set_pending_exception (&error);
+               return result;
+       }
 
        klass = startklass = mono_class_from_mono_type (type->type);
        refklass = mono_class_from_mono_type (reftype->type);
@@ -4429,8 +4465,11 @@ ves_icall_Type_GetNestedTypes (MonoReflectionType *type, MonoString *name, guint
        mono_error_init (&error);
 
        domain = ((MonoObject *)type)->vtable->domain;
-       if (type->type->byref)
-               return mono_array_new (domain, mono_defaults.monotype_class, 0);
+       if (type->type->byref) {
+               MonoArray *result = mono_array_new_checked (domain, mono_defaults.monotype_class, 0, &error);
+               mono_error_set_pending_exception (&error);
+               return result;
+       }
        klass = mono_class_from_mono_type (type->type);
 
        /*
@@ -4790,8 +4829,11 @@ ves_icall_System_Reflection_Assembly_GetManifestModuleInternal (MonoReflectionAs
 ICALL_EXPORT MonoArray*
 ves_icall_System_Reflection_Assembly_GetManifestResourceNames (MonoReflectionAssembly *assembly) 
 {
+       MonoError error;
        MonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_MANIFESTRESOURCE];
-       MonoArray *result = mono_array_new (mono_object_domain (assembly), mono_defaults.string_class, table->rows);
+       MonoArray *result = mono_array_new_checked (mono_object_domain (assembly), mono_defaults.string_class, table->rows, &error);
+       if (mono_error_set_pending_exception (&error))
+               return NULL;
        int i;
        const char *val;
 
@@ -4847,7 +4889,10 @@ ves_icall_System_Reflection_Assembly_GetReferencedAssemblies (MonoReflectionAsse
        t = &assembly->assembly->image->tables [MONO_TABLE_ASSEMBLYREF];
        count = t->rows;
 
-       result = mono_array_new (domain, mono_class_get_assembly_name_class (), count);
+       result = mono_array_new_checked (domain, mono_class_get_assembly_name_class (), count, &error);
+       if (mono_error_set_pending_exception (&error))
+               return NULL;
+
 
        if (count > 0 && !create_culture) {
                MonoMethodDesc *desc = mono_method_desc_new (
@@ -4905,14 +4950,26 @@ ves_icall_System_Reflection_Assembly_GetReferencedAssemblies (MonoReflectionAsse
                        if ((cols [MONO_ASSEMBLYREF_FLAGS] & ASSEMBLYREF_FULL_PUBLIC_KEY_FLAG)) {
                                /* public key token isn't copied - the class library will 
                                automatically generate it from the public key if required */
-                               MONO_OBJECT_SETREF (aname, publicKey, mono_array_new (domain, mono_defaults.byte_class, pkey_len));
-                               memcpy (mono_array_addr (aname->publicKey, guint8, 0), pkey_ptr, pkey_len);
+                               MonoArray *pkey = mono_array_new_checked (domain, mono_defaults.byte_class, pkey_len, &error);
+                               if (mono_error_set_pending_exception (&error))
+                                       return NULL;
+
+                               MONO_OBJECT_SETREF (aname, publicKey, pkey);
+                               memcpy (mono_array_addr (pkey, guint8, 0), pkey_ptr, pkey_len);
                        } else {
-                               MONO_OBJECT_SETREF (aname, keyToken, mono_array_new (domain, mono_defaults.byte_class, pkey_len));
-                               memcpy (mono_array_addr (aname->keyToken, guint8, 0), pkey_ptr, pkey_len);
+                               MonoArray *keyToken = mono_array_new_checked (domain, mono_defaults.byte_class, pkey_len, &error);
+                               if (mono_error_set_pending_exception (&error))
+                                       return NULL;
+
+                               MONO_OBJECT_SETREF (aname, keyToken, keyToken);
+                               memcpy (mono_array_addr (keyToken, guint8, 0), pkey_ptr, pkey_len);
                        }
                } else {
-                       MONO_OBJECT_SETREF (aname, keyToken, mono_array_new (domain, mono_defaults.byte_class, 0));
+                       MonoArray *keyToken = mono_array_new_checked (domain, mono_defaults.byte_class, 0, &error);
+                       if (mono_error_set_pending_exception (&error))
+                               return NULL;
+
+                       MONO_OBJECT_SETREF (aname, keyToken, keyToken);
                }
                
                /* note: this function doesn't return the codebase on purpose (i.e. it can
@@ -5061,6 +5118,7 @@ ves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal (MonoReflec
 ICALL_EXPORT MonoObject*
 ves_icall_System_Reflection_Assembly_GetFilesInternal (MonoReflectionAssembly *assembly, MonoString *name, MonoBoolean resource_modules) 
 {
+       MonoError error;
        MonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_FILE];
        MonoArray *result = NULL;
        int i, count;
@@ -5091,7 +5149,10 @@ ves_icall_System_Reflection_Assembly_GetFilesInternal (MonoReflectionAssembly *a
                        count ++;
        }
 
-       result = mono_array_new (mono_object_domain (assembly), mono_defaults.string_class, count);
+       result = mono_array_new_checked (mono_object_domain (assembly), mono_defaults.string_class, count, &error);
+       if (mono_error_set_pending_exception (&error))
+               return NULL;
+
 
        count = 0;
        for (i = 0; i < table->rows; ++i) {
@@ -5135,7 +5196,9 @@ ves_icall_System_Reflection_Assembly_GetModulesInternal (MonoReflectionAssembly
                        real_module_count ++;
 
        klass = mono_class_get_module_class ();
-       res = mono_array_new (domain, klass, 1 + real_module_count + file_count);
+       res = mono_array_new_checked (domain, klass, 1 + real_module_count + file_count, &error);
+       if (mono_error_set_pending_exception (&error))
+               return NULL;
 
        MonoReflectionModule *image_obj = mono_module_get_object_checked (domain, image, &error);
        if (mono_error_set_pending_exception (&error))
@@ -5463,11 +5526,15 @@ fill_reflection_assembly_name (MonoDomain *domain, MonoReflectionAssemblyName *a
                pkey_ptr = (char*)name->public_key;
                pkey_len = mono_metadata_decode_blob_size (pkey_ptr, &pkey_ptr);
 
-               MONO_OBJECT_SETREF (aname, publicKey, mono_array_new (domain, mono_defaults.byte_class, pkey_len));
+               MonoArray *pkey = mono_array_new_checked (domain, mono_defaults.byte_class, pkey_len, error);
+               return_if_nok (error);
+               MONO_OBJECT_SETREF (aname, publicKey, pkey);
                memcpy (mono_array_addr (aname->publicKey, guint8, 0), pkey_ptr, pkey_len);
                aname->flags |= ASSEMBLYREF_FULL_PUBLIC_KEY_FLAG;
        } else if (default_publickey) {
-               MONO_OBJECT_SETREF (aname, publicKey, mono_array_new (domain, mono_defaults.byte_class, 0));
+               MonoArray *pkey = mono_array_new_checked (domain, mono_defaults.byte_class, 0, error);
+               return_if_nok (error);
+               MONO_OBJECT_SETREF (aname, publicKey, pkey);
                aname->flags |= ASSEMBLYREF_FULL_PUBLIC_KEY_FLAG;
        }
 
@@ -5476,8 +5543,11 @@ fill_reflection_assembly_name (MonoDomain *domain, MonoReflectionAssemblyName *a
                int i, j;
                char *p;
 
-               MONO_OBJECT_SETREF (aname, keyToken, mono_array_new (domain, mono_defaults.byte_class, 8));
-               p = mono_array_addr (aname->keyToken, char, 0);
+               MonoArray *keyToken = mono_array_new_checked (domain, mono_defaults.byte_class, 8, error);
+               return_if_nok (error);
+               
+               MONO_OBJECT_SETREF (aname, keyToken, keyToken);
+               p = mono_array_addr (keyToken, char, 0);
 
                for (i = 0, j = 0; i < 8; i++) {
                        *p = g_ascii_xdigit_value (name->public_key_token [j++]) << 4;
@@ -5485,7 +5555,9 @@ fill_reflection_assembly_name (MonoDomain *domain, MonoReflectionAssemblyName *a
                        p++;
                }
        } else if (default_token) {
-               MONO_OBJECT_SETREF (aname, keyToken, mono_array_new (domain, mono_defaults.byte_class, 0));
+               MonoArray *keyToken = mono_array_new_checked (domain, mono_defaults.byte_class, 0, error);
+               return_if_nok (error);
+               MONO_OBJECT_SETREF (aname, keyToken, keyToken);
        }
 }
 
@@ -5635,8 +5707,10 @@ mono_module_get_types (MonoDomain *domain, MonoImage *image, MonoArray **excepti
        } else {
                count = tdef->rows - 1;
        }
-       res = mono_array_new (domain, mono_defaults.monotype_class, count);
-       *exceptions = mono_array_new (domain, mono_defaults.exception_class, count);
+       res = mono_array_new_checked (domain, mono_defaults.monotype_class, count, error);
+       return_val_if_nok (error, NULL);
+       *exceptions = mono_array_new_checked (domain, mono_defaults.exception_class, count, error);
+       return_val_if_nok (error, NULL);
        count = 0;
        for (i = 1; i < tdef->rows; ++i) {
                if (!exportedOnly || mono_module_type_is_visible (tdef, image, i + 1)) {
@@ -5700,12 +5774,16 @@ ves_icall_System_Reflection_Assembly_GetTypes (MonoReflectionAssembly *assembly,
                                        len1 = mono_array_length (res);
                                        len2 = mono_array_length (res2);
 
-                                       res3 = mono_array_new (domain, mono_defaults.monotype_class, len1 + len2);
+                                       res3 = mono_array_new_checked (domain, mono_defaults.monotype_class, len1 + len2, &error);
+                                       if (mono_error_set_pending_exception (&error))
+                                               return NULL;
                                        mono_array_memcpy_refs (res3, 0, res, 0, len1);
                                        mono_array_memcpy_refs (res3, len1, res2, 0, len2);
                                        res = res3;
 
-                                       ex3 = mono_array_new (domain, mono_defaults.monotype_class, len1 + len2);
+                                       ex3 = mono_array_new_checked (domain, mono_defaults.monotype_class, len1 + len2, &error);
+                                       if (mono_error_set_pending_exception (&error))
+                                               return NULL;
                                        mono_array_memcpy_refs (ex3, 0, exceptions, 0, len1);
                                        mono_array_memcpy_refs (ex3, len1, ex2, 0, len2);
                                        exceptions = ex3;
@@ -5745,7 +5823,11 @@ ves_icall_System_Reflection_Assembly_GetTypes (MonoReflectionAssembly *assembly,
                MonoArray *exl = NULL;
                int j, length = g_list_length (list) + ex_count;
 
-               exl = mono_array_new (domain, mono_defaults.exception_class, length);
+               exl = mono_array_new_checked (domain, mono_defaults.exception_class, length, &error);
+               if (mono_error_set_pending_exception (&error)) {
+                       g_list_free (list);
+                       return NULL;
+               }
                /* Types for which mono_class_get_checked () succeeded */
                for (i = 0, tmp = list; tmp; i++, tmp = tmp->next) {
                        MonoException *exc = mono_class_get_exception_for_failure ((MonoClass *)tmp->data);
@@ -5886,9 +5968,11 @@ ves_icall_System_Reflection_Module_InternalGetTypes (MonoReflectionModule *modul
        MonoArray *exceptions;
        int i;
 
-       if (!module->image)
-               return mono_array_new (mono_object_domain (module), mono_defaults.monotype_class, 0);
-       else {
+       if (!module->image) {
+               MonoArray *arr = mono_array_new_checked (mono_object_domain (module), mono_defaults.monotype_class, 0, &error);
+               mono_error_set_pending_exception (&error);
+               return arr;
+       } else {
                MonoArray *res;
 
                res = mono_module_get_types (mono_object_domain (module), module->image, &exceptions, FALSE, &error);
@@ -6205,8 +6289,9 @@ ves_icall_System_Reflection_Module_ResolveMemberToken (MonoImage *image, guint32
 }
 
 ICALL_EXPORT MonoArray*
-ves_icall_System_Reflection_Module_ResolveSignature (MonoImage *image, guint32 token, MonoResolveTokenError *error)
+ves_icall_System_Reflection_Module_ResolveSignature (MonoImage *image, guint32 token, MonoResolveTokenError *resolve_error)
 {
+       MonoError error;
        int table = mono_metadata_token_table (token);
        int idx = mono_metadata_token_index (token);
        MonoTableInfo *tables = image->tables;
@@ -6214,7 +6299,7 @@ ves_icall_System_Reflection_Module_ResolveSignature (MonoImage *image, guint32 t
        const char *ptr;
        MonoArray *res;
 
-       *error = ResolveTokenError_OutOfRange;
+       *resolve_error = ResolveTokenError_OutOfRange;
 
        /* FIXME: Support other tables ? */
        if (table != MONO_TABLE_STANDALONESIG)
@@ -6231,7 +6316,9 @@ ves_icall_System_Reflection_Module_ResolveSignature (MonoImage *image, guint32 t
        ptr = mono_metadata_blob_heap (image, sig);
        len = mono_metadata_decode_blob_size (ptr, &ptr);
 
-       res = mono_array_new (mono_domain_get (), mono_defaults.byte_class, len);
+       res = mono_array_new_checked (mono_domain_get (), mono_defaults.byte_class, len, &error);
+       if (mono_error_set_pending_exception (&error))
+               return NULL;
        memcpy (mono_array_addr (res, guint8, 0), ptr, len);
        return res;
 }
@@ -6782,10 +6869,20 @@ char **environ;
 #endif
 #endif
 
+ICALL_EXPORT MonoArray *
+ves_icall_System_Environment_GetCoomandLineArgs (void)
+{
+       MonoError error;
+       MonoArray *result = mono_runtime_get_main_args_checked (&error);
+       mono_error_set_pending_exception (&error);
+       return result;
+}
+
 ICALL_EXPORT MonoArray *
 ves_icall_System_Environment_GetEnvironmentVariableNames (void)
 {
 #ifdef HOST_WIN32
+       MonoError error;
        MonoArray *names;
        MonoDomain *domain;
        MonoString *str;
@@ -6809,7 +6906,9 @@ ves_icall_System_Environment_GetEnvironmentVariableNames (void)
        }
 
        domain = mono_domain_get ();
-       names = mono_array_new (domain, mono_defaults.string_class, n);
+       names = mono_array_new_checked (domain, mono_defaults.string_class, n, &error);
+       if (mono_error_set_pending_exception (&error))
+               return NULL;
 
        if (env_strings) {
                n = 0;
@@ -6838,6 +6937,7 @@ ves_icall_System_Environment_GetEnvironmentVariableNames (void)
        return names;
 
 #else
+       MonoError error;
        MonoArray *names;
        MonoDomain *domain;
        MonoString *str;
@@ -6849,7 +6949,9 @@ ves_icall_System_Environment_GetEnvironmentVariableNames (void)
                ++ n;
 
        domain = mono_domain_get ();
-       names = mono_array_new (domain, mono_defaults.string_class, n);
+       names = mono_array_new_checked (domain, mono_defaults.string_class, n, &error);
+       if (mono_error_set_pending_exception (&error))
+               return NULL;
 
        n = 0;
        for (e = environ; *e != 0; ++ e) {
@@ -7012,7 +7114,10 @@ ves_icall_System_Environment_GetLogicalDrives (void)
        } while (*dname);
 
        dname = ptr;
-       result = mono_array_new (domain, mono_defaults.string_class, ndrives);
+       result = mono_array_new_checked (domain, mono_defaults.string_class, ndrives, &error);
+       if (mono_error_set_pending_exception (&error))
+               goto leave;
+
        ndrives = 0;
        do {
                len = 0;
@@ -7020,12 +7125,13 @@ ves_icall_System_Environment_GetLogicalDrives (void)
                while (*u16) { u16++; len ++; }
                drivestr = mono_string_new_utf16_checked (domain, dname, len, &error);
                if (mono_error_set_pending_exception (&error))
-                       return NULL;
+                       goto leave;
 
                mono_array_setref (result, ndrives++, drivestr);
                while (*dname++);
        } while (*dname);
 
+leave:
        if (ptr != buf)
                g_free (ptr);
 
@@ -7278,7 +7384,9 @@ ves_icall_System_Runtime_Activation_ActivationServices_AllocateUninitializedClas
 
        if (klass->rank >= 1) {
                g_assert (klass->rank == 1);
-               return (MonoObject *) mono_array_new (domain, klass->element_class, 0);
+               ret = (MonoObject *) mono_array_new_checked (domain, klass->element_class, 0, &error);
+               mono_error_set_pending_exception (&error);
+               return ret;
        } else {
                MonoVTable *vtable = mono_class_vtable_full (domain, klass, &error);
                if (!is_ok (&error)) {
@@ -7907,7 +8015,8 @@ type_array_from_modifiers (MonoImage *image, MonoType *type, int optional, MonoE
        }
        if (!count)
                return NULL;
-       res = mono_array_new (mono_domain_get (), mono_defaults.systemtype_class, count);
+       res = mono_array_new_checked (mono_domain_get (), mono_defaults.systemtype_class, count, error);
+       return_val_if_nok (error, NULL);
        count = 0;
        for (i = 0; i < type->num_mods; ++i) {
                if ((optional && !type->modifiers [i].required) || (!optional && type->modifiers [i].required)) {
index 2adadc6ed6ea52e638f47b2e74e0a03fabf3ae3f..a3744a57f2b049d17a5ad4a8d3a13139677228c2 100644 (file)
@@ -601,7 +601,9 @@ ves_icall_System_Globalization_CultureInfo_internal_get_cultures (MonoBoolean ne
        if (neutral)
                len++;
 
-       ret = mono_array_new (domain, klass, len);
+       ret = mono_array_new_checked (domain, klass, len, &error);
+       if (!is_ok (&error))
+               goto fail;
 
        if (len == 0)
                return ret;
@@ -642,13 +644,17 @@ int ves_icall_System_Globalization_CompareInfo_internal_compare (MonoCompareInfo
 
 void ves_icall_System_Globalization_CompareInfo_assign_sortkey (MonoCompareInfo *this_obj, MonoSortKey *key, MonoString *source, gint32 options)
 {
+       MonoError error;
        MonoArray *arr;
        gint32 keylen, i;
 
        keylen=mono_string_length (source);
        
-       arr=mono_array_new (mono_domain_get (), mono_get_byte_class (),
-                           keylen);
+       arr=mono_array_new_checked (mono_domain_get (), mono_get_byte_class (),
+                                   keylen, &error);
+       if (mono_error_set_pending_exception (&error))
+               return;
+
        for(i=0; i<keylen; i++) {
                mono_array_set (arr, guint8, i, mono_string_chars (source)[i]);
        }
index e7148a823f68f457bcaebb95496b4d1114a35f7c..fb205e80eaff2781966cdb448262ac85e9bac19f 100644 (file)
@@ -1590,16 +1590,25 @@ mono_perfcounter_instance_exists (MonoString *instance, MonoString *category, Mo
 MonoArray*
 mono_perfcounter_category_names (MonoString *machine)
 {
+       MonoError error;
        int i;
        MonoArray *res;
        MonoDomain *domain = mono_domain_get ();
        GSList *custom_categories, *tmp;
        /* no support for counters on other machines */
-       if (mono_string_compare_ascii (machine, "."))
-               return mono_array_new (domain, mono_get_string_class (), 0);
+       if (mono_string_compare_ascii (machine, ".")) {
+               res = mono_array_new_checked (domain, mono_get_string_class (), 0, &error);
+               mono_error_set_pending_exception (&error);
+               return res;
+       }
        perfctr_lock ();
        custom_categories = get_custom_categories ();
-       res = mono_array_new (domain, mono_get_string_class (), NUM_CATEGORIES + g_slist_length (custom_categories));
+       res = mono_array_new_checked (domain, mono_get_string_class (), NUM_CATEGORIES + g_slist_length (custom_categories), &error);
+       if (mono_error_set_pending_exception (&error)) {
+               perfctr_unlock ();
+               return NULL;
+       }
+
        for (i = 0; i < NUM_CATEGORIES; ++i) {
                const CategoryDesc *cdesc = &predef_categories [i];
                mono_array_setref (res, i, mono_string_new (domain, cdesc->name));
@@ -1617,17 +1626,23 @@ mono_perfcounter_category_names (MonoString *machine)
 MonoArray*
 mono_perfcounter_counter_names (MonoString *category, MonoString *machine)
 {
+       MonoError error;
        int i;
        SharedCategory *scat;
        const CategoryDesc *cdesc;
        MonoArray *res;
        MonoDomain *domain = mono_domain_get ();
        /* no support for counters on other machines */
-       if (mono_string_compare_ascii (machine, "."))
-               return mono_array_new (domain, mono_get_string_class (), 0);
+       if (mono_string_compare_ascii (machine, ".")) {
+               res =  mono_array_new_checked (domain, mono_get_string_class (), 0, &error);
+               mono_error_set_pending_exception (&error);
+               return res;
+       }
        cdesc = find_category (category);
        if (cdesc) {
-               res = mono_array_new (domain, mono_get_string_class (), cdesc [1].first_counter - cdesc->first_counter);
+               res = mono_array_new_checked (domain, mono_get_string_class (), cdesc [1].first_counter - cdesc->first_counter, &error);
+               if (mono_error_set_pending_exception (&error))
+                       return NULL;
                for (i = cdesc->first_counter; i < cdesc [1].first_counter; ++i) {
                        const CounterDesc *desc = &predef_counters [i];
                        mono_array_setref (res, i - cdesc->first_counter, mono_string_new (domain, desc->name));
@@ -1639,7 +1654,12 @@ mono_perfcounter_counter_names (MonoString *category, MonoString *machine)
        if (scat) {
                char *p = custom_category_counters (scat);
                int i;
-               res = mono_array_new (domain, mono_get_string_class (), scat->num_counters);
+               res = mono_array_new_checked (domain, mono_get_string_class (), scat->num_counters, &error);
+               if (mono_error_set_pending_exception (&error)) {
+                       perfctr_unlock ();
+                       return NULL;
+               }
+
                for (i = 0; i < scat->num_counters; ++i) {
                        mono_array_setref (res, i, mono_string_new (domain, p + 1));
                        p += 2; /* skip counter type */
@@ -1650,15 +1670,19 @@ mono_perfcounter_counter_names (MonoString *category, MonoString *machine)
                return res;
        }
        perfctr_unlock ();
-       return mono_array_new (domain, mono_get_string_class (), 0);
+       res = mono_array_new_checked (domain, mono_get_string_class (), 0, &error);
+       mono_error_set_pending_exception (&error);
+       return res;
 }
 
 static MonoArray*
-get_string_array (void **array, int count, gboolean is_process)
+get_string_array (void **array, int count, gboolean is_process, MonoError *error)
 {
        int i;
        MonoDomain *domain = mono_domain_get ();
-       MonoArray * res = mono_array_new (mono_domain_get (), mono_get_string_class (), count);
+       mono_error_init (error);
+       MonoArray * res = mono_array_new_checked (mono_domain_get (), mono_get_string_class (), count, error);
+       return_val_if_nok (error, NULL);
        for (i = 0; i < count; ++i) {
                char buf [128];
                char *p;
@@ -1677,11 +1701,13 @@ get_string_array (void **array, int count, gboolean is_process)
 }
 
 static MonoArray*
-get_string_array_of_strings (void **array, int count)
+get_string_array_of_strings (void **array, int count, MonoError *error)
 {
        int i;
        MonoDomain *domain = mono_domain_get ();
-       MonoArray * res = mono_array_new (mono_domain_get (), mono_get_string_class (), count);
+       mono_error_init (error);
+       MonoArray * res = mono_array_new_checked (mono_domain_get (), mono_get_string_class (), count, error);
+       return_val_if_nok (error, NULL);
        for (i = 0; i < count; ++i) {
                char* p = (char *)array[i];
                mono_array_setref (res, i, mono_string_new (domain, p));
@@ -1691,76 +1717,84 @@ get_string_array_of_strings (void **array, int count)
 }
 
 static MonoArray*
-get_mono_instances (void)
+get_mono_instances (MonoError *error)
 {
        int count = 64;
        int res;
        void **buf = NULL;
        MonoArray *array;
+       mono_error_init (error);
        do {
                count *= 2;
                g_free (buf);
                buf = g_new (void*, count);
                res = mono_shared_area_instances (buf, count);
        } while (res == count);
-       array = get_string_array (buf, res, TRUE);
+       array = get_string_array (buf, res, TRUE, error);
        g_free (buf);
        return array;
 }
 
 static MonoArray*
-get_cpu_instances (void)
+get_cpu_instances (MonoError *error)
 {
        void **buf = NULL;
        int i, count;
        MonoArray *array;
-
+       mono_error_init (error);
        count = mono_cpu_count () + 1; /* +1 for "_Total" */
        buf = g_new (void*, count);
        for (i = 0; i < count; ++i)
                buf [i] = GINT_TO_POINTER (i - 1); /* -1 => _Total */
-       array = get_string_array (buf, count, FALSE);
+       array = get_string_array (buf, count, FALSE, error);
        g_free (buf);
        mono_array_setref (array, 0, mono_string_new (mono_domain_get (), "_Total"));
        return array;
 }
 
 static MonoArray*
-get_processes_instances (void)
+get_processes_instances (MonoError *error)
 {
        MonoArray *array;
        int count = 0;
        void **buf = mono_process_list (&count);
+       mono_error_init (error);
        if (!buf)
-               return get_string_array (NULL, 0, FALSE);
-       array = get_string_array (buf, count, TRUE);
+               return get_string_array (NULL, 0, FALSE, error);
+       array = get_string_array (buf, count, TRUE, error);
        g_free (buf);
        return array;
 }
 
 static MonoArray*
-get_networkinterface_instances (void)
+get_networkinterface_instances (MonoError *error)
 {
        MonoArray *array;
        int count = 0;
+       mono_error_init (error);
        void **buf = mono_networkinterface_list (&count);
        if (!buf)
-               return get_string_array_of_strings (NULL, 0);
-       array = get_string_array_of_strings (buf, count);
+               return get_string_array_of_strings (NULL, 0, error);
+       array = get_string_array_of_strings (buf, count, error);
        g_strfreev ((char **) buf);
        return array;
 }
 
 static MonoArray*
-get_custom_instances (MonoString *category)
+get_custom_instances (MonoString *category, MonoError *error)
 {
        SharedCategory *scat;
+       mono_error_init (error);
        scat = find_custom_category (category);
        if (scat) {
                GSList *list = get_custom_instances_list (scat);
                GSList *tmp;
                int i = 0;
-               MonoArray *array = mono_array_new (mono_domain_get (), mono_get_string_class (), g_slist_length (list));
+               MonoArray *array = mono_array_new_checked (mono_domain_get (), mono_get_string_class (), g_slist_length (list), error);
+               if (!is_ok (error)) {
+                       g_slist_free (list);
+                       return NULL;
+               }
                for (tmp = list; tmp; tmp = tmp->next) {
                        SharedInstance *inst = (SharedInstance *)tmp->data;
                        mono_array_setref (array, i, mono_string_new (mono_domain_get (), inst->instance_name));
@@ -1769,31 +1803,46 @@ get_custom_instances (MonoString *category)
                g_slist_free (list);
                return array;
        }
-       return mono_array_new (mono_domain_get (), mono_get_string_class (), 0);
+       return mono_array_new_checked (mono_domain_get (), mono_get_string_class (), 0, error);
 }
 
 MonoArray*
 mono_perfcounter_instance_names (MonoString *category, MonoString *machine)
 {
+       MonoError error;
        const CategoryDesc* cat;
-       if (mono_string_compare_ascii (machine, "."))
-               return mono_array_new (mono_domain_get (), mono_get_string_class (), 0);
+       MonoArray *result = NULL;
+       if (mono_string_compare_ascii (machine, ".")) {
+               result = mono_array_new_checked (mono_domain_get (), mono_get_string_class (), 0, &error);
+               mono_error_set_pending_exception (&error);
+               return result;
+       }
+       
        cat = find_category (category);
-       if (!cat)
-               return get_custom_instances (category);
+       if (!cat) {
+               MonoArray *result = get_custom_instances (category, &error);
+               mono_error_set_pending_exception (&error);
+               return result;
+       }
        switch (cat->instance_type) {
        case MonoInstance:
-               return get_mono_instances ();
+               result = get_mono_instances (&error);
+               break;
        case CPUInstance:
-               return get_cpu_instances ();
+               result = get_cpu_instances (&error);
+               break;
        case ProcessInstance:
-               return get_processes_instances ();
+               result = get_processes_instances (&error);
+               break;
        case NetworkInterfaceInstance:
-               return get_networkinterface_instances ();
+               result = get_networkinterface_instances (&error);
+               break;
        case ThreadInstance:
        default:
-               return mono_array_new (mono_domain_get (), mono_get_string_class (), 0);
+               result = mono_array_new_checked (mono_domain_get (), mono_get_string_class (), 0, &error);
        }
+       mono_error_set_pending_exception (&error);
+       return result;
 }
 
 typedef struct {
index d59d624782a8d781bacbf49472ca26a457a185b8..b27da358575742b762965b76338ececeb5248327 100644 (file)
@@ -391,10 +391,10 @@ ves_icall_System_Security_Principal_WindowsIdentity_GetUserToken (MonoString *us
 MonoArray*
 ves_icall_System_Security_Principal_WindowsIdentity_GetRoles (gpointer token) 
 {
+       MonoError error;
        MonoArray *array = NULL;
        MonoDomain *domain = mono_domain_get (); 
 #ifdef HOST_WIN32
-       MonoError error;
        gint32 size = 0;
 
        GetTokenInformation (token, TokenGroups, NULL, size, (PDWORD)&size);
@@ -404,7 +404,11 @@ ves_icall_System_Security_Principal_WindowsIdentity_GetRoles (gpointer token)
                        int i=0;
                        int num = tg->GroupCount;
 
-                       array = mono_array_new (domain, mono_get_string_class (), num);
+                       array = mono_array_new_checked (domain, mono_get_string_class (), num, &error);
+                       if (mono_error_set_pending_exception (&error)) {
+                               g_free (tg);
+                               return NULL;
+                       }
 
                        for (i=0; i < num; i++) {
                                gint32 size = 0;
@@ -431,7 +435,8 @@ ves_icall_System_Security_Principal_WindowsIdentity_GetRoles (gpointer token)
 #endif
        if (!array) {
                /* return empty array of string, i.e. string [0] */
-               array = mono_array_new (domain, mono_get_string_class (), 0);
+               array = mono_array_new_checked (domain, mono_get_string_class (), 0, &error);
+               mono_error_set_pending_exception (&error);
        }
        return array;
 }
index 586d84230dec2979c7d2168bd266f74891f26098..96e9f6ff67d39469106d524ffedd5ca7e3b3d3d0 100644 (file)
@@ -1429,12 +1429,18 @@ mono_array_full_copy (MonoArray *src, MonoArray *dest);
 gboolean
 mono_array_calc_byte_len (MonoClass *klass, uintptr_t len, uintptr_t *res);
 
+MonoArray*
+mono_array_new_checked (MonoDomain *domain, MonoClass *eclass, uintptr_t n, MonoError *error);
+
 MonoArray*
 mono_array_new_full_checked (MonoDomain *domain, MonoClass *array_class, uintptr_t *lengths, intptr_t *lower_bounds, MonoError *error);
 
 MonoArray*
 mono_array_new_specific_checked (MonoVTable *vtable, uintptr_t n, MonoError *error);
 
+MonoArray*
+ves_icall_array_new (MonoDomain *domain, MonoClass *eclass, uintptr_t n);
+
 MonoArray*
 ves_icall_array_new_specific (MonoVTable *vtable, uintptr_t n);
 
@@ -1649,7 +1655,7 @@ gboolean
 mono_error_set_pending_exception (MonoError *error);
 
 MonoArray *
-mono_glist_to_array (GList *list, MonoClass *eclass);
+mono_glist_to_array (GList *list, MonoClass *eclass, MonoError *error);
 
 MonoObject *
 mono_object_new_checked (MonoDomain *domain, MonoClass *klass, MonoError *error);
@@ -1691,6 +1697,9 @@ MonoObject*
 mono_runtime_invoke_checked (MonoMethod *method, void *obj, void **params, MonoError *error);
 
 
+MonoArray*
+mono_runtime_get_main_args_checked (MonoError *error);
+
 #endif /* __MONO_OBJECT_INTERNALS_H__ */
 
 
index f6059a7c36bcf5d503a43e4f4b6b9faab1103285..eeae842666f4ce12e2e029f2ea4c343015235f42 100644 (file)
@@ -3939,12 +3939,30 @@ MonoArray*
 mono_runtime_get_main_args (void)
 {
        MONO_REQ_GC_UNSAFE_MODE;
+       MonoError error;
+       MonoArray *result = mono_runtime_get_main_args_checked (&error);
+       mono_error_assert_ok (&error);
+       return result;
+}
 
+/**
+ * mono_runtime_get_main_args:
+ * @error: set on error
+ *
+ * Returns: a MonoArray with the arguments passed to the main
+ * program. On failure returns NULL and sets @error.
+ */
+MonoArray*
+mono_runtime_get_main_args_checked (MonoError *error)
+{
        MonoArray *res;
        int i;
        MonoDomain *domain = mono_domain_get ();
 
-       res = (MonoArray*)mono_array_new (domain, mono_defaults.string_class, num_main_args);
+       mono_error_init (error);
+
+       res = (MonoArray*)mono_array_new_checked (domain, mono_defaults.string_class, num_main_args, error);
+       return_val_if_nok (error, NULL);
 
        for (i = 0; i < num_main_args; ++i)
                mono_array_setref (res, i, mono_string_new (domain, main_args [i]));
@@ -4020,6 +4038,7 @@ mono_runtime_run_main (MonoMethod *method, int argc, char* argv[],
 {
        MONO_REQ_GC_UNSAFE_MODE;
 
+       MonoError error;
        int i;
        MonoArray *args = NULL;
        MonoDomain *domain = mono_domain_get ();
@@ -4087,7 +4106,8 @@ mono_runtime_run_main (MonoMethod *method, int argc, char* argv[],
        }
 
        if (sig->param_count) {
-               args = (MonoArray*)mono_array_new (domain, mono_defaults.string_class, argc);
+               args = (MonoArray*)mono_array_new_checked (domain, mono_defaults.string_class, argc, &error);
+               mono_error_assert_ok (&error);
                for (i = 0; i < argc; ++i) {
                        /* The encodings should all work, given that
                         * we've checked all these args for the
@@ -4099,7 +4119,8 @@ mono_runtime_run_main (MonoMethod *method, int argc, char* argv[],
                        g_free (str);
                }
        } else {
-               args = (MonoArray*)mono_array_new (domain, mono_defaults.string_class, 0);
+               args = (MonoArray*)mono_array_new_checked (domain, mono_defaults.string_class, 0, &error);
+               mono_error_assert_ok (&error);
        }
        
        mono_assembly_set_main (method->klass->image->assembly);
@@ -5536,17 +5557,43 @@ mono_array_new (MonoDomain *domain, MonoClass *eclass, uintptr_t n)
        MONO_REQ_GC_UNSAFE_MODE;
 
        MonoError error;
+       MonoArray *result = mono_array_new_checked (domain, eclass, n, &error);
+       mono_error_cleanup (&error);
+       return result;
+}
+
+/**
+ * mono_array_new_checked:
+ * @domain: domain where the object is created
+ * @eclass: element class
+ * @n: number of array elements
+ * @error: set on error
+ *
+ * This routine creates a new szarray with @n elements of type @eclass.
+ * On failure returns NULL and sets @error.
+ */
+MonoArray *
+mono_array_new_checked (MonoDomain *domain, MonoClass *eclass, uintptr_t n, MonoError *error)
+{
        MonoClass *ac;
-       MonoArray *arr;
+
+       mono_error_init (error);
 
        ac = mono_array_class_get (eclass, 1);
        g_assert (ac);
 
-       MonoVTable *vtable = mono_class_vtable_full (domain, ac, &error);
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       MonoVTable *vtable = mono_class_vtable_full (domain, ac, error);
+       return_val_if_nok (error, NULL);
 
-       arr = mono_array_new_specific_checked (vtable, n, &error);
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       return mono_array_new_specific_checked (vtable, n, error);
+}
+
+MonoArray*
+ves_icall_array_new (MonoDomain *domain, MonoClass *eclass, uintptr_t n)
+{
+       MonoError error;
+       MonoArray *arr = mono_array_new_checked (domain, eclass, n, &error);
+       mono_error_set_pending_exception (&error);
 
        return arr;
 }
@@ -7551,7 +7598,8 @@ mono_load_remote_field_checked (MonoObject *this_obj, MonoClass *klass, MonoClas
 
        msg = (MonoMethodMessage *)mono_object_new_checked (domain, mono_defaults.mono_method_message_class, error);
        return_val_if_nok (error, NULL);
-       out_args = mono_array_new (domain, mono_defaults.object_class, 1);
+       out_args = mono_array_new_checked (domain, mono_defaults.object_class, 1, error);
+       return_val_if_nok (error, NULL);
        MonoReflectionMethod *rm = mono_method_get_object_checked (domain, getter, NULL, error);
        return_val_if_nok (error, NULL);
        mono_message_init (domain, msg, rm, out_args);
@@ -7676,7 +7724,8 @@ mono_load_remote_field_new_checked (MonoObject *this_obj, MonoClass *klass, Mono
        
        msg = (MonoMethodMessage *)mono_object_new_checked (domain, mono_defaults.mono_method_message_class, error);
        return_val_if_nok (error, NULL);
-       out_args = mono_array_new (domain, mono_defaults.object_class, 1);
+       out_args = mono_array_new_checked (domain, mono_defaults.object_class, 1, error);
+       return_val_if_nok (error, NULL);
 
        MonoReflectionMethod *rm = mono_method_get_object_checked (domain, getter, NULL, error);
        return_val_if_nok (error, NULL);
@@ -7993,17 +8042,19 @@ mono_array_addr_with_size (MonoArray *array, int size, uintptr_t idx)
 
 
 MonoArray *
-mono_glist_to_array (GList *list, MonoClass *eclass) 
+mono_glist_to_array (GList *list, MonoClass *eclass, MonoError *error
 {
        MonoDomain *domain = mono_domain_get ();
        MonoArray *res;
        int len, i;
 
+       mono_error_init (error);
        if (!list)
                return NULL;
 
        len = g_list_length (list);
-       res = mono_array_new (domain, eclass, len);
+       res = mono_array_new_checked (domain, eclass, len, error);
+       return_val_if_nok (error, NULL);
 
        for (i = 0; list; list = list->next, i++)
                mono_array_set (res, gpointer, i, list->data);
index 77aac6f334d308cab07572a453517ceaed2b3c2e..987e05e1f902c46bc371d5765f4c735720e4a086 100644 (file)
@@ -89,6 +89,7 @@ MONO_RT_EXTERNAL_ONLY
 MONO_API MonoObject *
 mono_object_new_from_token  (MonoDomain *domain, MonoImage *image, uint32_t token);
 
+MONO_RT_EXTERNAL_ONLY
 MONO_API MonoArray*
 mono_array_new             (MonoDomain *domain, MonoClass *eclass, uintptr_t n);
 
@@ -261,6 +262,7 @@ mono_runtime_invoke_array   (MonoMethod *method, void *obj, MonoArray *params,
 MONO_API void*
 mono_method_get_unmanaged_thunk (MonoMethod *method);
 
+MONO_RT_EXTERNAL_ONLY
 MONO_API MonoArray*
 mono_runtime_get_main_args  (void);
 
index 3cd38789d3cfd897fd521d25a6443f718d4f32e4..d74ca084f10e586c0521ee9d848db9c1dcf42fbf 100644 (file)
@@ -507,7 +507,9 @@ ves_icall_System_Diagnostics_Process_GetModules_internal (MonoObject *this_obj,
        }
 
        count = module_count + assembly_count; 
-       temp_arr = mono_array_new (mono_domain_get (), mono_class_get_process_module_class (), count);
+       temp_arr = mono_array_new_checked (mono_domain_get (), mono_class_get_process_module_class (), count, &error);
+       if (mono_error_set_pending_exception (&error))
+               return NULL;
 
        for (i = 0; i < module_count; i++) {
                if (GetModuleBaseName (process, mods[i], modname, MAX_PATH) &&
@@ -539,7 +541,9 @@ ves_icall_System_Diagnostics_Process_GetModules_internal (MonoObject *this_obj,
                arr = temp_arr;
        } else {
                /* shorter version of the array */
-               arr = mono_array_new (mono_domain_get (), mono_class_get_process_module_class (), num_added);
+               arr = mono_array_new_checked (mono_domain_get (), mono_class_get_process_module_class (), num_added, &error);
+               if (mono_error_set_pending_exception (&error))
+                       return NULL;
 
                for (i = 0; i < num_added; i++)
                        mono_array_setref (arr, i, mono_array_get (temp_arr, MonoObject*, i));
@@ -850,6 +854,7 @@ MonoArray *
 ves_icall_System_Diagnostics_Process_GetProcesses_internal (void)
 {
 #if !defined(HOST_WIN32)
+       MonoError error;
        MonoArray *procs;
        gpointer *pidarray;
        int i, count;
@@ -859,7 +864,11 @@ ves_icall_System_Diagnostics_Process_GetProcesses_internal (void)
                mono_set_pending_exception (mono_get_exception_not_supported ("This system does not support EnumProcesses"));
                return NULL;
        }
-       procs = mono_array_new (mono_domain_get (), mono_get_int32_class (), count);
+       procs = mono_array_new_checked (mono_domain_get (), mono_get_int32_class (), count, &error);
+       if (mono_error_set_pending_exception (&error)) {
+               g_free (pidarray);
+               return NULL;
+       }
        if (sizeof (guint32) == sizeof (gpointer)) {
                memcpy (mono_array_addr (procs, guint32, 0), pidarray, count * sizeof (gint32));
        } else {
@@ -870,6 +879,7 @@ ves_icall_System_Diagnostics_Process_GetProcesses_internal (void)
 
        return procs;
 #else
+       MonoError error;
        MonoArray *procs;
        gboolean ret;
        DWORD needed;
@@ -897,7 +907,12 @@ ves_icall_System_Diagnostics_Process_GetProcesses_internal (void)
        } while (TRUE);
 
        count = needed / sizeof (guint32);
-       procs = mono_array_new (mono_domain_get (), mono_get_int32_class (), count);
+       procs = mono_array_new_checked (mono_domain_get (), mono_get_int32_class (), count, &error);
+       if (mono_error_set_pending_exception (&error)) {
+               g_free (pids);
+               return NULL;
+       }
+
        memcpy (mono_array_addr (procs, guint32, 0), pids, needed);
        g_free (pids);
        pids = NULL;
index 258bb4fbdcd553ce3930cba6392eb794bd6b2dc6..5e2adacea5e8a0a3f81ba2b297a2bb1759e4a68c 100644 (file)
@@ -9165,7 +9165,8 @@ handle_type:
                        *end = p;
                        return NULL;
                }
-               arr = mono_array_new (mono_domain_get(), tklass, alen);
+               arr = mono_array_new_checked (mono_domain_get(), tklass, alen, error);
+               return_val_if_nok (error, NULL);
                basetype = tklass->byval_arg.type;
                if (basetype == MONO_TYPE_VALUETYPE && tklass->enumtype)
                        basetype = mono_class_enum_basetype (tklass)->type;
@@ -9591,8 +9592,9 @@ mono_reflection_create_custom_attr_data_args (MonoImage *image, MonoMethod *meth
        if (len < 2 || read16 (p) != 0x0001) /* Prolog */
                return;
 
-       typedargs = mono_array_new (domain, mono_get_object_class (), mono_method_signature (method)->param_count);
-       
+       typedargs = mono_array_new_checked (domain, mono_get_object_class (), mono_method_signature (method)->param_count, error);
+       return_if_nok (error);
+
        /* skip prolog */
        p += 2;
        for (i = 0; i < mono_method_signature (method)->param_count; ++i) {
@@ -9605,7 +9607,8 @@ mono_reflection_create_custom_attr_data_args (MonoImage *image, MonoMethod *meth
 
        named = p;
        num_named = read16 (named);
-       namedargs = mono_array_new (domain, mono_get_object_class (), num_named);
+       namedargs = mono_array_new_checked (domain, mono_get_object_class (), num_named, error);
+       return_if_nok (error);
        named += 2;
        attrklass = method->klass;
 
@@ -9862,7 +9865,8 @@ mono_custom_attrs_data_construct (MonoCustomAttrInfo *cinfo, MonoError *error)
        int i;
        
        mono_error_init (error);
-       result = mono_array_new (mono_domain_get (), mono_defaults.customattribute_data_class, cinfo->num_attrs);
+       result = mono_array_new_checked (mono_domain_get (), mono_defaults.customattribute_data_class, cinfo->num_attrs, error);
+       return_val_if_nok (error, NULL);
        for (i = 0; i < cinfo->num_attrs; ++i) {
                attr = create_custom_attr_data (cinfo->image, &cinfo->attrs [i], error);
                return_val_if_nok (error, NULL);
@@ -10523,8 +10527,8 @@ mono_reflection_get_custom_attrs_data_checked (MonoObject *obj, MonoError *error
                if (!cinfo->cached)
                        mono_custom_attrs_free (cinfo);
                return_val_if_nok (error, NULL);
-       } else
-               result = mono_array_new (mono_domain_get (), mono_defaults.customattribute_data_class, 0);
+       } else 
+               result = mono_array_new_checked (mono_domain_get (), mono_defaults.customattribute_data_class, 0, error);
 
        return result;
 }
@@ -11394,7 +11398,9 @@ mono_reflection_get_custom_attrs_blob_checked (MonoReflectionAssembly *assembly,
 
        g_assert (p - buffer <= buflen);
        buflen = p - buffer;
-       result = mono_array_new (mono_domain_get (), mono_defaults.byte_class, buflen);
+       result = mono_array_new_checked (mono_domain_get (), mono_defaults.byte_class, buflen, error);
+       if (!is_ok (error))
+               goto leave;
        p = mono_array_addr (result, char, 0);
        memcpy (p, buffer, buflen);
 leave:
@@ -13483,7 +13489,8 @@ reflection_sighelper_get_signature_local (MonoReflectionSigHelper *sig, MonoErro
        }
 
        buflen = buf.p - buf.buf;
-       result = mono_array_new (mono_domain_get (), mono_defaults.byte_class, buflen);
+       result = mono_array_new_checked (mono_domain_get (), mono_defaults.byte_class, buflen, error);
+       if (!is_ok (error)) goto fail;
        memcpy (mono_array_addr (result, char, 0), buf.buf, buflen);
        sigbuffer_free (&buf);
        return result;
@@ -13526,7 +13533,8 @@ reflection_sighelper_get_signature_field (MonoReflectionSigHelper *sig, MonoErro
        }
 
        buflen = buf.p - buf.buf;
-       result = mono_array_new (mono_domain_get (), mono_defaults.byte_class, buflen);
+       result = mono_array_new_checked (mono_domain_get (), mono_defaults.byte_class, buflen, error);
+       if (!is_ok (error)) goto fail;
        memcpy (mono_array_addr (result, char, 0), buf.buf, buflen);
        sigbuffer_free (&buf);
 
index 68d225de0c547a82ce6656f244eaa63ceddfea0e..9bcaa328f7ceed260178ee97b08c332e4cf5416e 100644 (file)
@@ -2481,7 +2481,7 @@ ves_icall_System_Net_Sockets_Socket_IOControl_internal (SOCKET sock, gint32 code
 }
 
 static gboolean 
-addrinfo_to_IPHostEntry(MonoAddressInfo *info, MonoString **h_name, MonoArray **h_aliases, MonoArray **h_addr_list, gboolean add_local_ips)
+addrinfo_to_IPHostEntry (MonoAddressInfo *info, MonoString **h_name, MonoArray **h_aliases, MonoArray **h_addr_list, gboolean add_local_ips, MonoError *error)
 {
        gint32 count, i;
        MonoAddressEntry *ai = NULL;
@@ -2492,14 +2492,19 @@ addrinfo_to_IPHostEntry(MonoAddressInfo *info, MonoString **h_name, MonoArray **
        int addr_index;
        MonoDomain *domain = mono_domain_get ();
 
+       mono_error_init (error);
        addr_index = 0;
-       *h_aliases = mono_array_new (domain, mono_get_string_class (), 0);
+       *h_aliases = mono_array_new_checked (domain, mono_get_string_class (), 0, error);
+       return_val_if_nok (error, FALSE);
        if (add_local_ips) {
                local_in = (struct in_addr *) mono_get_local_interfaces (AF_INET, &nlocal_in);
                local_in6 = (struct in6_addr *) mono_get_local_interfaces (AF_INET6, &nlocal_in6);
                if (nlocal_in || nlocal_in6) {
                        char addr [INET6_ADDRSTRLEN];
-                       *h_addr_list = mono_array_new (domain, mono_get_string_class (), nlocal_in + nlocal_in6);
+                       *h_addr_list = mono_array_new_checked (domain, mono_get_string_class (), nlocal_in + nlocal_in6, error);
+                       if (!is_ok (error))
+                               goto leave;
+                       
                        if (nlocal_in) {
                                MonoString *addr_string;
                                int i;
@@ -2530,11 +2535,12 @@ addrinfo_to_IPHostEntry(MonoAddressInfo *info, MonoString **h_name, MonoArray **
                                }
                        }
 
+               leave:
                        g_free (local_in);
                        g_free (local_in6);
                        if (info)
                                mono_free_address_info (info);
-                       return TRUE;
+                       return is_ok (error);;
                }
 
                g_free (local_in);
@@ -2547,7 +2553,9 @@ addrinfo_to_IPHostEntry(MonoAddressInfo *info, MonoString **h_name, MonoArray **
                count++;
        }
 
-       *h_addr_list = mono_array_new (domain, mono_get_string_class (), count);
+       *h_addr_list = mono_array_new_checked (domain, mono_get_string_class (), count, error);
+       if (!is_ok (error))
+               goto leave2;
 
        for (ai = info->entries, i = 0; ai != NULL; ai = ai->next) {
                MonoAddress maddr;
@@ -2577,10 +2585,11 @@ addrinfo_to_IPHostEntry(MonoAddressInfo *info, MonoString **h_name, MonoArray **
                addr_index++;
        }
 
+leave2:
        if (info)
                mono_free_address_info (info);
 
-       return TRUE;
+       return is_ok (error);
 }
 
 static int
@@ -2641,8 +2650,11 @@ ves_icall_System_Net_Dns_GetHostByName_internal (MonoString *host, MonoString **
 
        g_free(hostname);
 
-       if (add_info_ok)
-               return addrinfo_to_IPHostEntry (info, h_name, h_aliases, h_addr_list, add_local_ips);
+       if (add_info_ok) {
+               MonoBoolean result = addrinfo_to_IPHostEntry (info, h_name, h_aliases, h_addr_list, add_local_ips, &error);
+               mono_error_set_pending_exception (&error);
+               return result;
+       }
        return FALSE;
 }
 
@@ -2707,7 +2719,9 @@ ves_icall_System_Net_Dns_GetHostByAddr_internal (MonoString *addr, MonoString **
        if (mono_get_address_info (hostname, 0, hint | MONO_HINT_CANONICAL_NAME | MONO_HINT_CONFIGURED_ONLY, &info) != 0)
                return FALSE;
 
-       return addrinfo_to_IPHostEntry (info, h_name, h_aliases, h_addr_list, FALSE);
+       MonoBoolean result = addrinfo_to_IPHostEntry (info, h_name, h_aliases, h_addr_list, FALSE, &error);
+       mono_error_set_pending_exception (&error);
+       return result;
 }
 
 MonoBoolean
index ff1ca45f170f6f261aaa77c3d3b7cb80065240b2..ee8b209392e91fe9c577cd82510d9f7c01820019 100644 (file)
@@ -1442,17 +1442,18 @@ ves_icall_System_Threading_Thread_SetPriority (MonoThread *this_obj, int priorit
 /* If the array is already in the requested domain, we just return it,
    otherwise we return a copy in that domain. */
 static MonoArray*
-byte_array_to_domain (MonoArray *arr, MonoDomain *domain)
+byte_array_to_domain (MonoArray *arr, MonoDomain *domain, MonoError *error)
 {
        MonoArray *copy;
 
+       mono_error_init (error);
        if (!arr)
                return NULL;
 
        if (mono_object_domain (arr) == domain)
                return arr;
 
-       copy = mono_array_new (domain, mono_defaults.byte_class, arr->max_length);
+       copy = mono_array_new_checked (domain, mono_defaults.byte_class, arr->max_length, error);
        memmove (mono_array_addr (copy, guint8, 0), mono_array_addr (arr, guint8, 0), arr->max_length);
        return copy;
 }
@@ -1460,13 +1461,19 @@ byte_array_to_domain (MonoArray *arr, MonoDomain *domain)
 MonoArray*
 ves_icall_System_Threading_Thread_ByteArrayToRootDomain (MonoArray *arr)
 {
-       return byte_array_to_domain (arr, mono_get_root_domain ());
+       MonoError error;
+       MonoArray *result = byte_array_to_domain (arr, mono_get_root_domain (), &error);
+       mono_error_set_pending_exception (&error);
+       return result;
 }
 
 MonoArray*
 ves_icall_System_Threading_Thread_ByteArrayToCurrentDomain (MonoArray *arr)
 {
-       return byte_array_to_domain (arr, mono_domain_get ());
+       MonoError error;
+       MonoArray *result = byte_array_to_domain (arr, mono_domain_get (), &error);
+       mono_error_set_pending_exception (&error);
+       return result;
 }
 
 MonoThread *
@@ -3533,8 +3540,12 @@ mono_threads_get_thread_dump (MonoArray **out_threads, MonoArray **out_stack_fra
        ud.frames = g_new0 (MonoStackFrameInfo, 256);
        ud.max_frames = 256;
 
-       *out_threads = mono_array_new (domain, mono_defaults.thread_class, nthreads);
-       *out_stack_frames = mono_array_new (domain, mono_defaults.array_class, nthreads);
+       *out_threads = mono_array_new_checked (domain, mono_defaults.thread_class, nthreads, &error);
+       if (!is_ok (&error))
+               goto leave;
+       *out_stack_frames = mono_array_new_checked (domain, mono_defaults.array_class, nthreads, &error);
+       if (!is_ok (&error))
+               goto leave;
 
        for (tindex = 0; tindex < nthreads; ++tindex) {
                MonoInternalThread *thread = thread_array [tindex];
@@ -3553,7 +3564,9 @@ mono_threads_get_thread_dump (MonoArray **out_threads, MonoArray **out_stack_fra
 
                mono_array_setref_fast (*out_threads, tindex, mono_thread_current_for_thread (thread));
 
-               thread_frames = mono_array_new (domain, mono_defaults.stack_frame_class, ud.nframes);
+               thread_frames = mono_array_new_checked (domain, mono_defaults.stack_frame_class, ud.nframes, &error);
+               if (!is_ok (&error))
+                       goto leave;
                mono_array_setref_fast (*out_stack_frames, tindex, thread_frames);
 
                for (i = 0; i < ud.nframes; ++i) {
index 9546009e724697247abc5e7e3e11ff1f67c8e685..45849a824337eb2fd5dd7bb8d9eae312640afd27 100644 (file)
@@ -1520,7 +1520,7 @@ mono_decompose_array_access_opts (MonoCompile *cfg)
                                                MONO_INST_NEW (cfg, iargs [2], OP_MOVE);
                                                iargs [2]->dreg = ins->sreg1;
 
-                                               dest = mono_emit_jit_icall (cfg, mono_array_new, iargs);
+                                               dest = mono_emit_jit_icall (cfg, ves_icall_array_new, iargs);
                                                dest->dreg = ins->dreg;
                                        } else {
                                                MonoClass *array_class = mono_array_class_get (ins->inst_newa_class, 1);
index 2bbd9f48dd4d50b49a9a29d939bda2fb2c849b3b..5e6e71e26adecaf495bf6e37ae05a5477906aea2 100644 (file)
@@ -1140,7 +1140,7 @@ load_agent (MonoDomain *domain, char *desc)
 
        method = mono_get_method_checked (image, entry, NULL, NULL, &error);
        if (method == NULL){
-               g_print ("The entry point method of assembly '%s' could not be loaded due to %s\n", agent, &error);
+               g_print ("The entry point method of assembly '%s' could not be loaded due to %s\n", agent, mono_error_get_message (&error));
                mono_error_cleanup (&error);
                g_free (agent);
                return 1;
@@ -1149,12 +1149,19 @@ load_agent (MonoDomain *domain, char *desc)
        mono_thread_set_main (mono_thread_current ());
 
        if (args) {
-               main_args = (MonoArray*)mono_array_new (domain, mono_defaults.string_class, 1);
-               mono_array_set (main_args, MonoString*, 0, mono_string_new (domain, args));
+               main_args = (MonoArray*)mono_array_new_checked (domain, mono_defaults.string_class, 1, &error);
+               if (main_args)
+                       mono_array_set (main_args, MonoString*, 0, mono_string_new (domain, args));
        } else {
-               main_args = (MonoArray*)mono_array_new (domain, mono_defaults.string_class, 0);
+               main_args = (MonoArray*)mono_array_new_checked (domain, mono_defaults.string_class, 0, &error);
        }
-
+       if (!main_args) {
+               g_print ("Could not allocate array for main args of assembly '%s' due to %s\n", agent, mono_error_get_message (&error));
+               mono_error_cleanup (&error);
+               g_free (agent);
+               return 1;
+       }
+       
        g_free (agent);
 
        pa [0] = main_args;
index 8bf63dcfbfe1b221dbc800d6924d91ea3a40e20e..8e6ffa8dbac0d62df121c2d96d0082607b974e21 100644 (file)
@@ -11869,7 +11869,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
                                        EMIT_NEW_CLASSCONST (cfg, iargs [1], klass);
                                        iargs [2] = sp [0];
 
-                                       ins = mono_emit_jit_icall (cfg, mono_array_new, iargs);
+                                       ins = mono_emit_jit_icall (cfg, ves_icall_array_new, iargs);
                                } else {
                                        /* Decompose later since it is needed by abcrem */
                                        MonoClass *array_type = mono_array_class_get (klass, 1);
index 479aed2f41ab71ae43f465101c120d87934a2162..a4d15fa4849100f30054a6e2324dc540937f0aa9 100644 (file)
@@ -709,12 +709,16 @@ ves_icall_get_trace (MonoException *exc, gint32 skip, MonoBoolean need_file_info
 
        if (ta == NULL) {
                /* Exception is not thrown yet */
-               return mono_array_new (domain, mono_defaults.stack_frame_class, 0);
+               res = mono_array_new_checked (domain, mono_defaults.stack_frame_class, 0, &error);
+               mono_error_set_pending_exception (&error);
+               return res;
        }
 
        len = mono_array_length (ta) >> 1;
 
-       res = mono_array_new (domain, mono_defaults.stack_frame_class, len > skip ? len - skip : 0);
+       res = mono_array_new_checked (domain, mono_defaults.stack_frame_class, len > skip ? len - skip : 0, &error);
+       if (mono_error_set_pending_exception (&error))
+               return NULL;
 
        for (i = skip; i < len; i++) {
                MonoJitInfo *ji;
@@ -1278,8 +1282,9 @@ wrap_non_exception_throws (MonoMethod *m)
 
 #define MAX_UNMANAGED_BACKTRACE 128
 static MonoArray*
-build_native_trace (void)
+build_native_trace (MonoError *error)
 {
+       mono_error_init (error);
 /* This puppy only makes sense on mobile, IOW, ARM. */
 #if defined (HAVE_BACKTRACE_SYMBOLS) && defined (TARGET_ARM)
        MonoArray *res;
@@ -1289,7 +1294,8 @@ build_native_trace (void)
 
        if (!size)
                return NULL;
-       res = mono_array_new (mono_domain_get (), mono_defaults.int_class, size);
+       res = mono_array_new_checked (mono_domain_get (), mono_defaults.int_class, size, error);
+       return_val_if_nok (error, NULL);
 
        for (i = 0; i < size; i++)
                mono_array_set (res, gpointer, i, native_trace [i]);
@@ -1304,8 +1310,12 @@ setup_stack_trace (MonoException *mono_ex, GSList *dynamic_methods, MonoArray *i
 {
        if (mono_ex && !initial_trace_ips) {
                *trace_ips = g_list_reverse (*trace_ips);
-               MONO_OBJECT_SETREF (mono_ex, trace_ips, mono_glist_to_array (*trace_ips, mono_defaults.int_class));
-               MONO_OBJECT_SETREF (mono_ex, native_trace_ips, build_native_trace ());
+               MonoError error;
+               MonoArray *ips_arr = mono_glist_to_array (*trace_ips, mono_defaults.int_class, &error);
+               mono_error_assert_ok (&error);
+               MONO_OBJECT_SETREF (mono_ex, trace_ips, ips_arr);
+               MONO_OBJECT_SETREF (mono_ex, native_trace_ips, build_native_trace (&error));
+               mono_error_assert_ok (&error);
                if (dynamic_methods) {
                        /* These methods could go away anytime, so save a reference to them in the exception object */
                        GSList *l;
@@ -2910,7 +2920,9 @@ throw_exception (MonoObject *ex, gboolean rethrow)
                        trace = g_list_append (trace, l->data);
                        trace = g_list_append (trace, NULL);
                }
-               MONO_OBJECT_SETREF (mono_ex, trace_ips, mono_glist_to_array (trace, mono_defaults.int_class));
+               MonoArray *ips_arr = mono_glist_to_array (trace, mono_defaults.int_class, &error);
+               mono_error_assert_ok (&error);
+               MONO_OBJECT_SETREF (mono_ex, trace_ips, ips_arr);
                g_list_free (l);
                g_list_free (trace);
 #endif
@@ -2967,6 +2979,7 @@ mono_llvm_resume_exception (void)
 MonoObject *
 mono_llvm_load_exception (void)
 {
+               MonoError error;
        MonoJitTlsData *jit_tls = mono_get_jit_tls ();
 
        MonoException *mono_ex = (MonoException*)mono_gchandle_get_target (jit_tls->thrown_exc);
@@ -2990,14 +3003,18 @@ mono_llvm_load_exception (void)
                // FIXME: Does this work correctly for rethrows?
                // We may be discarding useful information
                // when this gets GC'ed
-               MONO_OBJECT_SETREF (mono_ex, trace_ips, mono_glist_to_array (trace_ips, mono_defaults.int_class));
+               MonoArray *ips_arr = mono_glist_to_array (trace_ips, mono_defaults.int_class, &error);
+               mono_error_assert_ok (&error);
+               MONO_OBJECT_SETREF (mono_ex, trace_ips, ips_arr);
                g_list_free (trace_ips);
 
                // FIXME:
                //MONO_OBJECT_SETREF (mono_ex, stack_trace, ves_icall_System_Exception_get_trace (mono_ex));
        } else {
-               MONO_OBJECT_SETREF (mono_ex, trace_ips, mono_array_new (mono_domain_get (), mono_defaults.int_class, 0));
-               MONO_OBJECT_SETREF (mono_ex, stack_trace, mono_array_new (mono_domain_get (), mono_defaults.stack_frame_class, 0));
+               MONO_OBJECT_SETREF (mono_ex, trace_ips, mono_array_new_checked (mono_domain_get (), mono_defaults.int_class, 0, &error));
+               mono_error_assert_ok (&error);
+               MONO_OBJECT_SETREF (mono_ex, stack_trace, mono_array_new_checked (mono_domain_get (), mono_defaults.stack_frame_class, 0, &error));
+               mono_error_assert_ok (&error);
        }
 
        return &mono_ex->object;
index 0153bcfde8a57496c9cbeaee1599abc8863cd7f3..4978f84f15426720113495e298c4b1f5843d916e 100644 (file)
@@ -4050,7 +4050,7 @@ register_icalls (void)
        register_icall (mono_helper_stelem_ref_check, "mono_helper_stelem_ref_check", "void object object", FALSE);
        register_icall (ves_icall_object_new, "ves_icall_object_new", "object ptr ptr", FALSE);
        register_icall (ves_icall_object_new_specific, "ves_icall_object_new_specific", "object ptr", FALSE);
-       register_icall (mono_array_new, "mono_array_new", "object ptr ptr int32", FALSE);
+       register_icall (ves_icall_array_new, "ves_icall_array_new", "object ptr ptr int32", FALSE);
        register_icall (ves_icall_array_new_specific, "ves_icall_array_new_specific", "object ptr int32", FALSE);
        register_icall (ves_icall_runtime_class_init, "ves_icall_runtime_class_init", "void ptr", FALSE);
        register_icall (mono_ldftn, "mono_ldftn", "ptr ptr", FALSE);