-
msaboff@apple.com authored
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: http://svn.webkit.org/repository/webkit/trunk@98624 268f45cc-cd09-0410-ab3c-d52691b4dbfc
0cb990be