#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>
}
/* 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;
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);
}
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_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))
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);
#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 *
}
#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;
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
}
MonoArray *
-mono_icall_get_environment_variable_names (void)
+mono_icall_get_environment_variable_names (MonoError *error)
{
- MonoError error;
MonoArray *names;
MonoDomain *domain;
MonoString *str;
WCHAR* equal_str;
int n = 0;
+ error_init (error);
env_strings = GetEnvironmentStrings();
if (env_strings) {
}
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;
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++;
env_string++;
}
- FreeEnvironmentStrings (env_strings);
}
+cleanup:
+ if (env_strings)
+ FreeEnvironmentStrings (env_strings);
+ if (!is_ok (error))
+ return NULL;
return names;
}
}
#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
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) */
#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);
/* 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
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
}
#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
#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);
}
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
}
#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)
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 */