Bug 1470992 - Don't call though public APIs when converting atoms to strings in the parser r=jandem

This commit is contained in:
Jon Coppeard 2018-06-27 11:23:15 +01:00
Родитель e555bb0ae4
Коммит db3005b5b3
5 изменённых файлов: 37 добавлений и 23 удалений

Просмотреть файл

@ -0,0 +1,5 @@
if (helperThreadCount() === 0)
quit();
offThreadCompileModule("export { x };");
gcslice(10);

Просмотреть файл

@ -6102,34 +6102,13 @@ JS_DecodeBytes(JSContext* cx, const char* src, size_t srclen, char16_t* dst, siz
return true;
}
static char*
EncodeLatin1(JSContext* cx, JSString* str)
{
JSLinearString* linear = str->ensureLinear(cx);
if (!linear)
return nullptr;
JS::AutoCheckCannotGC nogc;
if (linear->hasTwoByteChars())
return JS::LossyTwoByteCharsToNewLatin1CharsZ(cx, linear->twoByteRange(nogc)).c_str();
size_t len = str->length();
Latin1Char* buf = cx->pod_malloc<Latin1Char>(len + 1);
if (!buf)
return nullptr;
mozilla::PodCopy(buf, linear->latin1Chars(nogc), len);
buf[len] = '\0';
return reinterpret_cast<char*>(buf);
}
JS_PUBLIC_API(char*)
JS_EncodeString(JSContext* cx, JSString* str)
{
AssertHeapIsIdle();
CHECK_REQUEST(cx);
return EncodeLatin1(cx, str);
return js::EncodeLatin1(cx, str).release();
}
JS_PUBLIC_API(char*)

Просмотреть файл

@ -121,7 +121,8 @@ js::AtomToPrintableString(JSContext* cx, JSAtom* atom, JSAutoByteString* bytes)
JSString* str = QuoteString(cx, atom, 0);
if (!str)
return nullptr;
return bytes->encodeLatin1(cx, str);
bytes->initBytes(EncodeLatin1(cx, str));
return bytes->ptr();
}
#define DEFINE_PROTO_STRING(name,init,clasp) const char js_##name##_str[] = #name;

Просмотреть файл

@ -2007,6 +2007,29 @@ JSString::fillWithRepresentatives(JSContext* cx, HandleArrayObject array)
/*** Conversions *********************************************************************************/
UniqueChars
js::EncodeLatin1(JSContext* cx, JSString* str)
{
JSLinearString* linear = str->ensureLinear(cx);
if (!linear)
return nullptr;
JS::AutoCheckCannotGC nogc;
if (linear->hasTwoByteChars()) {
Latin1CharsZ chars = JS::LossyTwoByteCharsToNewLatin1CharsZ(cx, linear->twoByteRange(nogc));
return UniqueChars(chars.c_str());
}
size_t len = str->length();
Latin1Char* buf = cx->pod_malloc<Latin1Char>(len + 1);
if (!buf)
return nullptr;
mozilla::PodCopy(buf, linear->latin1Chars(nogc), len);
buf[len] = '\0';
return UniqueChars(reinterpret_cast<char*>(buf));
}
const char*
js::ValueToPrintableLatin1(JSContext* cx, const Value& vArg, JSAutoByteString* bytes,
bool asSource)

Просмотреть файл

@ -1589,6 +1589,12 @@ SubstringKernel(JSContext* cx, HandleString str, int32_t beginInt, int32_t lengt
/*** Conversions *********************************************************************************/
/*
* Convert a string to a printable C string.
*/
UniqueChars
EncodeLatin1(JSContext* cx, JSString* str);
/*
* Convert a value to a printable C string.
*