}
static MonoStringBuilder *
-mono_string_builder_new (void)
+mono_string_builder_new (int starting_string_length)
{
static MonoClass *string_builder_class;
static MonoMethod *sb_ctor;
static void *args [1];
- static int initial_len;
+ int initial_len = starting_string_length;
+
+ if (initial_len < 0)
+ initial_len = 0;
if (!string_builder_class) {
MonoMethodDesc *desc;
// We make a new array in the _to_builder function, so this
// array will always be garbage collected.
- initial_len = 1;
args [0] = &initial_len;
}
mono_runtime_invoke (sb_ctor, sb, args, &exc);
- g_assert (sb->chunkChars->max_length == initial_len);
+ g_assert (sb->chunkChars->max_length >= initial_len);
g_assert (!exc);
return sb;
static void
mono_string_utf16_to_builder_copy (MonoStringBuilder *sb, gunichar2 *text, size_t string_len)
{
- MonoClass *ac = mono_array_class_get (mono_defaults.char_class, 1);
- g_assert (ac);
- int builder_capacity = mono_string_builder_capacity (sb);
-
- MonoArray* newArray = mono_array_new (mono_domain_get (), mono_defaults.char_class, builder_capacity);
-
- gunichar2 *charDst = (gunichar2 *)newArray->vector;
+ gunichar2 *charDst = (gunichar2 *)sb->chunkChars->vector;
gunichar2 *charSrc = (gunichar2 *)text;
memcpy (charDst, charSrc, sizeof (gunichar2) * string_len);
- MONO_OBJECT_SETREF (sb, chunkChars, newArray);
+ sb->chunkLength = string_len;
return;
}
if (!text)
return NULL;
- MonoStringBuilder *sb = mono_string_builder_new ();
+ int len;
+ for (len = 0; text [len] != 0; ++len);
+
+ MonoStringBuilder *sb = mono_string_builder_new (len);
mono_string_utf16_to_builder (sb, text);
return sb;
int len = strlen (text);
if (len > mono_string_builder_capacity (sb))
len = mono_string_builder_capacity (sb);
+
GError *error = NULL;
- gunichar2* ut = g_utf8_to_utf16 (text, len, NULL, NULL, &error);
+ glong copied;
+ gunichar2* ut = g_utf8_to_utf16 (text, len, NULL, &copied, &error);
if (!error) {
MONO_OBJECT_SETREF (sb, chunkPrevious, NULL);
- mono_string_utf16_to_builder_copy (sb, ut, len);
+ mono_string_utf16_to_builder_copy (sb, ut, copied);
} else
g_error_free (error);
if (!text)
return NULL;
- MonoStringBuilder *sb = mono_string_builder_new ();
+ int len = strlen (text);
+ MonoStringBuilder *sb = mono_string_builder_new (len);
mono_string_utf8_to_builder (sb, text);
return sb;