зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1352323 - Add JS_NewMaybeExternalString function that creates either an external string or returns a static string. r=jandem
This commit is contained in:
Родитель
3c97553fda
Коммит
61524c3df7
|
@ -1499,6 +1499,15 @@ JS_NewExternalString(JSContext* cx, const char16_t* chars, size_t length,
|
||||||
return s;
|
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)
|
extern JS_PUBLIC_API(bool)
|
||||||
JS_IsExternalString(JSString* str)
|
JS_IsExternalString(JSString* str)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1854,6 +1854,17 @@ extern JS_PUBLIC_API(JSString*)
|
||||||
JS_NewExternalString(JSContext* cx, const char16_t* chars, size_t length,
|
JS_NewExternalString(JSContext* cx, const char16_t* chars, size_t length,
|
||||||
const JSStringFinalizer* fin);
|
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
|
* Return whether 'str' was created with JS_NewExternalString or
|
||||||
* JS_NewExternalStringWithClosure.
|
* JS_NewExternalStringWithClosure.
|
||||||
|
|
|
@ -1413,6 +1413,19 @@ NewStringCopyUTF8N(JSContext* cx, const JS::UTF8Chars utf8)
|
||||||
template JSFlatString*
|
template JSFlatString*
|
||||||
NewStringCopyUTF8N<CanGC>(JSContext* cx, const JS::UTF8Chars utf8);
|
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 */
|
} /* namespace js */
|
||||||
|
|
||||||
#ifdef DEBUG
|
#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())));
|
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);
|
JS_STATIC_ASSERT(sizeof(HashNumber) == 4);
|
||||||
|
|
||||||
} /* namespace js */
|
} /* namespace js */
|
||||||
|
|
|
@ -96,9 +96,10 @@ XPCStringConvert::ReadableToJSVal(JSContext* cx,
|
||||||
uint32_t length = readable.Length();
|
uint32_t length = readable.Length();
|
||||||
|
|
||||||
if (readable.IsLiteral()) {
|
if (readable.IsLiteral()) {
|
||||||
JSString* str = JS_NewExternalString(cx,
|
bool ignored;
|
||||||
|
JSString* str = JS_NewMaybeExternalString(cx,
|
||||||
static_cast<const char16_t*>(readable.BeginReading()),
|
static_cast<const char16_t*>(readable.BeginReading()),
|
||||||
length, &sLiteralFinalizer);
|
length, &sLiteralFinalizer, &ignored);
|
||||||
if (!str)
|
if (!str)
|
||||||
return false;
|
return false;
|
||||||
vp.setString(str);
|
vp.setString(str);
|
||||||
|
|
|
@ -267,13 +267,22 @@ public:
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
JSString* str = JS_NewExternalString(cx,
|
bool isExternal;
|
||||||
|
JSString* str = JS_NewMaybeExternalString(cx,
|
||||||
static_cast<char16_t*>(buf->Data()),
|
static_cast<char16_t*>(buf->Data()),
|
||||||
length, &sDOMStringFinalizer);
|
length, &sDOMStringFinalizer, &isExternal);
|
||||||
if (!str) {
|
if (!str) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
rval.setString(str);
|
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) {
|
if (!cache) {
|
||||||
cache = new ZoneStringCache();
|
cache = new ZoneStringCache();
|
||||||
JS_SetZoneUserData(zone, cache);
|
JS_SetZoneUserData(zone, cache);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче