Ignore:
Timestamp:
Jul 24, 2013, 9:03:16 PM (12 years ago)
Author:
[email protected]
Message:

fourthTier: DFG should have switch_char
https://bugs.webkit.org/show_bug.cgi?id=117710

Source/JavaScriptCore:

Reviewed by Michael Saboff.

Add op_switch_char. Most of this is fairly simple, except for the whole
LazyJSValue thing.

It's long been the case that anytime you wanted the DFG to speak of a string
that didn't appear in the constant pool, you would have a hard time since
the DFG isn't allowed to allocate in the GC heap. For example, if you know
that you want to speak of a single character string, you might find that
the one you wanted to speak of had been GC'd. Another example is if you
wanted to add constant folding for string concatenation - something we don't
have yet but will want eventually.

I solve this by finally adding the notion of LazyJSValue. In the future I
anticipate using this for a variety of string-related things. The idea here
is that the DFG can either say that it already knows what the value is, or
it can describe the value. For example, in this patch I needed to be able to
describe single-character strings.

(JSC::CodeBlock::dumpBytecode):
(JSC::CodeBlock::CodeBlock):

  • bytecode/JumpTable.h:
  • dfg/DFGBackwardsPropagationPhase.cpp:

(JSC::DFG::BackwardsPropagationPhase::propagate):

  • dfg/DFGByteCodeParser.cpp:

(InlineStackEntry):
(JSC::DFG::ByteCodeParser::parseBlock):
(JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry):

  • dfg/DFGCFGSimplificationPhase.cpp:

(JSC::DFG::CFGSimplificationPhase::run):

  • dfg/DFGCapabilities.cpp:

(JSC::DFG::capabilityLevel):

  • dfg/DFGDriver.cpp:

(JSC::DFG::compile):

  • dfg/DFGFixupPhase.cpp:

(JSC::DFG::FixupPhase::fixupNode):

  • dfg/DFGGPRInfo.h:

(JSC::DFG::JSValueRegs::payloadGPR):

  • dfg/DFGJITCompiler.cpp:

(JSC::DFG::JITCompiler::jumpTable):
(DFG):
(JSC::DFG::JITCompiler::numberOfJumpTables):
(JSC::DFG::JITCompiler::linkSwitches):
(JSC::DFG::JITCompiler::link):

  • dfg/DFGJITCompiler.h:

(JITCompiler):

  • dfg/DFGLazyJSValue.cpp: Added.

(DFG):
(JSC::DFG::LazyJSValue::getValue):
(JSC::DFG::equalToSingleCharacter):
(JSC::DFG::LazyJSValue::strictEqual):
(JSC::DFG::LazyJSValue::dump):

  • dfg/DFGLazyJSValue.h: Added.

(DFG):
(LazyJSValue):
(JSC::DFG::LazyJSValue::LazyJSValue):
(JSC::DFG::LazyJSValue::singleCharacterString):
(JSC::DFG::LazyJSValue::tryGetValue):
(JSC::DFG::LazyJSValue::value):
(JSC::DFG::LazyJSValue::character):
(JSC::DFG::LazyJSValue::switchLookupValue):

  • dfg/DFGNode.h:

(JSC::DFG::SwitchCase::SwitchCase):
(SwitchCase):

  • dfg/DFGSpeculativeJIT.cpp:

(JSC::DFG::SpeculativeJIT::emitSwitchIntJump):
(JSC::DFG::SpeculativeJIT::emitSwitchImmIntJump):
(DFG):
(JSC::DFG::SpeculativeJIT::emitSwitchImm):
(JSC::DFG::SpeculativeJIT::emitSwitchCharStringJump):
(JSC::DFG::SpeculativeJIT::emitSwitchChar):
(JSC::DFG::SpeculativeJIT::emitSwitch):

  • dfg/DFGSpeculativeJIT.h:

(SpeculativeJIT):

Source/WTF:

Reviewed by Michael Saboff.

I wanted to be able to say stringImpl->at(index), and now I can!

Also made it possible to convert a UChar to a utf8 CString without
allocating a StringImpl.

  • wtf/text/StringImpl.cpp:

(WTF::StringImpl::utf8Impl):
(WTF):
(WTF::StringImpl::utf8ForCharacters):
(WTF::StringImpl::utf8ForRange):

  • wtf/text/StringImpl.h:

(StringImpl):
(WTF::StringImpl::at):
(WTF::StringImpl::operator[]):

LayoutTests:

Rubber stamped by Mark Hahnenberg.

  • fast/js/regress/script-tests/switch-char-constant.js: Added.

(foo):
(bar):

  • fast/js/regress/script-tests/switch-char.js: Added.

(foo):
(bar):

  • fast/js/regress/switch-char-constant-expected.txt: Added.
  • fast/js/regress/switch-char-constant.html: Added.
  • fast/js/regress/switch-char-expected.txt: Added.
  • fast/js/regress/switch-char.html: Added.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/dfg/DFGDriver.cpp

    r153227 r153234  
    7171        return CompilationFailed;
    7272
    73    
    74     // If the concurrent thread will want the code block's hash, then compute it here
    75     // synchronously.
    76     if (Options::showDisassembly()
    77         || Options::showDFGDisassembly()
    78         || Options::dumpBytecodeAtDFGTime()
    79         || Options::verboseCompilation()
    80         || Options::logCompilationChanges()
    81         || Options::validateGraph()
    82         || Options::validateGraphAtEachPhase()
    83         || Options::verboseOSR()
    84         || Options::verboseCompilationQueue()
    85         || Options::reportCompileTimes())
    86         codeBlock->hash();
    8773   
    8874    if (logCompilationChanges())
Note: See TracChangeset for help on using the changeset viewer.