Investigate storing strings in 8-bit buffers when possible
authormsaboff@apple.com <msaboff@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 27 Oct 2011 20:16:20 +0000 (20:16 +0000)
committermsaboff@apple.com <msaboff@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 27 Oct 2011 20:16:20 +0000 (20:16 +0000)
commit6a46bb1b2ab9f92dd290cdd404b5118d2f686f52
tree99e02688adb6598c8e3ac45455024f6db07ef458
parente8913e500ff33dbb39ae05c1dcef14d12c3c6281
Investigate storing strings in 8-bit buffers when possible
https://bugs.webkit.org/show_bug.cgi?id=66161

Source/JavaScriptCore:

Investigate storing strings in 8-bit buffers when possible
https://bugs.webkit.org/show_bug.cgi?id=66161

Added support for 8 bit string data in StringImpl.  Changed
(UChar*) m_data to m_data16.  Added char* m_data8 as a union
with m_data16.  Added UChar* m_copyData16 to the other union
to store a 16 bit copy of an 8 bit string when needed.
Added characters8() and characters16() accessor methods
that assume the caller has checked the underlying string type
via the new is8Bit() method. The characters() method will
return a UChar* of the string, materializing a 16 bit copy if the
string is an 8 bit string.  Added two flags, one for 8 bit buffer
and a second for a 16 bit copy for an 8 bit string.

Fixed method name typo (StringHasher::defaultCoverter()).

Over time the goal is to eliminate calls to characters() and
us the character8() and characters16() accessors.

This patch does not include changes that actually create 8 bit
strings. This is the first of at least 8 patches.  Subsequent
patches will be submitted for JIT changes, making the JSC lexer,
parser and literal parser, JavaScript string changes and
then changes in webcore to take advantage of the 8 bit strings.

This change is performance neutral for SunSpider and V8 when
run from the command line with "jsc".

Reviewed by Geoffrey Garen.

* JavaScriptCore.exp:
* JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def
* interpreter/Interpreter.cpp:
(JSC::Interpreter::callEval):
* parser/SourceProvider.h:
(JSC::UStringSourceProvider::data):
(JSC::UStringSourceProvider::UStringSourceProvider):
* runtime/Identifier.cpp:
(JSC::IdentifierCStringTranslator::hash):
(JSC::IdentifierCStringTranslator::equal):
(JSC::IdentifierCStringTranslator::translate):
(JSC::Identifier::add):
(JSC::Identifier::toUInt32):
* runtime/Identifier.h:
(JSC::Identifier::equal):
(JSC::operator==):
(JSC::operator!=):
* runtime/JSString.cpp:
(JSC::JSString::resolveRope):
(JSC::JSString::resolveRopeSlowCase):
* runtime/RegExp.cpp:
(JSC::RegExp::match):
* runtime/StringPrototype.cpp:
(JSC::jsSpliceSubstringsWithSeparators):
* runtime/UString.cpp:
(JSC::UString::UString):
(JSC::equalSlowCase):
(JSC::UString::utf8):
* runtime/UString.h:
(JSC::UString::characters):
(JSC::UString::characters8):
(JSC::UString::characters16):
(JSC::UString::is8Bit):
(JSC::UString::operator[]):
(JSC::UString::find):
(JSC::operator==):
* wtf/StringHasher.h:
(WTF::StringHasher::computeHash):
(WTF::StringHasher::defaultConverter):
* wtf/text/AtomicString.cpp:
(WTF::CStringTranslator::hash):
(WTF::CStringTranslator::equal):
(WTF::CStringTranslator::translate):
(WTF::AtomicString::add):
* wtf/text/AtomicString.h:
(WTF::AtomicString::AtomicString):
(WTF::AtomicString::contains):
(WTF::AtomicString::find):
(WTF::AtomicString::add):
(WTF::operator==):
(WTF::operator!=):
(WTF::equalIgnoringCase):
* wtf/text/StringConcatenate.h:
* wtf/text/StringHash.h:
(WTF::StringHash::equal):
(WTF::CaseFoldingHash::hash):
* wtf/text/StringImpl.cpp:
(WTF::StringImpl::~StringImpl):
(WTF::StringImpl::createUninitialized):
(WTF::StringImpl::create):
(WTF::StringImpl::getData16SlowCase):
(WTF::StringImpl::containsOnlyWhitespace):
(WTF::StringImpl::substring):
(WTF::StringImpl::characterStartingAt):
(WTF::StringImpl::lower):
(WTF::StringImpl::upper):
(WTF::StringImpl::fill):
(WTF::StringImpl::foldCase):
(WTF::StringImpl::stripMatchedCharacters):
(WTF::StringImpl::removeCharacters):
(WTF::StringImpl::simplifyMatchedCharactersToSpace):
(WTF::StringImpl::toIntStrict):
(WTF::StringImpl::toUIntStrict):
(WTF::StringImpl::toInt64Strict):
(WTF::StringImpl::toUInt64Strict):
(WTF::StringImpl::toIntPtrStrict):
(WTF::StringImpl::toInt):
(WTF::StringImpl::toUInt):
(WTF::StringImpl::toInt64):
(WTF::StringImpl::toUInt64):
(WTF::StringImpl::toIntPtr):
(WTF::StringImpl::toDouble):
(WTF::StringImpl::toFloat):
(WTF::equal):
(WTF::equalIgnoringCase):
(WTF::StringImpl::find):
(WTF::StringImpl::findIgnoringCase):
(WTF::StringImpl::reverseFind):
(WTF::StringImpl::replace):
(WTF::StringImpl::defaultWritingDirection):
(WTF::StringImpl::adopt):
(WTF::StringImpl::createWithTerminatingNullCharacter):
* wtf/text/StringImpl.h:
(WTF::StringImpl::StringImpl):
(WTF::StringImpl::create):
(WTF::StringImpl::create8):
(WTF::StringImpl::tryCreateUninitialized):
(WTF::StringImpl::flagsOffset):
(WTF::StringImpl::flagIs8Bit):
(WTF::StringImpl::dataOffset):
(WTF::StringImpl::is8Bit):
(WTF::StringImpl::characters8):
(WTF::StringImpl::characters16):
(WTF::StringImpl::characters):
(WTF::StringImpl::has16BitShadow):
(WTF::StringImpl::setHash):
(WTF::StringImpl::hash):
(WTF::StringImpl::copyChars):
(WTF::StringImpl::operator[]):
(WTF::StringImpl::find):
(WTF::StringImpl::findIgnoringCase):
(WTF::equal):
(WTF::equalIgnoringCase):
(WTF::StringImpl::isolatedCopy):
* wtf/text/WTFString.cpp:
(WTF::String::String):
(WTF::String::append):
(WTF::String::format):
(WTF::String::fromUTF8):
(WTF::String::fromUTF8WithLatin1Fallback):
* wtf/text/WTFString.h:
(WTF::String::find):
(WTF::String::findIgnoringCase):
(WTF::String::contains):
(WTF::String::append):
(WTF::String::fromUTF8):
(WTF::String::fromUTF8WithLatin1Fallback):
(WTF::operator==):
(WTF::operator!=):
(WTF::equalIgnoringCase):
* wtf/unicode/Unicode.h:
* yarr/YarrJIT.cpp:
(JSC::Yarr::execute):
* yarr/YarrJIT.h:
(JSC::Yarr::YarrCodeBlock::execute):
* yarr/YarrParser.h:
(JSC::Yarr::Parser::Parser):

Source/WebCore:

Changes to support 8 bit StringImpl changes.

Reviewed by Geoffrey Garen.

No new tests, refactored StringImpl for 8 bit strings.

* platform/text/cf/StringImplCF.cpp:
(WTF::StringImpl::createCFString):

Source/WebKit2:

Added export of StringImpl::getData16SlowCase for linking tests.

Reviewed by Geoffrey Garen.

* win/WebKit2.def:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@98624 268f45cc-cd09-0410-ab3c-d52691b4dbfc
29 files changed:
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/JavaScriptCore.exp
Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def
Source/JavaScriptCore/interpreter/Interpreter.cpp
Source/JavaScriptCore/parser/SourceProvider.h
Source/JavaScriptCore/runtime/Identifier.cpp
Source/JavaScriptCore/runtime/Identifier.h
Source/JavaScriptCore/runtime/JSString.cpp
Source/JavaScriptCore/runtime/RegExp.cpp
Source/JavaScriptCore/runtime/StringPrototype.cpp
Source/JavaScriptCore/runtime/UString.cpp
Source/JavaScriptCore/runtime/UString.h
Source/JavaScriptCore/wtf/StringHasher.h
Source/JavaScriptCore/wtf/text/AtomicString.cpp
Source/JavaScriptCore/wtf/text/AtomicString.h
Source/JavaScriptCore/wtf/text/StringConcatenate.h
Source/JavaScriptCore/wtf/text/StringHash.h
Source/JavaScriptCore/wtf/text/StringImpl.cpp
Source/JavaScriptCore/wtf/text/StringImpl.h
Source/JavaScriptCore/wtf/text/WTFString.cpp
Source/JavaScriptCore/wtf/text/WTFString.h
Source/JavaScriptCore/wtf/unicode/Unicode.h
Source/JavaScriptCore/yarr/YarrJIT.cpp
Source/JavaScriptCore/yarr/YarrJIT.h
Source/JavaScriptCore/yarr/YarrParser.h
Source/WebCore/ChangeLog
Source/WebCore/platform/text/cf/StringImplCF.cpp
Source/WebKit2/ChangeLog
Source/WebKit2/win/WebKit2.def