-static MonoString*
-empty_string (MonoDomain *domain)
-{
- MonoVTable *vtable = mono_class_vtable (domain, mono_defaults.string_class);
- MonoObject *o;
- static MonoClassField *empty_field = NULL;
-
- if (!empty_field) {
- MonoClassField *field;
- gpointer iter;
-
- iter = NULL;
- while ((field = mono_class_get_fields (mono_defaults.string_class, &iter))) {
- if (!strcmp (field->name, "Empty"))
- break;
- }
-
- g_assert (field);
- empty_field = field;
- }
-
- mono_field_static_get_value (vtable, empty_field, &o);
- g_assert (o);
- return (MonoString*)o;
-}
-
-MonoString *
-ves_icall_System_String_ctor_charp (gpointer dummy, gunichar2 *value)
-{
- gint32 i, length;
- MonoDomain *domain;
-
- MONO_ARCH_SAVE_REGS;
-
- domain = mono_domain_get ();
-
- if (value == NULL)
- return empty_string (domain);
-
- for (i = 0; *(value + i) != '\0'; i++);
- length = i;
-
- return mono_string_new_utf16 (domain, value, length);
-}
-
-MonoString *
-ves_icall_System_String_ctor_char_int (gpointer dummy, gunichar2 value, gint32 count)
-{
- MonoDomain *domain;
- MonoString *res;
- gunichar2 *chars;
- gint32 i;
-
- MONO_ARCH_SAVE_REGS;
-
- if (count < 0)
- mono_raise_exception (mono_get_exception_argument_out_of_range ("count"));
-
- domain = mono_domain_get ();
- res = mono_string_new_size (domain, count);
-
- chars = mono_string_chars (res);
- for (i = 0; i < count; i++)
- chars [i] = value;
-
- return res;
-}
-
-MonoString *
-ves_icall_System_String_ctor_charp_int_int (gpointer dummy, gunichar2 *value, gint32 sindex, gint32 length)
-{
- gunichar2 *begin;
- MonoDomain * domain;
-
- MONO_ARCH_SAVE_REGS;
-
- domain = mono_domain_get ();
-
- if ((value == NULL) && (length != 0))
- mono_raise_exception (mono_get_exception_argument_out_of_range ("Out of range"));
-
- if ((sindex < 0) || (length < 0))
- mono_raise_exception (mono_get_exception_argument_out_of_range ("Out of range"));
-
- if (length == 0)
- return empty_string (domain);
-
- begin = (gunichar2 *) (value + sindex);
-
- return mono_string_new_utf16 (domain, begin, length);
-}
-
-MonoString *
-ves_icall_System_String_ctor_sbytep (gpointer dummy, gint8 *value)
-{
- MonoDomain *domain;
-
- MONO_ARCH_SAVE_REGS;
-
- domain = mono_domain_get ();
-
- if (NULL == value)
- return empty_string (domain);
-
- return mono_string_new (domain, (const char *) value);
-}
-
-MonoString *
-ves_icall_System_String_ctor_sbytep_int_int (gpointer dummy, gint8 *value, gint32 sindex, gint32 length)
-{
- guchar *begin;
- MonoDomain *domain;
- MonoString *res;
- gunichar2 *chars;
- int i;
-
- MONO_ARCH_SAVE_REGS;
-
- domain = mono_domain_get ();
-
- if ((value == NULL) && (length != 0))
- mono_raise_exception (mono_get_exception_argument_out_of_range ("Out of range"));
-
- if ((sindex < 0) || (length < 0))
- mono_raise_exception (mono_get_exception_argument_out_of_range ("Out of range"));
-
- begin = (guchar *) (value + sindex);
- res = mono_string_new_size (domain, length);
- chars = mono_string_chars (res);
- for (i = 0; i < length; ++i)
- chars [i] = begin [i];
-
- return res;
-}
-
-MonoString *
-ves_icall_System_String_ctor_chara (gpointer dummy, MonoArray *value)
-{
- MonoDomain *domain;
-
- MONO_ARCH_SAVE_REGS;
-
- domain = mono_domain_get ();
-
- if (value == NULL)
- return mono_string_new_utf16 (domain, NULL, 0);
- else
- return mono_string_new_utf16 (domain, (gunichar2 *) mono_array_addr(value, gunichar2, 0), value->max_length);
-}
-
-MonoString *
-ves_icall_System_String_ctor_chara_int_int (gpointer dummy, MonoArray *value,
- gint32 sindex, gint32 length)
-{
- MonoDomain *domain;
-
- MONO_ARCH_SAVE_REGS;
-
- if (value == NULL)
- mono_raise_exception (mono_get_exception_argument_null ("value"));
- if (sindex < 0)
- mono_raise_exception (mono_get_exception_argument_out_of_range ("startIndex"));
- if (length < 0)
- mono_raise_exception (mono_get_exception_argument_out_of_range ("length"));
- if (sindex + length > mono_array_length (value))
- mono_raise_exception (mono_get_exception_argument_out_of_range ("Out of range"));
-
- domain = mono_domain_get ();
-
- return mono_string_new_utf16 (domain, (gunichar2 *) mono_array_addr(value, gunichar2, sindex), length);
-}
-
-MonoString *
-ves_icall_System_String_ctor_encoding (gpointer dummy, gint8 *value, gint32 sindex,
- gint32 length, MonoObject *enc)
-{
- MonoArray *arr;
- MonoString *s;
- MonoObject *exc;
- MonoDomain *domain = mono_domain_get ();
- MonoMethod *get_string;
- gpointer args [1];
- MonoClass *klass;
-
- MONO_ARCH_SAVE_REGS;
-
- if ((value == NULL) || (length == 0))
- return mono_string_new_size (mono_domain_get (), 0);
- if (enc == NULL)
- mono_raise_exception (mono_get_exception_argument_null ("enc"));
- if (sindex < 0)
- mono_raise_exception (mono_get_exception_argument_out_of_range ("startIndex"));
- if (length < 0)
- mono_raise_exception (mono_get_exception_argument_out_of_range ("length"));
-
- arr = mono_array_new (domain, mono_defaults.byte_class, length);
- memcpy (mono_array_addr (arr, guint8, 0), value + sindex, length);
-
- /* Find the System.Text.Encoding class */
- for (klass = enc->vtable->klass; klass->parent->parent != NULL; klass = klass->parent)
- ;
-
- get_string = mono_class_get_method_from_name (klass, "GetString", 1);
- args [0] = arr;
- s = (MonoString*)mono_runtime_invoke (get_string, enc, args, &exc);
- if (!s || exc)
- mono_raise_exception (mono_get_exception_argument ("", "Unable to decode the array into a valid string."));
-
- return s;
-}
-