Bug 1229642 - Factor out StringToNewUTF8CharsZ (r?jandem) draft
authorLuke Wagner <luke@mozilla.com>
Mon, 21 Dec 2015 18:12:26 -0600
changeset 316748 b92d8960e66651ac333be867002ce113f3c67887
parent 316334 7b3d19ed6664fe76666b6bccf5c3d08ae86b02a4
child 316749 d03f6274ac34976a74f139e439312101c8022e4f
child 317187 b1668ec23f6b2932df0d588accccdbf59037de6d
push id8602
push userlwagner@mozilla.com
push dateTue, 22 Dec 2015 00:45:49 +0000
reviewersjandem
bugs1229642
milestone46.0a1
Bug 1229642 - Factor out StringToNewUTF8CharsZ (r?jandem)
js/src/jit/JitcodeMap.cpp
js/src/jsapi.cpp
js/src/vm/SPSProfiler.cpp
js/src/vm/String.h
--- a/js/src/jit/JitcodeMap.cpp
+++ b/js/src/jit/JitcodeMap.cpp
@@ -306,26 +306,20 @@ JitcodeGlobalEntry::compare(const Jitcod
 }
 
 /* static */ char*
 JitcodeGlobalEntry::createScriptString(JSContext* cx, JSScript* script, size_t* length)
 {
     // If the script has a function, try calculating its name.
     bool hasName = false;
     size_t nameLength = 0;
-    mozilla::UniquePtr<char, JS::FreePolicy> nameStr = nullptr;
+    UniqueChars nameStr;
     JSFunction* func = script->functionDelazifying();
     if (func && func->displayAtom()) {
-        JSAtom* atom = func->displayAtom();
-
-        JS::AutoCheckCannotGC nogc;
-        nameStr = mozilla::UniquePtr<char, JS::FreePolicy>(
-            atom->hasLatin1Chars() ?
-                JS::CharsToNewUTF8CharsZ(cx, atom->latin1Range(nogc)).c_str()
-              : JS::CharsToNewUTF8CharsZ(cx, atom->twoByteRange(nogc)).c_str());
+        nameStr = StringToNewUTF8CharsZ(cx, *func->displayAtom());
         if (!nameStr)
             return nullptr;
 
         nameLength = strlen(nameStr.get());
         hasName = true;
     }
 
     // Calculate filename length
--- a/js/src/jsapi.cpp
+++ b/js/src/jsapi.cpp
@@ -5003,24 +5003,17 @@ JS_EncodeString(JSContext* cx, JSString*
 }
 
 JS_PUBLIC_API(char*)
 JS_EncodeStringToUTF8(JSContext* cx, HandleString str)
 {
     AssertHeapIsIdle(cx);
     CHECK_REQUEST(cx);
 
-    JSLinearString* linear = str->ensureLinear(cx);
-    if (!linear)
-        return nullptr;
-
-    JS::AutoCheckCannotGC nogc;
-    return linear->hasLatin1Chars()
-           ? JS::CharsToNewUTF8CharsZ(cx, linear->latin1Range(nogc)).c_str()
-           : JS::CharsToNewUTF8CharsZ(cx, linear->twoByteRange(nogc)).c_str();
+    return StringToNewUTF8CharsZ(cx, *str).release();
 }
 
 JS_PUBLIC_API(size_t)
 JS_GetStringEncodingLength(JSContext* cx, JSString* str)
 {
     AssertHeapIsIdle(cx);
     CHECK_REQUEST(cx);
 
--- a/js/src/vm/SPSProfiler.cpp
+++ b/js/src/vm/SPSProfiler.cpp
@@ -341,21 +341,17 @@ SPSProfiler::allocProfileString(JSScript
     // Allocate the buffer.
     char* cstr = js_pod_malloc<char>(len + 1);
     if (cstr == nullptr)
         return nullptr;
 
     // Construct the descriptive string.
     DebugOnly<size_t> ret;
     if (atom) {
-        JS::AutoCheckCannotGC nogc;
-        auto atomStr = mozilla::UniquePtr<char, JS::FreePolicy>(
-            atom->hasLatin1Chars()
-            ? JS::CharsToNewUTF8CharsZ(nullptr, atom->latin1Range(nogc)).c_str()
-            : JS::CharsToNewUTF8CharsZ(nullptr, atom->twoByteRange(nogc)).c_str());
+        UniqueChars atomStr = StringToNewUTF8CharsZ(nullptr, *atom);
         if (!atomStr)
             return nullptr;
         ret = JS_snprintf(cstr, len + 1, "%s (%s:%llu)", atomStr.get(), filename, lineno);
     } else {
         ret = JS_snprintf(cstr, len + 1, "%s:%llu", filename, lineno);
     }
 
     MOZ_ASSERT(ret == len, "Computed length should match actual length!");
--- a/js/src/vm/String.h
+++ b/js/src/vm/String.h
@@ -1137,16 +1137,30 @@ NameToId(PropertyName* name)
 }
 
 using PropertyNameVector = js::TraceableVector<PropertyName*>;
 
 template <typename CharT>
 void
 CopyChars(CharT* dest, const JSLinearString& str);
 
+static inline UniqueChars
+StringToNewUTF8CharsZ(ExclusiveContext* maybecx, JSString& str)
+{
+    JS::AutoCheckCannotGC nogc;
+
+    JSLinearString* linear = str.ensureLinear(maybecx);
+    if (!linear)
+        return nullptr;
+
+    return UniqueChars(linear->hasLatin1Chars()
+                       ? JS::CharsToNewUTF8CharsZ(maybecx, linear->latin1Range(nogc)).c_str()
+                       : JS::CharsToNewUTF8CharsZ(maybecx, linear->twoByteRange(nogc)).c_str());
+}
+
 /* GC-allocate a string descriptor for the given malloc-allocated chars. */
 template <js::AllowGC allowGC, typename CharT>
 extern JSFlatString*
 NewString(js::ExclusiveContext* cx, CharT* chars, size_t length);
 
 /* Like NewString, but doesn't try to deflate to Latin1. */
 template <js::AllowGC allowGC, typename CharT>
 extern JSFlatString*