Bug 1229642 - Factor out StringToNewUTF8CharsZ (r?jandem)
--- 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*