Merge pull request #4782 from lambdageek/dev-mono_string_new-excise
authorAleksey Kliger (λgeek) <akliger@gmail.com>
Thu, 4 May 2017 21:31:01 +0000 (17:31 -0400)
committerGitHub <noreply@github.com>
Thu, 4 May 2017 21:31:01 +0000 (17:31 -0400)
[runtime] Mark mono_string_new external only

36 files changed:
mono/metadata/appdomain.c
mono/metadata/appdomain.h
mono/metadata/attach.c
mono/metadata/domain-internals.h
mono/metadata/environment.c
mono/metadata/exception.c
mono/metadata/filewatcher.c
mono/metadata/gc.c
mono/metadata/icall-def.h
mono/metadata/icall-internals.h
mono/metadata/icall-windows-uwp.c
mono/metadata/icall-windows.c
mono/metadata/icall.c
mono/metadata/locales.c
mono/metadata/locales.h
mono/metadata/marshal.c
mono/metadata/marshal.h
mono/metadata/mono-perfcounters.c
mono/metadata/mono-route.c
mono/metadata/mono-security-windows.c
mono/metadata/mono-security.c
mono/metadata/object.c
mono/metadata/object.h
mono/metadata/security.h
mono/metadata/sre.c
mono/metadata/threadpool.c
mono/metadata/threads.c
mono/metadata/w32file.c
mono/metadata/w32process.c
mono/metadata/w32socket.c
mono/mini/aot-compiler.c
mono/mini/debugger-agent.c
mono/mini/driver.c
mono/mini/interp/interp.c
mono/mini/mini-exceptions.c
mono/utils/mono-error.c

index 8a86bc3dea3fa38c1ce8994444b54e6cd4bde260..f8de9e2d23e3842a747a4948d641847b77f3464c 100644 (file)
@@ -192,7 +192,9 @@ create_domain_objects (MonoDomain *domain)
        string_vt = mono_class_vtable (domain, mono_defaults.string_class);
        string_empty_fld = mono_class_get_field_from_name (mono_defaults.string_class, "Empty");
        g_assert (string_empty_fld);
-       MonoString *empty_str = mono_string_intern_checked (mono_string_new (domain, ""), &error);
+       MonoString *empty_str = mono_string_new_checked (domain, "", &error);
+       mono_error_assert_ok (&error);
+       empty_str = mono_string_intern_checked (empty_str, &error);
        mono_error_assert_ok (&error);
        mono_field_static_set_value (string_vt, string_empty_fld, empty_str);
        domain->empty_string = empty_str;
@@ -200,7 +202,8 @@ create_domain_objects (MonoDomain *domain)
        /*
         * Create an instance early since we can't do it when there is no memory.
         */
-       arg = mono_string_new (domain, "Out of memory");
+       arg = mono_string_new_checked (domain, "Out of memory", &error);
+       mono_error_assert_ok (&error);
        domain->out_of_memory_ex = mono_exception_from_name_two_strings_checked (mono_defaults.corlib, "System", "OutOfMemoryException", arg, NULL, &error);
        mono_error_assert_ok (&error);
 
@@ -208,10 +211,12 @@ create_domain_objects (MonoDomain *domain)
         * These two are needed because the signal handlers might be executing on
         * an alternate stack, and Boehm GC can't handle that.
         */
-       arg = mono_string_new (domain, "A null value was found where an object instance was required");
+       arg = mono_string_new_checked (domain, "A null value was found where an object instance was required", &error);
+       mono_error_assert_ok (&error);
        domain->null_reference_ex = mono_exception_from_name_two_strings_checked (mono_defaults.corlib, "System", "NullReferenceException", arg, NULL, &error);
        mono_error_assert_ok (&error);
-       arg = mono_string_new (domain, "The requested operation caused a stack overflow.");
+       arg = mono_string_new_checked (domain, "The requested operation caused a stack overflow.", &error);
+       mono_error_assert_ok (&error);
        domain->stack_overflow_ex = mono_exception_from_name_two_strings_checked (mono_defaults.corlib, "System", "StackOverflowException", arg, NULL, &error);
        mono_error_assert_ok (&error);
 
@@ -521,8 +526,28 @@ leave:
 void
 mono_domain_set_config (MonoDomain *domain, const char *base_dir, const char *config_file_name)
 {
-       MONO_OBJECT_SETREF (domain->setup, application_base, mono_string_new (domain, base_dir));
-       MONO_OBJECT_SETREF (domain->setup, configuration_file, mono_string_new (domain, config_file_name));
+       HANDLE_FUNCTION_ENTER ();
+       MonoError error;
+       mono_domain_set_config_checked (domain, base_dir, config_file_name, &error);
+       mono_error_cleanup (&error);
+       HANDLE_FUNCTION_RETURN ();
+}
+
+gboolean
+mono_domain_set_config_checked (MonoDomain *domain, const char *base_dir, const char *config_file_name, MonoError *error)
+{
+       error_init (error);
+       MonoAppDomainSetupHandle setup = MONO_HANDLE_NEW (MonoAppDomainSetup, domain->setup);
+       MonoStringHandle base_dir_str = mono_string_new_handle (domain, base_dir, error);
+       if (!is_ok (error))
+               goto leave;
+       MONO_HANDLE_SET (setup, application_base, base_dir_str);
+       MonoStringHandle config_file_name_str = mono_string_new_handle (domain, config_file_name, error);
+       if (!is_ok (error))
+               goto leave;
+       MONO_HANDLE_SET (setup, configuration_file, config_file_name_str);
+leave:
+       return is_ok (error);
 }
 
 static MonoAppDomainSetupHandle
@@ -730,9 +755,10 @@ mono_domain_try_type_resolve_checked (MonoDomain *domain, char *name, MonoObject
                }
        }
 
-       if (name)
-               *params = (MonoObject*)mono_string_new (mono_domain_get (), name);
-       else
+       if (name) {
+               *params = (MonoObject*)mono_string_new_checked (mono_domain_get (), name, error);
+               return_val_if_nok (error, NULL);
+       } else
                *params = tb;
 
        ret = (MonoReflectionAssembly *) mono_runtime_invoke_checked (method, domain->domain, params, error);
@@ -2516,7 +2542,9 @@ unload_thread_main (void *arg)
 
        internal = mono_thread_internal_current ();
 
-       mono_thread_set_name_internal (internal, mono_string_new (mono_domain_get (), "Domain unloader"), TRUE, FALSE, &error);
+       MonoString *thread_name_str = mono_string_new_checked (mono_domain_get (), "Domain unloader", &error);
+       if (is_ok (&error))
+               mono_thread_set_name_internal (internal, thread_name_str, TRUE, FALSE, &error);
        if (!is_ok (&error)) {
                data->failure_reason = g_strdup (mono_error_get_message (&error));
                mono_error_cleanup (&error);
index 83ca9ea26837759acebff6038f8160cb7b612dd6..9d42bdda490344814869d484bbf037106a20c68f 100644 (file)
@@ -69,6 +69,7 @@ MONO_RT_EXTERNAL_ONLY
 MONO_API MonoDomain *
 mono_domain_create_appdomain (char *friendly_name, char *configuration_file);
 
+MONO_RT_EXTERNAL_ONLY
 MONO_API void
 mono_domain_set_config (MonoDomain *domain, const char *base_dir, const char *config_file_name);
 
index 0e89624cce35befe8fb6c75d771e24e9d7b98c83..942209fb168b1136dcdca933376ab5d35c16ff25 100644 (file)
@@ -313,7 +313,14 @@ mono_attach_load_agent (MonoDomain *domain, char *agent, char *args, MonoObject
        }
 
        if (args) {
-               mono_array_set (main_args, MonoString*, 0, mono_string_new (domain, args));
+               MonoString *args_str = mono_string_new_checked (domain, args, &error);
+               if (!is_ok (&error)) {
+                       g_print ("Could not allocate main method arg string due to %s\n", mono_error_get_message (&error));
+                       mono_error_cleanup (&error);
+                       g_free (agent);
+                       return 1;
+               }
+               mono_array_set (main_args, MonoString*, 0, args_str);
        }
 
 
@@ -502,7 +509,9 @@ receiver_thread (void *arg)
        MonoInternalThread *internal;
 
        internal = mono_thread_internal_current ();
-       mono_thread_set_name_internal (internal, mono_string_new (mono_domain_get (), "Attach receiver"), TRUE, FALSE, &error);
+       MonoString *attach_str = mono_string_new_checked (mono_domain_get (), "Attach receiver", &error);
+       mono_error_assert_ok (&error);
+       mono_thread_set_name_internal (internal, attach_str, TRUE, FALSE, &error);
        mono_error_assert_ok (&error);
        /* Ask the runtime to not abort this thread */
        //internal->flags |= MONO_THREAD_FLAG_DONT_MANAGE;
index c04b7f61c92f605baf4e6e5c1d5836f7a491e638..c9fb4add3dd46edb349dc33e980c637972a8d059 100644 (file)
@@ -533,6 +533,9 @@ mono_domain_unset (void);
 void
 mono_domain_set_internal_with_options (MonoDomain *domain, gboolean migrate_exception);
 
+gboolean
+mono_domain_set_config_checked (MonoDomain *domain, const char *base_dir, const char *config_file_name, MonoError *error);
+
 MonoTryBlockHoleTableJitInfo*
 mono_jit_info_get_try_block_hole_table_info (MonoJitInfo *ji);
 
index 2ccf0fe7217eb1ba5e55bd1524f219565a205cf2..b7001b57ac5664ceae8e509c920c273cc5f83ed6 100644 (file)
 #include <mono/metadata/appdomain.h>
 #include <mono/metadata/environment.h>
 #include <mono/metadata/exception.h>
+#include <mono/metadata/handle.h>
 #include <mono/utils/mono-compiler.h>
 #include <mono/utils/w32api.h>
 
-extern MonoString* ves_icall_System_Environment_GetOSVersionString (void);
+extern MonoStringHandle ves_icall_System_Environment_GetOSVersionString (MonoError *error);
 
 #if !defined(HOST_WIN32) && defined(HAVE_SYS_UTSNAME_H)
 #include <sys/utsname.h>
@@ -47,9 +48,10 @@ mono_environment_exitcode_set (gint32 value)
 }
 
 /* note: we better manipulate the string in managed code (easier and safer) */
-MonoString*
-ves_icall_System_Environment_GetOSVersionString (void)
+MonoStringHandle
+ves_icall_System_Environment_GetOSVersionString (MonoError *error)
 {
+       error_init (error);
 #ifdef HOST_WIN32
        OSVERSIONINFOEX verinfo;
 
@@ -63,15 +65,15 @@ ves_icall_System_Environment_GetOSVersionString (void)
                                 verinfo.dwMinorVersion,
                                 verinfo.dwBuildNumber,
                                 verinfo.wServicePackMajor << 16);
-               return mono_string_new (mono_domain_get (), version);
+               return mono_string_new_handle (mono_domain_get (), version, error);
        }
 #elif defined(HAVE_SYS_UTSNAME_H)
        struct utsname name;
 
        if (uname (&name) >= 0) {
-               return mono_string_new (mono_domain_get (), name.release);
+               return mono_string_new_handle (mono_domain_get (), name.release, error);
        }
 #endif
-       return mono_string_new (mono_domain_get (), "0.0.0.0");
+       return mono_string_new_handle (mono_domain_get (), "0.0.0.0", error);
 }
 
index de1e917dc8412cc6066f9bc6f8301aa0250c21e4..beece6709d74432af8e3a942362a6dcc9305986d 100644 (file)
@@ -230,12 +230,16 @@ MonoException *
 mono_exception_from_name_msg (MonoImage *image, const char *name_space,
                              const char *name, const char *msg)
 {
+       MonoError error;
        MonoException *ex;
 
        ex = mono_exception_from_name (image, name_space, name);
 
-       if (msg)
-               MONO_OBJECT_SETREF (ex, message, mono_string_new (mono_object_get_domain ((MonoObject*)ex), msg));
+       if (msg) {
+               MonoString  *msg_str = mono_string_new_checked (mono_object_get_domain ((MonoObject*)ex), msg, &error);
+               mono_error_assert_ok (&error);
+               MONO_OBJECT_SETREF (ex, message, msg_str);
+       }
 
        return ex;
 }
@@ -430,9 +434,14 @@ mono_get_exception_array_type_mismatch ()
 MonoException *
 mono_get_exception_type_load (MonoString *class_name, char *assembly_name)
 {
-       MonoString *s = assembly_name ? mono_string_new (mono_domain_get (), assembly_name) : mono_string_new (mono_domain_get (), "");
-
        MonoError error;
+       MonoString *s = NULL;
+       if (assembly_name) {
+               s = mono_string_new_checked (mono_domain_get (), assembly_name, &error);
+               mono_error_assert_ok (&error);
+       } else
+               s = mono_string_empty (mono_domain_get ());
+
        MonoException *ret = mono_exception_from_name_two_strings_checked (mono_get_corlib (), "System",
                                                                   "TypeLoadException", class_name, s, &error);
        mono_error_assert_ok (&error);
@@ -470,10 +479,12 @@ mono_get_exception_not_supported (const char *msg)
 MonoException *
 mono_get_exception_missing_method (const char *class_name, const char *member_name)
 {
-       MonoString *s1 = mono_string_new (mono_domain_get (), class_name);
-       MonoString *s2 = mono_string_new (mono_domain_get (), member_name);
-
        MonoError error;
+       MonoString *s1 = mono_string_new_checked (mono_domain_get (), class_name, &error);
+       mono_error_assert_ok (&error);
+       MonoString *s2 = mono_string_new_checked (mono_domain_get (), member_name, &error);
+       mono_error_assert_ok (&error);
+
        MonoException *ret = mono_exception_from_name_two_strings_checked (mono_get_corlib (), "System",
                                                                           "MissingMethodException", s1, s2, &error);
        mono_error_assert_ok (&error);
@@ -489,10 +500,12 @@ mono_get_exception_missing_method (const char *class_name, const char *member_na
 MonoException *
 mono_get_exception_missing_field (const char *class_name, const char *member_name)
 {
-       MonoString *s1 = mono_string_new (mono_domain_get (), class_name);
-       MonoString *s2 = mono_string_new (mono_domain_get (), member_name);
-
        MonoError error;
+       MonoString *s1 = mono_string_new_checked (mono_domain_get (), class_name, &error);
+       mono_error_assert_ok (&error);
+       MonoString *s2 = mono_string_new_checked (mono_domain_get (), member_name, &error);
+       mono_error_assert_ok (&error);
+
        MonoException *ret = mono_exception_from_name_two_strings_checked (mono_get_corlib (), "System",
                                                                   "MissingFieldException", s1, s2, &error);
        mono_error_assert_ok (&error);
@@ -513,8 +526,11 @@ mono_get_exception_argument_null (const char *arg)
                mono_get_corlib (), "System", "ArgumentNullException");
 
        if (arg) {
+               MonoError error;
                MonoArgumentException *argex = (MonoArgumentException *)ex;
-               MONO_OBJECT_SETREF (argex, param_name, mono_string_new (mono_object_get_domain ((MonoObject*)ex), arg));
+               MonoString *arg_str = mono_string_new_checked (mono_object_get_domain ((MonoObject*)ex), arg, &error);
+               mono_error_assert_ok (&error);
+               MONO_OBJECT_SETREF (argex, param_name, arg_str);
        }
        
        return ex;
@@ -534,8 +550,11 @@ mono_get_exception_argument (const char *arg, const char *msg)
                mono_get_corlib (), "System", "ArgumentException", msg);
 
        if (arg) {
+               MonoError error;
                MonoArgumentException *argex = (MonoArgumentException *)ex;
-               MONO_OBJECT_SETREF (argex, param_name, mono_string_new (mono_object_get_domain ((MonoObject*)ex), arg));
+               MonoString *arg_str = mono_string_new_checked (mono_object_get_domain ((MonoObject*)ex), arg, &error);
+               mono_error_assert_ok (&error);
+               MONO_OBJECT_SETREF (argex, param_name, arg_str);
        }
        
        return ex;
@@ -555,8 +574,11 @@ mono_get_exception_argument_out_of_range (const char *arg)
                mono_get_corlib (), "System", "ArgumentOutOfRangeException");
 
        if (arg) {
+               MonoError error;
                MonoArgumentException *argex = (MonoArgumentException *)ex;
-               MONO_OBJECT_SETREF (argex, param_name, mono_string_new (mono_object_get_domain ((MonoObject*)ex), arg));
+               MonoString *arg_str = mono_string_new_checked (mono_object_get_domain ((MonoObject*)ex), arg, &error);
+               mono_error_assert_ok (&error);
+               MONO_OBJECT_SETREF (argex, param_name, arg_str);
        }
        
        return ex;
@@ -610,9 +632,13 @@ mono_get_exception_file_not_found (MonoString *fname)
 MonoException *
 mono_get_exception_file_not_found2 (const char *msg, MonoString *fname)
 {
-       MonoString *s = msg ? mono_string_new (mono_domain_get (), msg) : NULL;
-
        MonoError error;
+       MonoString *s = NULL;
+       if (msg) {
+               s = mono_string_new_checked (mono_domain_get (), msg, &error);
+               mono_error_assert_ok (&error);
+       }
+
        MonoException *ret = mono_exception_from_name_two_strings_checked (
                mono_get_corlib (), "System.IO", "FileNotFoundException", s, fname, &error);
        mono_error_assert_ok (&error);
@@ -647,6 +673,8 @@ mono_get_exception_type_initialization_checked (const gchar *type_name, MonoExce
        MonoMethod *method;
        gpointer iter;
 
+       error_init (error);
+
        klass = mono_class_load_from_name (mono_get_corlib (), "System", "TypeInitializationException");
 
        mono_class_init (klass);
@@ -663,7 +691,9 @@ mono_get_exception_type_initialization_checked (const gchar *type_name, MonoExce
        }
        g_assert (method);
 
-       args [0] = mono_string_new (mono_domain_get (), type_name);
+       MonoString *type_name_str = mono_string_new_checked (mono_domain_get (), type_name, error);
+       mono_error_assert_ok (error);
+       args [0] = type_name_str;
        args [1] = inner;
 
        exc = mono_object_new_checked (mono_domain_get (), klass, error);
@@ -727,9 +757,14 @@ mono_get_exception_bad_image_format (const char *msg)
 MonoException *
 mono_get_exception_bad_image_format2 (const char *msg, MonoString *fname)
 {
-       MonoString *s = msg ? mono_string_new (mono_domain_get (), msg) : NULL;
-
        MonoError error;
+       MonoString *s = NULL;
+
+       if (msg) {
+               s = mono_string_new_checked (mono_domain_get (), msg, &error);
+               mono_error_assert_ok (&error);
+       }
+
        MonoException *ret = mono_exception_from_name_two_strings_checked (
                mono_get_corlib (), "System", "BadImageFormatException", s, fname, &error);
        mono_error_assert_ok (&error);
index aed76449e25eadd617289b36a17779772fc8f6da..159a2537bcbf05459238ba5491a5a46be6816946 100644 (file)
@@ -111,12 +111,15 @@ ves_icall_System_IO_FAMW_InternalFAMNextEvent (gpointer conn,
                                               gint *code,
                                               gint *reqnum)
 {
+       MonoError error;
        FAMEvent ev;
 
        if (FAMNextEvent (conn, &ev) == 1) {
-               *filename = mono_string_new (mono_domain_get (), ev.filename);
+               *filename = mono_string_new_checked (mono_domain_get (), ev.filename, &error);
                *code = ev.code;
                *reqnum = ev.fr.reqnum;
+               if (mono_error_set_pending_exception (&error))
+                       return FALSE;
                return TRUE;
        }
 
index ffe47f32cc59129e2730581bcee5d907e44a3f25..111ed39e6ba610289e1faf69a43f336f05e0a4da 100644 (file)
@@ -845,7 +845,9 @@ finalizer_thread (gpointer unused)
        MonoError error;
        gboolean wait = TRUE;
 
-       mono_thread_set_name_internal (mono_thread_internal_current (), mono_string_new (mono_get_root_domain (), "Finalizer"), FALSE, FALSE, &error);
+       MonoString *finalizer = mono_string_new_checked (mono_get_root_domain (), "Finalizer", &error);
+       mono_error_assert_ok (&error);
+       mono_thread_set_name_internal (mono_thread_internal_current (), finalizer, FALSE, FALSE, &error);
        mono_error_assert_ok (&error);
 
        /* Register a hazard free queue pump callback */
index 84b6a4d24fbf2a1428cb377f9bc3dbeebf43a1eb..37e349224a428c2191141a2526e34edae54000f3 100644 (file)
@@ -172,11 +172,11 @@ ICALL(CLRCONFIG_1, "CheckThrowUnobservedTaskExceptions", ves_icall_System_CLRCon
 
 ICALL_TYPE(DEFAULTC, "System.Configuration.DefaultConfig", DEFAULTC_1)
 HANDLES(ICALL(DEFAULTC_1, "get_bundled_machine_config", ves_icall_System_Configuration_DefaultConfig_get_bundled_machine_config))
-ICALL(DEFAULTC_2, "get_machine_config_path", ves_icall_System_Configuration_DefaultConfig_get_machine_config_path)
+HANDLES(ICALL(DEFAULTC_2, "get_machine_config_path", ves_icall_System_Configuration_DefaultConfig_get_machine_config_path))
 
 /* Note that the below icall shares the same function as DefaultConfig uses */
 ICALL_TYPE(INTCFGHOST, "System.Configuration.InternalConfigurationHost", INTCFGHOST_1)
-ICALL(INTCFGHOST_1, "get_bundled_app_config", get_bundled_app_config)
+HANDLES(ICALL(INTCFGHOST_1, "get_bundled_app_config", ves_icall_System_Configuration_InternalConfigurationHost_get_bundled_app_config))
 HANDLES(ICALL(INTCFGHOST_2, "get_bundled_machine_config", ves_icall_System_Configuration_InternalConfigurationHost_get_bundled_machine_config))
 
 ICALL_TYPE(CONSOLE, "System.ConsoleDriver", CONSOLE_1)
@@ -267,19 +267,19 @@ ICALL(ENV_2, "GetCommandLineArgs", ves_icall_System_Environment_GetCommandLineAr
 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 )
-ICALL(ENV_5, "GetMachineConfigPath", ves_icall_System_Configuration_DefaultConfig_get_machine_config_path)
-ICALL(ENV_51, "GetNewLine", ves_icall_System_Environment_get_NewLine)
-ICALL(ENV_6, "GetOSVersionString", ves_icall_System_Environment_GetOSVersionString)
+HANDLES(ICALL(ENV_5, "GetMachineConfigPath", ves_icall_System_Configuration_DefaultConfig_get_machine_config_path))
+HANDLES(ICALL(ENV_51, "GetNewLine", ves_icall_System_Environment_get_NewLine))
+HANDLES(ICALL(ENV_6, "GetOSVersionString", ves_icall_System_Environment_GetOSVersionString))
 ICALL(ENV_6a, "GetPageSize", mono_pagesize)
-ICALL(ENV_7, "GetWindowsFolderPath", ves_icall_System_Environment_GetWindowsFolderPath)
+HANDLES(ICALL(ENV_7, "GetWindowsFolderPath", ves_icall_System_Environment_GetWindowsFolderPath))
 ICALL(ENV_8, "InternalSetEnvironmentVariable", ves_icall_System_Environment_InternalSetEnvironmentVariable)
 ICALL(ENV_9, "get_ExitCode", mono_environment_exitcode_get)
 ICALL(ENV_10, "get_HasShutdownStarted", ves_icall_System_Environment_get_HasShutdownStarted)
-ICALL(ENV_11, "get_MachineName", ves_icall_System_Environment_get_MachineName)
+HANDLES(ICALL(ENV_11, "get_MachineName", ves_icall_System_Environment_get_MachineName))
 ICALL(ENV_13, "get_Platform", ves_icall_System_Environment_get_Platform)
 ICALL(ENV_14, "get_ProcessorCount", mono_cpu_count)
 ICALL(ENV_15, "get_TickCount", ves_icall_System_Environment_get_TickCount)
-ICALL(ENV_16, "get_UserName", ves_icall_System_Environment_get_UserName)
+HANDLES(ICALL(ENV_16, "get_UserName", ves_icall_System_Environment_get_UserName))
 HANDLES(ICALL(ENV_16b, "get_bundled_machine_config", ves_icall_System_Environment_get_bundled_machine_config))
 ICALL(ENV_16m, "internalBroadcastSettingChange", ves_icall_System_Environment_BroadcastSettingChange)
 HANDLES(ICALL(ENV_17, "internalGetEnvironmentVariable_native", ves_icall_System_Environment_GetEnvironmentVariable_native))
@@ -317,7 +317,7 @@ ICALL(CULDATA_2, "fill_number_data", ves_icall_System_Globalization_CultureData_
 ICALL_TYPE(CULINF, "System.Globalization.CultureInfo", CULINF_5)
 ICALL(CULINF_5, "construct_internal_locale_from_lcid", ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_lcid)
 ICALL(CULINF_6, "construct_internal_locale_from_name", ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_name)
-ICALL(CULINF_7, "get_current_locale_name", ves_icall_System_Globalization_CultureInfo_get_current_locale_name)
+HANDLES(ICALL(CULINF_7, "get_current_locale_name", ves_icall_System_Globalization_CultureInfo_get_current_locale_name))
 ICALL(CULINF_9, "internal_get_cultures", ves_icall_System_Globalization_CultureInfo_internal_get_cultures)
 //ICALL(CULINF_10, "internal_is_lcid_neutral", ves_icall_System_Globalization_CultureInfo_internal_is_lcid_neutral)
 
@@ -700,7 +700,7 @@ ICALL(MARSHAL_48, "IsComObject", ves_icall_System_Runtime_InteropServices_Marsha
 ICALL(MARSHAL_12, "OffsetOf", ves_icall_System_Runtime_InteropServices_Marshal_OffsetOf)
 ICALL(MARSHAL_13, "Prelink", ves_icall_System_Runtime_InteropServices_Marshal_Prelink)
 ICALL(MARSHAL_14, "PrelinkAll", ves_icall_System_Runtime_InteropServices_Marshal_PrelinkAll)
-ICALL(MARSHAL_15, "PtrToStringAnsi(intptr)", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringAnsi)
+HANDLES(ICALL(MARSHAL_15, "PtrToStringAnsi(intptr)", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringAnsi))
 ICALL(MARSHAL_16, "PtrToStringAnsi(intptr,int)", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringAnsi_len)
 ICALL(MARSHAL_17, "PtrToStringBSTR", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringBSTR)
 ICALL(MARSHAL_18, "PtrToStringUni(intptr)", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringUni)
@@ -869,7 +869,7 @@ ICALL(STRING_10, "InternalIntern", ves_icall_System_String_InternalIntern)
 ICALL(STRING_11, "InternalIsInterned", ves_icall_System_String_InternalIsInterned)
 
 ICALL_TYPE(TENC, "System.Text.EncodingHelper", TENC_1)
-ICALL(TENC_1, "InternalCodePage", ves_icall_System_Text_EncodingHelper_InternalCodePage)
+HANDLES(ICALL(TENC_1, "InternalCodePage", ves_icall_System_Text_EncodingHelper_InternalCodePage))
 
 ICALL_TYPE(UNORM, "System.Text.Normalization", UNORM_1)
 ICALL(UNORM_1, "load_normalization_resource", ves_icall_System_Text_Normalization_load_normalization_resource)
@@ -1050,8 +1050,8 @@ ICALL(VALUET_1, "InternalEquals", ves_icall_System_ValueType_Equals)
 ICALL(VALUET_2, "InternalGetHashCode", ves_icall_System_ValueType_InternalGetHashCode)
 
 ICALL_TYPE(WEBIC, "System.Web.Util.ICalls", WEBIC_1)
-ICALL(WEBIC_1, "GetMachineConfigPath", ves_icall_System_Configuration_DefaultConfig_get_machine_config_path)
-ICALL(WEBIC_2, "GetMachineInstallDirectory", ves_icall_System_Web_Util_ICalls_get_machine_install_dir)
+HANDLES(ICALL(WEBIC_1, "GetMachineConfigPath", ves_icall_System_Configuration_DefaultConfig_get_machine_config_path))
+HANDLES(ICALL(WEBIC_2, "GetMachineInstallDirectory", ves_icall_System_Web_Util_ICalls_get_machine_install_dir))
 HANDLES(ICALL(WEBIC_3, "GetUnmanagedResourcesPtr", ves_icall_get_resources_ptr))
 
 #ifndef DISABLE_COM
index 62af7edbdf5a6a7f9b809f5cc0af855b3422f679..60cca8316b0ae31da8f794ecc075c71558cdae13 100644 (file)
@@ -23,26 +23,26 @@ mono_icall_get_file_path_prefix (const gchar *path);
 gpointer
 mono_icall_module_get_hinstance (MonoReflectionModuleHandle module);
 
-MonoString *
-mono_icall_get_machine_name (void);
+MonoStringHandle
+mono_icall_get_machine_name (MonoError *error);
 
 int
 mono_icall_get_platform (void);
 
-MonoString *
-mono_icall_get_new_line (void);
+MonoStringHandle
+mono_icall_get_new_line (MonoError *error);
 
 MonoBoolean
 mono_icall_is_64bit_os (void);
 
 MonoArray *
-mono_icall_get_environment_variable_names (void);
+mono_icall_get_environment_variable_names (MonoError *error);
 
 void
 mono_icall_set_environment_variable (MonoString *name, MonoString *value);
 
-MonoString *
-mono_icall_get_windows_folder_path (int folder);
+MonoStringHandle
+mono_icall_get_windows_folder_path (int folder, MonoError *error);
 
 void
 mono_icall_broadcast_setting_change (void);
index 92b8d76e089566d24afdbac215f99b5f4e3fc659..2708e90e26e5b2d2faa2c0f53e1606de13f66efe 100644 (file)
 #include <windows.h>
 #include "mono/metadata/icall-windows-internals.h"
 
-MonoString *
-mono_icall_get_machine_name (void)
+MonoStringHandle
+mono_icall_get_machine_name (MonoError *error)
 {
        g_unsupported_api ("GetComputerName");
-       return mono_string_new (mono_domain_get (), "mono");
+       return mono_string_new_handle (mono_domain_get (), "mono", error);
 }
 
-MonoString *
-mono_icall_get_windows_folder_path (int folder)
+MonoStringHandle
+mono_icall_get_windows_folder_path (int folder, MonoError *error)
 {
+       error_init (error);
        g_unsupported_api ("SHGetFolderPath");
-       return mono_string_new (mono_domain_get (), "");
+       return mono_string_new_handle (mono_domain_get (), "", error);
 }
 
 MonoArray *
index c0b1d314d9189e72cb8534913a59edb9f0dc792d..21a759157c08641bc2d5cfdcac05f8ebd6c738ca 100644 (file)
@@ -46,22 +46,21 @@ mono_icall_module_get_hinstance (MonoReflectionModuleHandle module)
 }
 
 #if G_HAVE_API_SUPPORT(HAVE_CLASSIC_WINAPI_SUPPORT)
-MonoString *
-mono_icall_get_machine_name (void)
+MonoStringHandle
+mono_icall_get_machine_name (MonoError *error)
 {
        gunichar2 *buf;
        guint32 len;
-       MonoString *result;
+       MonoStringHandle result;
 
        len = MAX_COMPUTERNAME_LENGTH + 1;
        buf = g_new (gunichar2, len);
 
        result = NULL;
        if (GetComputerName (buf, (PDWORD) &len)) {
-               MonoError error;
-               result = mono_string_new_utf16_checked (mono_domain_get (), buf, len, &error);
-               mono_error_set_pending_exception (&error);
-       }
+               result = mono_string_new_utf16_handle (mono_domain_get (), buf, len, error);
+       } else
+               result = MONO_HANDLE_NEW (MonoString, NULL);
 
        g_free (buf);
        return result;
@@ -75,10 +74,11 @@ mono_icall_get_platform (void)
        return 2;
 }
 
-MonoString *
-mono_icall_get_new_line (void)
+MonoStringHandle
+mono_icall_get_new_line (MonoError *error)
 {
-       return mono_string_new (mono_domain_get (), "\r\n");
+       error_init (error);
+       return mono_string_new_handle (mono_domain_get (), "\r\n", error);
 }
 
 MonoBoolean
@@ -96,9 +96,8 @@ mono_icall_is_64bit_os (void)
 }
 
 MonoArray *
-mono_icall_get_environment_variable_names (void)
+mono_icall_get_environment_variable_names (MonoError *error)
 {
-       MonoError error;
        MonoArray *names;
        MonoDomain *domain;
        MonoString *str;
@@ -107,6 +106,7 @@ mono_icall_get_environment_variable_names (void)
        WCHAR* equal_str;
        int n = 0;
 
+       error_init (error);
        env_strings = GetEnvironmentStrings();
 
        if (env_strings) {
@@ -122,9 +122,8 @@ mono_icall_get_environment_variable_names (void)
        }
 
        domain = mono_domain_get ();
-       names = mono_array_new_checked (domain, mono_defaults.string_class, n, &error);
-       if (mono_error_set_pending_exception (&error))
-               return NULL;
+       names = mono_array_new_checked (domain, mono_defaults.string_class, n, error);
+       return_val_if_nok (error, NULL);
 
        if (env_strings) {
                n = 0;
@@ -134,9 +133,9 @@ mono_icall_get_environment_variable_names (void)
                        if (*env_string != '=') {
                                equal_str = wcschr(env_string, '=');
                                g_assert(equal_str);
-                               str = mono_string_new_utf16_checked (domain, env_string, (gint32)(equal_str - env_string), &error);
-                               if (mono_error_set_pending_exception (&error))
-                                       return NULL;
+                               str = mono_string_new_utf16_checked (domain, env_string, (gint32)(equal_str - env_string), error);
+                               if (!is_ok (error))
+                                       goto cleanup;
 
                                mono_array_setref (names, n, str);
                                n++;
@@ -146,9 +145,13 @@ mono_icall_get_environment_variable_names (void)
                        env_string++;
                }
 
-               FreeEnvironmentStrings (env_strings);
        }
 
+cleanup:
+       if (env_strings)
+               FreeEnvironmentStrings (env_strings);
+       if (!is_ok (error))
+               return NULL;
        return names;
 }
 
@@ -173,9 +176,10 @@ mono_icall_set_environment_variable (MonoString *name, MonoString *value)
 }
 
 #if G_HAVE_API_SUPPORT(HAVE_CLASSIC_WINAPI_SUPPORT)
-MonoString *
-mono_icall_get_windows_folder_path (int folder)
+MonoStringHandle
+mono_icall_get_windows_folder_path (int folder, MonoError *error)
 {
+       error_init (error);
        #ifndef CSIDL_FLAG_CREATE
                #define CSIDL_FLAG_CREATE       0x8000
        #endif
@@ -186,12 +190,9 @@ mono_icall_get_windows_folder_path (int folder)
                int len = 0;
                while (path [len])
                        ++ len;
-               MonoError error;
-               MonoString *res = mono_string_new_utf16_checked (mono_domain_get (), path, len, &error);
-               mono_error_set_pending_exception (&error);
-               return res;
+               return mono_string_new_utf16_handle (mono_domain_get (), path, len, error);
        }
-       return mono_string_new (mono_domain_get (), "");
+       return mono_string_new_handle (mono_domain_get (), "", error);
 }
 #endif /* G_HAVE_API_SUPPORT(HAVE_CLASSIC_WINAPI_SUPPORT) */
 
index 9e1c7903d7899d3bc32fd9bdacb06e389c81a5ad..33376d734921926e39e1d9b1611ccb1bea606cd8 100644 (file)
 #include <sys/utsname.h>
 #endif
 
-extern MonoString* ves_icall_System_Environment_GetOSVersionString (void);
+extern MonoStringHandle ves_icall_System_Environment_GetOSVersionString (MonoError *error);
 
 ICALL_EXPORT MonoReflectionAssemblyHandle ves_icall_System_Reflection_Assembly_GetCallingAssembly (MonoError *error);
 
@@ -6415,19 +6415,21 @@ ves_icall_Remoting_RealProxy_InternalGetProxyType (MonoTransparentProxy *tp)
 
 /* System.Environment */
 
-MonoString*
-ves_icall_System_Environment_get_UserName (void)
+MonoStringHandle
+ves_icall_System_Environment_get_UserName (MonoError *error)
 {
+       error_init (error);
        /* using glib is more portable */
-       return mono_string_new (mono_domain_get (), g_get_user_name ());
+       return mono_string_new_handle (mono_domain_get (), g_get_user_name (), error);
 }
 
 #ifndef HOST_WIN32
-static MonoString *
-mono_icall_get_machine_name (void)
+static MonoStringHandle
+mono_icall_get_machine_name (MonoError *error)
 {
+       error_init (error);
 #if !defined(DISABLE_SOCKETS)
-       MonoString *result;
+       MonoStringHandle result;
        char *buf;
        int n;
 #if defined _SC_HOST_NAME_MAX
@@ -6439,22 +6441,23 @@ mono_icall_get_machine_name (void)
        
        if (gethostname (buf, n) == 0){
                buf [n] = 0;
-               result = mono_string_new (mono_domain_get (), buf);
+               result = mono_string_new_handle (mono_domain_get (), buf, error);
        } else
-               result = NULL;
+               result = MONO_HANDLE_CAST (MonoString, NULL_HANDLE);
        g_free (buf);
        
        return result;
 #else
-       return mono_string_new (mono_domain_get (), "mono");
+       return mono_string_new_handle (mono_domain_get (), "mono", error);
 #endif
 }
 #endif /* !HOST_WIN32 */
 
-ICALL_EXPORT MonoString *
-ves_icall_System_Environment_get_MachineName (void)
+ICALL_EXPORT MonoStringHandle
+ves_icall_System_Environment_get_MachineName (MonoError *error)
 {
-       return mono_icall_get_machine_name ();
+       error_init (error);
+       return mono_icall_get_machine_name (error);
 }
 
 #ifndef HOST_WIN32
@@ -6485,17 +6488,18 @@ ves_icall_System_Environment_get_Platform (void)
 }
 
 #ifndef HOST_WIN32
-static inline MonoString *
-mono_icall_get_new_line (void)
+static inline MonoStringHandle
+mono_icall_get_new_line (MonoError *error)
 {
-       return mono_string_new (mono_domain_get (), "\n");
+       error_init (error);
+       return mono_string_new_handle (mono_domain_get (), "\n", error);
 }
 #endif /* !HOST_WIN32 */
 
-ICALL_EXPORT MonoString *
-ves_icall_System_Environment_get_NewLine (void)
+ICALL_EXPORT MonoStringHandle
+ves_icall_System_Environment_get_NewLine (MonoError *error)
 {
-       return mono_icall_get_new_line ();
+       return mono_icall_get_new_line (error);
 }
 
 #ifndef HOST_WIN32
@@ -6576,29 +6580,32 @@ ves_icall_System_Environment_GetCommandLineArgs (void)
 
 #ifndef HOST_WIN32
 static MonoArray *
-mono_icall_get_environment_variable_names (void)
+mono_icall_get_environment_variable_names (MonoError *error)
 {
-       MonoError error;
        MonoArray *names;
        MonoDomain *domain;
        MonoString *str;
        gchar **e, **parts;
        int n;
 
+       error_init (error);
        n = 0;
        for (e = environ; *e != 0; ++ e)
                ++ n;
 
        domain = mono_domain_get ();
-       names = mono_array_new_checked (domain, mono_defaults.string_class, n, &error);
-       if (mono_error_set_pending_exception (&error))
-               return NULL;
+       names = mono_array_new_checked (domain, mono_defaults.string_class, n, error);
+       return_val_if_nok (error, NULL);
 
        n = 0;
        for (e = environ; *e != 0; ++ e) {
                parts = g_strsplit (*e, "=", 2);
                if (*parts != 0) {
-                       str = mono_string_new (domain, *parts);
+                       str = mono_string_new_checked (domain, *parts, error);
+                       if (!is_ok (error)) {
+                               g_strfreev (parts);
+                               return NULL;
+                       }
                        mono_array_setref (names, n, str);
                }
 
@@ -6614,7 +6621,10 @@ mono_icall_get_environment_variable_names (void)
 ICALL_EXPORT MonoArray *
 ves_icall_System_Environment_GetEnvironmentVariableNames (void)
 {
-       return mono_icall_get_environment_variable_names ();
+       MonoError error;
+       MonoArray *result = mono_icall_get_environment_variable_names (&error);
+       mono_error_set_pending_exception (&error);
+       return result;
 }
 
 #ifndef HOST_WIN32
@@ -6683,18 +6693,19 @@ ves_icall_System_Environment_GetGacPath (MonoError *error)
 }
 
 #ifndef HOST_WIN32
-static inline MonoString *
-mono_icall_get_windows_folder_path (int folder)
+static inline MonoStringHandle
+mono_icall_get_windows_folder_path (int folder, MonoError *error)
 {
+       error_init (error);
        g_warning ("ves_icall_System_Environment_GetWindowsFolderPath should only be called on Windows!");
-       return mono_string_new (mono_domain_get (), "");
+       return mono_string_new_handle (mono_domain_get (), "", error);
 }
 #endif /* !HOST_WIN32 */
 
-ICALL_EXPORT MonoString*
-ves_icall_System_Environment_GetWindowsFolderPath (int folder)
+ICALL_EXPORT MonoStringHandle
+ves_icall_System_Environment_GetWindowsFolderPath (int folder, MonoError *error)
 {
-       return mono_icall_get_windows_folder_path (folder);
+       return mono_icall_get_windows_folder_path (folder, error);
 }
 
 #if G_HAVE_API_SUPPORT(HAVE_CLASSIC_WINAPI_SUPPORT)
@@ -6811,9 +6822,10 @@ static const char *encodings [] = {
  * 1 at entry, and we can not compute a suitable code page number,
  * returns the code page as a string
  */
-ICALL_EXPORT MonoString*
-ves_icall_System_Text_EncodingHelper_InternalCodePage (gint32 *int_code_page
+ICALL_EXPORT MonoStringHandle
+ves_icall_System_Text_EncodingHelper_InternalCodePage (gint32 *int_code_page, MonoError *error)
 {
+       error_init (error);
        const char *cset;
        const char *p;
        char *c;
@@ -6855,9 +6867,9 @@ ves_icall_System_Text_EncodingHelper_InternalCodePage (gint32 *int_code_page)
        g_free (codepage);
        
        if (want_name && *int_code_page == -1)
-               return mono_string_new (mono_domain_get (), cset);
+               return mono_string_new_handle (mono_domain_get (), cset, error);
        else
-               return NULL;
+               return MONO_HANDLE_CAST (MonoString, NULL_HANDLE);
 }
 
 ICALL_EXPORT MonoBoolean
@@ -7085,53 +7097,54 @@ ves_icall_RuntimeMethodHandle_GetFunctionPointer (MonoMethod *method)
        return result;
 }
 
-ICALL_EXPORT MonoString *
-ves_icall_System_Configuration_DefaultConfig_get_machine_config_path (void)
+ICALL_EXPORT MonoStringHandle
+ves_icall_System_Configuration_DefaultConfig_get_machine_config_path (MonoError *error)
 {
-       MonoString *mcpath;
+       error_init (error);
        gchar *path;
 
        path = g_build_path (G_DIR_SEPARATOR_S, mono_get_config_dir (), "mono", mono_get_runtime_info ()->framework_version, "machine.config", NULL);
 
        mono_icall_make_platform_path (path);
 
-       mcpath = mono_string_new (mono_domain_get (), path);
+       MonoStringHandle mcpath = mono_string_new_handle (mono_domain_get (), path, error);
        g_free (path);
 
-       g_assert (mcpath);
+       mono_error_assert_ok (error);
 
        return mcpath;
 }
 
-/* this is an icall */
-static MonoString *
-get_bundled_app_config (void)
+static MonoStringHandle
+ves_icall_System_Configuration_InternalConfigurationHost_get_bundled_app_config (MonoError *error)
 {
-       MonoError error;
+       error_init (error);
        const gchar *app_config;
        MonoDomain *domain;
-       MonoString *file;
        gchar *config_file_name, *config_file_path;
        gsize len, config_file_path_length, config_ext_length;
        gchar *module;
 
        domain = mono_domain_get ();
-       file = domain->setup->configuration_file;
-       if (!file || file->length == 0)
+       MonoStringHandle file = MONO_HANDLE_NEW (MonoString, domain->setup->configuration_file);
+       if (MONO_HANDLE_IS_NULL (file) || MONO_HANDLE_GETVAL (file, length) == 0)
                return NULL;
 
        // Retrieve config file and remove the extension
-       config_file_name = mono_string_to_utf8_checked (file, &error);
-       if (mono_error_set_pending_exception (&error))
-               return NULL;
+       config_file_name = mono_string_handle_to_utf8 (file, error);
+       return_val_if_nok (error, MONO_HANDLE_CAST (MonoString, NULL_HANDLE));
+
        config_file_path = mono_portability_find_file (config_file_name, TRUE);
        if (!config_file_path)
                config_file_path = config_file_name;
 
        config_file_path_length = strlen (config_file_path);
        config_ext_length = strlen (".config");
-       if (config_file_path_length <= config_ext_length)
-               return NULL;
+       if (config_file_path_length <= config_ext_length) {
+               if (config_file_name != config_file_path)
+                       g_free (config_file_name);
+               return MONO_HANDLE_CAST (MonoString, NULL_HANDLE);
+       }
 
        len = config_file_path_length - config_ext_length;
        module = (gchar *)g_malloc0 (len + 1);
@@ -7145,9 +7158,9 @@ get_bundled_app_config (void)
        g_free (config_file_path);
 
        if (!app_config)
-               return NULL;
+               return MONO_HANDLE_CAST (MonoString, NULL_HANDLE);
 
-       return mono_string_new (mono_domain_get (), app_config);
+       return mono_string_new_handle (mono_domain_get (), app_config, error);
 }
 
 static MonoStringHandle
@@ -7183,17 +7196,17 @@ ves_icall_System_Configuration_InternalConfigurationHost_get_bundled_machine_con
 }
 
 
-ICALL_EXPORT MonoString *
-ves_icall_System_Web_Util_ICalls_get_machine_install_dir (void)
+ICALL_EXPORT MonoStringHandle
+ves_icall_System_Web_Util_ICalls_get_machine_install_dir (MonoError *error)
 {
-       MonoString *ipath;
+       error_init (error);
        gchar *path;
 
        path = g_path_get_dirname (mono_get_config_dir ());
 
        mono_icall_make_platform_path (path);
 
-       ipath = mono_string_new (mono_domain_get (), path);
+       MonoStringHandle ipath = mono_string_new_handle (mono_domain_get (), path, error);
        g_free (path);
 
        return ipath;
index c3800d5325fbc6e599fe7188b4150a52ee78b0e4..205fae8f031919017fbbdc109f1f41edd5c8d230 100644 (file)
@@ -133,8 +133,11 @@ create_names_array_idx (const guint16 *names, int ml, MonoError *error)
        ret = mono_array_new_cached (mono_domain_get (), mono_get_string_class (), ml, error);
        return_val_if_nok (error, NULL);
 
-       for(i = 0; i < ml; i++)
-               mono_array_setref (ret, i, mono_string_new (domain, dtidx2string (names [i])));
+       for(i = 0; i < ml; i++) {
+               MonoString *s = mono_string_new_checked (domain, dtidx2string (names [i]), error);
+               return_val_if_nok (error, NULL);
+               mono_array_setref (ret, i, s);
+       }
 
        return ret;
 }
@@ -162,8 +165,11 @@ create_names_array_idx_dynamic (const guint16 *names, int ml, MonoError *error)
        ret = mono_array_new_cached (mono_domain_get (), mono_get_string_class (), len, error);
        return_val_if_nok (error, NULL);
 
-       for(i = 0; i < len; i++)
-               mono_array_setref (ret, i, mono_string_new (domain, pattern2string (names [i])));
+       for(i = 0; i < len; i++) {
+               MonoString *s = mono_string_new_checked (domain, pattern2string (names [i]), error);
+               return_val_if_nok (error, NULL);
+               mono_array_setref (ret, i, s);
+       }
 
        return ret;
 }
@@ -193,7 +199,9 @@ ves_icall_System_Globalization_CalendarData_fill_calendar_data (MonoCalendarData
 
        domain = mono_domain_get ();
 
-       MONO_OBJECT_SETREF (this_obj, NativeName, mono_string_new (domain, idx2string (ci->nativename)));
+       MonoString *native_name = mono_string_new_checked (domain, idx2string (ci->nativename), &error);
+       return_val_and_set_pending_if_nok (&error, FALSE);
+       MONO_OBJECT_SETREF (this_obj, NativeName, native_name);
        MonoArray *short_date_patterns = create_names_array_idx_dynamic (dfe->short_date_patterns,
                                                                         NUM_SHORT_DATE_PATTERNS, &error);
        return_val_and_set_pending_if_nok (&error, FALSE);
@@ -208,7 +216,9 @@ ves_icall_System_Globalization_CalendarData_fill_calendar_data (MonoCalendarData
        return_val_and_set_pending_if_nok (&error, FALSE);
        MONO_OBJECT_SETREF (this_obj, LongDatePatterns, long_date_patterns);
 
-       MONO_OBJECT_SETREF (this_obj, MonthDayPattern, mono_string_new (domain, pattern2string (dfe->month_day_pattern)));
+       MonoString *month_day_pattern = mono_string_new_checked (domain, pattern2string (dfe->month_day_pattern), &error);
+       return_val_and_set_pending_if_nok (&error, FALSE);
+       MONO_OBJECT_SETREF (this_obj, MonthDayPattern, month_day_pattern);
 
        MonoArray *day_names = create_names_array_idx (dfe->day_names, NUM_DAYS, &error);
        return_val_and_set_pending_if_nok (&error, FALSE);
@@ -257,9 +267,17 @@ ves_icall_System_Globalization_CultureData_fill_culture_data (MonoCultureData *t
 
        domain = mono_domain_get ();
 
-       MONO_OBJECT_SETREF (this_obj, AMDesignator, mono_string_new (domain, idx2string (dfe->am_designator)));
-       MONO_OBJECT_SETREF (this_obj, PMDesignator, mono_string_new (domain, idx2string (dfe->pm_designator)));
-       MONO_OBJECT_SETREF (this_obj, TimeSeparator, mono_string_new (domain, idx2string (dfe->time_separator)));
+#define SET_STR(obj,field,domain,expr,err) do {                                \
+               MonoString *_tmp_str = mono_string_new_checked ((domain), (expr), (err)); \
+               if (mono_error_set_pending_exception ((err)))           \
+                       return;                                         \
+               MONO_OBJECT_SETREF((obj), field, _tmp_str);             \
+       } while (0)
+
+       SET_STR (this_obj, AMDesignator, domain, idx2string (dfe->am_designator), &error);
+       SET_STR (this_obj, PMDesignator, domain, idx2string (dfe->pm_designator), &error);
+       SET_STR (this_obj, TimeSeparator, domain, idx2string (dfe->time_separator), &error);
+#undef SET_STR
 
        MonoArray *long_time_patterns = create_names_array_idx_dynamic (dfe->long_time_patterns,
                                                                        NUM_LONG_TIME_PATTERNS, &error);
@@ -290,10 +308,17 @@ ves_icall_System_Globalization_CultureData_fill_number_data (MonoNumberFormatInf
        domain = mono_domain_get ();
 
        number->currencyDecimalDigits = nfe->currency_decimal_digits;
-       MONO_OBJECT_SETREF (number, currencyDecimalSeparator, mono_string_new (domain,
-                       idx2string (nfe->currency_decimal_separator)));
-       MONO_OBJECT_SETREF (number, currencyGroupSeparator, mono_string_new (domain,
-                       idx2string (nfe->currency_group_separator)));
+
+#define SET_STR(obj,field,domain,expr,err) do {                                \
+               MonoString *_tmp_str = mono_string_new_checked ((domain), (expr), (err)); \
+               if (mono_error_set_pending_exception ((err)))           \
+                       return;                                         \
+               MONO_OBJECT_SETREF((obj), field, _tmp_str);             \
+       } while (0)
+
+       SET_STR (number, currencyDecimalSeparator, domain, idx2string (nfe->currency_decimal_separator), &error);
+       SET_STR (number, currencyGroupSeparator, domain, idx2string (nfe->currency_group_separator), &error);
+
        MonoArray *currency_sizes_arr = create_group_sizes_array (nfe->currency_group_sizes,
                                                                  GROUP_SIZE, &error);
        if (mono_error_set_pending_exception (&error))
@@ -301,15 +326,14 @@ ves_icall_System_Globalization_CultureData_fill_number_data (MonoNumberFormatInf
        MONO_OBJECT_SETREF (number, currencyGroupSizes, currency_sizes_arr);
        number->currencyNegativePattern = nfe->currency_negative_pattern;
        number->currencyPositivePattern = nfe->currency_positive_pattern;
-       MONO_OBJECT_SETREF (number, currencySymbol, mono_string_new (domain, idx2string (nfe->currency_symbol)));
-       MONO_OBJECT_SETREF (number, naNSymbol, mono_string_new (domain, idx2string (nfe->nan_symbol)));
-       MONO_OBJECT_SETREF (number, negativeInfinitySymbol, mono_string_new (domain,
-                       idx2string (nfe->negative_infinity_symbol)));
-       MONO_OBJECT_SETREF (number, negativeSign, mono_string_new (domain, idx2string (nfe->negative_sign)));
+
+       SET_STR (number, currencySymbol, domain, idx2string (nfe->currency_symbol), &error);
+       SET_STR (number, naNSymbol, domain, idx2string (nfe->nan_symbol), &error);
+       SET_STR (number, negativeInfinitySymbol, domain, idx2string (nfe->negative_infinity_symbol), &error);
+       SET_STR (number, negativeSign, domain, idx2string (nfe->negative_sign), &error);
        number->numberDecimalDigits = nfe->number_decimal_digits;
-       MONO_OBJECT_SETREF (number, numberDecimalSeparator, mono_string_new (domain,
-                       idx2string (nfe->number_decimal_separator)));
-       MONO_OBJECT_SETREF (number, numberGroupSeparator, mono_string_new (domain, idx2string (nfe->number_group_separator)));
+       SET_STR (number, numberDecimalSeparator, domain, idx2string (nfe->number_decimal_separator), &error);
+       SET_STR (number, numberGroupSeparator, domain, idx2string (nfe->number_group_separator), &error);
        MonoArray *number_sizes_arr = create_group_sizes_array (nfe->number_group_sizes,
                                                                GROUP_SIZE, &error);
        if (mono_error_set_pending_exception (&error))
@@ -318,11 +342,11 @@ ves_icall_System_Globalization_CultureData_fill_number_data (MonoNumberFormatInf
        number->numberNegativePattern = nfe->number_negative_pattern;
        number->percentNegativePattern = nfe->percent_negative_pattern;
        number->percentPositivePattern = nfe->percent_positive_pattern;
-       MONO_OBJECT_SETREF (number, percentSymbol, mono_string_new (domain, idx2string (nfe->percent_symbol)));
-       MONO_OBJECT_SETREF (number, perMilleSymbol, mono_string_new (domain, idx2string (nfe->per_mille_symbol)));
-       MONO_OBJECT_SETREF (number, positiveInfinitySymbol, mono_string_new (domain,
-                       idx2string (nfe->positive_infinity_symbol)));
-       MONO_OBJECT_SETREF (number, positiveSign, mono_string_new (domain, idx2string (nfe->positive_sign)));
+       SET_STR (number, percentSymbol, domain, idx2string (nfe->percent_symbol), &error);
+       SET_STR (number, perMilleSymbol, domain, idx2string (nfe->per_mille_symbol), &error);
+       SET_STR (number, positiveInfinitySymbol, domain, idx2string (nfe->positive_infinity_symbol), &error);
+       SET_STR (number, positiveSign, domain, idx2string (nfe->positive_sign), &error);
+#undef SET_STR
 }
 
 static MonoBoolean
@@ -333,16 +357,24 @@ construct_culture (MonoCultureInfo *this_obj, const CultureInfoEntry *ci, MonoEr
        error_init (error);
 
        this_obj->lcid = ci->lcid;
-       MONO_OBJECT_SETREF (this_obj, name, mono_string_new (domain, idx2string (ci->name)));
-       MONO_OBJECT_SETREF (this_obj, englishname, mono_string_new (domain, idx2string (ci->englishname)));
-       MONO_OBJECT_SETREF (this_obj, nativename, mono_string_new (domain, idx2string (ci->nativename)));
-       MONO_OBJECT_SETREF (this_obj, win3lang, mono_string_new (domain, idx2string (ci->win3lang)));
-       MONO_OBJECT_SETREF (this_obj, iso3lang, mono_string_new (domain, idx2string (ci->iso3lang)));
-       MONO_OBJECT_SETREF (this_obj, iso2lang, mono_string_new (domain, idx2string (ci->iso2lang)));
+
+#define SET_STR(obj,field,domain,expr,err) do {                                \
+               MonoString *_tmp_str = mono_string_new_checked ((domain), (expr), (err)); \
+               return_val_if_nok (err, FALSE);                         \
+               MONO_OBJECT_SETREF((obj), field, _tmp_str);             \
+       } while (0)
+
+       SET_STR (this_obj, name, domain, idx2string (ci->name), error);
+       SET_STR (this_obj, englishname, domain, idx2string (ci->englishname), error);
+       SET_STR (this_obj, nativename, domain, idx2string (ci->nativename), error);
+       SET_STR (this_obj, win3lang, domain, idx2string (ci->win3lang), error);
+       SET_STR (this_obj, iso3lang, domain, idx2string (ci->iso3lang), error);
+       SET_STR (this_obj, iso2lang, domain, idx2string (ci->iso2lang), error);
 
        // It's null for neutral cultures
-       if (ci->territory > 0)
-               MONO_OBJECT_SETREF (this_obj, territory, mono_string_new (domain, idx2string (ci->territory)));
+       if (ci->territory > 0) {
+               SET_STR (this_obj, territory, domain, idx2string (ci->territory), error);
+       }
 
        MonoArray *native_calendar_names = create_names_array_idx (ci->native_calendar_names, NUM_CALENDARS, error);
        return_val_if_nok (error, FALSE);
@@ -352,26 +384,37 @@ construct_culture (MonoCultureInfo *this_obj, const CultureInfoEntry *ci, MonoEr
        this_obj->number_index = ci->number_format_index;
        this_obj->calendar_type = ci->calendar_type;
        this_obj->text_info_data = &ci->text_info;
+#undef SET_STR
        
        return TRUE;
 }
 
 static MonoBoolean
-construct_region (MonoRegionInfo *this_obj, const RegionInfoEntry *ri)
+construct_region (MonoRegionInfo *this_obj, const RegionInfoEntry *ri, MonoError *error)
 {
        MonoDomain *domain = mono_domain_get ();
 
+       error_init (error);
+
+#define SET_STR(obj,field,domain,expr,err) do {                                \
+               MonoString *_tmp_str = mono_string_new_checked ((domain), (expr), (err)); \
+               return_val_if_nok (err, FALSE);                         \
+               MONO_OBJECT_SETREF((obj), field, _tmp_str);             \
+       } while (0)
+
        this_obj->geo_id = ri->geo_id;
-       MONO_OBJECT_SETREF (this_obj, iso2name, mono_string_new (domain, idx2string (ri->iso2name)));
-       MONO_OBJECT_SETREF (this_obj, iso3name, mono_string_new (domain, idx2string (ri->iso3name)));
-       MONO_OBJECT_SETREF (this_obj, win3name, mono_string_new (domain, idx2string (ri->win3name)));
-       MONO_OBJECT_SETREF (this_obj, english_name, mono_string_new (domain, idx2string (ri->english_name)));
-       MONO_OBJECT_SETREF (this_obj, native_name, mono_string_new (domain, idx2string (ri->native_name)));
-       MONO_OBJECT_SETREF (this_obj, currency_symbol, mono_string_new (domain, idx2string (ri->currency_symbol)));
-       MONO_OBJECT_SETREF (this_obj, iso_currency_symbol, mono_string_new (domain, idx2string (ri->iso_currency_symbol)));
-       MONO_OBJECT_SETREF (this_obj, currency_english_name, mono_string_new (domain, idx2string (ri->currency_english_name)));
-       MONO_OBJECT_SETREF (this_obj, currency_native_name, mono_string_new (domain, idx2string (ri->currency_native_name)));
+       SET_STR (this_obj, iso2name, domain, idx2string (ri->iso2name), error);
+       SET_STR (this_obj, iso3name, domain, idx2string (ri->iso3name), error);
+       SET_STR (this_obj, win3name, domain, idx2string (ri->win3name), error);
+       SET_STR (this_obj, english_name, domain, idx2string (ri->english_name), error);
+       SET_STR (this_obj, native_name, domain, idx2string (ri->native_name), error);
+       SET_STR (this_obj, currency_symbol, domain, idx2string (ri->currency_symbol), error);
+       SET_STR (this_obj, iso_currency_symbol, domain, idx2string (ri->iso_currency_symbol), error);
+       SET_STR (this_obj, currency_english_name, domain, idx2string (ri->currency_english_name), error);
+       SET_STR (this_obj, currency_native_name, domain, idx2string (ri->currency_native_name), error);
        
+#undef SET_STR
+
        return TRUE;
 }
 
@@ -538,19 +581,19 @@ get_current_locale_name (void)
        return ret;
 }
 
-MonoString*
-ves_icall_System_Globalization_CultureInfo_get_current_locale_name (void)
+MonoStringHandle
+ves_icall_System_Globalization_CultureInfo_get_current_locale_name (MonoError *error)
 {
+       error_init (error);
        gchar *locale;
-       MonoString* ret;
        MonoDomain *domain;
 
        locale = get_current_locale_name ();
        if (locale == NULL)
-               return NULL;
+               return MONO_HANDLE_CAST (MonoString, NULL_HANDLE);
 
        domain = mono_domain_get ();
-       ret = mono_string_new (domain, locale);
+       MonoStringHandle ret = mono_string_new_handle (domain, locale, error);
        g_free (locale);
 
        return ret;
@@ -620,13 +663,16 @@ MonoBoolean
 ves_icall_System_Globalization_RegionInfo_construct_internal_region_from_lcid (MonoRegionInfo *this_obj,
                gint lcid)
 {
+       MonoError error;
        const RegionInfoEntry *ri;
        
        ri = region_info_entry_from_lcid (lcid);
        if(ri == NULL)
                return FALSE;
 
-       return construct_region (this_obj, ri);
+       MonoBoolean result = construct_region (this_obj, ri, &error);
+       mono_error_set_pending_exception (&error);
+       return result;
 }
 
 MonoBoolean
@@ -650,7 +696,9 @@ ves_icall_System_Globalization_RegionInfo_construct_internal_region_from_name (M
        }
        g_free (n);
 
-       return construct_region (this_obj, &region_entries [ne->region_entry_index]);
+       MonoBoolean result = construct_region (this_obj, &region_entries [ne->region_entry_index], &error);
+       mono_error_set_pending_exception (&error);
+       return result;
 }
 
 MonoArray*
index 774636cf253ac57401d01649adb3bb3a9975ba9b..6987aa316167888695fc6423e8bedaab999854bc 100644 (file)
@@ -31,7 +31,7 @@ extern MonoBoolean ves_icall_System_Globalization_CalendarData_fill_calendar_dat
 extern void ves_icall_System_Globalization_CultureData_fill_culture_data (MonoCultureData *this_obj, gint32 datetime_index);
 extern void ves_icall_System_Globalization_CultureData_fill_number_data (MonoNumberFormatInfo* number, gint32 number_index);
 extern void ves_icall_System_Globalization_CultureInfo_construct_internal_locale (MonoCultureInfo *this_obj, MonoString *locale);
-extern MonoString* ves_icall_System_Globalization_CultureInfo_get_current_locale_name (void);
+extern MonoStringHandle ves_icall_System_Globalization_CultureInfo_get_current_locale_name (MonoError *error);
 extern MonoBoolean ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_lcid (MonoCultureInfo *this_obj, gint lcid);
 extern MonoBoolean ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_name (MonoCultureInfo *this_obj, MonoString *name);
 extern MonoArray *ves_icall_System_Globalization_CultureInfo_internal_get_cultures (MonoBoolean neutral, MonoBoolean specific, MonoBoolean installed);
index 9d6d6c9c860e8853b865bf848ea20f29c167e704..41dded95f02cc1898ebc9fcf4d6ea7eb4f802cd2 100644 (file)
@@ -3253,10 +3253,13 @@ mono_delegate_end_invoke (MonoDelegate *delegate, gpointer *params)
                        if (is_ok (&inner_error)) {
                                char  *tmp;
                                tmp = g_strdup_printf ("%s\nException Rethrown at:\n", strace);
-                               g_free (strace);        
-                               MONO_OBJECT_SETREF (((MonoException*)exc), stack_trace, mono_string_new (domain, tmp));
+                               g_free (strace);
+                               MonoString *tmp_str = mono_string_new_checked (domain, tmp, &inner_error);
                                g_free (tmp);
-                       } else
+                               if (is_ok (&inner_error))
+                                       MONO_OBJECT_SETREF (((MonoException*)exc), stack_trace, tmp_str);
+                       };
+                       if (!is_ok (&inner_error))
                                mono_error_cleanup (&inner_error); /* no stack trace, but at least throw the original exception */
                }
                mono_set_pending_exception ((MonoException*)exc);
@@ -10927,13 +10930,14 @@ ves_icall_System_Runtime_InteropServices_Marshal_copy_from_unmanaged (gpointer s
        memcpy (dest_addr, src, length * element_size);
 }
 
-MonoString *
-ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringAnsi (char *ptr)
+MonoStringHandle
+ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringAnsi (char *ptr, MonoError *error)
 {
+       error_init (error);
        if (ptr == NULL)
-               return NULL;
+               return MONO_HANDLE_CAST (MonoString, NULL_HANDLE);
        else
-               return mono_string_new (mono_domain_get (), ptr);
+               return mono_string_new_handle (mono_domain_get (), ptr, error);
 }
 
 MonoString *
index 2469701a84af4650a5e264645394c6b352616e87..57018b828d41dbe1d0ee050ce98a27161586be3e 100644 (file)
@@ -436,8 +436,8 @@ void
 ves_icall_System_Runtime_InteropServices_Marshal_copy_from_unmanaged (gpointer src, gint32 start_index,
                                                                      MonoArray *dest, gint32 length);
 
-MonoString *
-ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringAnsi (char *ptr);
+MonoStringHandle
+ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringAnsi (char *ptr, MonoError *error);
 
 MonoString *
 ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringAnsi_len (char *ptr, gint32 len);
index 57ae9d3f0d2df6242d3704151aa281894257a2e8..f4ec3e34c2b9a8633eec90b1aa16bf6a02a9b7f6 100644 (file)
@@ -1423,10 +1423,14 @@ mono_perfcounter_category_del (MonoString *name)
        return TRUE;
 }
 
+/* this is an icall */
 MonoString*
 mono_perfcounter_category_help (MonoString *category, MonoString *machine)
 {
+       MonoError error;
+       MonoString *result = NULL;
        const CategoryDesc *cdesc;
+       error_init (&error);
        /* no support for counters on other machines */
        if (mono_string_compare_ascii (machine, "."))
                return NULL;
@@ -1435,9 +1439,15 @@ mono_perfcounter_category_help (MonoString *category, MonoString *machine)
                SharedCategory *scat = find_custom_category (category);
                if (!scat)
                        return NULL;
-               return mono_string_new (mono_domain_get (), custom_category_help (scat));
+               result = mono_string_new_checked (mono_domain_get (), custom_category_help (scat), &error);
+               if (mono_error_set_pending_exception (&error))
+                       return NULL;
+               return result;
        }
-       return mono_string_new (mono_domain_get (), cdesc->help);
+       result = mono_string_new_checked (mono_domain_get (), cdesc->help, &error);
+       if (mono_error_set_pending_exception (&error))
+               return NULL;
+       return result;
 }
 
 /*
@@ -1596,6 +1606,7 @@ mono_perfcounter_instance_exists (MonoString *instance, MonoString *category, Mo
        return FALSE;
 }
 
+/* this is an icall */
 MonoArray*
 mono_perfcounter_category_names (MonoString *machine)
 {
@@ -1620,15 +1631,23 @@ mono_perfcounter_category_names (MonoString *machine)
 
        for (i = 0; i < NUM_CATEGORIES; ++i) {
                const CategoryDesc *cdesc = &predef_categories [i];
-               mono_array_setref (res, i, mono_string_new (domain, cdesc->name));
+               MonoString *name = mono_string_new_checked (domain, cdesc->name, &error);
+               if (!is_ok (&error))
+                       goto leave;
+               mono_array_setref (res, i, name);
        }
        for (tmp = custom_categories; tmp; tmp = tmp->next) {
                SharedCategory *scat = (SharedCategory *)tmp->data;
-               mono_array_setref (res, i, mono_string_new (domain, scat->name));
+               MonoString *name = mono_string_new_checked (domain, scat->name, &error);
+               if (!is_ok (&error))
+                       goto leave;
+               mono_array_setref (res, i, name);
                i++;
        }
+leave:
        perfctr_unlock ();
        g_slist_free (custom_categories);
+       mono_error_set_pending_exception (&error);
        return res;
 }
 
@@ -1654,7 +1673,10 @@ mono_perfcounter_counter_names (MonoString *category, MonoString *machine)
                        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));
+                       MonoString *name = mono_string_new_checked (domain, desc->name, &error);
+                       if (mono_error_set_pending_exception (&error))
+                               return NULL;
+                       mono_array_setref (res, i - cdesc->first_counter, name);
                }
                return res;
        }
@@ -1670,16 +1692,18 @@ mono_perfcounter_counter_names (MonoString *category, MonoString *machine)
                }
 
                for (i = 0; i < scat->num_counters; ++i) {
-                       mono_array_setref (res, i, mono_string_new (domain, p + 1));
+                       MonoString *str = mono_string_new_checked (domain, p + 1, &error);
+                       if (!is_ok (&error))
+                               goto leave;
+                       mono_array_setref (res, i, str);
                        p += 2; /* skip counter type */
                        p += strlen (p) + 1; /* skip counter name */
                        p += strlen (p) + 1; /* skip counter help */
                }
-               perfctr_unlock ();
-               return res;
-       }
+       } else
+               res = mono_array_new_checked (domain, mono_get_string_class (), 0, &error);
+leave:
        perfctr_unlock ();
-       res = mono_array_new_checked (domain, mono_get_string_class (), 0, &error);
        mono_error_set_pending_exception (&error);
        return res;
 }
@@ -1702,9 +1726,11 @@ get_string_array (void **array, int count, gboolean is_process, MonoError *error
                        sprintf (buf, "%d", GPOINTER_TO_INT (array [i]));
                        p = buf;
                }
-               mono_array_setref (res, i, mono_string_new (domain, p));
+               MonoString *str = mono_string_new_checked (domain, p, error);
                if (p != buf)
                        g_free (p);
+               return_val_if_nok (error, NULL);
+               mono_array_setref (res, i, str);
        }
        return res;
 }
@@ -1719,7 +1745,9 @@ get_string_array_of_strings (void **array, int count, MonoError *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));
+               MonoString *str = mono_string_new_checked (domain, p, error);
+               return_val_if_nok (error, NULL);
+               mono_array_setref (res, i, str);
        }
 
        return res;
@@ -1757,7 +1785,9 @@ get_cpu_instances (MonoError *error)
                buf [i] = GINT_TO_POINTER (i - 1); /* -1 => _Total */
        array = get_string_array (buf, count, FALSE, error);
        g_free (buf);
-       mono_array_setref (array, 0, mono_string_new (mono_domain_get (), "_Total"));
+       MonoString *total = mono_string_new_checked (mono_domain_get (), "_Total", error);
+       return_val_if_nok (error, NULL);
+       mono_array_setref (array, 0, total);
        return array;
 }
 
@@ -1806,7 +1836,12 @@ get_custom_instances (MonoString *category, MonoError *error)
                }
                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));
+                       MonoString *str = mono_string_new_checked (mono_domain_get (), inst->instance_name, error);
+                       if (!is_ok (error)) {
+                               g_slist_free (list);
+                               return NULL;
+                       }
+                       mono_array_setref (array, i, str);
                        i++;
                }
                g_slist_free (list);
index e6e397af0ec7cd4bca2b842d3d39b8a6cc3e003e..a35bd562743f5c334749fb692aaba4a99d149e64 100644 (file)
@@ -9,6 +9,7 @@
 
 #if defined(PLATFORM_MACOSX) || defined(PLATFORM_BSD)
 
+#include <config.h>
 #include <sys/socket.h>
 #include <net/if.h>
 #include <net/if_dl.h>
@@ -58,8 +59,10 @@ extern MonoBoolean ves_icall_System_Net_NetworkInformation_MacOsIPInterfacePrope
                return FALSE;
 
        // Second sysctl call to retrieve data into appropriately sized buffer
-       if (sysctl(mib, G_N_ELEMENTS(mib), buf, &needed, NULL, 0) < 0)
+       if (sysctl(mib, G_N_ELEMENTS(mib), buf, &needed, NULL, 0) < 0) {
+               g_free (buf);
                return FALSE;
+       }
 
        lim = buf + needed;
        for (next = buf; next < lim; next += rtm->rtm_msglen) {
@@ -73,7 +76,9 @@ extern MonoBoolean ves_icall_System_Net_NetworkInformation_MacOsIPInterfacePrope
                num_gws++;
        }
 
-       *gw_addr_list = mono_array_new(domain, mono_get_string_class (), num_gws);
+       *gw_addr_list = mono_array_new_checked (domain, mono_get_string_class (), num_gws, &error);
+       if (!is_ok (&error))
+               goto leave;
 
        for (next = buf; next < lim; next += rtm->rtm_msglen) {
                rtm = (struct rt_msghdr *)next;
@@ -99,12 +104,15 @@ extern MonoBoolean ves_icall_System_Net_NetworkInformation_MacOsIPInterfacePrope
                        // snprintf output truncated
                        continue;
 
-               addr_string = mono_string_new (domain, addr);
+               addr_string = mono_string_new_checked (domain, addr, &error);
+               if (!is_ok (&error))
+                       goto leave;
                mono_array_setref (*gw_addr_list, gwnum, addr_string);
                gwnum++;
        }
+leave:
        g_free (buf);
-       return TRUE;
+       return is_ok (&error);
 }
 
 in_addr_t gateway_from_rtm(struct rt_msghdr *rtm)
index d6f269c6e946b25b5f9968512832f726981882b6..7a34c8a1a6186206251169b4a6e0602a3dfa0c98 100644 (file)
@@ -120,7 +120,7 @@ ves_icall_System_Security_Principal_WindowsIdentity_GetTokenName (gpointer token
                result = mono_string_new_utf16_checked (mono_domain_get (), uniname, size, &error);
        }
        else
-               result = mono_string_new (mono_domain_get (), "");
+               result = mono_string_new_checked (mono_domain_get (), "", &error);
 
        if (uniname)
                g_free (uniname);
index d5b40a927b659b1ea2174ba8127f7ea1e8903d51..fe043d0a6bfaa861dc0b37a0ac307dd1bc19381d 100644 (file)
@@ -253,7 +253,7 @@ ves_icall_System_Security_Principal_WindowsIdentity_GetTokenName (gpointer token
                result = mono_string_new_utf16_checked (mono_domain_get (), uniname, size, &error);
        }
        else
-               result = mono_string_new (mono_domain_get (), "");
+               result = mono_string_new_checked (mono_domain_get (), "", &error);
 
        if (uniname)
                g_free (uniname);
index 6c3466099d95879377f875348b1a844ffe66c7b6..92aa723f20a73f61c7ffec75631e46b6ee77ec94 100644 (file)
@@ -3978,8 +3978,11 @@ mono_runtime_get_main_args_checked (MonoError *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]));
+       for (i = 0; i < num_main_args; ++i) {
+               MonoString *arg = mono_string_new_checked (domain, main_args [i], error);
+               return_val_if_nok (error, NULL);
+               mono_array_setref (res, i, arg);
+       }
 
        return res;
 }
@@ -4119,7 +4122,8 @@ prepare_run_main (MonoMethod *method, int argc, char *argv[])
                         * main_args array.
                         */
                        gchar *str = mono_utf8_from_external (argv [i]);
-                       MonoString *arg = mono_string_new (domain, str);
+                       MonoString *arg = mono_string_new_checked (domain, str, &error);
+                       mono_error_assert_ok (&error);
                        mono_array_setref (args, i, arg);
                        g_free (str);
                }
@@ -4592,18 +4596,23 @@ prepare_thread_to_exec_main (MonoDomain *domain, MonoMethod *method)
 
        if (!domain->entry_assembly) {
                gchar *str;
+               MonoError error;
                MonoAssembly *assembly;
 
                assembly = method->klass->image->assembly;
                domain->entry_assembly = assembly;
                /* Domains created from another domain already have application_base and configuration_file set */
                if (domain->setup->application_base == NULL) {
-                       MONO_OBJECT_SETREF (domain->setup, application_base, mono_string_new (domain, assembly->basedir));
+                       MonoString *basedir = mono_string_new_checked (domain, assembly->basedir, &error);
+                       mono_error_assert_ok (&error);
+                       MONO_OBJECT_SETREF (domain->setup, application_base, basedir);
                }
 
                if (domain->setup->configuration_file == NULL) {
                        str = g_strconcat (assembly->image->name, ".config", NULL);
-                       MONO_OBJECT_SETREF (domain->setup, configuration_file, mono_string_new (domain, str));
+                       MonoString *config_file = mono_string_new_checked (domain, str, &error);
+                       mono_error_assert_ok (&error);
+                       MONO_OBJECT_SETREF (domain->setup, configuration_file, config_file);
                        g_free (str);
                        mono_domain_set_options_from_config (domain);
                }
@@ -6254,8 +6263,12 @@ mono_string_new_wrapper (const char *text)
 
        MonoDomain *domain = mono_domain_get ();
 
-       if (text)
-               return mono_string_new (domain, text);
+       if (text) {
+               MonoError error;
+               MonoString *result = mono_string_new_checked (domain, text, &error);
+               mono_error_assert_ok (&error);
+               return result;
+       }
 
        return NULL;
 }
@@ -8086,9 +8099,13 @@ mono_load_remote_field_checked (MonoObject *this_obj, MonoClass *klass, MonoClas
        return_val_if_nok (error, NULL);
 
        full_name = mono_type_get_full_name (klass);
-       mono_array_setref (msg->args, 0, mono_string_new (domain, full_name));
-       mono_array_setref (msg->args, 1, mono_string_new (domain, mono_field_get_name (field)));
+       MonoString *full_name_str = mono_string_new_checked (domain, full_name, error);
        g_free (full_name);
+       return_val_if_nok (error, NULL);
+       mono_array_setref (msg->args, 0, full_name_str);
+       MonoString *field_name = mono_string_new_checked (domain, mono_field_get_name (field), error);
+       return_val_if_nok (error, NULL);
+       mono_array_setref (msg->args, 1, field_name);
 
        mono_remoting_invoke ((MonoObject *)(tp->rp), msg, &exc, &out_args, error);
        return_val_if_nok (error, NULL);
index 3444bb8e34ea924bd6c38b401705de1a29c3b7a4..c439fda2e8073f981d0736b0e82e9ac50a52b931 100644 (file)
@@ -141,6 +141,7 @@ MONO_RT_EXTERNAL_ONLY
 MONO_API MonoString*
 mono_string_intern         (MonoString *str);
 
+MONO_RT_EXTERNAL_ONLY
 MONO_API MonoString*
 mono_string_new                    (MonoDomain *domain, const char *text);
 
index 8405b258498f7ffd5394a80109049d25fdb6e861..44e4b4ea4c1617bfb6763b10c06d931a30e5bbce 100644 (file)
@@ -22,7 +22,7 @@
 G_BEGIN_DECLS
 
 /* System.Environment */
-extern MonoString* ves_icall_System_Environment_get_UserName (void);
+extern MonoStringHandle ves_icall_System_Environment_get_UserName (MonoError *error);
 
 
 /* System.Security.Principal.WindowsIdentity */
index 61e5f5da4ae93f16ab6c008e54a572081b58ec9d..c76dc30a4f4fcd68198f1a44c9b7e5ff825dbfd2 100644 (file)
@@ -519,7 +519,8 @@ mono_reflection_methodbuilder_from_ctor_builder (ReflectionMethodBuilder *rmb, M
        rmb->call_conv = mb->call_conv;
        rmb->code = NULL;
        rmb->type = mb->type;
-       rmb->name = mono_string_new (mono_domain_get (), name);
+       rmb->name = mono_string_new_checked (mono_domain_get (), name, error);
+       return_val_if_nok (error, FALSE);
        rmb->table_idx = &mb->table_idx;
        rmb->init_locals = mb->init_locals;
        rmb->skip_visibility = FALSE;
index 3c0fa3d7f6db0ebda4cd140ae42d6f7a7b60e716..fbdd359394a85ba6bf0883d4a4d2bc46c34df7f5 100644 (file)
@@ -346,7 +346,9 @@ worker_callback (void)
 
                domains_unlock ();
 
-               mono_thread_set_name_internal (thread, mono_string_new (mono_get_root_domain (), "Threadpool worker"), FALSE, TRUE, &error);
+               MonoString *thread_name = mono_string_new_checked (mono_get_root_domain (), "Threadpool worker", &error);
+               mono_error_assert_ok (&error);
+               mono_thread_set_name_internal (thread, thread_name, FALSE, TRUE, &error);
                mono_error_assert_ok (&error);
 
                mono_thread_clr_state (thread, (MonoThreadState)~ThreadState_Background);
index f669790739f01e73ffa05876f24017ea6f16151c..6ae7eaa0c72dcde34e6b49afac8aa7a7ce409048 100644 (file)
@@ -3727,7 +3727,10 @@ mono_threads_get_thread_dump (MonoArray **out_threads, MonoArray **out_stack_fra
                                        sf->il_offset = location->il_offset;
 
                                        if (location && location->source_file) {
-                                               MONO_OBJECT_SETREF (sf, filename, mono_string_new (domain, location->source_file));
+                                               MonoString *filename = mono_string_new_checked (domain, location->source_file, error);
+                                               if (!is_ok (error))
+                                                       goto leave;
+                                               MONO_OBJECT_SETREF (sf, filename, filename);
                                                sf->line = location->row;
                                                sf->column = location->column;
                                        }
index 5c86cee116c5ce180e4fc85fa19efebbde8e3e24..919965c1639ff43e809e0b4373ada759c7126413 100644 (file)
@@ -405,7 +405,10 @@ ves_icall_System_IO_MonoIO_GetFileSystemEntries (MonoString *path,
        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)));
+               MonoString *name = mono_string_new_checked (domain, (const char *)g_ptr_array_index (names, i), &error);
+               if (mono_error_set_pending_exception (&error))
+                       goto leave;
+               mono_array_setref (result, i, name);
                g_free (g_ptr_array_index (names, i));
        }
 leave:
@@ -420,8 +423,9 @@ typedef struct {
 } IncrementalFind;
        
 static gboolean
-incremental_find_check_match (IncrementalFind *handle, WIN32_FIND_DATA *data, MonoString **result)
+incremental_find_check_match (IncrementalFind *handle, WIN32_FIND_DATA *data, MonoString **result, MonoError *error)
 {
+       error_init (error);
        gchar *utf8_result;
        gchar *full_name;
        
@@ -434,8 +438,10 @@ incremental_find_check_match (IncrementalFind *handle, WIN32_FIND_DATA *data, Mo
        
        full_name = g_build_filename (handle->utf8_path, utf8_result, NULL);
        g_free (utf8_result);
-       *result = mono_string_new (mono_domain_get (), full_name);
+       *result = mono_string_new_checked (mono_domain_get (), full_name, error);
        g_free (full_name);
+       if (!is_ok (error))
+               return FALSE;
        
        return TRUE;
 }
@@ -535,7 +541,11 @@ ves_icall_System_IO_MonoIO_FindFirst (MonoString *path,
        ifh->domain = mono_domain_get ();
        *handle = ifh;
 
-       while (incremental_find_check_match (ifh, &data, &result) == 0){
+       while (incremental_find_check_match (ifh, &data, &result, &error) == 0){
+               if (!is_ok (&error)) {
+                       mono_error_set_pending_exception (&error);
+                       return NULL;
+               }
                if (mono_w32file_find_next (find_handle, &data) == FALSE){
                        int e = mono_w32error_get_last ();
                        if (e != ERROR_NO_MORE_FILES)
@@ -544,27 +554,33 @@ ves_icall_System_IO_MonoIO_FindFirst (MonoString *path,
                }
        }
        *result_attr = data.dwFileAttributes;
-       
+
        return result;
 }
 
 /* FIXME make gc suspendable */
 MonoString *
-ves_icall_System_IO_MonoIO_FindNext (gpointer handle, gint32 *result_attr, gint32 *error)
+ves_icall_System_IO_MonoIO_FindNext (gpointer handle, gint32 *result_attr, gint32 *ioerror)
 {
+       MonoError error;
        IncrementalFind *ifh = (IncrementalFind *)handle;
        WIN32_FIND_DATA data;
        MonoString *result;
 
-       *error = ERROR_SUCCESS;
+       error_init (&error);
+       *ioerror = ERROR_SUCCESS;
        do {
+               if (!is_ok (&error)) {
+                       mono_error_set_pending_exception (&error);
+                       return NULL;
+               }
                if (mono_w32file_find_next (ifh->find_handle, &data) == FALSE){
                        int e = mono_w32error_get_last ();
                        if (e != ERROR_NO_MORE_FILES)
-                               *error = e;
+                               *ioerror = e;
                        return NULL;
                }
-       } while (incremental_find_check_match (ifh, &data, &result) == 0);
+       } while (incremental_find_check_match (ifh, &data, &result, &error) == 0);
 
        *result_attr = data.dwFileAttributes;
        return result;
index 8de42cbcdfe7790bba989e07dea89ef79a174ddf..255314f5b604aca7bd904d4bf385eecbd4c83860 100644 (file)
@@ -166,13 +166,14 @@ process_set_field_string (MonoObject *obj, const gchar *fieldname, const gunicha
 }
 
 static void
-process_set_field_string_char (MonoObject *obj, const gchar *fieldname, const gchar *val)
+process_set_field_string_char (MonoObject *obj, const gchar *fieldname, const gchar *val, MonoError *error)
 {
        MonoDomain *domain;
        MonoClass *klass;
        MonoClassField *field;
        MonoString *string;
 
+       error_init (error);
        LOGDEBUG (g_message ("%s: Setting field %s to [%s]", __func__, fieldname, val));
 
        domain = mono_object_domain (obj);
@@ -184,7 +185,8 @@ process_set_field_string_char (MonoObject *obj, const gchar *fieldname, const gc
        field = mono_class_get_field_from_name (klass, fieldname);
        g_assert (field);
 
-       string = mono_string_new (domain, val);
+       string = mono_string_new_checked (domain, val, error);
+       return_if_nok (error);
 
        mono_gc_wbarrier_generic_store (((char *)obj) + field->offset, (MonoObject*)string);
 }
@@ -532,13 +534,16 @@ process_get_module (MonoAssembly *assembly, MonoClass *proc_class, MonoError *er
        filename = g_strdup_printf ("[In Memory] %s", modulename);
 
        process_get_assembly_fileversion (filever, assembly);
-       process_set_field_string_char (filever, "filename", filename);
+       process_set_field_string_char (filever, "filename", filename, error);
+       return_val_if_nok (error, NULL);
        process_set_field_object (item, "version_info", filever);
 
        process_set_field_intptr (item, "baseaddr", assembly->image->raw_data);
        process_set_field_int (item, "memory_size", assembly->image->raw_data_len);
-       process_set_field_string_char (item, "filename", filename);
-       process_set_field_string_char (item, "modulename", modulename);
+       process_set_field_string_char (item, "filename", filename, error);
+       return_val_if_nok (error, NULL);
+       process_set_field_string_char (item, "modulename", modulename, error);
+       return_val_if_nok (error, NULL);
 
        g_free (filename);
 
index 936e9ca908111d1111f5769a00ef9efae533f833..0ce2b04e6258bdf10bcb66305f9285306ea4b134 100644 (file)
@@ -2471,7 +2471,9 @@ addrinfo_to_IPHostEntry (MonoAddressInfo *info, MonoString **h_name, MonoArray *
                                        MonoAddress maddr;
                                        mono_address_init (&maddr, AF_INET, &local_in [i]);
                                        if (mono_networking_addr_to_str (&maddr, addr, sizeof (addr))) {
-                                               addr_string = mono_string_new (domain, addr);
+                                               addr_string = mono_string_new_checked (domain, addr, error);
+                                               if (!is_ok (error))
+                                                       goto leave;
                                                mono_array_setref (*h_addr_list, addr_index, addr_string);
                                                addr_index++;
                                        }
@@ -2486,7 +2488,9 @@ addrinfo_to_IPHostEntry (MonoAddressInfo *info, MonoString **h_name, MonoArray *
                                        MonoAddress maddr;
                                        mono_address_init (&maddr, AF_INET6, &local_in6 [i]);
                                        if (mono_networking_addr_to_str (&maddr, addr, sizeof (addr))) {
-                                               addr_string = mono_string_new (domain, addr);
+                                               addr_string = mono_string_new_checked (domain, addr, error);
+                                               if (!is_ok (error))
+                                                       goto leave;
                                                mono_array_setref (*h_addr_list, addr_index, addr_string);
                                                addr_index++;
                                        }
@@ -2525,19 +2529,23 @@ addrinfo_to_IPHostEntry (MonoAddressInfo *info, MonoString **h_name, MonoArray *
 
                mono_address_init (&maddr, ai->family, &ai->address);
                if (mono_networking_addr_to_str (&maddr, buffer, sizeof (buffer)))
-                       addr_string = mono_string_new (domain, buffer);
+                       addr_string = mono_string_new_checked (domain, buffer, error);
                else
-                       addr_string = mono_string_new (domain, "");
+                       addr_string = mono_string_new_checked (domain, "", error);
+               if (!is_ok (error))
+                       goto leave2;
 
                mono_array_setref (*h_addr_list, addr_index, addr_string);
 
                if (!i) {
                        i++;
                        if (ai->canonical_name != NULL) {
-                               *h_name = mono_string_new (domain, ai->canonical_name);
+                               *h_name = mono_string_new_checked (domain, ai->canonical_name, error);
                        } else {
-                               *h_name = mono_string_new (domain, buffer);
+                               *h_name = mono_string_new_checked (domain, buffer, error);
                        }
+                       if (!is_ok (error))
+                               goto leave2;
                }
 
                addr_index++;
@@ -2669,6 +2677,7 @@ ves_icall_System_Net_Dns_GetHostByAddr_internal (MonoString *addr, MonoString **
 MonoBoolean
 ves_icall_System_Net_Dns_GetHostName_internal (MonoString **h_name)
 {
+       MonoError error;
        gchar hostname [NI_MAXHOST] = { 0 };
        int ret;
 
@@ -2676,7 +2685,8 @@ ves_icall_System_Net_Dns_GetHostName_internal (MonoString **h_name)
        if (ret == -1)
                return FALSE;
 
-       *h_name = mono_string_new (mono_domain_get (), hostname);
+       *h_name = mono_string_new_checked (mono_domain_get (), hostname, &error);
+       mono_error_set_pending_exception (&error);
 
        return TRUE;
 }
index c18f91c9749b6f76e74396ae1d793ac381c416e6..385a4d43dd1622f6ab21ae5f344c0fa4457ced88 100644 (file)
@@ -7931,7 +7931,9 @@ compile_thread_main (gpointer user_data)
 
        MonoError error;
        MonoInternalThread *internal = mono_thread_internal_current ();
-       mono_thread_set_name_internal (internal, mono_string_new (mono_domain_get (), "AOT compiler"), TRUE, FALSE, &error);
+       MonoString *str = mono_string_new_checked (mono_domain_get (), "AOT compiler", &error);
+       mono_error_assert_ok (&error);
+       mono_thread_set_name_internal (internal, str, TRUE, FALSE, &error);
        mono_error_assert_ok (&error);
 
        for (i = 0; i < methods->len; ++i)
index 839494f06f7766108d27c49b61a592c4ff165f43..c639fa9e756e5c095b0e73f81b1c78b94651d6a8 100644 (file)
@@ -7968,13 +7968,19 @@ domain_commands (int command, guint8 *p, guint8 *end, Buffer *buf)
        case CMD_APPDOMAIN_CREATE_STRING: {
                char *s;
                MonoString *o;
+               MonoError error;
 
                domain = decode_domainid (p, &p, end, NULL, &err);
                if (err != ERR_NONE)
                        return err;
                s = decode_string (p, &p, end);
 
-               o = mono_string_new (domain, s);
+               o = mono_string_new_checked (domain, s, &error);
+               if (!is_ok (&error)) {
+                       DEBUG_PRINTF (1, "[dbg] Failed to allocate String object '%s': %s\n", s, mono_error_get_message (&error));
+                       mono_error_cleanup (&error);
+                       return ERR_INVALID_OBJECT;
+               }
                buffer_add_objid (buf, (MonoObject*)o);
                break;
        }
@@ -10141,7 +10147,9 @@ debugger_thread (void *arg)
        debugger_thread_id = mono_native_thread_id_get ();
 
        MonoInternalThread *internal = mono_thread_internal_current ();
-       mono_thread_set_name_internal (internal, mono_string_new (mono_domain_get (), "Debugger agent"), TRUE, FALSE, &error);
+       MonoString *str = mono_string_new_checked (mono_domain_get (), "Debugger agent", &error);
+       mono_error_assert_ok (&error);
+       mono_thread_set_name_internal (internal, str, TRUE, FALSE, &error);
        mono_error_assert_ok (&error);
 
        internal->state |= ThreadState_Background;
index 43aa7219f2311f86aca7307dd2f8a5004ae88210..8719a12994c8e3fa936f5c34277412141aa72953 100644 (file)
@@ -1156,8 +1156,11 @@ load_agent (MonoDomain *domain, char *desc)
 
        if (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));
+               if (main_args) {
+                       MonoString *str = mono_string_new_checked (domain, args, &error);
+                       if (str)
+                               mono_array_set (main_args, MonoString*, 0, str);
+               }
        } else {
                main_args = (MonoArray*)mono_array_new_checked (domain, mono_defaults.string_class, 0, &error);
        }
index 1b74cc75f5eaafedd33bf643f81cc3511d4b8547..790d57fb0d231ade15eefa369ee23c8556df37ad 100644 (file)
@@ -218,7 +218,8 @@ interp_ex_handler (MonoException *ex) {
        if (context == NULL)
                return;
        stack_trace = dump_frame (context->current_frame);
-       ex->stack_trace = mono_string_new (mono_domain_get(), stack_trace);
+       ex->stack_trace = mono_string_new_checked (mono_domain_get(), stack_trace, &error);
+       mono_error_cleanup (&error); /* FIXME: don't swallow the error */
        g_free (stack_trace);
        if (context->current_env == NULL || strcmp(ex->object.vtable->klass->name, "ExecutionEngineException") == 0) {
                char *strace = mono_string_to_utf8_checked (ex->stack_trace, &error);
@@ -561,9 +562,11 @@ stackval_to_data (MonoType *type, stackval *val, char *data, gboolean pinvoke)
 static void
 fill_in_trace (MonoException *exception, MonoInvocation *frame)
 {
+       MonoError error;
        char *stack_trace = dump_frame (frame);
        MonoDomain *domain = mono_domain_get();
-       (exception)->stack_trace = mono_string_new (domain, stack_trace);
+       (exception)->stack_trace = mono_string_new_checked (domain, stack_trace, &error);
+       mono_error_cleanup (&error); /* FIXME: don't swallow the error */
        (exception)->trace_ips = get_trace_ips (domain, frame);
        g_free (stack_trace);
 }
@@ -5120,8 +5123,10 @@ interp_ves_icall_get_frame_info (gint32 skip, MonoBoolean need_file_info,
        if (need_file_info) {
                if (column)
                        *column = 0;
-               if (file)
-                       *file = mono_string_new (mono_domain_get (), "unknown");
+               if (file) {
+                       *file = mono_string_new_checked (mono_domain_get (), "unknown", &error);
+                       mono_error_cleanup (&error); /* FIXME: don't swallow the error */
+               }
        }
 
        return TRUE;
@@ -5168,7 +5173,11 @@ interp_ves_icall_get_trace (MonoException *exc, gint32 skip, MonoBoolean need_fi
                        
                        filename = mono_debug_source_location_from_address (ji->method, sf->native_offset, &sf->line, domain);
 
-                       sf->filename = filename? mono_string_new (domain, filename): NULL;
+                       sf->filename = NULL;
+                       if (filename) {
+                               sf->filename = mono_string_new_checked (domain, filename, &error);
+                               mono_error_cleanup (&error); /* FIXME: don't swallow the error */
+                       }
                        sf->column = 0;
 
                        g_free (filename);
index 57b669fb9e12c050c044e67d9ec183f17f8aaeaa..a7c086cf08915480d65356d2a17021afa9f89f45 100644 (file)
@@ -898,8 +898,13 @@ ves_icall_get_trace (MonoException *exc, gint32 skip, MonoBoolean need_file_info
 
                        sf->method = NULL;
                        s = mono_method_get_name_full (method, TRUE, FALSE, MONO_TYPE_NAME_FORMAT_REFLECTION);
-                       MONO_OBJECT_SETREF (sf, internal_method_name, mono_string_new (domain, s));
+                       MonoString *name = mono_string_new_checked (domain, s, &error);
                        g_free (s);
+                       if (!is_ok (&error)) {
+                               mono_error_set_pending_exception (&error);
+                               return NULL;
+                       }
+                       MONO_OBJECT_SETREF (sf, internal_method_name, name);
                }
                else {
                        MonoReflectionMethod *rm = mono_method_get_object_checked (domain, method, NULL, &error);
@@ -932,7 +937,12 @@ ves_icall_get_trace (MonoException *exc, gint32 skip, MonoBoolean need_file_info
 
                if (need_file_info) {
                        if (location && location->source_file) {
-                               MONO_OBJECT_SETREF (sf, filename, mono_string_new (domain, location->source_file));
+                               MonoString *filename = mono_string_new_checked (domain, location->source_file, &error);
+                               if (!is_ok (&error)) {
+                                       mono_error_set_pending_exception (&error);
+                                       return NULL;
+                               }
+                               MONO_OBJECT_SETREF (sf, filename, filename);
                                sf->line = location->row;
                                sf->column = location->column;
                        } else {
@@ -1264,7 +1274,12 @@ ves_icall_get_frame_info (gint32 skip, MonoBoolean need_file_info,
 
        if (need_file_info) {
                if (location) {
-                       mono_gc_wbarrier_generic_store (file, (MonoObject*) mono_string_new (domain, location->source_file));
+                       MonoString *filename = mono_string_new_checked (domain, location->source_file, &error);
+                       if (!is_ok (&error)) {
+                               mono_error_set_pending_exception (&error);
+                               return FALSE;
+                       }
+                       mono_gc_wbarrier_generic_store (file, (MonoObject*)filename);
                        *line = location->row;
                        *column = location->column;
                } else {
@@ -1775,7 +1790,9 @@ mono_handle_exception_internal (MonoContext *ctx, MonoObject *obj, gboolean resu
        g_assert (ctx != NULL);
        if (!obj) {
                MonoException *ex = mono_get_exception_null_reference ();
-               MONO_OBJECT_SETREF (ex, message, mono_string_new (domain, "Object reference not set to an instance of an object"));
+               MonoString *msg = mono_string_new_checked (domain, "Object reference not set to an instance of an object", &error);
+               mono_error_assert_ok (&error);
+               MONO_OBJECT_SETREF (ex, message, msg);
                obj = (MonoObject *)ex;
        } 
 
@@ -1820,18 +1837,26 @@ mono_handle_exception_internal (MonoContext *ctx, MonoObject *obj, gboolean resu
                        char *from_name = mono_type_get_full_name (jit_tls->class_cast_from);
                        char *to_name = mono_type_get_full_name (jit_tls->class_cast_to);
                        char *msg = g_strdup_printf ("Unable to cast object of type '%s' to type '%s'.", from_name, to_name);
-                       mono_ex->message = mono_string_new (domain, msg);
+                       mono_ex->message = mono_string_new_checked (domain, msg, &error);
                        g_free (from_name);
                        g_free (to_name);
+                       if (!is_ok (&error)) {
+                               mono_runtime_printf_err ("Error creating class cast exception message '%s'\n", msg);
+                               mono_error_assert_ok (&error);
+                       }
                        g_free (msg);
                }
                if (!strcmp (mono_ex->object.vtable->klass->name, "ArrayTypeMismatchException")) {
                        char *from_name = mono_type_get_full_name (jit_tls->class_cast_from);
                        char *to_name = mono_type_get_full_name (jit_tls->class_cast_to);
                        char *msg = g_strdup_printf ("Source array of type '%s' cannot be cast to destination array type '%s'.", from_name, to_name);
-                       mono_ex->message = mono_string_new (domain, msg);
+                       mono_ex->message = mono_string_new_checked (domain, msg, &error);
                        g_free (from_name);
                        g_free (to_name);
+                       if (!is_ok (&error)) {
+                               mono_runtime_printf_err ("Error creating array type mismatch exception message '%s'\n", msg);
+                               mono_error_assert_ok (&error);
+                       }
                        g_free (msg);
                }
        }
index 2f83c8357d5281cba7d9699683d10907425241d0..06fd8a7ffce5505dd13a44e9b499e66d27719791 100644 (file)
@@ -541,20 +541,30 @@ mono_error_set_not_verifiable (MonoError *oerror, MonoMethod *method, const char
 }
 
 
+/* Used by mono_error_prepare_exception - it sets its own error on mono_string_new_checked failure. */
+static MonoString*
+string_new_cleanup (MonoDomain *domain, const char *text)
+{
+       MonoError ignored_err;
+       MonoString *result = mono_string_new_checked (domain, text, &ignored_err);
+       mono_error_cleanup (&ignored_err);
+       return result;
+}
+
 static MonoString*
 get_type_name_as_mono_string (MonoErrorInternal *error, MonoDomain *domain, MonoError *error_out)
 {
        MonoString* res = NULL;
 
        if (error->type_name) {
-               res = mono_string_new (domain, error->type_name);
+               res = string_new_cleanup (domain, error->type_name);
                
        } else {
                MonoClass *klass = get_class (error);
                if (klass) {
                        char *name = mono_type_full_name (&klass->byval_arg);
                        if (name) {
-                               res = mono_string_new (domain, name);
+                               res = string_new_cleanup (domain, name);
                                g_free (name);
                        }
                }
@@ -567,7 +577,7 @@ get_type_name_as_mono_string (MonoErrorInternal *error, MonoDomain *domain, Mono
 static void
 set_message_on_exception (MonoException *exception, MonoErrorInternal *error, MonoError *error_out)
 {
-       MonoString *msg = mono_string_new (mono_domain_get (), error->full_message);
+       MonoString *msg = string_new_cleanup (mono_domain_get (), error->full_message);
        if (msg)
                MONO_OBJECT_SETREF (exception, message, msg);
        else
@@ -596,7 +606,7 @@ mono_error_prepare_exception (MonoError *oerror, MonoError *error_out)
                        if (!mono_error_ok (error_out))
                                break;
 
-                       method_name = mono_string_new (domain, error->member_name);
+                       method_name = string_new_cleanup (domain, error->member_name);
                        if (!method_name) {
                                mono_error_set_out_of_memory (error_out, "Could not allocate method name");
                                break;
@@ -616,7 +626,7 @@ mono_error_prepare_exception (MonoError *oerror, MonoError *error_out)
                        if (!mono_error_ok (error_out))
                                break;
                        
-                       field_name = mono_string_new (domain, error->member_name);
+                       field_name = string_new_cleanup (domain, error->member_name);
                        if (!field_name) {
                                mono_error_set_out_of_memory (error_out, "Could not allocate field name");
                                break;
@@ -637,7 +647,7 @@ mono_error_prepare_exception (MonoError *oerror, MonoError *error_out)
                                break;
 
                        if (error->assembly_name) {
-                               assembly_name = mono_string_new (domain, error->assembly_name);
+                               assembly_name = string_new_cleanup (domain, error->assembly_name);
                                if (!assembly_name) {
                                        mono_error_set_out_of_memory (error_out, "Could not allocate assembly name");
                                        break;
@@ -655,14 +665,14 @@ mono_error_prepare_exception (MonoError *oerror, MonoError *error_out)
        case MONO_ERROR_FILE_NOT_FOUND:
        case MONO_ERROR_BAD_IMAGE:
                if (error->assembly_name) {
-                       msg = mono_string_new (domain, error->full_message);
+                       msg = string_new_cleanup (domain, error->full_message);
                        if (!msg) {
                                mono_error_set_out_of_memory (error_out, "Could not allocate message");
                                break;
                        }
 
                        if (error->assembly_name) {
-                               assembly_name = mono_string_new (domain, error->assembly_name);
+                               assembly_name = string_new_cleanup (domain, error->assembly_name);
                                if (!assembly_name) {
                                        mono_error_set_out_of_memory (error_out, "Could not allocate assembly name");
                                        break;