Bug 1028866 part 4 - Add NewStringCopyNDontDeflate. r=luke

This commit is contained in:
Jan de Mooij 2014-06-25 08:05:45 +02:00
parent 7eea29388a
commit 6198cb3fb7
5 changed files with 42 additions and 11 deletions

View File

@ -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()) {

View File

@ -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

View File

@ -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);

View File

@ -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 *

View File

@ -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 *