Only allocate 1 empty string instance per AppDomain (#4047)
authorMike Voorhees <mrvoorhe@users.noreply.github.com>
Wed, 30 Nov 2016 21:40:19 +0000 (16:40 -0500)
committerZoltan Varga <vargaz@gmail.com>
Wed, 30 Nov 2016 21:40:19 +0000 (16:40 -0500)
* Reuse a single empty string instance

* Undo string empty change to mono_string_new_size_checked and add new embedding api for string empty instead

mono/metadata/appdomain.c
mono/metadata/domain-internals.h
mono/metadata/object.c
mono/metadata/object.h
msvc/mono.def
msvc/monosgen.def

index 7f62f1ad5562d30504f3deac4a237ba52c0ea3eb..f0fefe4a9f03ee13b69b6015b7fc66a7d5f643e6 100644 (file)
@@ -187,6 +187,7 @@ create_domain_objects (MonoDomain *domain)
        MonoString *empty_str = mono_string_intern_checked (mono_string_new (domain, ""), &error);
        mono_error_assert_ok (&error);
        mono_field_static_set_value (string_vt, string_empty_fld, empty_str);
+       domain->empty_string = empty_str;
 
        /*
         * Create an instance early since we can't do it when there is no memory.
index c07c181157125834dd95541260a0e31ee4bc67f7..25ed47e011220ca46d82ed85978430066536ca20 100644 (file)
@@ -315,6 +315,7 @@ struct _MonoDomain {
        MonoObject         *ephemeron_tombstone;
        /* new MonoType [0] */
        MonoArray          *empty_types;
+       MonoString         *empty_string;
        /* 
         * The fields between FIRST_GC_TRACKED and LAST_GC_TRACKED are roots, but
         * not object references.
index a2b28ad4f0d6ba4fcbc9850f02323f13b7c7930e..3147588dcd53f1cba61b536d742c247f16235789 100644 (file)
@@ -5915,6 +5915,31 @@ ves_icall_array_new_specific (MonoVTable *vtable, uintptr_t n)
        return arr;
 }
 
+/**
+ * mono_string_empty_wrapper:
+ *
+ * Returns: The same empty string instance as the managed string.Empty
+ */
+MonoString*
+mono_string_empty_wrapper ()
+{
+       MonoDomain *domain = mono_domain_get ();
+       return mono_string_empty (domain);
+}
+
+/**
+ * mono_string_empty:
+ *
+ * Returns: The same empty string instance as the managed string.Empty
+ */
+MonoString*
+mono_string_empty (MonoDomain *domain)
+{
+       g_assert (domain);
+       g_assert (domain->empty_string);
+       return domain->empty_string;
+}
+
 /**
  * mono_string_new_utf16:
  * @text: a pointer to an utf16 string
index 24f7284e8e29fe365e3933622a98983951e09830..e67e8cfd9cdbd060637ce0161574a0e3bad2919a 100644 (file)
@@ -112,6 +112,14 @@ mono_array_addr_with_size   (MonoArray *array, int size, uintptr_t idx);
 MONO_API uintptr_t
 mono_array_length           (MonoArray *array);
 
+MONO_RT_EXTERNAL_ONLY
+MONO_API MonoString*
+mono_string_empty            (MonoDomain *domain);
+
+MONO_RT_EXTERNAL_ONLY
+MONO_API MonoString*
+mono_string_empty_wrapper   ();
+
 MONO_RT_EXTERNAL_ONLY
 MONO_API MonoString*
 mono_string_new_utf16      (MonoDomain *domain, const mono_unichar2 *text, int32_t len);
index f5a0e9ab98ae02180157b09927d2fccd54f239a3..83431ecc0e672298a43f45a10d35e6f6665c59e1 100644 (file)
@@ -824,6 +824,8 @@ mono_string_hash
 mono_string_intern
 mono_string_is_interned
 mono_string_length
+mono_string_empty
+mono_string_empty_wrapper
 mono_string_new
 mono_string_new_len
 mono_string_new_size
index 1722591c2f397fcd574413a75dd699b8602dcec5..9aeb6f7e10b461252eec24af79fe7bd3d0a8d38c 100644 (file)
@@ -826,6 +826,8 @@ mono_string_hash
 mono_string_intern
 mono_string_is_interned
 mono_string_length
+mono_string_empty
+mono_string_empty_wrapper
 mono_string_new
 mono_string_new_len
 mono_string_new_size