Bug 1352323 - Add JS_NewMaybeExternalString function that creates either an external string or returns a static string. r=jandem

This commit is contained in:
Tooru Fujisawa 2017-04-04 15:45:49 +09:00
Родитель 3c97553fda
Коммит 61524c3df7
6 изменённых файлов: 53 добавлений и 6 удалений

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

@ -1499,6 +1499,15 @@ JS_NewExternalString(JSContext* cx, const char16_t* chars, size_t length,
return s;
}
JS_PUBLIC_API(JSString*)
JS_NewMaybeExternalString(JSContext* cx, const char16_t* chars, size_t length,
const JSStringFinalizer* fin, bool* isExternal)
{
AssertHeapIsIdle();
CHECK_REQUEST(cx);
return NewMaybeExternalString(cx, chars, length, fin, isExternal);
}
extern JS_PUBLIC_API(bool)
JS_IsExternalString(JSString* str)
{

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

@ -1854,6 +1854,17 @@ extern JS_PUBLIC_API(JSString*)
JS_NewExternalString(JSContext* cx, const char16_t* chars, size_t length,
const JSStringFinalizer* fin);
/**
* Create a new JSString whose chars member may refer to external memory.
* If the returned string refers to the external memory, |*isExternal| is set
* to true. Otherwise the returned string is not an external string and
* |*isExternal| is set to false. If |*isExternal| is false, |fin| won't be
* called.
*/
extern JS_PUBLIC_API(JSString*)
JS_NewMaybeExternalString(JSContext* cx, const char16_t* chars, size_t length,
const JSStringFinalizer* fin, bool* isExternal);
/**
* Return whether 'str' was created with JS_NewExternalString or
* JS_NewExternalStringWithClosure.

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

@ -1413,6 +1413,19 @@ NewStringCopyUTF8N(JSContext* cx, const JS::UTF8Chars utf8)
template JSFlatString*
NewStringCopyUTF8N<CanGC>(JSContext* cx, const JS::UTF8Chars utf8);
JSString*
NewMaybeExternalString(JSContext* cx, const char16_t* s, size_t n, const JSStringFinalizer* fin,
bool* isExternal)
{
if (JSString* str = TryEmptyOrStaticString(cx, s, n)) {
*isExternal = false;
return str;
}
*isExternal = true;
return JSExternalString::new_(cx, s, n, fin);
}
} /* namespace js */
#ifdef DEBUG

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

@ -1313,6 +1313,10 @@ NewStringCopyUTF8Z(JSContext* cx, const JS::ConstUTF8CharsZ utf8)
return NewStringCopyUTF8N<allowGC>(cx, JS::UTF8Chars(utf8.c_str(), strlen(utf8.c_str())));
}
JSString*
NewMaybeExternalString(JSContext* cx, const char16_t* s, size_t n, const JSStringFinalizer* fin,
bool* isExternal);
JS_STATIC_ASSERT(sizeof(HashNumber) == 4);
} /* namespace js */

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

@ -96,9 +96,10 @@ XPCStringConvert::ReadableToJSVal(JSContext* cx,
uint32_t length = readable.Length();
if (readable.IsLiteral()) {
JSString* str = JS_NewExternalString(cx,
bool ignored;
JSString* str = JS_NewMaybeExternalString(cx,
static_cast<const char16_t*>(readable.BeginReading()),
length, &sLiteralFinalizer);
length, &sLiteralFinalizer, &ignored);
if (!str)
return false;
vp.setString(str);

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

@ -267,13 +267,22 @@ public:
return true;
}
JSString* str = JS_NewExternalString(cx,
bool isExternal;
JSString* str = JS_NewMaybeExternalString(cx,
static_cast<char16_t*>(buf->Data()),
length, &sDOMStringFinalizer);
length, &sDOMStringFinalizer, &isExternal);
if (!str) {
return false;
}
rval.setString(str);
// If JS_NewMaybeExternalString returns non-external string, finalizer
// won't be called. Do not store it to cache.
if (!isExternal) {
*sharedBuffer = false;
return true;
}
if (!cache) {
cache = new ZoneStringCache();
JS_SetZoneUserData(zone, cache);