mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1028866 part 4 - Add NewStringCopyNDontDeflate. r=luke
This commit is contained in:
parent
7eea29388a
commit
6198cb3fb7
@ -282,7 +282,7 @@ CopyStringPure(JSContext *cx, JSString *str)
|
||||
copy = NewStringCopyN<NoGC>(cx, str->asLinear().latin1Chars(nogc), len);
|
||||
} else {
|
||||
JS::AutoCheckCannotGC nogc;
|
||||
copy = NewStringCopyN<NoGC>(cx, str->asLinear().twoByteChars(nogc), len);
|
||||
copy = NewStringCopyNDontDeflate<NoGC>(cx, str->asLinear().twoByteChars(nogc), len);
|
||||
}
|
||||
if (copy)
|
||||
return copy;
|
||||
@ -293,7 +293,7 @@ CopyStringPure(JSContext *cx, JSString *str)
|
||||
|
||||
return chars.isLatin1()
|
||||
? NewStringCopyN<CanGC>(cx, chars.latin1Range().start().get(), len)
|
||||
: NewStringCopyN<CanGC>(cx, chars.twoByteRange().start().get(), len);
|
||||
: NewStringCopyNDontDeflate<CanGC>(cx, chars.twoByteRange().start().get(), len);
|
||||
}
|
||||
|
||||
if (str->hasLatin1Chars()) {
|
||||
|
@ -1548,7 +1548,7 @@ ScriptSource::substring(JSContext *cx, uint32_t start, uint32_t stop)
|
||||
const jschar *chars = this->chars(cx, holder);
|
||||
if (!chars)
|
||||
return nullptr;
|
||||
return NewStringCopyN<CanGC>(cx, chars + start, stop - start);
|
||||
return NewStringCopyNDontDeflate<CanGC>(cx, chars + start, stop - start);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -4346,6 +4346,9 @@ CopyCharsMaybeInflate(jschar *dest, const Latin1Char *src, size_t len)
|
||||
static bool
|
||||
CanStoreCharsAsLatin1(const jschar *s, size_t length)
|
||||
{
|
||||
if (!EnableLatin1Strings)
|
||||
return false;
|
||||
|
||||
for (const jschar *end = s + length; s < end; ++s) {
|
||||
if (*s > JSString::MAX_LATIN1_CHAR)
|
||||
return false;
|
||||
@ -4364,6 +4367,8 @@ template <AllowGC allowGC>
|
||||
static MOZ_ALWAYS_INLINE JSInlineString *
|
||||
NewFatInlineStringDeflated(ThreadSafeContext *cx, Range<const jschar> chars)
|
||||
{
|
||||
MOZ_ASSERT(EnableLatin1Strings);
|
||||
|
||||
size_t len = chars.length();
|
||||
Latin1Char *storage;
|
||||
JSInlineString *str = AllocateFatInlineString<allowGC>(cx, len, &storage);
|
||||
@ -4416,12 +4421,9 @@ namespace js {
|
||||
|
||||
template <AllowGC allowGC, typename CharT>
|
||||
JSFlatString *
|
||||
NewStringCopyN(ThreadSafeContext *cx, const CharT *s, size_t n)
|
||||
NewStringCopyNDontDeflate(ThreadSafeContext *cx, const CharT *s, size_t n)
|
||||
{
|
||||
if (EnableLatin1Strings) {
|
||||
if (IsSame<CharT, jschar>::value && CanStoreCharsAsLatin1(s, n))
|
||||
return NewStringDeflated<allowGC>(cx, s, n);
|
||||
|
||||
if (JSFatInlineString::lengthFits<CharT>(n))
|
||||
return NewFatInlineString<allowGC>(cx, Range<const CharT>(s, n));
|
||||
|
||||
@ -4458,6 +4460,28 @@ NewStringCopyN(ThreadSafeContext *cx, const CharT *s, size_t n)
|
||||
return str;
|
||||
}
|
||||
|
||||
template JSFlatString *
|
||||
NewStringCopyNDontDeflate<CanGC>(ThreadSafeContext *cx, const jschar *s, size_t n);
|
||||
|
||||
template JSFlatString *
|
||||
NewStringCopyNDontDeflate<NoGC>(ThreadSafeContext *cx, const jschar *s, size_t n);
|
||||
|
||||
template JSFlatString *
|
||||
NewStringCopyNDontDeflate<CanGC>(ThreadSafeContext *cx, const Latin1Char *s, size_t n);
|
||||
|
||||
template JSFlatString *
|
||||
NewStringCopyNDontDeflate<NoGC>(ThreadSafeContext *cx, const Latin1Char *s, size_t n);
|
||||
|
||||
template <AllowGC allowGC, typename CharT>
|
||||
JSFlatString *
|
||||
NewStringCopyN(ThreadSafeContext *cx, const CharT *s, size_t n)
|
||||
{
|
||||
if (IsSame<CharT, jschar>::value && CanStoreCharsAsLatin1(s, n))
|
||||
return NewStringDeflated<allowGC>(cx, s, n);
|
||||
|
||||
return NewStringCopyNDontDeflate<allowGC>(cx, s, n);
|
||||
}
|
||||
|
||||
template JSFlatString *
|
||||
NewStringCopyN<CanGC>(ThreadSafeContext *cx, const jschar *s, size_t n);
|
||||
|
||||
|
@ -120,6 +120,11 @@ template <js::AllowGC allowGC, typename CharT>
|
||||
extern JSFlatString *
|
||||
NewStringCopyN(js::ThreadSafeContext *cx, const CharT *s, size_t n);
|
||||
|
||||
/* Like NewStringCopyN, but doesn't try to deflate to Latin1. */
|
||||
template <js::AllowGC allowGC, typename CharT>
|
||||
extern JSFlatString *
|
||||
NewStringCopyNDontDeflate(js::ThreadSafeContext *cx, const CharT *s, size_t n);
|
||||
|
||||
/* Copy a C string and GC-allocate a descriptor for it. */
|
||||
template <js::AllowGC allowGC>
|
||||
extern JSFlatString *
|
||||
|
@ -1127,9 +1127,11 @@ CloneString(JSContext *cx, JSFlatString *selfHostedString)
|
||||
size_t len = selfHostedString->length();
|
||||
{
|
||||
JS::AutoCheckCannotGC nogc;
|
||||
JSString *clone = selfHostedString->hasLatin1Chars()
|
||||
? NewStringCopyN<NoGC>(cx, selfHostedString->latin1Chars(nogc), len)
|
||||
: NewStringCopyN<NoGC>(cx, selfHostedString->twoByteChars(nogc), len);
|
||||
JSString *clone;
|
||||
if (selfHostedString->hasLatin1Chars())
|
||||
clone = NewStringCopyN<NoGC>(cx, selfHostedString->latin1Chars(nogc), len);
|
||||
else
|
||||
clone = NewStringCopyNDontDeflate<NoGC>(cx, selfHostedString->twoByteChars(nogc), len);
|
||||
if (clone)
|
||||
return clone;
|
||||
}
|
||||
@ -1140,7 +1142,7 @@ CloneString(JSContext *cx, JSFlatString *selfHostedString)
|
||||
|
||||
return chars.isLatin1()
|
||||
? NewStringCopyN<CanGC>(cx, chars.latin1Range().start().get(), len)
|
||||
: NewStringCopyN<CanGC>(cx, chars.twoByteRange().start().get(), len);
|
||||
: NewStringCopyNDontDeflate<CanGC>(cx, chars.twoByteRange().start().get(), len);
|
||||
}
|
||||
|
||||
static JSObject *
|
||||
|
Loading…
Reference in New Issue
Block a user