<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[153142] trunk/Source</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/153142">153142</a></dd>
<dt>Author</dt> <dd>oliver@apple.com</dd>
<dt>Date</dt> <dd>2013-07-24 20:59:29 -0700 (Wed, 24 Jul 2013)</dd>
</dl>

<h3>Log Message</h3>
<pre>fourthTier: DFG tries to ref/deref StringImpls in a ton of places
https://bugs.webkit.org/show_bug.cgi?id=115300

Source/JavaScriptCore:

Reviewed by Geoffrey Garen.

Change any code transitively called from DFG compilation to use StringImpl*
directly instead of String, Identifier, or PropertyName. I use the convention
of passing &quot;StringImpl* uid&quot; instead of an Identifier or PropertyName.

Switch over any code transitively called from DFG compilation to use CStrings
whenever possible for all of its debug dumping.

This makes it possible to compile things without hitting the ref/deref
assertion in StringImpl.

* JavaScriptCore.xcodeproj/project.pbxproj:
* bytecode/CodeBlock.cpp:
(JSC::CodeBlock::inferredName):
(JSC::CodeBlock::sourceCodeForTools):
(JSC::CodeBlock::sourceCodeOnOneLine):
(JSC::constantName):
(JSC::idName):
(JSC::CodeBlock::registerName):
(JSC::regexpToSourceString):
(JSC::regexpName):
(JSC::pointerToSourceString):
(JSC::CodeBlock::printUnaryOp):
(JSC::CodeBlock::printBinaryOp):
(JSC::CodeBlock::printConditionalJump):
(JSC::CodeBlock::printGetByIdOp):
(JSC::dumpStructure):
(JSC::CodeBlock::printCallOp):
(JSC::CodeBlock::printPutByIdOp):
(JSC::CodeBlock::printStructure):
(JSC::CodeBlock::printStructures):
(JSC::CodeBlock::dumpBytecode):
* bytecode/CodeBlock.h:
(CodeBlock):
* bytecode/CodeBlockHash.cpp:
(JSC::CodeBlockHash::CodeBlockHash):
* bytecode/CodeOrigin.cpp:
(JSC::InlineCallFrame::inferredName):
* bytecode/CodeOrigin.h:
(InlineCallFrame):
* bytecode/GetByIdStatus.cpp:
(JSC::GetByIdStatus::computeFromLLInt):
(JSC::GetByIdStatus::computeForChain):
(JSC::GetByIdStatus::computeFor):
* bytecode/GetByIdStatus.h:
(JSC):
(GetByIdStatus):
* bytecode/PutByIdStatus.cpp:
(JSC::PutByIdStatus::computeFromLLInt):
(JSC::PutByIdStatus::computeFor):
* bytecode/PutByIdStatus.h:
(JSC):
(PutByIdStatus):
* bytecode/ReduceWhitespace.cpp:
(JSC::reduceWhitespace):
* bytecode/ReduceWhitespace.h:
(JSC):
* bytecode/ResolveGlobalStatus.cpp:
(JSC::computeForStructure):
(JSC::ResolveGlobalStatus::computeFor):
* bytecode/ResolveGlobalStatus.h:
(JSC):
(ResolveGlobalStatus):
* dfg/DFGAbstractState.cpp:
(JSC::DFG::AbstractState::executeEffects):
* dfg/DFGByteCodeParser.cpp:
(ByteCodeParser):
(JSC::DFG::ByteCodeParser::parseResolveOperations):
(JSC::DFG::ByteCodeParser::parseBlock):
(JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry):
* dfg/DFGConstantFoldingPhase.cpp:
(JSC::DFG::ConstantFoldingPhase::foldConstants):
* dfg/DFGDesiredIdentifiers.cpp: Added.
(DFG):
(JSC::DFG::DesiredIdentifiers::DesiredIdentifiers):
(JSC::DFG::DesiredIdentifiers::~DesiredIdentifiers):
(JSC::DFG::DesiredIdentifiers::addLazily):
(JSC::DFG::DesiredIdentifiers::reallyAdd):
* dfg/DFGDesiredIdentifiers.h: Added.
(DFG):
(DesiredIdentifiers):
(JSC::DFG::DesiredIdentifiers::numberOfIdentifiers):
(JSC::DFG::DesiredIdentifiers::at):
(JSC::DFG::DesiredIdentifiers::operator[]):
* dfg/DFGFixupPhase.cpp:
(JSC::DFG::FixupPhase::fixupNode):
(JSC::DFG::FixupPhase::isStringPrototypeMethodSane):
(JSC::DFG::FixupPhase::canOptimizeStringObjectAccess):
* dfg/DFGGraph.cpp:
(JSC::DFG::Graph::Graph):
(JSC::DFG::Graph::dump):
* dfg/DFGGraph.h:
(Graph):
* dfg/DFGJITCompiler.cpp:
(JSC::DFG::JITCompiler::link):
* dfg/DFGOperations.cpp:
* dfg/DFGOperations.h:
* dfg/DFGRepatch.cpp:
(JSC::DFG::tryBuildGetByIDList):
* dfg/DFGSpeculativeJIT.h:
(JSC::DFG::SpeculativeJIT::identifierUID):
(JSC::DFG::SpeculativeJIT::callOperation):
* dfg/DFGSpeculativeJIT32_64.cpp:
(JSC::DFG::SpeculativeJIT::cachedGetById):
(JSC::DFG::SpeculativeJIT::cachedPutById):
(JSC::DFG::SpeculativeJIT::compile):
* dfg/DFGSpeculativeJIT64.cpp:
(JSC::DFG::SpeculativeJIT::cachedGetById):
(JSC::DFG::SpeculativeJIT::cachedPutById):
(JSC::DFG::SpeculativeJIT::compile):
* parser/SourceCode.cpp: Added.
(JSC):
(JSC::SourceCode::toUTF8):
* parser/SourceCode.h:
(SourceCode):
* profiler/ProfilerBytecodes.cpp:
(JSC::Profiler::Bytecodes::toJS):
* profiler/ProfilerBytecodes.h:
(JSC::Profiler::Bytecodes::inferredName):
(JSC::Profiler::Bytecodes::sourceCode):
(Bytecodes):
* runtime/Identifier.h:
(JSC::Identifier::utf8):
(JSC):
* runtime/Structure.cpp:
(JSC::Structure::addPropertyTransitionToExistingStructureImpl):
(JSC::Structure::addPropertyTransitionToExistingStructure):
(JSC::Structure::addPropertyTransitionToExistingStructureConcurrently):
(JSC::Structure::getConcurrently):
(JSC::Structure::prototypeChainMayInterceptStoreTo):
(JSC):
* runtime/Structure.h:
(Structure):
* runtime/StructureInlines.h:
(JSC::Structure::getConcurrently):

Source/WTF:

Reviewed by Geoffrey Garen.

Make it possible to do more things directly to StringImpl*'s, including being
able to directly do utf8 conversion on a substring without creating the
substring first.

Add assertions to StringImpl that it isn't being ref/deref'd from the
compilation thread.

* wtf/PrintStream.cpp:
(WTF::printInternal):
(WTF):
* wtf/PrintStream.h:
(WTF):
(WTF::printInternal):
* wtf/StringPrintStream.h:
(WTF):
(WTF::toCString):
* wtf/text/StringImpl.cpp:
(WTF::StringImpl::utf8ForRange):
(WTF::StringImpl::utf8):
(WTF):
* wtf/text/StringImpl.h:
(StringImpl):
(WTF::StringImpl::hasAtLeastOneRef):
(WTF::StringImpl::ref):
(WTF::StringImpl::deref):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj">trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeCodeBlockcpp">trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeCodeBlockh">trunk/Source/JavaScriptCore/bytecode/CodeBlock.h</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeCodeBlockHashcpp">trunk/Source/JavaScriptCore/bytecode/CodeBlockHash.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeCodeOrigincpp">trunk/Source/JavaScriptCore/bytecode/CodeOrigin.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeCodeOriginh">trunk/Source/JavaScriptCore/bytecode/CodeOrigin.h</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeGetByIdStatuscpp">trunk/Source/JavaScriptCore/bytecode/GetByIdStatus.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeGetByIdStatush">trunk/Source/JavaScriptCore/bytecode/GetByIdStatus.h</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodePutByIdStatuscpp">trunk/Source/JavaScriptCore/bytecode/PutByIdStatus.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodePutByIdStatush">trunk/Source/JavaScriptCore/bytecode/PutByIdStatus.h</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeReduceWhitespacecpp">trunk/Source/JavaScriptCore/bytecode/ReduceWhitespace.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeReduceWhitespaceh">trunk/Source/JavaScriptCore/bytecode/ReduceWhitespace.h</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeResolveGlobalStatuscpp">trunk/Source/JavaScriptCore/bytecode/ResolveGlobalStatus.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeResolveGlobalStatush">trunk/Source/JavaScriptCore/bytecode/ResolveGlobalStatus.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGAbstractStatecpp">trunk/Source/JavaScriptCore/dfg/DFGAbstractState.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGByteCodeParsercpp">trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGConstantFoldingPhasecpp">trunk/Source/JavaScriptCore/dfg/DFGConstantFoldingPhase.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGFixupPhasecpp">trunk/Source/JavaScriptCore/dfg/DFGFixupPhase.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGGraphcpp">trunk/Source/JavaScriptCore/dfg/DFGGraph.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGGraphh">trunk/Source/JavaScriptCore/dfg/DFGGraph.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGJITCompilercpp">trunk/Source/JavaScriptCore/dfg/DFGJITCompiler.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGOperationscpp">trunk/Source/JavaScriptCore/dfg/DFGOperations.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGOperationsh">trunk/Source/JavaScriptCore/dfg/DFGOperations.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGRepatchcpp">trunk/Source/JavaScriptCore/dfg/DFGRepatch.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGSpeculativeJITh">trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGSpeculativeJIT32_64cpp">trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGSpeculativeJIT64cpp">trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreparserSourceCodeh">trunk/Source/JavaScriptCore/parser/SourceCode.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreprofilerProfilerBytecodescpp">trunk/Source/JavaScriptCore/profiler/ProfilerBytecodes.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreprofilerProfilerBytecodesh">trunk/Source/JavaScriptCore/profiler/ProfilerBytecodes.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeIdentifierh">trunk/Source/JavaScriptCore/runtime/Identifier.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeStructurecpp">trunk/Source/JavaScriptCore/runtime/Structure.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeStructureh">trunk/Source/JavaScriptCore/runtime/Structure.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeStructureInlinesh">trunk/Source/JavaScriptCore/runtime/StructureInlines.h</a></li>
<li><a href="#trunkSourceWTFChangeLog">trunk/Source/WTF/ChangeLog</a></li>
<li><a href="#trunkSourceWTFwtfPrintStreamcpp">trunk/Source/WTF/wtf/PrintStream.cpp</a></li>
<li><a href="#trunkSourceWTFwtfPrintStreamh">trunk/Source/WTF/wtf/PrintStream.h</a></li>
<li><a href="#trunkSourceWTFwtfStringPrintStreamh">trunk/Source/WTF/wtf/StringPrintStream.h</a></li>
<li><a href="#trunkSourceWTFwtftextStringImplcpp">trunk/Source/WTF/wtf/text/StringImpl.cpp</a></li>
<li><a href="#trunkSourceWTFwtftextStringImplh">trunk/Source/WTF/wtf/text/StringImpl.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoredfgDFGDesiredIdentifierscpp">trunk/Source/JavaScriptCore/dfg/DFGDesiredIdentifiers.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGDesiredIdentifiersh">trunk/Source/JavaScriptCore/dfg/DFGDesiredIdentifiers.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreparserSourceCodecpp">trunk/Source/JavaScriptCore/parser/SourceCode.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/JavaScriptCore/ChangeLog        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -1,5 +1,147 @@
</span><span class="cx"> 2013-05-02  Filip Pizlo  &lt;fpizlo@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        fourthTier: DFG tries to ref/deref StringImpls in a ton of places
+        https://bugs.webkit.org/show_bug.cgi?id=115300
+
+        Reviewed by Geoffrey Garen.
+        
+        Change any code transitively called from DFG compilation to use StringImpl*
+        directly instead of String, Identifier, or PropertyName. I use the convention
+        of passing &quot;StringImpl* uid&quot; instead of an Identifier or PropertyName.
+        
+        Switch over any code transitively called from DFG compilation to use CStrings
+        whenever possible for all of its debug dumping.
+        
+        This makes it possible to compile things without hitting the ref/deref
+        assertion in StringImpl.
+
+        * JavaScriptCore.xcodeproj/project.pbxproj:
+        * bytecode/CodeBlock.cpp:
+        (JSC::CodeBlock::inferredName):
+        (JSC::CodeBlock::sourceCodeForTools):
+        (JSC::CodeBlock::sourceCodeOnOneLine):
+        (JSC::constantName):
+        (JSC::idName):
+        (JSC::CodeBlock::registerName):
+        (JSC::regexpToSourceString):
+        (JSC::regexpName):
+        (JSC::pointerToSourceString):
+        (JSC::CodeBlock::printUnaryOp):
+        (JSC::CodeBlock::printBinaryOp):
+        (JSC::CodeBlock::printConditionalJump):
+        (JSC::CodeBlock::printGetByIdOp):
+        (JSC::dumpStructure):
+        (JSC::CodeBlock::printCallOp):
+        (JSC::CodeBlock::printPutByIdOp):
+        (JSC::CodeBlock::printStructure):
+        (JSC::CodeBlock::printStructures):
+        (JSC::CodeBlock::dumpBytecode):
+        * bytecode/CodeBlock.h:
+        (CodeBlock):
+        * bytecode/CodeBlockHash.cpp:
+        (JSC::CodeBlockHash::CodeBlockHash):
+        * bytecode/CodeOrigin.cpp:
+        (JSC::InlineCallFrame::inferredName):
+        * bytecode/CodeOrigin.h:
+        (InlineCallFrame):
+        * bytecode/GetByIdStatus.cpp:
+        (JSC::GetByIdStatus::computeFromLLInt):
+        (JSC::GetByIdStatus::computeForChain):
+        (JSC::GetByIdStatus::computeFor):
+        * bytecode/GetByIdStatus.h:
+        (JSC):
+        (GetByIdStatus):
+        * bytecode/PutByIdStatus.cpp:
+        (JSC::PutByIdStatus::computeFromLLInt):
+        (JSC::PutByIdStatus::computeFor):
+        * bytecode/PutByIdStatus.h:
+        (JSC):
+        (PutByIdStatus):
+        * bytecode/ReduceWhitespace.cpp:
+        (JSC::reduceWhitespace):
+        * bytecode/ReduceWhitespace.h:
+        (JSC):
+        * bytecode/ResolveGlobalStatus.cpp:
+        (JSC::computeForStructure):
+        (JSC::ResolveGlobalStatus::computeFor):
+        * bytecode/ResolveGlobalStatus.h:
+        (JSC):
+        (ResolveGlobalStatus):
+        * dfg/DFGAbstractState.cpp:
+        (JSC::DFG::AbstractState::executeEffects):
+        * dfg/DFGByteCodeParser.cpp:
+        (ByteCodeParser):
+        (JSC::DFG::ByteCodeParser::parseResolveOperations):
+        (JSC::DFG::ByteCodeParser::parseBlock):
+        (JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry):
+        * dfg/DFGConstantFoldingPhase.cpp:
+        (JSC::DFG::ConstantFoldingPhase::foldConstants):
+        * dfg/DFGDesiredIdentifiers.cpp: Added.
+        (DFG):
+        (JSC::DFG::DesiredIdentifiers::DesiredIdentifiers):
+        (JSC::DFG::DesiredIdentifiers::~DesiredIdentifiers):
+        (JSC::DFG::DesiredIdentifiers::addLazily):
+        (JSC::DFG::DesiredIdentifiers::reallyAdd):
+        * dfg/DFGDesiredIdentifiers.h: Added.
+        (DFG):
+        (DesiredIdentifiers):
+        (JSC::DFG::DesiredIdentifiers::numberOfIdentifiers):
+        (JSC::DFG::DesiredIdentifiers::at):
+        (JSC::DFG::DesiredIdentifiers::operator[]):
+        * dfg/DFGFixupPhase.cpp:
+        (JSC::DFG::FixupPhase::fixupNode):
+        (JSC::DFG::FixupPhase::isStringPrototypeMethodSane):
+        (JSC::DFG::FixupPhase::canOptimizeStringObjectAccess):
+        * dfg/DFGGraph.cpp:
+        (JSC::DFG::Graph::Graph):
+        (JSC::DFG::Graph::dump):
+        * dfg/DFGGraph.h:
+        (Graph):
+        * dfg/DFGJITCompiler.cpp:
+        (JSC::DFG::JITCompiler::link):
+        * dfg/DFGOperations.cpp:
+        * dfg/DFGOperations.h:
+        * dfg/DFGRepatch.cpp:
+        (JSC::DFG::tryBuildGetByIDList):
+        * dfg/DFGSpeculativeJIT.h:
+        (JSC::DFG::SpeculativeJIT::identifierUID):
+        (JSC::DFG::SpeculativeJIT::callOperation):
+        * dfg/DFGSpeculativeJIT32_64.cpp:
+        (JSC::DFG::SpeculativeJIT::cachedGetById):
+        (JSC::DFG::SpeculativeJIT::cachedPutById):
+        (JSC::DFG::SpeculativeJIT::compile):
+        * dfg/DFGSpeculativeJIT64.cpp:
+        (JSC::DFG::SpeculativeJIT::cachedGetById):
+        (JSC::DFG::SpeculativeJIT::cachedPutById):
+        (JSC::DFG::SpeculativeJIT::compile):
+        * parser/SourceCode.cpp: Added.
+        (JSC):
+        (JSC::SourceCode::toUTF8):
+        * parser/SourceCode.h:
+        (SourceCode):
+        * profiler/ProfilerBytecodes.cpp:
+        (JSC::Profiler::Bytecodes::toJS):
+        * profiler/ProfilerBytecodes.h:
+        (JSC::Profiler::Bytecodes::inferredName):
+        (JSC::Profiler::Bytecodes::sourceCode):
+        (Bytecodes):
+        * runtime/Identifier.h:
+        (JSC::Identifier::utf8):
+        (JSC):
+        * runtime/Structure.cpp:
+        (JSC::Structure::addPropertyTransitionToExistingStructureImpl):
+        (JSC::Structure::addPropertyTransitionToExistingStructure):
+        (JSC::Structure::addPropertyTransitionToExistingStructureConcurrently):
+        (JSC::Structure::getConcurrently):
+        (JSC::Structure::prototypeChainMayInterceptStoreTo):
+        (JSC):
+        * runtime/Structure.h:
+        (Structure):
+        * runtime/StructureInlines.h:
+        (JSC::Structure::getConcurrently):
+
+2013-05-02  Filip Pizlo  &lt;fpizlo@apple.com&gt;
+
</ins><span class="cx">         fourthTier: Structure transition table keys don't have to ref their StringImpl's
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=115525
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -220,6 +220,9 @@
</span><span class="cx">                 0F8364B7164B0C110053329A /* DFGBranchDirection.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F8364B5164B0C0E0053329A /* DFGBranchDirection.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 0F8F2B95172E04A0007DBDA5 /* FTLLink.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F8F2B93172E049E007DBDA5 /* FTLLink.cpp */; };
</span><span class="cx">                 0F8F2B96172E04A3007DBDA5 /* FTLLink.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F8F2B94172E049E007DBDA5 /* FTLLink.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><ins>+                0F8F2B99172F04FF007DBDA5 /* DFGDesiredIdentifiers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F8F2B97172F04FD007DBDA5 /* DFGDesiredIdentifiers.cpp */; };
+                0F8F2B9A172F0501007DBDA5 /* DFGDesiredIdentifiers.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F8F2B98172F04FD007DBDA5 /* DFGDesiredIdentifiers.h */; settings = {ATTRIBUTES = (Private, ); }; };
+                0F8F2B9E17306C8D007DBDA5 /* SourceCode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F8F2B9D17306C8B007DBDA5 /* SourceCode.cpp */; };
</ins><span class="cx">                 0F8F943C1667631300D61971 /* CodeSpecializationKind.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F8F943A1667631100D61971 /* CodeSpecializationKind.cpp */; };
</span><span class="cx">                 0F8F94401667633000D61971 /* CodeBlockHash.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F8F943D1667632D00D61971 /* CodeBlockHash.cpp */; };
</span><span class="cx">                 0F8F94411667633200D61971 /* CodeBlockHash.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F8F943E1667632D00D61971 /* CodeBlockHash.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="lines">@@ -1196,6 +1199,9 @@
</span><span class="cx">                 0F85A31E16AB76AE0077571E /* DFGVariadicFunction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGVariadicFunction.h; path = dfg/DFGVariadicFunction.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F8F2B93172E049E007DBDA5 /* FTLLink.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = FTLLink.cpp; path = ftl/FTLLink.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F8F2B94172E049E007DBDA5 /* FTLLink.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FTLLink.h; path = ftl/FTLLink.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                0F8F2B97172F04FD007DBDA5 /* DFGDesiredIdentifiers.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = DFGDesiredIdentifiers.cpp; path = dfg/DFGDesiredIdentifiers.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                0F8F2B98172F04FD007DBDA5 /* DFGDesiredIdentifiers.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DFGDesiredIdentifiers.h; path = dfg/DFGDesiredIdentifiers.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                0F8F2B9D17306C8B007DBDA5 /* SourceCode.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = SourceCode.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 0F8F943A1667631100D61971 /* CodeSpecializationKind.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CodeSpecializationKind.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F8F943D1667632D00D61971 /* CodeBlockHash.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CodeBlockHash.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F8F943E1667632D00D61971 /* CodeBlockHash.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CodeBlockHash.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -2559,6 +2565,7 @@
</span><span class="cx">                                 A77F18241641925400640A47 /* ParserModes.h */,
</span><span class="cx">                                 65303D631447B9E100D3F904 /* ParserTokens.h */,
</span><span class="cx">                                 869EBCB60E8C6D4A008722CC /* ResultType.h */,
</span><ins>+                                0F8F2B9D17306C8B007DBDA5 /* SourceCode.cpp */,
</ins><span class="cx">                                 65E866EE0DD59AFA00A2B2A1 /* SourceCode.h */,
</span><span class="cx">                                 0F493AF816D0CAD10084508B /* SourceProvider.cpp */,
</span><span class="cx">                                 65E866ED0DD59AFA00A2B2A1 /* SourceProvider.h */,
</span><span class="lines">@@ -2894,6 +2901,8 @@
</span><span class="cx">                                 0FFFC94E14EF909500C72532 /* DFGCSEPhase.h */,
</span><span class="cx">                                 0F2FC77016E12F6F0038D976 /* DFGDCEPhase.cpp */,
</span><span class="cx">                                 0F2FC77116E12F6F0038D976 /* DFGDCEPhase.h */,
</span><ins>+                                0F8F2B97172F04FD007DBDA5 /* DFGDesiredIdentifiers.cpp */,
+                                0F8F2B98172F04FD007DBDA5 /* DFGDesiredIdentifiers.h */,
</ins><span class="cx">                                 0FE853491723CDA500B618F5 /* DFGDesiredWatchpoints.cpp */,
</span><span class="cx">                                 0FE8534A1723CDA500B618F5 /* DFGDesiredWatchpoints.h */,
</span><span class="cx">                                 0FF427611591A1C9004CB9FF /* DFGDisassembler.cpp */,
</span><span class="lines">@@ -3479,6 +3488,7 @@
</span><span class="cx">                                 86E3C612167BABD7006D760A /* JSValue.h in Headers */,
</span><span class="cx">                                 86E3C61B167BABEE006D760A /* JSValueInternal.h in Headers */,
</span><span class="cx">                                 BC18C42C0E16F5CD00B34460 /* JSValueRef.h in Headers */,
</span><ins>+                                0F8F2B9A172F0501007DBDA5 /* DFGDesiredIdentifiers.h in Headers */,
</ins><span class="cx">                                 BC18C42D0E16F5CD00B34460 /* JSVariableObject.h in Headers */,
</span><span class="cx">                                 86E3C615167BABD7006D760A /* JSVirtualMachine.h in Headers */,
</span><span class="cx">                                 86E3C61D167BABEE006D760A /* JSVirtualMachineInternal.h in Headers */,
</span><span class="lines">@@ -4123,6 +4133,7 @@
</span><span class="cx">                                 86EC9DD21328DF82002B2AD7 /* DFGSpeculativeJIT.cpp in Sources */,
</span><span class="cx">                                 86880F1F14328BB900B08D42 /* DFGSpeculativeJIT32_64.cpp in Sources */,
</span><span class="cx">                                 86880F4D14353B2100B08D42 /* DFGSpeculativeJIT64.cpp in Sources */,
</span><ins>+                                0F8F2B9E17306C8D007DBDA5 /* SourceCode.cpp in Sources */,
</ins><span class="cx">                                 0FC097A1146B28CA00CF2442 /* DFGThunks.cpp in Sources */,
</span><span class="cx">                                 0F63944015C75F1D006A597C /* DFGTypeCheckHoistingPhase.cpp in Sources */,
</span><span class="cx">                                 0FBE0F7616C1DB0F0082C5E8 /* DFGUnificationPhase.cpp in Sources */,
</span><span class="lines">@@ -4346,6 +4357,7 @@
</span><span class="cx">                                 BCCF0D0C0EF0B8A500413C8F /* StructureStubInfo.cpp in Sources */,
</span><span class="cx">                                 C2DF442F1707AC0100A5CA96 /* SuperRegion.cpp in Sources */,
</span><span class="cx">                                 0F919D2815856773004A4E7D /* SymbolTable.cpp in Sources */,
</span><ins>+                                0F8F2B99172F04FF007DBDA5 /* DFGDesiredIdentifiers.cpp in Sources */,
</ins><span class="cx">                                 A7386555118697B400540279 /* ThunkGenerators.cpp in Sources */,
</span><span class="cx">                                 0FF4274A158EBE91004CB9FF /* udis86.c in Sources */,
</span><span class="cx">                                 0FF42740158EBE8B004CB9FF /* udis86_decode.c in Sources */,
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeCodeBlockcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -63,7 +63,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><del>-String CodeBlock::inferredName() const
</del><ins>+CString CodeBlock::inferredName() const
</ins><span class="cx"> {
</span><span class="cx">     switch (codeType()) {
</span><span class="cx">     case GlobalCode:
</span><span class="lines">@@ -71,10 +71,10 @@
</span><span class="cx">     case EvalCode:
</span><span class="cx">         return &quot;&lt;eval&gt;&quot;;
</span><span class="cx">     case FunctionCode:
</span><del>-        return jsCast&lt;FunctionExecutable*&gt;(ownerExecutable())-&gt;inferredName().string();
</del><ins>+        return jsCast&lt;FunctionExecutable*&gt;(ownerExecutable())-&gt;inferredName().utf8();
</ins><span class="cx">     default:
</span><span class="cx">         CRASH();
</span><del>-        return String();
</del><ins>+        return CString(&quot;&quot;, 0);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -83,10 +83,10 @@
</span><span class="cx">     return CodeBlockHash(ownerExecutable()-&gt;source(), specializationKind());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-String CodeBlock::sourceCodeForTools() const
</del><ins>+CString CodeBlock::sourceCodeForTools() const
</ins><span class="cx"> {
</span><span class="cx">     if (codeType() != FunctionCode)
</span><del>-        return ownerExecutable()-&gt;source().toString();
</del><ins>+        return ownerExecutable()-&gt;source().toUTF8();
</ins><span class="cx">     
</span><span class="cx">     SourceProvider* provider = source();
</span><span class="cx">     FunctionExecutable* executable = jsCast&lt;FunctionExecutable*&gt;(ownerExecutable());
</span><span class="lines">@@ -94,15 +94,14 @@
</span><span class="cx">     unsigned unlinkedStartOffset = unlinked-&gt;startOffset();
</span><span class="cx">     unsigned linkedStartOffset = executable-&gt;source().startOffset();
</span><span class="cx">     int delta = linkedStartOffset - unlinkedStartOffset;
</span><del>-    StringBuilder builder;
-    builder.append(&quot;function &quot;);
-    builder.append(provider-&gt;getRange(
-        delta + unlinked-&gt;functionStartOffset(),
-        delta + unlinked-&gt;startOffset() + unlinked-&gt;sourceLength()));
-    return builder.toString();
</del><ins>+    unsigned rangeStart = delta + unlinked-&gt;functionStartOffset();
+    unsigned rangeEnd = delta + unlinked-&gt;startOffset() + unlinked-&gt;sourceLength();
+    return toCString(
+        &quot;function &quot;,
+        provider-&gt;source().impl()-&gt;utf8ForRange(rangeStart, rangeEnd - rangeStart));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-String CodeBlock::sourceCodeOnOneLine() const
</del><ins>+CString CodeBlock::sourceCodeOnOneLine() const
</ins><span class="cx"> {
</span><span class="cx">     return reduceWhitespace(sourceCodeForTools());
</span><span class="cx"> }
</span><span class="lines">@@ -120,50 +119,28 @@
</span><span class="cx">     dumpAssumingJITType(out, getJITType());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static String escapeQuotes(const String&amp; str)
</del><ins>+static CString constantName(int k, JSValue value)
</ins><span class="cx"> {
</span><del>-    String result = str;
-    size_t pos = 0;
-    while ((pos = result.find('\&quot;', pos)) != notFound) {
-        result = makeString(result.substringSharingImpl(0, pos), &quot;\&quot;\\\&quot;\&quot;&quot;, result.substringSharingImpl(pos + 1));
-        pos += 4;
-    }
-    return result;
</del><ins>+    return toCString(value, &quot;(@k&quot;, k - FirstConstantRegisterIndex, &quot;)&quot;);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-static String valueToSourceString(ExecState* exec, JSValue val)
-{
-    if (!val)
-        return ASCIILiteral(&quot;0&quot;);
-
-    if (val.isString())
-        return makeString(&quot;\&quot;&quot;, escapeQuotes(val.toString(exec)-&gt;value(exec)), &quot;\&quot;&quot;);
-
-    return toString(val);
-}
-
-static CString constantName(ExecState* exec, int k, JSValue value)
-{
-    return makeString(valueToSourceString(exec, value), &quot;(@k&quot;, String::number(k - FirstConstantRegisterIndex), &quot;)&quot;).utf8();
-}
-
</del><span class="cx"> static CString idName(int id0, const Identifier&amp; ident)
</span><span class="cx"> {
</span><del>-    return makeString(ident.string(), &quot;(@id&quot;, String::number(id0), &quot;)&quot;).utf8();
</del><ins>+    return toCString(ident.impl(), &quot;(@id&quot;, id0, &quot;)&quot;);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-CString CodeBlock::registerName(ExecState* exec, int r) const
</del><ins>+CString CodeBlock::registerName(int r) const
</ins><span class="cx"> {
</span><span class="cx">     if (r == missingThisObjectMarker())
</span><span class="cx">         return &quot;&lt;null&gt;&quot;;
</span><span class="cx"> 
</span><span class="cx">     if (isConstantRegisterIndex(r))
</span><del>-        return constantName(exec, r, getConstant(r));
</del><ins>+        return constantName(r, getConstant(r));
</ins><span class="cx"> 
</span><del>-    return makeString(&quot;r&quot;, String::number(r)).utf8();
</del><ins>+    return toCString(&quot;r&quot;, r);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-static String regexpToSourceString(RegExp* regExp)
</del><ins>+static CString regexpToSourceString(RegExp* regExp)
</ins><span class="cx"> {
</span><span class="cx">     char postfix[5] = { '/', 0, 0, 0, 0 };
</span><span class="cx">     int index = 1;
</span><span class="lines">@@ -174,19 +151,17 @@
</span><span class="cx">     if (regExp-&gt;multiline())
</span><span class="cx">         postfix[index] = 'm';
</span><span class="cx"> 
</span><del>-    return makeString(&quot;/&quot;, regExp-&gt;pattern(), postfix);
</del><ins>+    return toCString(&quot;/&quot;, regExp-&gt;pattern().impl(), postfix);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static CString regexpName(int re, RegExp* regexp)
</span><span class="cx"> {
</span><del>-    return makeString(regexpToSourceString(regexp), &quot;(@re&quot;, String::number(re), &quot;)&quot;).utf8();
</del><ins>+    return toCString(regexpToSourceString(regexp), &quot;(@re&quot;, re, &quot;)&quot;);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-static String pointerToSourceString(void* p)
</del><ins>+static CString pointerToSourceString(void* p)
</ins><span class="cx"> {
</span><del>-    char buffer[2 + 2 * sizeof(void*) + 1]; // 0x [two characters per byte] \0
-    snprintf(buffer, sizeof(buffer), &quot;%p&quot;, p);
-    return buffer;
</del><ins>+    return toCString(RawPointer(p));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> NEVER_INLINE static const char* debugHookName(int debugHookID)
</span><span class="lines">@@ -210,27 +185,27 @@
</span><span class="cx">     return &quot;&quot;;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void CodeBlock::printUnaryOp(PrintStream&amp; out, ExecState* exec, int location, const Instruction*&amp; it, const char* op)
</del><ins>+void CodeBlock::printUnaryOp(PrintStream&amp; out, ExecState*, int location, const Instruction*&amp; it, const char* op)
</ins><span class="cx"> {
</span><span class="cx">     int r0 = (++it)-&gt;u.operand;
</span><span class="cx">     int r1 = (++it)-&gt;u.operand;
</span><span class="cx"> 
</span><del>-    out.printf(&quot;[%4d] %s\t\t %s, %s&quot;, location, op, registerName(exec, r0).data(), registerName(exec, r1).data());
</del><ins>+    out.printf(&quot;[%4d] %s\t\t %s, %s&quot;, location, op, registerName(r0).data(), registerName(r1).data());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void CodeBlock::printBinaryOp(PrintStream&amp; out, ExecState* exec, int location, const Instruction*&amp; it, const char* op)
</del><ins>+void CodeBlock::printBinaryOp(PrintStream&amp; out, ExecState*, int location, const Instruction*&amp; it, const char* op)
</ins><span class="cx"> {
</span><span class="cx">     int r0 = (++it)-&gt;u.operand;
</span><span class="cx">     int r1 = (++it)-&gt;u.operand;
</span><span class="cx">     int r2 = (++it)-&gt;u.operand;
</span><del>-    out.printf(&quot;[%4d] %s\t\t %s, %s, %s&quot;, location, op, registerName(exec, r0).data(), registerName(exec, r1).data(), registerName(exec, r2).data());
</del><ins>+    out.printf(&quot;[%4d] %s\t\t %s, %s, %s&quot;, location, op, registerName(r0).data(), registerName(r1).data(), registerName(r2).data());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void CodeBlock::printConditionalJump(PrintStream&amp; out, ExecState* exec, const Instruction*, const Instruction*&amp; it, int location, const char* op)
</del><ins>+void CodeBlock::printConditionalJump(PrintStream&amp; out, ExecState*, const Instruction*, const Instruction*&amp; it, int location, const char* op)
</ins><span class="cx"> {
</span><span class="cx">     int r0 = (++it)-&gt;u.operand;
</span><span class="cx">     int offset = (++it)-&gt;u.operand;
</span><del>-    out.printf(&quot;[%4d] %s\t\t %s, %d(-&gt;%d)&quot;, location, op, registerName(exec, r0).data(), offset, location + offset);
</del><ins>+    out.printf(&quot;[%4d] %s\t\t %s, %d(-&gt;%d)&quot;, location, op, registerName(r0).data(), offset, location + offset);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void CodeBlock::printGetByIdOp(PrintStream&amp; out, ExecState* exec, int location, const Instruction*&amp; it)
</span><span class="lines">@@ -286,7 +261,7 @@
</span><span class="cx">     int r0 = (++it)-&gt;u.operand;
</span><span class="cx">     int r1 = (++it)-&gt;u.operand;
</span><span class="cx">     int id0 = (++it)-&gt;u.operand;
</span><del>-    out.printf(&quot;[%4d] %s\t %s, %s, %s&quot;, location, op, registerName(exec, r0).data(), registerName(exec, r1).data(), idName(id0, m_identifiers[id0]).data());
</del><ins>+    out.printf(&quot;[%4d] %s\t %s, %s, %s&quot;, location, op, registerName(r0).data(), registerName(r1).data(), idName(id0, m_identifiers[id0]).data());
</ins><span class="cx">     it += 4; // Increment up to the value profiler.
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -298,7 +273,7 @@
</span><span class="cx">     
</span><span class="cx">     out.printf(&quot;%s = %p&quot;, name, structure);
</span><span class="cx">     
</span><del>-    PropertyOffset offset = structure-&gt;get(exec-&gt;vm(), ident);
</del><ins>+    PropertyOffset offset = structure-&gt;getConcurrently(exec-&gt;vm(), ident.impl());
</ins><span class="cx">     if (offset != invalidOffset)
</span><span class="cx">         out.printf(&quot; (offset = %d)&quot;, offset);
</span><span class="cx"> }
</span><span class="lines">@@ -437,12 +412,12 @@
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void CodeBlock::printCallOp(PrintStream&amp; out, ExecState* exec, int location, const Instruction*&amp; it, const char* op, CacheDumpMode cacheDumpMode)
</del><ins>+void CodeBlock::printCallOp(PrintStream&amp; out, ExecState*, int location, const Instruction*&amp; it, const char* op, CacheDumpMode cacheDumpMode)
</ins><span class="cx"> {
</span><span class="cx">     int func = (++it)-&gt;u.operand;
</span><span class="cx">     int argCount = (++it)-&gt;u.operand;
</span><span class="cx">     int registerOffset = (++it)-&gt;u.operand;
</span><del>-    out.printf(&quot;[%4d] %s\t %s, %d, %d&quot;, location, op, registerName(exec, func).data(), argCount, registerOffset);
</del><ins>+    out.printf(&quot;[%4d] %s\t %s, %d, %d&quot;, location, op, registerName(func).data(), argCount, registerOffset);
</ins><span class="cx">     if (cacheDumpMode == DumpCaches) {
</span><span class="cx"> #if ENABLE(LLINT)
</span><span class="cx">         LLIntCallLinkInfo* callLinkInfo = it[1].u.callLinkInfo;
</span><span class="lines">@@ -465,19 +440,19 @@
</span><span class="cx">     it += 2;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void CodeBlock::printPutByIdOp(PrintStream&amp; out, ExecState* exec, int location, const Instruction*&amp; it, const char* op)
</del><ins>+void CodeBlock::printPutByIdOp(PrintStream&amp; out, ExecState*, int location, const Instruction*&amp; it, const char* op)
</ins><span class="cx"> {
</span><span class="cx">     int r0 = (++it)-&gt;u.operand;
</span><span class="cx">     int id0 = (++it)-&gt;u.operand;
</span><span class="cx">     int r1 = (++it)-&gt;u.operand;
</span><del>-    out.printf(&quot;[%4d] %s\t %s, %s, %s&quot;, location, op, registerName(exec, r0).data(), idName(id0, m_identifiers[id0]).data(), registerName(exec, r1).data());
</del><ins>+    out.printf(&quot;[%4d] %s\t %s, %s, %s&quot;, location, op, registerName(r0).data(), idName(id0, m_identifiers[id0]).data(), registerName(r1).data());
</ins><span class="cx">     it += 5;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void CodeBlock::printStructure(PrintStream&amp; out, const char* name, const Instruction* vPC, int operand)
</span><span class="cx"> {
</span><span class="cx">     unsigned instructionOffset = vPC - instructions().begin();
</span><del>-    out.printf(&quot;  [%4d] %s: %s\n&quot;, instructionOffset, name, pointerToSourceString(vPC[operand].u.structure).utf8().data());
</del><ins>+    out.printf(&quot;  [%4d] %s: %s\n&quot;, instructionOffset, name, pointerToSourceString(vPC[operand].u.structure).data());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void CodeBlock::printStructures(PrintStream&amp; out, const Instruction* vPC)
</span><span class="lines">@@ -494,15 +469,15 @@
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx">     if (vPC[0].u.opcode == interpreter-&gt;getOpcode(op_get_by_id_proto)) {
</span><del>-        out.printf(&quot;  [%4d] %s: %s, %s\n&quot;, instructionOffset, &quot;get_by_id_proto&quot;, pointerToSourceString(vPC[4].u.structure).utf8().data(), pointerToSourceString(vPC[5].u.structure).utf8().data());
</del><ins>+        out.printf(&quot;  [%4d] %s: %s, %s\n&quot;, instructionOffset, &quot;get_by_id_proto&quot;, pointerToSourceString(vPC[4].u.structure).data(), pointerToSourceString(vPC[5].u.structure).data());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx">     if (vPC[0].u.opcode == interpreter-&gt;getOpcode(op_put_by_id_transition)) {
</span><del>-        out.printf(&quot;  [%4d] %s: %s, %s, %s\n&quot;, instructionOffset, &quot;put_by_id_transition&quot;, pointerToSourceString(vPC[4].u.structure).utf8().data(), pointerToSourceString(vPC[5].u.structure).utf8().data(), pointerToSourceString(vPC[6].u.structureChain).utf8().data());
</del><ins>+        out.printf(&quot;  [%4d] %s: %s, %s, %s\n&quot;, instructionOffset, &quot;put_by_id_transition&quot;, pointerToSourceString(vPC[4].u.structure).data(), pointerToSourceString(vPC[5].u.structure).data(), pointerToSourceString(vPC[6].u.structureChain).data());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx">     if (vPC[0].u.opcode == interpreter-&gt;getOpcode(op_get_by_id_chain)) {
</span><del>-        out.printf(&quot;  [%4d] %s: %s, %s\n&quot;, instructionOffset, &quot;get_by_id_chain&quot;, pointerToSourceString(vPC[4].u.structure).utf8().data(), pointerToSourceString(vPC[5].u.structureChain).utf8().data());
</del><ins>+        out.printf(&quot;  [%4d] %s: %s, %s\n&quot;, instructionOffset, &quot;get_by_id_chain&quot;, pointerToSourceString(vPC[4].u.structure).data(), pointerToSourceString(vPC[5].u.structureChain).data());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx">     if (vPC[0].u.opcode == interpreter-&gt;getOpcode(op_put_by_id)) {
</span><span class="lines">@@ -568,7 +543,7 @@
</span><span class="cx">         out.printf(&quot;\nConstants:\n&quot;);
</span><span class="cx">         size_t i = 0;
</span><span class="cx">         do {
</span><del>-            out.printf(&quot;   k%u = %s\n&quot;, static_cast&lt;unsigned&gt;(i), valueToSourceString(exec, m_constantRegisters[i].get()).utf8().data());
</del><ins>+            out.printf(&quot;   k%u = %s\n&quot;, static_cast&lt;unsigned&gt;(i), toCString(m_constantRegisters[i].get()).data());
</ins><span class="cx">             ++i;
</span><span class="cx">         } while (i &lt; m_constantRegisters.size());
</span><span class="cx">     }
</span><span class="lines">@@ -577,7 +552,7 @@
</span><span class="cx">         out.printf(&quot;\nm_regexps:\n&quot;);
</span><span class="cx">         size_t i = 0;
</span><span class="cx">         do {
</span><del>-            out.printf(&quot;  re%u = %s\n&quot;, static_cast&lt;unsigned&gt;(i), regexpToSourceString(m_unlinkedCode-&gt;regexp(i)).utf8().data());
</del><ins>+            out.printf(&quot;  re%u = %s\n&quot;, static_cast&lt;unsigned&gt;(i), regexpToSourceString(m_unlinkedCode-&gt;regexp(i)).data());
</ins><span class="cx">             ++i;
</span><span class="cx">         } while (i &lt; count);
</span><span class="cx">     }
</span><span class="lines">@@ -715,22 +690,22 @@
</span><span class="cx">         }
</span><span class="cx">         case op_create_activation: {
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] create_activation %s&quot;, location, registerName(exec, r0).data());
</del><ins>+            out.printf(&quot;[%4d] create_activation %s&quot;, location, registerName(r0).data());
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_create_arguments: {
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] create_arguments\t %s&quot;, location, registerName(exec, r0).data());
</del><ins>+            out.printf(&quot;[%4d] create_arguments\t %s&quot;, location, registerName(r0).data());
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_init_lazy_reg: {
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] init_lazy_reg\t %s&quot;, location, registerName(exec, r0).data());
</del><ins>+            out.printf(&quot;[%4d] init_lazy_reg\t %s&quot;, location, registerName(r0).data());
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_get_callee: {
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] op_get_callee %s\n&quot;, location, registerName(exec, r0).data());
</del><ins>+            out.printf(&quot;[%4d] op_get_callee %s\n&quot;, location, registerName(r0).data());
</ins><span class="cx">             ++it;
</span><span class="cx">             break;
</span><span class="cx">         }
</span><span class="lines">@@ -738,19 +713,19 @@
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><span class="cx">             int r1 = (++it)-&gt;u.operand;
</span><span class="cx">             unsigned inferredInlineCapacity = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] create_this %s, %s, %u&quot;, location, registerName(exec, r0).data(), registerName(exec, r1).data(), inferredInlineCapacity);
</del><ins>+            out.printf(&quot;[%4d] create_this %s, %s, %u&quot;, location, registerName(r0).data(), registerName(r1).data(), inferredInlineCapacity);
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_convert_this: {
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] convert_this\t %s&quot;, location, registerName(exec, r0).data());
</del><ins>+            out.printf(&quot;[%4d] convert_this\t %s&quot;, location, registerName(r0).data());
</ins><span class="cx">             ++it; // Skip value profile.
</span><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_new_object: {
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><span class="cx">             unsigned inferredInlineCapacity = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] new_object\t %s, %u&quot;, location, registerName(exec, r0).data(), inferredInlineCapacity);
</del><ins>+            out.printf(&quot;[%4d] new_object\t %s, %u&quot;, location, registerName(r0).data(), inferredInlineCapacity);
</ins><span class="cx">             ++it; // Skip object allocation profile.
</span><span class="cx">             break;
</span><span class="cx">         }
</span><span class="lines">@@ -758,14 +733,14 @@
</span><span class="cx">             int dst = (++it)-&gt;u.operand;
</span><span class="cx">             int argv = (++it)-&gt;u.operand;
</span><span class="cx">             int argc = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] new_array\t %s, %s, %d&quot;, location, registerName(exec, dst).data(), registerName(exec, argv).data(), argc);
</del><ins>+            out.printf(&quot;[%4d] new_array\t %s, %s, %d&quot;, location, registerName(dst).data(), registerName(argv).data(), argc);
</ins><span class="cx">             ++it; // Skip array allocation profile.
</span><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_new_array_with_size: {
</span><span class="cx">             int dst = (++it)-&gt;u.operand;
</span><span class="cx">             int length = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] new_array_with_size\t %s, %s&quot;, location, registerName(exec, dst).data(), registerName(exec, length).data());
</del><ins>+            out.printf(&quot;[%4d] new_array_with_size\t %s, %s&quot;, location, registerName(dst).data(), registerName(length).data());
</ins><span class="cx">             ++it; // Skip array allocation profile.
</span><span class="cx">             break;
</span><span class="cx">         }
</span><span class="lines">@@ -773,14 +748,14 @@
</span><span class="cx">             int dst = (++it)-&gt;u.operand;
</span><span class="cx">             int argv = (++it)-&gt;u.operand;
</span><span class="cx">             int argc = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] new_array_buffer\t %s, %d, %d&quot;, location, registerName(exec, dst).data(), argv, argc);
</del><ins>+            out.printf(&quot;[%4d] new_array_buffer\t %s, %d, %d&quot;, location, registerName(dst).data(), argv, argc);
</ins><span class="cx">             ++it; // Skip array allocation profile.
</span><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_new_regexp: {
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><span class="cx">             int re0 = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] new_regexp\t %s, &quot;, location, registerName(exec, r0).data());
</del><ins>+            out.printf(&quot;[%4d] new_regexp\t %s, &quot;, location, registerName(r0).data());
</ins><span class="cx">             if (r0 &gt;=0 &amp;&amp; r0 &lt; (int)m_unlinkedCode-&gt;numberOfRegExps())
</span><span class="cx">                 out.printf(&quot;%s&quot;, regexpName(re0, regexp(re0)).data());
</span><span class="cx">             else
</span><span class="lines">@@ -790,7 +765,7 @@
</span><span class="cx">         case op_mov: {
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><span class="cx">             int r1 = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] mov\t\t %s, %s&quot;, location, registerName(exec, r0).data(), registerName(exec, r1).data());
</del><ins>+            out.printf(&quot;[%4d] mov\t\t %s, %s&quot;, location, registerName(r0).data(), registerName(r1).data());
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_not: {
</span><span class="lines">@@ -839,12 +814,12 @@
</span><span class="cx">         }
</span><span class="cx">         case op_inc: {
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] pre_inc\t\t %s&quot;, location, registerName(exec, r0).data());
</del><ins>+            out.printf(&quot;[%4d] pre_inc\t\t %s&quot;, location, registerName(r0).data());
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_dec: {
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] pre_dec\t\t %s&quot;, location, registerName(exec, r0).data());
</del><ins>+            out.printf(&quot;[%4d] pre_dec\t\t %s&quot;, location, registerName(r0).data());
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_to_number: {
</span><span class="lines">@@ -911,14 +886,14 @@
</span><span class="cx">             int r1 = (++it)-&gt;u.operand;
</span><span class="cx">             int r2 = (++it)-&gt;u.operand;
</span><span class="cx">             int offset = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] check_has_instance\t\t %s, %s, %s, %d(-&gt;%d)&quot;, location, registerName(exec, r0).data(), registerName(exec, r1).data(), registerName(exec, r2).data(), offset, location + offset);
</del><ins>+            out.printf(&quot;[%4d] check_has_instance\t\t %s, %s, %s, %d(-&gt;%d)&quot;, location, registerName(r0).data(), registerName(r1).data(), registerName(r2).data(), offset, location + offset);
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_instanceof: {
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><span class="cx">             int r1 = (++it)-&gt;u.operand;
</span><span class="cx">             int r2 = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] instanceof\t\t %s, %s, %s&quot;, location, registerName(exec, r0).data(), registerName(exec, r1).data(), registerName(exec, r2).data());
</del><ins>+            out.printf(&quot;[%4d] instanceof\t\t %s, %s, %s&quot;, location, registerName(r0).data(), registerName(r1).data(), registerName(r2).data());
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_typeof: {
</span><span class="lines">@@ -959,7 +934,7 @@
</span><span class="cx">             int id0 = (++it)-&gt;u.operand;
</span><span class="cx">             int value = (++it)-&gt;u.operand;
</span><span class="cx">             int resolveInfo = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] put_to_base\t %s, %s, %s, %d&quot;, location, registerName(exec, base).data(), idName(id0, m_identifiers[id0]).data(), registerName(exec, value).data(), resolveInfo);
</del><ins>+            out.printf(&quot;[%4d] put_to_base\t %s, %s, %s, %d&quot;, location, registerName(base).data(), idName(id0, m_identifiers[id0]).data(), registerName(value).data(), resolveInfo);
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_resolve:
</span><span class="lines">@@ -971,7 +946,7 @@
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><span class="cx">             int id0 = (++it)-&gt;u.operand;
</span><span class="cx">             int resolveInfo = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] resolve\t\t %s, %s, %d&quot;, location, registerName(exec, r0).data(), idName(id0, m_identifiers[id0]).data(), resolveInfo);
</del><ins>+            out.printf(&quot;[%4d] resolve\t\t %s, %s, %d&quot;, location, registerName(r0).data(), idName(id0, m_identifiers[id0]).data(), resolveInfo);
</ins><span class="cx">             dumpValueProfiling(out, it, hasPrintedProfiling);
</span><span class="cx">             break;
</span><span class="cx">         }
</span><span class="lines">@@ -979,7 +954,7 @@
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><span class="cx">             int index = (++it)-&gt;u.operand;
</span><span class="cx">             int skipLevels = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] get_scoped_var\t %s, %d, %d&quot;, location, registerName(exec, r0).data(), index, skipLevels);
</del><ins>+            out.printf(&quot;[%4d] get_scoped_var\t %s, %d, %d&quot;, location, registerName(r0).data(), index, skipLevels);
</ins><span class="cx">             dumpValueProfiling(out, it, hasPrintedProfiling);
</span><span class="cx">             break;
</span><span class="cx">         }
</span><span class="lines">@@ -987,7 +962,7 @@
</span><span class="cx">             int index = (++it)-&gt;u.operand;
</span><span class="cx">             int skipLevels = (++it)-&gt;u.operand;
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] put_scoped_var\t %d, %d, %s&quot;, location, index, skipLevels, registerName(exec, r0).data());
</del><ins>+            out.printf(&quot;[%4d] put_scoped_var\t %d, %d, %s&quot;, location, index, skipLevels, registerName(r0).data());
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_init_global_const_nop: {
</span><span class="lines">@@ -1001,7 +976,7 @@
</span><span class="cx">         case op_init_global_const: {
</span><span class="cx">             WriteBarrier&lt;Unknown&gt;* registerPointer = (++it)-&gt;u.registerPointer;
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] init_global_const\t g%d(%p), %s&quot;, location, m_globalObject-&gt;findRegisterIndex(registerPointer), registerPointer, registerName(exec, r0).data());
</del><ins>+            out.printf(&quot;[%4d] init_global_const\t g%d(%p), %s&quot;, location, m_globalObject-&gt;findRegisterIndex(registerPointer), registerPointer, registerName(r0).data());
</ins><span class="cx">             it++;
</span><span class="cx">             it++;
</span><span class="cx">             break;
</span><span class="lines">@@ -1009,7 +984,7 @@
</span><span class="cx">         case op_init_global_const_check: {
</span><span class="cx">             WriteBarrier&lt;Unknown&gt;* registerPointer = (++it)-&gt;u.registerPointer;
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] init_global_const_check\t g%d(%p), %s&quot;, location, m_globalObject-&gt;findRegisterIndex(registerPointer), registerPointer, registerName(exec, r0).data());
</del><ins>+            out.printf(&quot;[%4d] init_global_const_check\t g%d(%p), %s&quot;, location, m_globalObject-&gt;findRegisterIndex(registerPointer), registerPointer, registerName(r0).data());
</ins><span class="cx">             it++;
</span><span class="cx">             it++;
</span><span class="cx">             break;
</span><span class="lines">@@ -1024,7 +999,7 @@
</span><span class="cx">             int isStrict = (++it)-&gt;u.operand;
</span><span class="cx">             int resolveInfo = (++it)-&gt;u.operand;
</span><span class="cx">             int putToBaseInfo = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] resolve_base%s\t %s, %s, %d, %d&quot;, location, isStrict ? &quot;_strict&quot; : &quot;&quot;, registerName(exec, r0).data(), idName(id0, m_identifiers[id0]).data(), resolveInfo, putToBaseInfo);
</del><ins>+            out.printf(&quot;[%4d] resolve_base%s\t %s, %s, %d, %d&quot;, location, isStrict ? &quot;_strict&quot; : &quot;&quot;, registerName(r0).data(), idName(id0, m_identifiers[id0]).data(), resolveInfo, putToBaseInfo);
</ins><span class="cx">             dumpValueProfiling(out, it, hasPrintedProfiling);
</span><span class="cx">             break;
</span><span class="cx">         }
</span><span class="lines">@@ -1034,7 +1009,7 @@
</span><span class="cx">             int id0 = (++it)-&gt;u.operand;
</span><span class="cx">             int resolveInfo = (++it)-&gt;u.operand;
</span><span class="cx">             int putToBaseInfo = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] resolve_with_base %s, %s, %s, %d, %d&quot;, location, registerName(exec, r0).data(), registerName(exec, r1).data(), idName(id0, m_identifiers[id0]).data(), resolveInfo, putToBaseInfo);
</del><ins>+            out.printf(&quot;[%4d] resolve_with_base %s, %s, %s, %d, %d&quot;, location, registerName(r0).data(), registerName(r1).data(), idName(id0, m_identifiers[id0]).data(), resolveInfo, putToBaseInfo);
</ins><span class="cx">             dumpValueProfiling(out, it, hasPrintedProfiling);
</span><span class="cx">             break;
</span><span class="cx">         }
</span><span class="lines">@@ -1043,7 +1018,7 @@
</span><span class="cx">             int r1 = (++it)-&gt;u.operand;
</span><span class="cx">             int id0 = (++it)-&gt;u.operand;
</span><span class="cx">             int resolveInfo = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] resolve_with_this %s, %s, %s, %d&quot;, location, registerName(exec, r0).data(), registerName(exec, r1).data(), idName(id0, m_identifiers[id0]).data(), resolveInfo);
</del><ins>+            out.printf(&quot;[%4d] resolve_with_this %s, %s, %s, %d&quot;, location, registerName(r0).data(), registerName(r1).data(), idName(id0, m_identifiers[id0]).data(), resolveInfo);
</ins><span class="cx">             dumpValueProfiling(out, it, hasPrintedProfiling);
</span><span class="cx">             break;
</span><span class="cx">         }
</span><span class="lines">@@ -1112,21 +1087,21 @@
</span><span class="cx">             int id0 = (++it)-&gt;u.operand;
</span><span class="cx">             int r1 = (++it)-&gt;u.operand;
</span><span class="cx">             int r2 = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] put_getter_setter\t %s, %s, %s, %s&quot;, location, registerName(exec, r0).data(), idName(id0, m_identifiers[id0]).data(), registerName(exec, r1).data(), registerName(exec, r2).data());
</del><ins>+            out.printf(&quot;[%4d] put_getter_setter\t %s, %s, %s, %s&quot;, location, registerName(r0).data(), idName(id0, m_identifiers[id0]).data(), registerName(r1).data(), registerName(r2).data());
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_del_by_id: {
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><span class="cx">             int r1 = (++it)-&gt;u.operand;
</span><span class="cx">             int id0 = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] del_by_id\t %s, %s, %s&quot;, location, registerName(exec, r0).data(), registerName(exec, r1).data(), idName(id0, m_identifiers[id0]).data());
</del><ins>+            out.printf(&quot;[%4d] del_by_id\t %s, %s, %s&quot;, location, registerName(r0).data(), registerName(r1).data(), idName(id0, m_identifiers[id0]).data());
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_get_by_val: {
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><span class="cx">             int r1 = (++it)-&gt;u.operand;
</span><span class="cx">             int r2 = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] get_by_val\t %s, %s, %s&quot;, location, registerName(exec, r0).data(), registerName(exec, r1).data(), registerName(exec, r2).data());
</del><ins>+            out.printf(&quot;[%4d] get_by_val\t %s, %s, %s&quot;, location, registerName(r0).data(), registerName(r1).data(), registerName(r2).data());
</ins><span class="cx">             dumpArrayProfiling(out, it, hasPrintedProfiling);
</span><span class="cx">             dumpValueProfiling(out, it, hasPrintedProfiling);
</span><span class="cx">             break;
</span><span class="lines">@@ -1135,7 +1110,7 @@
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><span class="cx">             int r1 = (++it)-&gt;u.operand;
</span><span class="cx">             int r2 = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] get_argument_by_val\t %s, %s, %s&quot;, location, registerName(exec, r0).data(), registerName(exec, r1).data(), registerName(exec, r2).data());
</del><ins>+            out.printf(&quot;[%4d] get_argument_by_val\t %s, %s, %s&quot;, location, registerName(r0).data(), registerName(r1).data(), registerName(r2).data());
</ins><span class="cx">             ++it;
</span><span class="cx">             dumpValueProfiling(out, it, hasPrintedProfiling);
</span><span class="cx">             break;
</span><span class="lines">@@ -1147,14 +1122,14 @@
</span><span class="cx">             int r3 = (++it)-&gt;u.operand;
</span><span class="cx">             int r4 = (++it)-&gt;u.operand;
</span><span class="cx">             int r5 = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] get_by_pname\t %s, %s, %s, %s, %s, %s&quot;, location, registerName(exec, r0).data(), registerName(exec, r1).data(), registerName(exec, r2).data(), registerName(exec, r3).data(), registerName(exec, r4).data(), registerName(exec, r5).data());
</del><ins>+            out.printf(&quot;[%4d] get_by_pname\t %s, %s, %s, %s, %s, %s&quot;, location, registerName(r0).data(), registerName(r1).data(), registerName(r2).data(), registerName(r3).data(), registerName(r4).data(), registerName(r5).data());
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_put_by_val: {
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><span class="cx">             int r1 = (++it)-&gt;u.operand;
</span><span class="cx">             int r2 = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] put_by_val\t %s, %s, %s&quot;, location, registerName(exec, r0).data(), registerName(exec, r1).data(), registerName(exec, r2).data());
</del><ins>+            out.printf(&quot;[%4d] put_by_val\t %s, %s, %s&quot;, location, registerName(r0).data(), registerName(r1).data(), registerName(r2).data());
</ins><span class="cx">             dumpArrayProfiling(out, it, hasPrintedProfiling);
</span><span class="cx">             break;
</span><span class="cx">         }
</span><span class="lines">@@ -1162,14 +1137,14 @@
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><span class="cx">             int r1 = (++it)-&gt;u.operand;
</span><span class="cx">             int r2 = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] del_by_val\t %s, %s, %s&quot;, location, registerName(exec, r0).data(), registerName(exec, r1).data(), registerName(exec, r2).data());
</del><ins>+            out.printf(&quot;[%4d] del_by_val\t %s, %s, %s&quot;, location, registerName(r0).data(), registerName(r1).data(), registerName(r2).data());
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_put_by_index: {
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><span class="cx">             unsigned n0 = (++it)-&gt;u.operand;
</span><span class="cx">             int r1 = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] put_by_index\t %s, %u, %s&quot;, location, registerName(exec, r0).data(), n0, registerName(exec, r1).data());
</del><ins>+            out.printf(&quot;[%4d] put_by_index\t %s, %u, %s&quot;, location, registerName(r0).data(), n0, registerName(r1).data());
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_jmp: {
</span><span class="lines">@@ -1197,63 +1172,63 @@
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><span class="cx">             Special::Pointer pointer = (++it)-&gt;u.specialPointer;
</span><span class="cx">             int offset = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] jneq_ptr\t\t %s, %d (%p), %d(-&gt;%d)&quot;, location, registerName(exec, r0).data(), pointer, m_globalObject-&gt;actualPointerFor(pointer), offset, location + offset);
</del><ins>+            out.printf(&quot;[%4d] jneq_ptr\t\t %s, %d (%p), %d(-&gt;%d)&quot;, location, registerName(r0).data(), pointer, m_globalObject-&gt;actualPointerFor(pointer), offset, location + offset);
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_jless: {
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><span class="cx">             int r1 = (++it)-&gt;u.operand;
</span><span class="cx">             int offset = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] jless\t\t %s, %s, %d(-&gt;%d)&quot;, location, registerName(exec, r0).data(), registerName(exec, r1).data(), offset, location + offset);
</del><ins>+            out.printf(&quot;[%4d] jless\t\t %s, %s, %d(-&gt;%d)&quot;, location, registerName(r0).data(), registerName(r1).data(), offset, location + offset);
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_jlesseq: {
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><span class="cx">             int r1 = (++it)-&gt;u.operand;
</span><span class="cx">             int offset = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] jlesseq\t\t %s, %s, %d(-&gt;%d)&quot;, location, registerName(exec, r0).data(), registerName(exec, r1).data(), offset, location + offset);
</del><ins>+            out.printf(&quot;[%4d] jlesseq\t\t %s, %s, %d(-&gt;%d)&quot;, location, registerName(r0).data(), registerName(r1).data(), offset, location + offset);
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_jgreater: {
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><span class="cx">             int r1 = (++it)-&gt;u.operand;
</span><span class="cx">             int offset = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] jgreater\t\t %s, %s, %d(-&gt;%d)&quot;, location, registerName(exec, r0).data(), registerName(exec, r1).data(), offset, location + offset);
</del><ins>+            out.printf(&quot;[%4d] jgreater\t\t %s, %s, %d(-&gt;%d)&quot;, location, registerName(r0).data(), registerName(r1).data(), offset, location + offset);
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_jgreatereq: {
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><span class="cx">             int r1 = (++it)-&gt;u.operand;
</span><span class="cx">             int offset = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] jgreatereq\t\t %s, %s, %d(-&gt;%d)&quot;, location, registerName(exec, r0).data(), registerName(exec, r1).data(), offset, location + offset);
</del><ins>+            out.printf(&quot;[%4d] jgreatereq\t\t %s, %s, %d(-&gt;%d)&quot;, location, registerName(r0).data(), registerName(r1).data(), offset, location + offset);
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_jnless: {
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><span class="cx">             int r1 = (++it)-&gt;u.operand;
</span><span class="cx">             int offset = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] jnless\t\t %s, %s, %d(-&gt;%d)&quot;, location, registerName(exec, r0).data(), registerName(exec, r1).data(), offset, location + offset);
</del><ins>+            out.printf(&quot;[%4d] jnless\t\t %s, %s, %d(-&gt;%d)&quot;, location, registerName(r0).data(), registerName(r1).data(), offset, location + offset);
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_jnlesseq: {
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><span class="cx">             int r1 = (++it)-&gt;u.operand;
</span><span class="cx">             int offset = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] jnlesseq\t\t %s, %s, %d(-&gt;%d)&quot;, location, registerName(exec, r0).data(), registerName(exec, r1).data(), offset, location + offset);
</del><ins>+            out.printf(&quot;[%4d] jnlesseq\t\t %s, %s, %d(-&gt;%d)&quot;, location, registerName(r0).data(), registerName(r1).data(), offset, location + offset);
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_jngreater: {
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><span class="cx">             int r1 = (++it)-&gt;u.operand;
</span><span class="cx">             int offset = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] jngreater\t\t %s, %s, %d(-&gt;%d)&quot;, location, registerName(exec, r0).data(), registerName(exec, r1).data(), offset, location + offset);
</del><ins>+            out.printf(&quot;[%4d] jngreater\t\t %s, %s, %d(-&gt;%d)&quot;, location, registerName(r0).data(), registerName(r1).data(), offset, location + offset);
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_jngreatereq: {
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><span class="cx">             int r1 = (++it)-&gt;u.operand;
</span><span class="cx">             int offset = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] jngreatereq\t\t %s, %s, %d(-&gt;%d)&quot;, location, registerName(exec, r0).data(), registerName(exec, r1).data(), offset, location + offset);
</del><ins>+            out.printf(&quot;[%4d] jngreatereq\t\t %s, %s, %d(-&gt;%d)&quot;, location, registerName(r0).data(), registerName(r1).data(), offset, location + offset);
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_loop_hint: {
</span><span class="lines">@@ -1264,34 +1239,34 @@
</span><span class="cx">             int tableIndex = (++it)-&gt;u.operand;
</span><span class="cx">             int defaultTarget = (++it)-&gt;u.operand;
</span><span class="cx">             int scrutineeRegister = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] switch_imm\t %d, %d(-&gt;%d), %s&quot;, location, tableIndex, defaultTarget, location + defaultTarget, registerName(exec, scrutineeRegister).data());
</del><ins>+            out.printf(&quot;[%4d] switch_imm\t %d, %d(-&gt;%d), %s&quot;, location, tableIndex, defaultTarget, location + defaultTarget, registerName(scrutineeRegister).data());
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_switch_char: {
</span><span class="cx">             int tableIndex = (++it)-&gt;u.operand;
</span><span class="cx">             int defaultTarget = (++it)-&gt;u.operand;
</span><span class="cx">             int scrutineeRegister = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] switch_char\t %d, %d(-&gt;%d), %s&quot;, location, tableIndex, defaultTarget, location + defaultTarget, registerName(exec, scrutineeRegister).data());
</del><ins>+            out.printf(&quot;[%4d] switch_char\t %d, %d(-&gt;%d), %s&quot;, location, tableIndex, defaultTarget, location + defaultTarget, registerName(scrutineeRegister).data());
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_switch_string: {
</span><span class="cx">             int tableIndex = (++it)-&gt;u.operand;
</span><span class="cx">             int defaultTarget = (++it)-&gt;u.operand;
</span><span class="cx">             int scrutineeRegister = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] switch_string\t %d, %d(-&gt;%d), %s&quot;, location, tableIndex, defaultTarget, location + defaultTarget, registerName(exec, scrutineeRegister).data());
</del><ins>+            out.printf(&quot;[%4d] switch_string\t %d, %d(-&gt;%d), %s&quot;, location, tableIndex, defaultTarget, location + defaultTarget, registerName(scrutineeRegister).data());
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_new_func: {
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><span class="cx">             int f0 = (++it)-&gt;u.operand;
</span><span class="cx">             int shouldCheck = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] new_func\t\t %s, f%d, %s&quot;, location, registerName(exec, r0).data(), f0, shouldCheck ? &quot;&lt;Checked&gt;&quot; : &quot;&lt;Unchecked&gt;&quot;);
</del><ins>+            out.printf(&quot;[%4d] new_func\t\t %s, f%d, %s&quot;, location, registerName(r0).data(), f0, shouldCheck ? &quot;&lt;Checked&gt;&quot; : &quot;&lt;Unchecked&gt;&quot;);
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_new_func_exp: {
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><span class="cx">             int f0 = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] new_func_exp\t %s, f%d&quot;, location, registerName(exec, r0).data(), f0);
</del><ins>+            out.printf(&quot;[%4d] new_func_exp\t %s, f%d&quot;, location, registerName(r0).data(), f0);
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_call: {
</span><span class="lines">@@ -1307,35 +1282,35 @@
</span><span class="cx">             int thisValue = (++it)-&gt;u.operand;
</span><span class="cx">             int arguments = (++it)-&gt;u.operand;
</span><span class="cx">             int firstFreeRegister = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] call_varargs\t %s, %s, %s, %d&quot;, location, registerName(exec, callee).data(), registerName(exec, thisValue).data(), registerName(exec, arguments).data(), firstFreeRegister);
</del><ins>+            out.printf(&quot;[%4d] call_varargs\t %s, %s, %s, %d&quot;, location, registerName(callee).data(), registerName(thisValue).data(), registerName(arguments).data(), firstFreeRegister);
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_tear_off_activation: {
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] tear_off_activation\t %s&quot;, location, registerName(exec, r0).data());
</del><ins>+            out.printf(&quot;[%4d] tear_off_activation\t %s&quot;, location, registerName(r0).data());
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_tear_off_arguments: {
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><span class="cx">             int r1 = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] tear_off_arguments %s, %s&quot;, location, registerName(exec, r0).data(), registerName(exec, r1).data());
</del><ins>+            out.printf(&quot;[%4d] tear_off_arguments %s, %s&quot;, location, registerName(r0).data(), registerName(r1).data());
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_ret: {
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] ret\t\t %s&quot;, location, registerName(exec, r0).data());
</del><ins>+            out.printf(&quot;[%4d] ret\t\t %s&quot;, location, registerName(r0).data());
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_call_put_result: {
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] call_put_result\t\t %s&quot;, location, registerName(exec, r0).data());
</del><ins>+            out.printf(&quot;[%4d] call_put_result\t\t %s&quot;, location, registerName(r0).data());
</ins><span class="cx">             dumpValueProfiling(out, it, hasPrintedProfiling);
</span><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_ret_object_or_this: {
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><span class="cx">             int r1 = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] constructor_ret\t\t %s %s&quot;, location, registerName(exec, r0).data(), registerName(exec, r1).data());
</del><ins>+            out.printf(&quot;[%4d] constructor_ret\t\t %s %s&quot;, location, registerName(r0).data(), registerName(r1).data());
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_construct: {
</span><span class="lines">@@ -1346,13 +1321,13 @@
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><span class="cx">             int r1 = (++it)-&gt;u.operand;
</span><span class="cx">             int count = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] strcat\t\t %s, %s, %d&quot;, location, registerName(exec, r0).data(), registerName(exec, r1).data(), count);
</del><ins>+            out.printf(&quot;[%4d] strcat\t\t %s, %s, %d&quot;, location, registerName(r0).data(), registerName(r1).data(), count);
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_to_primitive: {
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><span class="cx">             int r1 = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] to_primitive\t %s, %s&quot;, location, registerName(exec, r0).data(), registerName(exec, r1).data());
</del><ins>+            out.printf(&quot;[%4d] to_primitive\t %s, %s&quot;, location, registerName(r0).data(), registerName(r1).data());
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_get_pnames: {
</span><span class="lines">@@ -1361,7 +1336,7 @@
</span><span class="cx">             int r2 = it[3].u.operand;
</span><span class="cx">             int r3 = it[4].u.operand;
</span><span class="cx">             int offset = it[5].u.operand;
</span><del>-            out.printf(&quot;[%4d] get_pnames\t %s, %s, %s, %s, %d(-&gt;%d)&quot;, location, registerName(exec, r0).data(), registerName(exec, r1).data(), registerName(exec, r2).data(), registerName(exec, r3).data(), offset, location + offset);
</del><ins>+            out.printf(&quot;[%4d] get_pnames\t %s, %s, %s, %s, %d(-&gt;%d)&quot;, location, registerName(r0).data(), registerName(r1).data(), registerName(r2).data(), registerName(r3).data(), offset, location + offset);
</ins><span class="cx">             it += OPCODE_LENGTH(op_get_pnames) - 1;
</span><span class="cx">             break;
</span><span class="cx">         }
</span><span class="lines">@@ -1372,13 +1347,13 @@
</span><span class="cx">             int size = it[4].u.operand;
</span><span class="cx">             int iter = it[5].u.operand;
</span><span class="cx">             int offset = it[6].u.operand;
</span><del>-            out.printf(&quot;[%4d] next_pname\t %s, %s, %s, %s, %s, %d(-&gt;%d)&quot;, location, registerName(exec, dest).data(), registerName(exec, base).data(), registerName(exec, i).data(), registerName(exec, size).data(), registerName(exec, iter).data(), offset, location + offset);
</del><ins>+            out.printf(&quot;[%4d] next_pname\t %s, %s, %s, %s, %s, %d(-&gt;%d)&quot;, location, registerName(dest).data(), registerName(base).data(), registerName(i).data(), registerName(size).data(), registerName(iter).data(), offset, location + offset);
</ins><span class="cx">             it += OPCODE_LENGTH(op_next_pname) - 1;
</span><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_push_with_scope: {
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] push_with_scope\t %s&quot;, location, registerName(exec, r0).data());
</del><ins>+            out.printf(&quot;[%4d] push_with_scope\t %s&quot;, location, registerName(r0).data());
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_pop_scope: {
</span><span class="lines">@@ -1389,23 +1364,23 @@
</span><span class="cx">             int id0 = (++it)-&gt;u.operand;
</span><span class="cx">             int r1 = (++it)-&gt;u.operand;
</span><span class="cx">             unsigned attributes = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] push_name_scope \t%s, %s, %u&quot;, location, idName(id0, m_identifiers[id0]).data(), registerName(exec, r1).data(), attributes);
</del><ins>+            out.printf(&quot;[%4d] push_name_scope \t%s, %s, %u&quot;, location, idName(id0, m_identifiers[id0]).data(), registerName(r1).data(), attributes);
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_catch: {
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] catch\t\t %s&quot;, location, registerName(exec, r0).data());
</del><ins>+            out.printf(&quot;[%4d] catch\t\t %s&quot;, location, registerName(r0).data());
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_throw: {
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] throw\t\t %s&quot;, location, registerName(exec, r0).data());
</del><ins>+            out.printf(&quot;[%4d] throw\t\t %s&quot;, location, registerName(r0).data());
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_throw_static_error: {
</span><span class="cx">             int k0 = (++it)-&gt;u.operand;
</span><span class="cx">             int k1 = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] throw_static_error\t %s, %s&quot;, location, constantName(exec, k0, getConstant(k0)).data(), k1 ? &quot;true&quot; : &quot;false&quot;);
</del><ins>+            out.printf(&quot;[%4d] throw_static_error\t %s, %s&quot;, location, constantName(k0, getConstant(k0)).data(), k1 ? &quot;true&quot; : &quot;false&quot;);
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_debug: {
</span><span class="lines">@@ -1418,17 +1393,17 @@
</span><span class="cx">         }
</span><span class="cx">         case op_profile_will_call: {
</span><span class="cx">             int function = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] profile_will_call %s&quot;, location, registerName(exec, function).data());
</del><ins>+            out.printf(&quot;[%4d] profile_will_call %s&quot;, location, registerName(function).data());
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_profile_did_call: {
</span><span class="cx">             int function = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] profile_did_call\t %s&quot;, location, registerName(exec, function).data());
</del><ins>+            out.printf(&quot;[%4d] profile_did_call\t %s&quot;, location, registerName(function).data());
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case op_end: {
</span><span class="cx">             int r0 = (++it)-&gt;u.operand;
</span><del>-            out.printf(&quot;[%4d] end\t\t %s&quot;, location, registerName(exec, r0).data());
</del><ins>+            out.printf(&quot;[%4d] end\t\t %s&quot;, location, registerName(r0).data());
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx"> #if ENABLE(LLINT_C_LOOP)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeCodeBlockh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/CodeBlock.h (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/CodeBlock.h        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/JavaScriptCore/bytecode/CodeBlock.h        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -109,10 +109,10 @@
</span><span class="cx"> 
</span><span class="cx">         UnlinkedCodeBlock* unlinkedCodeBlock() const { return m_unlinkedCode.get(); }
</span><span class="cx"> 
</span><del>-        String inferredName() const;
</del><ins>+        CString inferredName() const;
</ins><span class="cx">         CodeBlockHash hash() const;
</span><del>-        String sourceCodeForTools() const; // Not quite the actual source we parsed; this will do things like prefix the source for a function with a reified signature.
-        String sourceCodeOnOneLine() const; // As sourceCodeForTools(), but replaces all whitespace runs with a single space.
</del><ins>+        CString sourceCodeForTools() const; // Not quite the actual source we parsed; this will do things like prefix the source for a function with a reified signature.
+        CString sourceCodeOnOneLine() const; // As sourceCodeForTools(), but replaces all whitespace runs with a single space.
</ins><span class="cx">         void dumpAssumingJITType(PrintStream&amp;, JITCode::JITType) const;
</span><span class="cx">         void dump(PrintStream&amp;) const;
</span><span class="cx"> 
</span><span class="lines">@@ -983,7 +983,7 @@
</span><span class="cx"> 
</span><span class="cx">         void dumpBytecode(PrintStream&amp;, ExecState*, const Instruction* begin, const Instruction*&amp;);
</span><span class="cx"> 
</span><del>-        CString registerName(ExecState*, int r) const;
</del><ins>+        CString registerName(int r) const;
</ins><span class="cx">         void printUnaryOp(PrintStream&amp;, ExecState*, int location, const Instruction*&amp;, const char* op);
</span><span class="cx">         void printBinaryOp(PrintStream&amp;, ExecState*, int location, const Instruction*&amp;, const char* op);
</span><span class="cx">         void printConditionalJump(PrintStream&amp;, ExecState*, const Instruction*, const Instruction*&amp;, int location, const char* op);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeCodeBlockHashcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/CodeBlockHash.cpp (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/CodeBlockHash.cpp        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/JavaScriptCore/bytecode/CodeBlockHash.cpp        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -58,7 +58,7 @@
</span><span class="cx">     : m_hash(0)
</span><span class="cx"> {
</span><span class="cx">     SHA1 sha1;
</span><del>-    sha1.addBytes(sourceCode.toString().utf8());
</del><ins>+    sha1.addBytes(sourceCode.toUTF8());
</ins><span class="cx">     Vector&lt;uint8_t, 20&gt; digest;
</span><span class="cx">     sha1.computeHash(digest);
</span><span class="cx">     m_hash += digest[0] | (digest[1] &lt;&lt; 8) | (digest[2] &lt;&lt; 16) | (digest[3] &lt;&lt; 24);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeCodeOrigincpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/CodeOrigin.cpp (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/CodeOrigin.cpp        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/JavaScriptCore/bytecode/CodeOrigin.cpp        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -87,9 +87,9 @@
</span><span class="cx">     return executable-&gt;hashFor(specializationKind());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-String InlineCallFrame::inferredName() const
</del><ins>+CString InlineCallFrame::inferredName() const
</ins><span class="cx"> {
</span><del>-    return jsCast&lt;FunctionExecutable*&gt;(executable.get())-&gt;inferredName().string();
</del><ins>+    return jsCast&lt;FunctionExecutable*&gt;(executable.get())-&gt;inferredName().utf8();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> CodeBlock* InlineCallFrame::baselineCodeBlock() const
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeCodeOriginh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/CodeOrigin.h (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/CodeOrigin.h        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/JavaScriptCore/bytecode/CodeOrigin.h        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -114,7 +114,7 @@
</span><span class="cx">     // Get the callee given a machine call frame to which this InlineCallFrame belongs.
</span><span class="cx">     JSFunction* calleeForCallFrame(ExecState*) const;
</span><span class="cx">     
</span><del>-    String inferredName() const;
</del><ins>+    CString inferredName() const;
</ins><span class="cx">     CodeBlockHash hash() const;
</span><span class="cx">     
</span><span class="cx">     CodeBlock* baselineCodeBlock() const;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeGetByIdStatuscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/GetByIdStatus.cpp (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/GetByIdStatus.cpp        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/JavaScriptCore/bytecode/GetByIdStatus.cpp        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -34,11 +34,11 @@
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><del>-GetByIdStatus GetByIdStatus::computeFromLLInt(CodeBlock* profiledBlock, unsigned bytecodeIndex, Identifier&amp; ident)
</del><ins>+GetByIdStatus GetByIdStatus::computeFromLLInt(CodeBlock* profiledBlock, unsigned bytecodeIndex, StringImpl* uid)
</ins><span class="cx"> {
</span><span class="cx">     UNUSED_PARAM(profiledBlock);
</span><span class="cx">     UNUSED_PARAM(bytecodeIndex);
</span><del>-    UNUSED_PARAM(ident);
</del><ins>+    UNUSED_PARAM(uid);
</ins><span class="cx"> #if ENABLE(LLINT)
</span><span class="cx">     Instruction* instruction = profiledBlock-&gt;instructions().begin() + bytecodeIndex;
</span><span class="cx">     
</span><span class="lines">@@ -52,7 +52,7 @@
</span><span class="cx">     unsigned attributesIgnored;
</span><span class="cx">     JSCell* specificValue;
</span><span class="cx">     PropertyOffset offset = structure-&gt;getConcurrently(
</span><del>-        *profiledBlock-&gt;vm(), ident, attributesIgnored, specificValue);
</del><ins>+        *profiledBlock-&gt;vm(), uid, attributesIgnored, specificValue);
</ins><span class="cx">     if (structure-&gt;isDictionary())
</span><span class="cx">         specificValue = 0;
</span><span class="cx">     if (!isValidOffset(offset))
</span><span class="lines">@@ -64,7 +64,7 @@
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void GetByIdStatus::computeForChain(GetByIdStatus&amp; result, CodeBlock* profiledBlock, Identifier&amp; ident, Structure* structure)
</del><ins>+void GetByIdStatus::computeForChain(GetByIdStatus&amp; result, CodeBlock* profiledBlock, StringImpl* uid, Structure* structure)
</ins><span class="cx"> {
</span><span class="cx"> #if ENABLE(JIT) &amp;&amp; ENABLE(VALUE_PROFILER)
</span><span class="cx">     // Validate the chain. If the chain is invalid, then currently the best thing
</span><span class="lines">@@ -93,7 +93,7 @@
</span><span class="cx">     JSCell* specificValue;
</span><span class="cx">         
</span><span class="cx">     result.m_offset = currentStructure-&gt;getConcurrently(
</span><del>-        *profiledBlock-&gt;vm(), ident, attributesIgnored, specificValue);
</del><ins>+        *profiledBlock-&gt;vm(), uid, attributesIgnored, specificValue);
</ins><span class="cx">     if (currentStructure-&gt;isDictionary())
</span><span class="cx">         specificValue = 0;
</span><span class="cx">     if (!isValidOffset(result.m_offset))
</span><span class="lines">@@ -104,28 +104,28 @@
</span><span class="cx"> #else
</span><span class="cx">     UNUSED_PARAM(result);
</span><span class="cx">     UNUSED_PARAM(profiledBlock);
</span><del>-    UNUSED_PARAM(ident);
</del><ins>+    UNUSED_PARAM(uid);
</ins><span class="cx">     UNUSED_PARAM(structure);
</span><span class="cx">     UNREACHABLE_FOR_PLATFORM();
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-GetByIdStatus GetByIdStatus::computeFor(CodeBlock* profiledBlock, unsigned bytecodeIndex, Identifier&amp; ident)
</del><ins>+GetByIdStatus GetByIdStatus::computeFor(CodeBlock* profiledBlock, unsigned bytecodeIndex, StringImpl* uid)
</ins><span class="cx"> {
</span><span class="cx">     CodeBlockLocker locker(profiledBlock-&gt;m_lock);
</span><span class="cx">     
</span><span class="cx">     UNUSED_PARAM(profiledBlock);
</span><span class="cx">     UNUSED_PARAM(bytecodeIndex);
</span><del>-    UNUSED_PARAM(ident);
</del><ins>+    UNUSED_PARAM(uid);
</ins><span class="cx"> #if ENABLE(JIT) &amp;&amp; ENABLE(VALUE_PROFILER)
</span><span class="cx">     if (!profiledBlock-&gt;numberOfStructureStubInfos())
</span><del>-        return computeFromLLInt(profiledBlock, bytecodeIndex, ident);
</del><ins>+        return computeFromLLInt(profiledBlock, bytecodeIndex, uid);
</ins><span class="cx">     
</span><span class="cx">     // First check if it makes either calls, in which case we want to be super careful, or
</span><span class="cx">     // if it's not set at all, in which case we punt.
</span><span class="cx">     StructureStubInfo&amp; stubInfo = profiledBlock-&gt;getStubInfo(bytecodeIndex);
</span><span class="cx">     if (!stubInfo.seen)
</span><del>-        return computeFromLLInt(profiledBlock, bytecodeIndex, ident);
</del><ins>+        return computeFromLLInt(profiledBlock, bytecodeIndex, uid);
</ins><span class="cx">     
</span><span class="cx">     if (stubInfo.resetByGC)
</span><span class="cx">         return GetByIdStatus(TakesSlowPath, true);
</span><span class="lines">@@ -160,14 +160,14 @@
</span><span class="cx">     result.m_wasSeenInJIT = true; // This is interesting for bytecode dumping only.
</span><span class="cx">     switch (stubInfo.accessType) {
</span><span class="cx">     case access_unset:
</span><del>-        return computeFromLLInt(profiledBlock, bytecodeIndex, ident);
</del><ins>+        return computeFromLLInt(profiledBlock, bytecodeIndex, uid);
</ins><span class="cx">         
</span><span class="cx">     case access_get_by_id_self: {
</span><span class="cx">         Structure* structure = stubInfo.u.getByIdSelf.baseObjectStructure.get();
</span><span class="cx">         unsigned attributesIgnored;
</span><span class="cx">         JSCell* specificValue;
</span><span class="cx">         result.m_offset = structure-&gt;getConcurrently(
</span><del>-            *profiledBlock-&gt;vm(), ident, attributesIgnored, specificValue);
</del><ins>+            *profiledBlock-&gt;vm(), uid, attributesIgnored, specificValue);
</ins><span class="cx">         if (structure-&gt;isDictionary())
</span><span class="cx">             specificValue = 0;
</span><span class="cx">         
</span><span class="lines">@@ -192,7 +192,7 @@
</span><span class="cx">             unsigned attributesIgnored;
</span><span class="cx">             JSCell* specificValue;
</span><span class="cx">             PropertyOffset myOffset = structure-&gt;getConcurrently(
</span><del>-                *profiledBlock-&gt;vm(), ident, attributesIgnored, specificValue);
</del><ins>+                *profiledBlock-&gt;vm(), uid, attributesIgnored, specificValue);
</ins><span class="cx">             if (structure-&gt;isDictionary())
</span><span class="cx">                 specificValue = 0;
</span><span class="cx">             
</span><span class="lines">@@ -223,7 +223,7 @@
</span><span class="cx">             return GetByIdStatus(MakesCalls, true);
</span><span class="cx">         result.m_chain.append(stubInfo.u.getByIdProto.prototypeStructure.get());
</span><span class="cx">         computeForChain(
</span><del>-            result, profiledBlock, ident,
</del><ins>+            result, profiledBlock, uid,
</ins><span class="cx">             stubInfo.u.getByIdProto.baseObjectStructure.get());
</span><span class="cx">         break;
</span><span class="cx">     }
</span><span class="lines">@@ -234,7 +234,7 @@
</span><span class="cx">         for (unsigned i = 0; i &lt; stubInfo.u.getByIdChain.count; ++i)
</span><span class="cx">             result.m_chain.append(stubInfo.u.getByIdChain.chain-&gt;head()[i].get());
</span><span class="cx">         computeForChain(
</span><del>-            result, profiledBlock, ident,
</del><ins>+            result, profiledBlock, uid,
</ins><span class="cx">             stubInfo.u.getByIdChain.baseObjectStructure.get());
</span><span class="cx">         break;
</span><span class="cx">     }
</span><span class="lines">@@ -258,12 +258,12 @@
</span><span class="cx"> #endif // ENABLE(JIT)
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-GetByIdStatus GetByIdStatus::computeFor(VM&amp; vm, Structure* structure, Identifier&amp; ident)
</del><ins>+GetByIdStatus GetByIdStatus::computeFor(VM&amp; vm, Structure* structure, StringImpl* uid)
</ins><span class="cx"> {
</span><span class="cx">     // For now we only handle the super simple self access case. We could handle the
</span><span class="cx">     // prototype case in the future.
</span><span class="cx">     
</span><del>-    if (PropertyName(ident).asIndex() != PropertyName::NotAnIndex)
</del><ins>+    if (toUInt32FromStringImpl(uid) != PropertyName::NotAnIndex)
</ins><span class="cx">         return GetByIdStatus(TakesSlowPath);
</span><span class="cx">     
</span><span class="cx">     if (structure-&gt;typeInfo().overridesGetOwnPropertySlot())
</span><span class="lines">@@ -273,10 +273,10 @@
</span><span class="cx">         return GetByIdStatus(TakesSlowPath);
</span><span class="cx">     
</span><span class="cx">     GetByIdStatus result;
</span><del>-    result.m_wasSeenInJIT = false; // To my knowledge nobody that uses computeFor(VM&amp;, Structure*, Identifier&amp;) reads this field, but I might as well be honest: no, it wasn't seen in the JIT, since I computed it statically.
</del><ins>+    result.m_wasSeenInJIT = false; // To my knowledge nobody that uses computeFor(VM&amp;, Structure*, StringImpl*) reads this field, but I might as well be honest: no, it wasn't seen in the JIT, since I computed it statically.
</ins><span class="cx">     unsigned attributes;
</span><span class="cx">     JSCell* specificValue;
</span><del>-    result.m_offset = structure-&gt;getConcurrently(vm, ident, attributes, specificValue);
</del><ins>+    result.m_offset = structure-&gt;getConcurrently(vm, uid, attributes, specificValue);
</ins><span class="cx">     if (!isValidOffset(result.m_offset))
</span><span class="cx">         return GetByIdStatus(TakesSlowPath); // It's probably a prototype lookup. Give up on life for now, even though we could totally be way smarter about it.
</span><span class="cx">     if (attributes &amp; Accessor)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeGetByIdStatush"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/GetByIdStatus.h (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/GetByIdStatus.h        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/JavaScriptCore/bytecode/GetByIdStatus.h        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2012 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2012, 2013 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -33,7 +33,6 @@
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><span class="cx"> class CodeBlock;
</span><del>-class Identifier;
</del><span class="cx"> 
</span><span class="cx"> class GetByIdStatus {
</span><span class="cx"> public:
</span><span class="lines">@@ -71,8 +70,8 @@
</span><span class="cx">         ASSERT((state == Simple) == (offset != invalidOffset));
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    static GetByIdStatus computeFor(CodeBlock*, unsigned bytecodeIndex, Identifier&amp;);
-    static GetByIdStatus computeFor(VM&amp;, Structure*, Identifier&amp;);
</del><ins>+    static GetByIdStatus computeFor(CodeBlock*, unsigned bytecodeIndex, StringImpl* uid);
+    static GetByIdStatus computeFor(VM&amp;, Structure*, StringImpl* uid);
</ins><span class="cx">     
</span><span class="cx">     State state() const { return m_state; }
</span><span class="cx">     
</span><span class="lines">@@ -90,8 +89,8 @@
</span><span class="cx">     bool wasSeenInJIT() const { return m_wasSeenInJIT; }
</span><span class="cx">     
</span><span class="cx"> private:
</span><del>-    static void computeForChain(GetByIdStatus&amp; result, CodeBlock*, Identifier&amp;, Structure*);
-    static GetByIdStatus computeFromLLInt(CodeBlock*, unsigned bytecodeIndex, Identifier&amp;);
</del><ins>+    static void computeForChain(GetByIdStatus&amp; result, CodeBlock*, StringImpl* uid, Structure*);
+    static GetByIdStatus computeFromLLInt(CodeBlock*, unsigned bytecodeIndex, StringImpl* uid);
</ins><span class="cx">     
</span><span class="cx">     State m_state;
</span><span class="cx">     StructureSet m_structureSet;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodePutByIdStatuscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/PutByIdStatus.cpp (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/PutByIdStatus.cpp        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/JavaScriptCore/bytecode/PutByIdStatus.cpp        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -35,11 +35,11 @@
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><del>-PutByIdStatus PutByIdStatus::computeFromLLInt(CodeBlock* profiledBlock, unsigned bytecodeIndex, Identifier&amp; ident)
</del><ins>+PutByIdStatus PutByIdStatus::computeFromLLInt(CodeBlock* profiledBlock, unsigned bytecodeIndex, StringImpl* uid)
</ins><span class="cx"> {
</span><span class="cx">     UNUSED_PARAM(profiledBlock);
</span><span class="cx">     UNUSED_PARAM(bytecodeIndex);
</span><del>-    UNUSED_PARAM(ident);
</del><ins>+    UNUSED_PARAM(uid);
</ins><span class="cx"> #if ENABLE(LLINT)
</span><span class="cx">     Instruction* instruction = profiledBlock-&gt;instructions().begin() + bytecodeIndex;
</span><span class="cx"> 
</span><span class="lines">@@ -49,7 +49,7 @@
</span><span class="cx">     
</span><span class="cx">     if (instruction[0].u.opcode == LLInt::getOpcode(llint_op_put_by_id)
</span><span class="cx">         || instruction[0].u.opcode == LLInt::getOpcode(llint_op_put_by_id_out_of_line)) {
</span><del>-        PropertyOffset offset = structure-&gt;getConcurrently(*profiledBlock-&gt;vm(), ident);
</del><ins>+        PropertyOffset offset = structure-&gt;getConcurrently(*profiledBlock-&gt;vm(), uid);
</ins><span class="cx">         if (!isValidOffset(offset))
</span><span class="cx">             return PutByIdStatus(NoInformation, 0, 0, 0, invalidOffset);
</span><span class="cx">         
</span><span class="lines">@@ -68,7 +68,7 @@
</span><span class="cx">     ASSERT(newStructure);
</span><span class="cx">     ASSERT(chain);
</span><span class="cx">     
</span><del>-    PropertyOffset offset = newStructure-&gt;getConcurrently(*profiledBlock-&gt;vm(), ident);
</del><ins>+    PropertyOffset offset = newStructure-&gt;getConcurrently(*profiledBlock-&gt;vm(), uid);
</ins><span class="cx">     if (!isValidOffset(offset))
</span><span class="cx">         return PutByIdStatus(NoInformation, 0, 0, 0, invalidOffset);
</span><span class="cx">     
</span><span class="lines">@@ -78,23 +78,23 @@
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-PutByIdStatus PutByIdStatus::computeFor(CodeBlock* profiledBlock, unsigned bytecodeIndex, Identifier&amp; ident)
</del><ins>+PutByIdStatus PutByIdStatus::computeFor(CodeBlock* profiledBlock, unsigned bytecodeIndex, StringImpl* uid)
</ins><span class="cx"> {
</span><span class="cx">     CodeBlockLocker locker(profiledBlock-&gt;m_lock);
</span><span class="cx">     
</span><span class="cx">     UNUSED_PARAM(profiledBlock);
</span><span class="cx">     UNUSED_PARAM(bytecodeIndex);
</span><del>-    UNUSED_PARAM(ident);
</del><ins>+    UNUSED_PARAM(uid);
</ins><span class="cx"> #if ENABLE(JIT) &amp;&amp; ENABLE(VALUE_PROFILER)
</span><span class="cx">     if (!profiledBlock-&gt;numberOfStructureStubInfos())
</span><del>-        return computeFromLLInt(profiledBlock, bytecodeIndex, ident);
</del><ins>+        return computeFromLLInt(profiledBlock, bytecodeIndex, uid);
</ins><span class="cx">     
</span><span class="cx">     if (profiledBlock-&gt;likelyToTakeSlowCase(bytecodeIndex))
</span><span class="cx">         return PutByIdStatus(TakesSlowPath, 0, 0, 0, invalidOffset);
</span><span class="cx">     
</span><span class="cx">     StructureStubInfo&amp; stubInfo = profiledBlock-&gt;getStubInfo(bytecodeIndex);
</span><span class="cx">     if (!stubInfo.seen)
</span><del>-        return computeFromLLInt(profiledBlock, bytecodeIndex, ident);
</del><ins>+        return computeFromLLInt(profiledBlock, bytecodeIndex, uid);
</ins><span class="cx">     
</span><span class="cx">     if (stubInfo.resetByGC)
</span><span class="cx">         return PutByIdStatus(TakesSlowPath, 0, 0, 0, invalidOffset);
</span><span class="lines">@@ -107,7 +107,7 @@
</span><span class="cx">     case access_put_by_id_replace: {
</span><span class="cx">         PropertyOffset offset =
</span><span class="cx">             stubInfo.u.putByIdReplace.baseObjectStructure-&gt;getConcurrently(
</span><del>-                *profiledBlock-&gt;vm(), ident);
</del><ins>+                *profiledBlock-&gt;vm(), uid);
</ins><span class="cx">         if (isValidOffset(offset)) {
</span><span class="cx">             return PutByIdStatus(
</span><span class="cx">                 SimpleReplace,
</span><span class="lines">@@ -123,7 +123,7 @@
</span><span class="cx">         ASSERT(stubInfo.u.putByIdTransition.previousStructure-&gt;transitionWatchpointSetHasBeenInvalidated());
</span><span class="cx">         PropertyOffset offset = 
</span><span class="cx">             stubInfo.u.putByIdTransition.structure-&gt;getConcurrently(
</span><del>-                *profiledBlock-&gt;vm(), ident);
</del><ins>+                *profiledBlock-&gt;vm(), uid);
</ins><span class="cx">         if (isValidOffset(offset)) {
</span><span class="cx">             return PutByIdStatus(
</span><span class="cx">                 SimpleTransition,
</span><span class="lines">@@ -143,9 +143,9 @@
</span><span class="cx"> #endif // ENABLE(JIT)
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-PutByIdStatus PutByIdStatus::computeFor(VM&amp; vm, JSGlobalObject* globalObject, Structure* structure, Identifier&amp; ident, bool isDirect)
</del><ins>+PutByIdStatus PutByIdStatus::computeFor(VM&amp; vm, JSGlobalObject* globalObject, Structure* structure, StringImpl* uid, bool isDirect)
</ins><span class="cx"> {
</span><del>-    if (PropertyName(ident).asIndex() != PropertyName::NotAnIndex)
</del><ins>+    if (toUInt32FromStringImpl(uid) != PropertyName::NotAnIndex)
</ins><span class="cx">         return PutByIdStatus(TakesSlowPath);
</span><span class="cx">     
</span><span class="cx">     if (structure-&gt;typeInfo().overridesGetOwnPropertySlot())
</span><span class="lines">@@ -157,7 +157,7 @@
</span><span class="cx">     unsigned attributes;
</span><span class="cx">     JSCell* specificValue;
</span><span class="cx">     PropertyOffset offset = structure-&gt;getConcurrently(
</span><del>-        vm, ident, attributes, specificValue);
</del><ins>+        vm, uid, attributes, specificValue);
</ins><span class="cx">     if (isValidOffset(offset)) {
</span><span class="cx">         if (attributes &amp; (Accessor | ReadOnly))
</span><span class="cx">             return PutByIdStatus(TakesSlowPath);
</span><span class="lines">@@ -183,7 +183,7 @@
</span><span class="cx">     
</span><span class="cx">     if (!isDirect) {
</span><span class="cx">         // If the prototype chain has setters or read-only properties, then give up.
</span><del>-        if (structure-&gt;prototypeChainMayInterceptStoreTo(vm, ident))
</del><ins>+        if (structure-&gt;prototypeChainMayInterceptStoreTo(vm, uid))
</ins><span class="cx">             return PutByIdStatus(TakesSlowPath);
</span><span class="cx">         
</span><span class="cx">         // If the prototype chain hasn't been normalized (i.e. there are proxies or dictionaries)
</span><span class="lines">@@ -210,7 +210,7 @@
</span><span class="cx">     // - If we're not storing a value that could be specific: again, this would only be a
</span><span class="cx">     //   problem if the existing transition did have a specific value, which we check for
</span><span class="cx">     //   by passing 0 for the specificValue.
</span><del>-    Structure* transition = Structure::addPropertyTransitionToExistingStructureConcurrently(structure, ident, 0, 0, offset);
</del><ins>+    Structure* transition = Structure::addPropertyTransitionToExistingStructureConcurrently(structure, uid, 0, 0, offset);
</ins><span class="cx">     if (!transition)
</span><span class="cx">         return PutByIdStatus(TakesSlowPath); // This occurs in bizarre cases only. See above.
</span><span class="cx">     ASSERT(!transition-&gt;transitionDidInvolveSpecificValue());
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodePutByIdStatush"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/PutByIdStatus.h (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/PutByIdStatus.h        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/JavaScriptCore/bytecode/PutByIdStatus.h        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2012 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2012, 2013 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -28,11 +28,11 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;PropertyOffset.h&quot;
</span><span class="cx"> #include &lt;wtf/NotFound.h&gt;
</span><ins>+#include &lt;wtf/text/StringImpl.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><span class="cx"> class CodeBlock;
</span><del>-class Identifier;
</del><span class="cx"> class VM;
</span><span class="cx"> class JSGlobalObject;
</span><span class="cx"> class Structure;
</span><span class="lines">@@ -90,8 +90,8 @@
</span><span class="cx">         ASSERT((m_state == NoInformation || m_state == TakesSlowPath) == (m_offset == invalidOffset));
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    static PutByIdStatus computeFor(CodeBlock*, unsigned bytecodeIndex, Identifier&amp;);
-    static PutByIdStatus computeFor(VM&amp;, JSGlobalObject*, Structure*, Identifier&amp;, bool isDirect);
</del><ins>+    static PutByIdStatus computeFor(CodeBlock*, unsigned bytecodeIndex, StringImpl* uid);
+    static PutByIdStatus computeFor(VM&amp;, JSGlobalObject*, Structure*, StringImpl* uid, bool isDirect);
</ins><span class="cx">     
</span><span class="cx">     State state() const { return m_state; }
</span><span class="cx">     
</span><span class="lines">@@ -107,7 +107,7 @@
</span><span class="cx">     PropertyOffset offset() const { return m_offset; }
</span><span class="cx">     
</span><span class="cx"> private:
</span><del>-    static PutByIdStatus computeFromLLInt(CodeBlock*, unsigned bytecodeIndex, Identifier&amp;);
</del><ins>+    static PutByIdStatus computeFromLLInt(CodeBlock*, unsigned bytecodeIndex, StringImpl* uid);
</ins><span class="cx">     
</span><span class="cx">     State m_state;
</span><span class="cx">     Structure* m_oldStructure;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeReduceWhitespacecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/ReduceWhitespace.cpp (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/ReduceWhitespace.cpp        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/JavaScriptCore/bytecode/ReduceWhitespace.cpp        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2012 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2012, 2013 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -26,27 +26,29 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;ReduceWhitespace.h&quot;
</span><span class="cx"> 
</span><del>-#include &lt;wtf/text/StringBuilder.h&gt;
-#include &lt;wtf/text/WTFString.h&gt;
</del><ins>+#include &lt;wtf/ASCIICType.h&gt;
+#include &lt;wtf/StringPrintStream.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><del>-String reduceWhitespace(const String&amp; input)
</del><ins>+CString reduceWhitespace(const CString&amp; input)
</ins><span class="cx"> {
</span><del>-    StringBuilder builder;
</del><ins>+    StringPrintStream out;
</ins><span class="cx">     
</span><ins>+    const char* data = input.data();
+    
</ins><span class="cx">     for (unsigned i = 0; i &lt; input.length();) {
</span><del>-        if (isASCIISpace(input[i])) {
-            while (i &lt; input.length() &amp;&amp; isASCIISpace(input[i]))
</del><ins>+        if (isASCIISpace(data[i])) {
+            while (i &lt; input.length() &amp;&amp; isASCIISpace(data[i]))
</ins><span class="cx">                 ++i;
</span><del>-            builder.append(' ');
</del><ins>+            out.print(CharacterDump(' '));
</ins><span class="cx">             continue;
</span><span class="cx">         }
</span><del>-        builder.append(input[i]);
</del><ins>+        out.print(CharacterDump(data[i]));
</ins><span class="cx">         ++i;
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    return builder.toString();
</del><ins>+    return out.toCString();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace JSC
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeReduceWhitespaceh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/ReduceWhitespace.h (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/ReduceWhitespace.h        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/JavaScriptCore/bytecode/ReduceWhitespace.h        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2012 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2012, 2013 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -26,12 +26,12 @@
</span><span class="cx"> #ifndef ReduceWhitespace_h
</span><span class="cx"> #define ReduceWhitespace_h
</span><span class="cx"> 
</span><del>-#include &lt;wtf/text/WTFString.h&gt;
</del><ins>+#include &lt;wtf/text/CString.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><span class="cx"> // Replace all whitespace runs with a single space.
</span><del>-String reduceWhitespace(const String&amp;);
</del><ins>+CString reduceWhitespace(const CString&amp;);
</ins><span class="cx"> 
</span><span class="cx"> } // namespace JSC
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeResolveGlobalStatuscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/ResolveGlobalStatus.cpp (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/ResolveGlobalStatus.cpp        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/JavaScriptCore/bytecode/ResolveGlobalStatus.cpp        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -33,11 +33,11 @@
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><del>-static ResolveGlobalStatus computeForStructure(CodeBlock* codeBlock, Structure* structure, Identifier&amp; identifier)
</del><ins>+static ResolveGlobalStatus computeForStructure(CodeBlock* codeBlock, Structure* structure, StringImpl* uid)
</ins><span class="cx"> {
</span><span class="cx">     unsigned attributesIgnored;
</span><span class="cx">     JSCell* specificValue;
</span><del>-    PropertyOffset offset = structure-&gt;getConcurrently(*codeBlock-&gt;vm(), identifier, attributesIgnored, specificValue);
</del><ins>+    PropertyOffset offset = structure-&gt;getConcurrently(*codeBlock-&gt;vm(), uid, attributesIgnored, specificValue);
</ins><span class="cx">     if (structure-&gt;isDictionary())
</span><span class="cx">         specificValue = 0;
</span><span class="cx">     if (!isValidOffset(offset))
</span><span class="lines">@@ -46,7 +46,7 @@
</span><span class="cx">     return ResolveGlobalStatus(ResolveGlobalStatus::Simple, structure, offset, specificValue);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-ResolveGlobalStatus ResolveGlobalStatus::computeFor(CodeBlock* codeBlock, int, ResolveOperation* operation, Identifier&amp; identifier)
</del><ins>+ResolveGlobalStatus ResolveGlobalStatus::computeFor(CodeBlock* codeBlock, int, ResolveOperation* operation, StringImpl* uid)
</ins><span class="cx"> {
</span><span class="cx">     CodeBlockLocker locker(codeBlock-&gt;m_lock);
</span><span class="cx">     
</span><span class="lines">@@ -54,7 +54,7 @@
</span><span class="cx">     if (!operation-&gt;m_structure)
</span><span class="cx">         return ResolveGlobalStatus();
</span><span class="cx">     
</span><del>-    return computeForStructure(codeBlock, operation-&gt;m_structure.get(), identifier);
</del><ins>+    return computeForStructure(codeBlock, operation-&gt;m_structure.get(), uid);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace JSC
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeResolveGlobalStatush"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/ResolveGlobalStatus.h (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/ResolveGlobalStatus.h        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/JavaScriptCore/bytecode/ResolveGlobalStatus.h        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2012 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2012, 2013 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -29,11 +29,11 @@
</span><span class="cx"> #include &quot;JSCJSValue.h&quot;
</span><span class="cx"> #include &quot;PropertyOffset.h&quot;
</span><span class="cx"> #include &lt;wtf/NotFound.h&gt;
</span><ins>+#include &lt;wtf/text/StringImpl.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><span class="cx"> class CodeBlock;
</span><del>-class Identifier;
</del><span class="cx"> struct ResolveOperation;
</span><span class="cx"> class Structure;
</span><span class="cx"> 
</span><span class="lines">@@ -62,7 +62,7 @@
</span><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    static ResolveGlobalStatus computeFor(CodeBlock*, int bytecodeIndex, ResolveOperation*, Identifier&amp;);
</del><ins>+    static ResolveGlobalStatus computeFor(CodeBlock*, int bytecodeIndex, ResolveOperation*, StringImpl* uid);
</ins><span class="cx">     
</span><span class="cx">     State state() const { return m_state; }
</span><span class="cx">     
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGAbstractStatecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGAbstractState.cpp (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGAbstractState.cpp        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/JavaScriptCore/dfg/DFGAbstractState.cpp        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -1239,7 +1239,7 @@
</span><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        value.set((value.m_type &amp; ~SpecEmpty) | SpecFunction);
</del><ins>+        value.setType((value.m_type &amp; ~SpecEmpty) | SpecFunction);
</ins><span class="cx">         break;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -1296,7 +1296,7 @@
</span><span class="cx">             if (Structure* structure = forNode(node-&gt;child1()).bestProvenStructure()) {
</span><span class="cx">                 GetByIdStatus status = GetByIdStatus::computeFor(
</span><span class="cx">                     m_graph.m_vm, structure,
</span><del>-                    m_graph.m_codeBlock-&gt;identifier(node-&gt;identifierNumber()));
</del><ins>+                    m_graph.m_identifiers[node-&gt;identifierNumber()]);
</ins><span class="cx">                 if (status.isSimple()) {
</span><span class="cx">                     // Assert things that we can't handle and that the computeFor() method
</span><span class="cx">                     // above won't be able to return.
</span><span class="lines">@@ -1497,7 +1497,7 @@
</span><span class="cx">                 m_graph.m_vm,
</span><span class="cx">                 m_graph.globalObjectFor(node-&gt;codeOrigin),
</span><span class="cx">                 structure,
</span><del>-                m_graph.m_codeBlock-&gt;identifier(node-&gt;identifierNumber()),
</del><ins>+                m_graph.m_identifiers[node-&gt;identifierNumber()],
</ins><span class="cx">                 node-&gt;op() == PutByIdDirect);
</span><span class="cx">             if (status.isSimpleReplace()) {
</span><span class="cx">                 forNode(node-&gt;child1()).filter(m_graph, structure);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGByteCodeParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -1124,7 +1124,7 @@
</span><span class="cx">     // inlining.
</span><span class="cx">     bool m_haveBuiltOperandMaps;
</span><span class="cx">     // Mapping between identifier names and numbers.
</span><del>-    IdentifierMap m_identifierMap;
</del><ins>+    BorrowedIdentifierMap m_identifierMap;
</ins><span class="cx">     // Mapping between values and constant numbers.
</span><span class="cx">     JSValueMap m_jsValueMap;
</span><span class="cx">     // Index of the empty value, or UINT_MAX if there is no mapping. This is a horrible
</span><span class="lines">@@ -1880,7 +1880,7 @@
</span><span class="cx">     ResolveOperation* resolveValueOperation = pc;
</span><span class="cx">     switch (resolveValueOperation-&gt;m_operation) {
</span><span class="cx">     case ResolveOperation::GetAndReturnGlobalProperty: {
</span><del>-        ResolveGlobalStatus status = ResolveGlobalStatus::computeFor(m_inlineStackTop-&gt;m_profiledBlock, m_currentIndex, resolveValueOperation, m_codeBlock-&gt;identifier(identifier));
</del><ins>+        ResolveGlobalStatus status = ResolveGlobalStatus::computeFor(m_inlineStackTop-&gt;m_profiledBlock, m_currentIndex, resolveValueOperation, m_graph.m_identifiers[identifier]);
</ins><span class="cx">         if (status.isSimple()) {
</span><span class="cx">             ASSERT(status.structure());
</span><span class="cx"> 
</span><span class="lines">@@ -1916,8 +1916,8 @@
</span><span class="cx"> 
</span><span class="cx">         JSGlobalObject* globalObject = m_inlineStackTop-&gt;m_codeBlock-&gt;globalObject();
</span><span class="cx"> 
</span><del>-        Identifier ident = m_codeBlock-&gt;identifier(identifier);
-        SymbolTableEntry entry = globalObject-&gt;symbolTable()-&gt;get(ident.impl());
</del><ins>+        StringImpl* uid = m_graph.m_identifiers[identifier];
+        SymbolTableEntry entry = globalObject-&gt;symbolTable()-&gt;get(uid);
</ins><span class="cx">         if (!m_graph.m_watchpoints.isStillValid(entry.watchpointSet())) {
</span><span class="cx">             *value = addToGraph(GetGlobalVar, OpInfo(globalObject-&gt;assertRegisterIsInThisObject(pc-&gt;m_registerAddress)), OpInfo(prediction));
</span><span class="cx">             return true;
</span><span class="lines">@@ -2570,9 +2570,9 @@
</span><span class="cx">             Node* base = get(currentInstruction[2].u.operand);
</span><span class="cx">             unsigned identifierNumber = m_inlineStackTop-&gt;m_identifierRemap[currentInstruction[3].u.operand];
</span><span class="cx">             
</span><del>-            Identifier identifier = m_codeBlock-&gt;identifier(identifierNumber);
</del><ins>+            StringImpl* uid = m_graph.m_identifiers[identifierNumber];
</ins><span class="cx">             GetByIdStatus getByIdStatus = GetByIdStatus::computeFor(
</span><del>-                m_inlineStackTop-&gt;m_profiledBlock, m_currentIndex, identifier);
</del><ins>+                m_inlineStackTop-&gt;m_profiledBlock, m_currentIndex, uid);
</ins><span class="cx">             
</span><span class="cx">             handleGetById(
</span><span class="cx">                 currentInstruction[1].u.operand, prediction, base, identifierNumber, getByIdStatus);
</span><span class="lines">@@ -2593,7 +2593,7 @@
</span><span class="cx">             PutByIdStatus putByIdStatus = PutByIdStatus::computeFor(
</span><span class="cx">                 m_inlineStackTop-&gt;m_profiledBlock,
</span><span class="cx">                 m_currentIndex,
</span><del>-                m_codeBlock-&gt;identifier(identifierNumber));
</del><ins>+                m_graph.m_identifiers[identifierNumber]);
</ins><span class="cx">             bool canCountAsInlined = true;
</span><span class="cx">             if (!putByIdStatus.isSet()) {
</span><span class="cx">                 addToGraph(ForceOSRExit);
</span><span class="lines">@@ -2715,8 +2715,8 @@
</span><span class="cx">             CodeBlock* codeBlock = m_inlineStackTop-&gt;m_codeBlock;
</span><span class="cx">             JSGlobalObject* globalObject = codeBlock-&gt;globalObject();
</span><span class="cx">             unsigned identifierNumber = m_inlineStackTop-&gt;m_identifierRemap[currentInstruction[4].u.operand];
</span><del>-            Identifier identifier = m_codeBlock-&gt;identifier(identifierNumber);
-            SymbolTableEntry entry = globalObject-&gt;symbolTable()-&gt;get(identifier.impl());
</del><ins>+            StringImpl* uid = m_graph.m_identifiers[identifierNumber];
+            SymbolTableEntry entry = globalObject-&gt;symbolTable()-&gt;get(uid);
</ins><span class="cx">             if (!entry.couldBeWatched()) {
</span><span class="cx">                 addToGraph(
</span><span class="cx">                     PutGlobalVar,
</span><span class="lines">@@ -3191,7 +3191,7 @@
</span><span class="cx">             case PutToBaseOperation::GlobalVariablePutChecked: {
</span><span class="cx">                 CodeBlock* codeBlock = m_inlineStackTop-&gt;m_codeBlock;
</span><span class="cx">                 JSGlobalObject* globalObject = codeBlock-&gt;globalObject();
</span><del>-                SymbolTableEntry entry = globalObject-&gt;symbolTable()-&gt;get(m_codeBlock-&gt;identifier(identifier).impl());
</del><ins>+                SymbolTableEntry entry = globalObject-&gt;symbolTable()-&gt;get(m_graph.m_identifiers[identifier]);
</ins><span class="cx">                 if (entry.couldBeWatched()) {
</span><span class="cx">                     addToGraph(PutGlobalVarCheck,
</span><span class="cx">                                OpInfo(codeBlock-&gt;globalObject()-&gt;assertRegisterIsInThisObject(putToBase-&gt;m_registerAddress)),
</span><span class="lines">@@ -3564,9 +3564,9 @@
</span><span class="cx"> 
</span><span class="cx">         for (size_t i = 0; i &lt; codeBlock-&gt;numberOfIdentifiers(); ++i) {
</span><span class="cx">             StringImpl* rep = codeBlock-&gt;identifier(i).impl();
</span><del>-            IdentifierMap::AddResult result = byteCodeParser-&gt;m_identifierMap.add(rep, byteCodeParser-&gt;m_codeBlock-&gt;numberOfIdentifiers());
</del><ins>+            BorrowedIdentifierMap::AddResult result = byteCodeParser-&gt;m_identifierMap.add(rep, byteCodeParser-&gt;m_graph.m_identifiers.numberOfIdentifiers());
</ins><span class="cx">             if (result.isNewEntry)
</span><del>-                byteCodeParser-&gt;m_codeBlock-&gt;addIdentifier(Identifier(byteCodeParser-&gt;m_vm, rep));
</del><ins>+                byteCodeParser-&gt;m_graph.m_identifiers.addLazily(rep);
</ins><span class="cx">             m_identifierRemap[i] = result.iterator-&gt;value;
</span><span class="cx">         }
</span><span class="cx">         for (size_t i = 0; i &lt; codeBlock-&gt;numberOfConstantRegisters(); ++i) {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGConstantFoldingPhasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGConstantFoldingPhase.cpp (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGConstantFoldingPhase.cpp        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/JavaScriptCore/dfg/DFGConstantFoldingPhase.cpp        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -155,7 +155,7 @@
</span><span class="cx">                 bool needsCellCheck = m_state.forNode(child).m_type &amp; ~SpecCell;
</span><span class="cx">                 
</span><span class="cx">                 GetByIdStatus status = GetByIdStatus::computeFor(
</span><del>-                    vm(), structure, codeBlock()-&gt;identifier(identifierNumber));
</del><ins>+                    vm(), structure, m_graph.m_identifiers[identifierNumber]);
</ins><span class="cx">                 
</span><span class="cx">                 if (!status.isSimple()) {
</span><span class="cx">                     // FIXME: We could handle prototype cases.
</span><span class="lines">@@ -223,7 +223,7 @@
</span><span class="cx">                     vm(),
</span><span class="cx">                     m_graph.globalObjectFor(codeOrigin),
</span><span class="cx">                     structure,
</span><del>-                    codeBlock()-&gt;identifier(identifierNumber),
</del><ins>+                    m_graph.m_identifiers[identifierNumber],
</ins><span class="cx">                     node-&gt;op() == PutByIdDirect);
</span><span class="cx">                 
</span><span class="cx">                 if (!status.isSimpleReplace() &amp;&amp; !status.isSimpleTransition())
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGDesiredIdentifierscppfromrev153141trunkSourceJavaScriptCorebytecodeReduceWhitespacecpp"></a>
<div class="copfile"><h4>Copied: trunk/Source/JavaScriptCore/dfg/DFGDesiredIdentifiers.cpp (from rev 153141, trunk/Source/JavaScriptCore/bytecode/ReduceWhitespace.cpp) (0 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGDesiredIdentifiers.cpp                                (rev 0)
+++ trunk/Source/JavaScriptCore/dfg/DFGDesiredIdentifiers.cpp        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -0,0 +1,59 @@
</span><ins>+/*
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include &quot;config.h&quot;
+#include &quot;DFGDesiredIdentifiers.h&quot;
+
+#if ENABLE(DFG_JIT)
+
+namespace JSC { namespace DFG {
+
+DesiredIdentifiers::DesiredIdentifiers(CodeBlock* codeBlock)
+    : m_codeBlock(codeBlock)
+{
+}
+
+DesiredIdentifiers::~DesiredIdentifiers()
+{
+}
+
+void DesiredIdentifiers::addLazily(StringImpl* rep)
+{
+    m_addedIdentifiers.append(rep);
+}
+
+void DesiredIdentifiers::reallyAdd(VM&amp; vm)
+{
+    for (unsigned i = 0; i &lt; m_addedIdentifiers.size(); ++i) {
+        StringImpl* rep = m_addedIdentifiers[i];
+        ASSERT(rep-&gt;hasAtLeastOneRef());
+        m_codeBlock-&gt;addIdentifier(Identifier(&amp;vm, rep));
+    }
+}
+
+} } // namespace JSC::DFG
+
+#endif // ENABLE(DFG_JIT)
+
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGDesiredIdentifiershfromrev153141trunkSourceJavaScriptCoreprofilerProfilerBytecodesh"></a>
<div class="copfile"><h4>Copied: trunk/Source/JavaScriptCore/dfg/DFGDesiredIdentifiers.h (from rev 153141, trunk/Source/JavaScriptCore/profiler/ProfilerBytecodes.h) (0 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGDesiredIdentifiers.h                                (rev 0)
+++ trunk/Source/JavaScriptCore/dfg/DFGDesiredIdentifiers.h        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -0,0 +1,75 @@
</span><ins>+/*
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#ifndef DFGDesiredIdentifiers_h
+#define DFGDesiredIdentifiers_h
+
+#include &lt;wtf/Platform.h&gt;
+
+#if ENABLE(DFG_JIT)
+
+#include &quot;CodeBlock.h&quot;
+#include &quot;Identifier.h&quot;
+
+namespace JSC { namespace DFG {
+
+class DesiredIdentifiers {
+public:
+    DesiredIdentifiers(CodeBlock*);
+    ~DesiredIdentifiers();
+    
+    unsigned numberOfIdentifiers()
+    {
+        return m_codeBlock-&gt;numberOfIdentifiers() + m_addedIdentifiers.size();
+    }
+    
+    void addLazily(StringImpl*);
+    
+    StringImpl* at(unsigned index) const
+    {
+        StringImpl* result;
+        if (index &lt; m_codeBlock-&gt;numberOfIdentifiers())
+            result = m_codeBlock-&gt;identifier(index).impl();
+        else
+            result = m_addedIdentifiers[index - m_codeBlock-&gt;numberOfIdentifiers()];
+        ASSERT(result-&gt;hasAtLeastOneRef());
+        return result;
+    }
+    
+    StringImpl* operator[](unsigned index) const { return at(index); }
+    
+    void reallyAdd(VM&amp;);
+    
+private:
+    CodeBlock* m_codeBlock;
+    Vector&lt;StringImpl*&gt; m_addedIdentifiers;
+};
+
+} } // namespace JSC::DFG
+
+#endif // ENABLE(DFG_JIT)
+
+#endif // DFGDesiredIdentifiers_h
+
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGFixupPhasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGFixupPhase.cpp (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGFixupPhase.cpp        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/JavaScriptCore/dfg/DFGFixupPhase.cpp        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -686,7 +686,7 @@
</span><span class="cx">             setUseKindAndUnboxIfProfitable&lt;CellUse&gt;(node-&gt;child1());
</span><span class="cx">             if (!isInt32Speculation(node-&gt;prediction()))
</span><span class="cx">                 break;
</span><del>-            if (codeBlock()-&gt;identifier(node-&gt;identifierNumber()) != vm().propertyNames-&gt;length)
</del><ins>+            if (m_graph.m_identifiers[node-&gt;identifierNumber()] != vm().propertyNames-&gt;length.impl())
</ins><span class="cx">                 break;
</span><span class="cx">             CodeBlock* profiledBlock = m_graph.baselineCodeBlockFor(node-&gt;codeOrigin);
</span><span class="cx">             ArrayProfile* arrayProfile = 
</span><span class="lines">@@ -1079,12 +1079,12 @@
</span><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    bool isStringPrototypeMethodSane(Structure* stringPrototypeStructure, const Identifier&amp; ident)
</del><ins>+    bool isStringPrototypeMethodSane(Structure* stringPrototypeStructure, StringImpl* uid)
</ins><span class="cx">     {
</span><span class="cx">         unsigned attributesUnused;
</span><span class="cx">         JSCell* specificValue;
</span><span class="cx">         PropertyOffset offset = stringPrototypeStructure-&gt;getConcurrently(
</span><del>-            vm(), ident, attributesUnused, specificValue);
</del><ins>+            vm(), uid, attributesUnused, specificValue);
</ins><span class="cx">         if (!isValidOffset(offset))
</span><span class="cx">             return false;
</span><span class="cx">         
</span><span class="lines">@@ -1123,9 +1123,9 @@
</span><span class="cx">         // (that would call toString()). We don't want the DFG to have to distinguish
</span><span class="cx">         // between the two, just because that seems like it would get confusing. So we
</span><span class="cx">         // just require both methods to be sane.
</span><del>-        if (!isStringPrototypeMethodSane(stringPrototypeStructure, vm().propertyNames-&gt;valueOf))
</del><ins>+        if (!isStringPrototypeMethodSane(stringPrototypeStructure, vm().propertyNames-&gt;valueOf.impl()))
</ins><span class="cx">             return false;
</span><del>-        if (!isStringPrototypeMethodSane(stringPrototypeStructure, vm().propertyNames-&gt;toString))
</del><ins>+        if (!isStringPrototypeMethodSane(stringPrototypeStructure, vm().propertyNames-&gt;toString.impl()))
</ins><span class="cx">             return false;
</span><span class="cx">         
</span><span class="cx">         return true;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGGraphcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGGraph.cpp (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGGraph.cpp        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/JavaScriptCore/dfg/DFGGraph.cpp        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -53,6 +53,7 @@
</span><span class="cx">     , m_hasArguments(false)
</span><span class="cx">     , m_osrEntryBytecodeIndex(osrEntryBytecodeIndex)
</span><span class="cx">     , m_mustHandleValues(mustHandleValues)
</span><ins>+    , m_identifiers(codeBlock)
</ins><span class="cx">     , m_fixpointState(BeforeFixpoint)
</span><span class="cx">     , m_form(LoadStore)
</span><span class="cx">     , m_unificationState(LocallyUnified)
</span><span class="lines">@@ -188,7 +189,7 @@
</span><span class="cx">     if (node-&gt;hasRegisterPointer())
</span><span class="cx">         out.print(comma, &quot;global&quot;, globalObjectFor(node-&gt;codeOrigin)-&gt;findRegisterIndex(node-&gt;registerPointer()), &quot;(&quot;, RawPointer(node-&gt;registerPointer()), &quot;)&quot;);
</span><span class="cx">     if (node-&gt;hasIdentifier())
</span><del>-        out.print(comma, &quot;id&quot;, node-&gt;identifierNumber(), &quot;{&quot;, m_codeBlock-&gt;identifier(node-&gt;identifierNumber()).string(), &quot;}&quot;);
</del><ins>+        out.print(comma, &quot;id&quot;, node-&gt;identifierNumber(), &quot;{&quot;, m_identifiers[node-&gt;identifierNumber()], &quot;}&quot;);
</ins><span class="cx">     if (node-&gt;hasStructureSet()) {
</span><span class="cx">         for (size_t i = 0; i &lt; node-&gt;structureSet().size(); ++i)
</span><span class="cx">             out.print(comma, &quot;struct(&quot;, RawPointer(node-&gt;structureSet()[i]), &quot;: &quot;, IndexingTypeDump(node-&gt;structureSet()[i]-&gt;indexingType()), &quot;)&quot;);
</span><span class="lines">@@ -225,7 +226,7 @@
</span><span class="cx">     }
</span><span class="cx">     if (node-&gt;hasStorageAccessData()) {
</span><span class="cx">         StorageAccessData&amp; storageAccessData = m_storageAccessData[node-&gt;storageAccessDataIndex()];
</span><del>-        out.print(comma, &quot;id&quot;, storageAccessData.identifierNumber, &quot;{&quot;, m_codeBlock-&gt;identifier(storageAccessData.identifierNumber).string(), &quot;}&quot;);
</del><ins>+        out.print(comma, &quot;id&quot;, storageAccessData.identifierNumber, &quot;{&quot;, m_identifiers[storageAccessData.identifierNumber], &quot;}&quot;);
</ins><span class="cx">         out.print(&quot;, &quot;, static_cast&lt;ptrdiff_t&gt;(storageAccessData.offset));
</span><span class="cx">     }
</span><span class="cx">     ASSERT(node-&gt;hasVariableAccessData() == node-&gt;hasLocal());
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGGraphh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGGraph.h (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGGraph.h        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/JavaScriptCore/dfg/DFGGraph.h        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -34,6 +34,7 @@
</span><span class="cx"> #include &quot;DFGArgumentPosition.h&quot;
</span><span class="cx"> #include &quot;DFGAssemblyHelpers.h&quot;
</span><span class="cx"> #include &quot;DFGBasicBlock.h&quot;
</span><ins>+#include &quot;DFGDesiredIdentifiers.h&quot;
</ins><span class="cx"> #include &quot;DFGDesiredWatchpoints.h&quot;
</span><span class="cx"> #include &quot;DFGDominators.h&quot;
</span><span class="cx"> #include &quot;DFGLongLivedState.h&quot;
</span><span class="lines">@@ -727,6 +728,7 @@
</span><span class="cx">     unsigned m_osrEntryBytecodeIndex;
</span><span class="cx">     Operands&lt;JSValue&gt; m_mustHandleValues;
</span><span class="cx">     DesiredWatchpoints m_watchpoints;
</span><ins>+    DesiredIdentifiers m_identifiers;
</ins><span class="cx">     
</span><span class="cx">     OptimizationFixpointState m_fixpointState;
</span><span class="cx">     GraphForm m_form;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGJITCompilercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGJITCompiler.cpp (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGJITCompiler.cpp        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/JavaScriptCore/dfg/DFGJITCompiler.cpp        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -244,6 +244,7 @@
</span><span class="cx">     m_jitCode-&gt;common.compilation = m_graph.m_compilation;
</span><span class="cx">     
</span><span class="cx">     m_graph.m_watchpoints.reallyAdd();
</span><ins>+    m_graph.m_identifiers.reallyAdd(*m_vm);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool JITCompiler::compile()
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGOperationscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGOperations.cpp (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGOperations.cpp        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/JavaScriptCore/dfg/DFGOperations.cpp        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -268,15 +268,15 @@
</span><span class="cx"> FUNCTION_WRAPPER_WITH_RETURN_ADDRESS_E(function)
</span><span class="cx"> 
</span><span class="cx"> #define J_FUNCTION_WRAPPER_WITH_RETURN_ADDRESS_ECI(function) \
</span><del>-EncodedJSValue DFG_OPERATION function##WithReturnAddress(ExecState*, JSCell*, Identifier*, ReturnAddressPtr) REFERENCED_FROM_ASM WTF_INTERNAL; \
</del><ins>+EncodedJSValue DFG_OPERATION function##WithReturnAddress(ExecState*, JSCell*, StringImpl*, ReturnAddressPtr) REFERENCED_FROM_ASM WTF_INTERNAL; \
</ins><span class="cx"> FUNCTION_WRAPPER_WITH_RETURN_ADDRESS_ECI(function)
</span><span class="cx"> 
</span><span class="cx"> #define J_FUNCTION_WRAPPER_WITH_RETURN_ADDRESS_EJI(function) \
</span><del>-EncodedJSValue DFG_OPERATION function##WithReturnAddress(ExecState*, EncodedJSValue, Identifier*, ReturnAddressPtr) REFERENCED_FROM_ASM WTF_INTERNAL; \
</del><ins>+EncodedJSValue DFG_OPERATION function##WithReturnAddress(ExecState*, EncodedJSValue, StringImpl*, ReturnAddressPtr) REFERENCED_FROM_ASM WTF_INTERNAL; \
</ins><span class="cx"> FUNCTION_WRAPPER_WITH_RETURN_ADDRESS_EJI(function)
</span><span class="cx"> 
</span><span class="cx"> #define V_FUNCTION_WRAPPER_WITH_RETURN_ADDRESS_EJCI(function) \
</span><del>-void DFG_OPERATION function##WithReturnAddress(ExecState*, EncodedJSValue, JSCell*, Identifier*, ReturnAddressPtr) REFERENCED_FROM_ASM WTF_INTERNAL; \
</del><ins>+void DFG_OPERATION function##WithReturnAddress(ExecState*, EncodedJSValue, JSCell*, StringImpl*, ReturnAddressPtr) REFERENCED_FROM_ASM WTF_INTERNAL; \
</ins><span class="cx"> FUNCTION_WRAPPER_WITH_RETURN_ADDRESS_EJCI(function)
</span><span class="cx"> 
</span><span class="cx"> namespace JSC { namespace DFG {
</span><span class="lines">@@ -485,70 +485,74 @@
</span><span class="cx">     return JSValue::encode(JSValue(base).get(exec, index));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-EncodedJSValue DFG_OPERATION operationGetById(ExecState* exec, EncodedJSValue base, Identifier* propertyName)
</del><ins>+EncodedJSValue DFG_OPERATION operationGetById(ExecState* exec, EncodedJSValue base, StringImpl* uid)
</ins><span class="cx"> {
</span><span class="cx">     VM* vm = &amp;exec-&gt;vm();
</span><span class="cx">     NativeCallFrameTracer tracer(vm, exec);
</span><span class="cx">     
</span><span class="cx">     JSValue baseValue = JSValue::decode(base);
</span><span class="cx">     PropertySlot slot(baseValue);
</span><del>-    return JSValue::encode(baseValue.get(exec, *propertyName, slot));
</del><ins>+    Identifier ident(vm, uid);
+    return JSValue::encode(baseValue.get(exec, ident, slot));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> J_FUNCTION_WRAPPER_WITH_RETURN_ADDRESS_EJI(operationGetByIdBuildList);
</span><del>-EncodedJSValue DFG_OPERATION operationGetByIdBuildListWithReturnAddress(ExecState* exec, EncodedJSValue base, Identifier* propertyName, ReturnAddressPtr returnAddress)
</del><ins>+EncodedJSValue DFG_OPERATION operationGetByIdBuildListWithReturnAddress(ExecState* exec, EncodedJSValue base, StringImpl* uid, ReturnAddressPtr returnAddress)
</ins><span class="cx"> {
</span><span class="cx">     VM* vm = &amp;exec-&gt;vm();
</span><span class="cx">     NativeCallFrameTracer tracer(vm, exec);
</span><del>-    
</del><ins>+
+    Identifier ident(vm, uid);
</ins><span class="cx">     StructureStubInfo&amp; stubInfo = exec-&gt;codeBlock()-&gt;getStubInfo(returnAddress);
</span><span class="cx">     AccessType accessType = static_cast&lt;AccessType&gt;(stubInfo.accessType);
</span><span class="cx"> 
</span><span class="cx">     JSValue baseValue = JSValue::decode(base);
</span><span class="cx">     PropertySlot slot(baseValue);
</span><del>-    JSValue result = baseValue.get(exec, *propertyName, slot);
</del><ins>+    JSValue result = baseValue.get(exec, ident, slot);
</ins><span class="cx"> 
</span><span class="cx">     if (accessType == static_cast&lt;AccessType&gt;(stubInfo.accessType))
</span><del>-        dfgBuildGetByIDList(exec, baseValue, *propertyName, slot, stubInfo);
</del><ins>+        dfgBuildGetByIDList(exec, baseValue, ident, slot, stubInfo);
</ins><span class="cx"> 
</span><span class="cx">     return JSValue::encode(result);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> J_FUNCTION_WRAPPER_WITH_RETURN_ADDRESS_EJI(operationGetByIdProtoBuildList);
</span><del>-EncodedJSValue DFG_OPERATION operationGetByIdProtoBuildListWithReturnAddress(ExecState* exec, EncodedJSValue base, Identifier* propertyName, ReturnAddressPtr returnAddress)
</del><ins>+EncodedJSValue DFG_OPERATION operationGetByIdProtoBuildListWithReturnAddress(ExecState* exec, EncodedJSValue base, StringImpl* uid, ReturnAddressPtr returnAddress)
</ins><span class="cx"> {
</span><span class="cx">     VM* vm = &amp;exec-&gt;vm();
</span><span class="cx">     NativeCallFrameTracer tracer(vm, exec);
</span><span class="cx">     
</span><ins>+    Identifier ident(vm, uid);
</ins><span class="cx">     StructureStubInfo&amp; stubInfo = exec-&gt;codeBlock()-&gt;getStubInfo(returnAddress);
</span><span class="cx">     AccessType accessType = static_cast&lt;AccessType&gt;(stubInfo.accessType);
</span><span class="cx"> 
</span><span class="cx">     JSValue baseValue = JSValue::decode(base);
</span><span class="cx">     PropertySlot slot(baseValue);
</span><del>-    JSValue result = baseValue.get(exec, *propertyName, slot);
</del><ins>+    JSValue result = baseValue.get(exec, ident, slot);
</ins><span class="cx">     
</span><span class="cx">     if (accessType == static_cast&lt;AccessType&gt;(stubInfo.accessType))
</span><del>-        dfgBuildGetByIDProtoList(exec, baseValue, *propertyName, slot, stubInfo);
</del><ins>+        dfgBuildGetByIDProtoList(exec, baseValue, ident, slot, stubInfo);
</ins><span class="cx"> 
</span><span class="cx">     return JSValue::encode(result);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> J_FUNCTION_WRAPPER_WITH_RETURN_ADDRESS_EJI(operationGetByIdOptimize);
</span><del>-EncodedJSValue DFG_OPERATION operationGetByIdOptimizeWithReturnAddress(ExecState* exec, EncodedJSValue base, Identifier* propertyName, ReturnAddressPtr returnAddress)
</del><ins>+EncodedJSValue DFG_OPERATION operationGetByIdOptimizeWithReturnAddress(ExecState* exec, EncodedJSValue base, StringImpl* uid, ReturnAddressPtr returnAddress)
</ins><span class="cx"> {
</span><span class="cx">     VM* vm = &amp;exec-&gt;vm();
</span><span class="cx">     NativeCallFrameTracer tracer(vm, exec);
</span><del>-    
</del><ins>+
+    Identifier ident(vm, uid);
</ins><span class="cx">     StructureStubInfo&amp; stubInfo = exec-&gt;codeBlock()-&gt;getStubInfo(returnAddress);
</span><span class="cx">     AccessType accessType = static_cast&lt;AccessType&gt;(stubInfo.accessType);
</span><span class="cx"> 
</span><span class="cx">     JSValue baseValue = JSValue::decode(base);
</span><span class="cx">     PropertySlot slot(baseValue);
</span><del>-    JSValue result = baseValue.get(exec, *propertyName, slot);
</del><ins>+    JSValue result = baseValue.get(exec, ident, slot);
</ins><span class="cx">     
</span><span class="cx">     if (accessType == static_cast&lt;AccessType&gt;(stubInfo.accessType)) {
</span><span class="cx">         if (stubInfo.seen)
</span><del>-            dfgRepatchGetByID(exec, baseValue, *propertyName, slot, stubInfo);
</del><ins>+            dfgRepatchGetByID(exec, baseValue, ident, slot, stubInfo);
</ins><span class="cx">         else
</span><span class="cx">             stubInfo.seen = true;
</span><span class="cx">     }
</span><span class="lines">@@ -556,12 +560,14 @@
</span><span class="cx">     return JSValue::encode(result);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-EncodedJSValue DFG_OPERATION operationCallCustomGetter(ExecState* exec, JSCell* base, PropertySlot::GetValueFunc function, Identifier* ident)
</del><ins>+EncodedJSValue DFG_OPERATION operationCallCustomGetter(ExecState* exec, JSCell* base, PropertySlot::GetValueFunc function, StringImpl* uid)
</ins><span class="cx"> {
</span><span class="cx">     VM* vm = &amp;exec-&gt;vm();
</span><span class="cx">     NativeCallFrameTracer tracer(vm, exec);
</span><span class="cx">     
</span><del>-    return JSValue::encode(function(exec, asObject(base), *ident));
</del><ins>+    Identifier ident(vm, uid);
+    
+    return JSValue::encode(function(exec, asObject(base), ident));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> EncodedJSValue DFG_OPERATION operationCallGetter(ExecState* exec, JSCell* base, JSCell* value)
</span><span class="lines">@@ -738,50 +744,55 @@
</span><span class="cx">     return asRegExpObject(base)-&gt;test(exec, input);
</span><span class="cx"> }
</span><span class="cx">         
</span><del>-void DFG_OPERATION operationPutByIdStrict(ExecState* exec, EncodedJSValue encodedValue, JSCell* base, Identifier* propertyName)
</del><ins>+void DFG_OPERATION operationPutByIdStrict(ExecState* exec, EncodedJSValue encodedValue, JSCell* base, StringImpl* uid)
</ins><span class="cx"> {
</span><span class="cx">     VM* vm = &amp;exec-&gt;vm();
</span><span class="cx">     NativeCallFrameTracer tracer(vm, exec);
</span><span class="cx">     
</span><ins>+    Identifier ident(vm, uid);
</ins><span class="cx">     PutPropertySlot slot(true);
</span><del>-    base-&gt;methodTable()-&gt;put(base, exec, *propertyName, JSValue::decode(encodedValue), slot);
</del><ins>+    base-&gt;methodTable()-&gt;put(base, exec, ident, JSValue::decode(encodedValue), slot);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DFG_OPERATION operationPutByIdNonStrict(ExecState* exec, EncodedJSValue encodedValue, JSCell* base, Identifier* propertyName)
</del><ins>+void DFG_OPERATION operationPutByIdNonStrict(ExecState* exec, EncodedJSValue encodedValue, JSCell* base, StringImpl* uid)
</ins><span class="cx"> {
</span><span class="cx">     VM* vm = &amp;exec-&gt;vm();
</span><span class="cx">     NativeCallFrameTracer tracer(vm, exec);
</span><span class="cx">     
</span><ins>+    Identifier ident(vm, uid);
</ins><span class="cx">     PutPropertySlot slot(false);
</span><del>-    base-&gt;methodTable()-&gt;put(base, exec, *propertyName, JSValue::decode(encodedValue), slot);
</del><ins>+    base-&gt;methodTable()-&gt;put(base, exec, ident, JSValue::decode(encodedValue), slot);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DFG_OPERATION operationPutByIdDirectStrict(ExecState* exec, EncodedJSValue encodedValue, JSCell* base, Identifier* propertyName)
</del><ins>+void DFG_OPERATION operationPutByIdDirectStrict(ExecState* exec, EncodedJSValue encodedValue, JSCell* base, StringImpl* uid)
</ins><span class="cx"> {
</span><span class="cx">     VM* vm = &amp;exec-&gt;vm();
</span><span class="cx">     NativeCallFrameTracer tracer(vm, exec);
</span><span class="cx">     
</span><ins>+    Identifier ident(vm, uid);
</ins><span class="cx">     PutPropertySlot slot(true);
</span><span class="cx">     ASSERT(base-&gt;isObject());
</span><del>-    asObject(base)-&gt;putDirect(exec-&gt;vm(), *propertyName, JSValue::decode(encodedValue), slot);
</del><ins>+    asObject(base)-&gt;putDirect(exec-&gt;vm(), ident, JSValue::decode(encodedValue), slot);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DFG_OPERATION operationPutByIdDirectNonStrict(ExecState* exec, EncodedJSValue encodedValue, JSCell* base, Identifier* propertyName)
</del><ins>+void DFG_OPERATION operationPutByIdDirectNonStrict(ExecState* exec, EncodedJSValue encodedValue, JSCell* base, StringImpl* uid)
</ins><span class="cx"> {
</span><span class="cx">     VM* vm = &amp;exec-&gt;vm();
</span><span class="cx">     NativeCallFrameTracer tracer(vm, exec);
</span><span class="cx">     
</span><ins>+    Identifier ident(vm, uid);
</ins><span class="cx">     PutPropertySlot slot(false);
</span><span class="cx">     ASSERT(base-&gt;isObject());
</span><del>-    asObject(base)-&gt;putDirect(exec-&gt;vm(), *propertyName, JSValue::decode(encodedValue), slot);
</del><ins>+    asObject(base)-&gt;putDirect(exec-&gt;vm(), ident, JSValue::decode(encodedValue), slot);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> V_FUNCTION_WRAPPER_WITH_RETURN_ADDRESS_EJCI(operationPutByIdStrictOptimize);
</span><del>-void DFG_OPERATION operationPutByIdStrictOptimizeWithReturnAddress(ExecState* exec, EncodedJSValue encodedValue, JSCell* base, Identifier* propertyName, ReturnAddressPtr returnAddress)
</del><ins>+void DFG_OPERATION operationPutByIdStrictOptimizeWithReturnAddress(ExecState* exec, EncodedJSValue encodedValue, JSCell* base, StringImpl* uid, ReturnAddressPtr returnAddress)
</ins><span class="cx"> {
</span><span class="cx">     VM* vm = &amp;exec-&gt;vm();
</span><span class="cx">     NativeCallFrameTracer tracer(vm, exec);
</span><span class="cx">     
</span><ins>+    Identifier ident(vm, uid);
</ins><span class="cx">     StructureStubInfo&amp; stubInfo = exec-&gt;codeBlock()-&gt;getStubInfo(returnAddress);
</span><span class="cx">     AccessType accessType = static_cast&lt;AccessType&gt;(stubInfo.accessType);
</span><span class="cx"> 
</span><span class="lines">@@ -789,23 +800,24 @@
</span><span class="cx">     JSValue baseValue(base);
</span><span class="cx">     PutPropertySlot slot(true);
</span><span class="cx">     
</span><del>-    baseValue.put(exec, *propertyName, value, slot);
</del><ins>+    baseValue.put(exec, ident, value, slot);
</ins><span class="cx">     
</span><span class="cx">     if (accessType != static_cast&lt;AccessType&gt;(stubInfo.accessType))
</span><span class="cx">         return;
</span><span class="cx">     
</span><span class="cx">     if (stubInfo.seen)
</span><del>-        dfgRepatchPutByID(exec, baseValue, *propertyName, slot, stubInfo, NotDirect);
</del><ins>+        dfgRepatchPutByID(exec, baseValue, ident, slot, stubInfo, NotDirect);
</ins><span class="cx">     else
</span><span class="cx">         stubInfo.seen = true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> V_FUNCTION_WRAPPER_WITH_RETURN_ADDRESS_EJCI(operationPutByIdNonStrictOptimize);
</span><del>-void DFG_OPERATION operationPutByIdNonStrictOptimizeWithReturnAddress(ExecState* exec, EncodedJSValue encodedValue, JSCell* base, Identifier* propertyName, ReturnAddressPtr returnAddress)
</del><ins>+void DFG_OPERATION operationPutByIdNonStrictOptimizeWithReturnAddress(ExecState* exec, EncodedJSValue encodedValue, JSCell* base, StringImpl* uid, ReturnAddressPtr returnAddress)
</ins><span class="cx"> {
</span><span class="cx">     VM* vm = &amp;exec-&gt;vm();
</span><span class="cx">     NativeCallFrameTracer tracer(vm, exec);
</span><span class="cx">     
</span><ins>+    Identifier ident(vm, uid);
</ins><span class="cx">     StructureStubInfo&amp; stubInfo = exec-&gt;codeBlock()-&gt;getStubInfo(returnAddress);
</span><span class="cx">     AccessType accessType = static_cast&lt;AccessType&gt;(stubInfo.accessType);
</span><span class="cx"> 
</span><span class="lines">@@ -813,23 +825,24 @@
</span><span class="cx">     JSValue baseValue(base);
</span><span class="cx">     PutPropertySlot slot(false);
</span><span class="cx">     
</span><del>-    baseValue.put(exec, *propertyName, value, slot);
</del><ins>+    baseValue.put(exec, ident, value, slot);
</ins><span class="cx">     
</span><span class="cx">     if (accessType != static_cast&lt;AccessType&gt;(stubInfo.accessType))
</span><span class="cx">         return;
</span><span class="cx">     
</span><span class="cx">     if (stubInfo.seen)
</span><del>-        dfgRepatchPutByID(exec, baseValue, *propertyName, slot, stubInfo, NotDirect);
</del><ins>+        dfgRepatchPutByID(exec, baseValue, ident, slot, stubInfo, NotDirect);
</ins><span class="cx">     else
</span><span class="cx">         stubInfo.seen = true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> V_FUNCTION_WRAPPER_WITH_RETURN_ADDRESS_EJCI(operationPutByIdDirectStrictOptimize);
</span><del>-void DFG_OPERATION operationPutByIdDirectStrictOptimizeWithReturnAddress(ExecState* exec, EncodedJSValue encodedValue, JSCell* base, Identifier* propertyName, ReturnAddressPtr returnAddress)
</del><ins>+void DFG_OPERATION operationPutByIdDirectStrictOptimizeWithReturnAddress(ExecState* exec, EncodedJSValue encodedValue, JSCell* base, StringImpl* uid, ReturnAddressPtr returnAddress)
</ins><span class="cx"> {
</span><span class="cx">     VM* vm = &amp;exec-&gt;vm();
</span><span class="cx">     NativeCallFrameTracer tracer(vm, exec);
</span><span class="cx">     
</span><ins>+    Identifier ident(vm, uid);
</ins><span class="cx">     StructureStubInfo&amp; stubInfo = exec-&gt;codeBlock()-&gt;getStubInfo(returnAddress);
</span><span class="cx">     AccessType accessType = static_cast&lt;AccessType&gt;(stubInfo.accessType);
</span><span class="cx"> 
</span><span class="lines">@@ -837,23 +850,24 @@
</span><span class="cx">     PutPropertySlot slot(true);
</span><span class="cx">     
</span><span class="cx">     ASSERT(base-&gt;isObject());
</span><del>-    asObject(base)-&gt;putDirect(exec-&gt;vm(), *propertyName, value, slot);
</del><ins>+    asObject(base)-&gt;putDirect(exec-&gt;vm(), ident, value, slot);
</ins><span class="cx">     
</span><span class="cx">     if (accessType != static_cast&lt;AccessType&gt;(stubInfo.accessType))
</span><span class="cx">         return;
</span><span class="cx">     
</span><span class="cx">     if (stubInfo.seen)
</span><del>-        dfgRepatchPutByID(exec, base, *propertyName, slot, stubInfo, Direct);
</del><ins>+        dfgRepatchPutByID(exec, base, ident, slot, stubInfo, Direct);
</ins><span class="cx">     else
</span><span class="cx">         stubInfo.seen = true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> V_FUNCTION_WRAPPER_WITH_RETURN_ADDRESS_EJCI(operationPutByIdDirectNonStrictOptimize);
</span><del>-void DFG_OPERATION operationPutByIdDirectNonStrictOptimizeWithReturnAddress(ExecState* exec, EncodedJSValue encodedValue, JSCell* base, Identifier* propertyName, ReturnAddressPtr returnAddress)
</del><ins>+void DFG_OPERATION operationPutByIdDirectNonStrictOptimizeWithReturnAddress(ExecState* exec, EncodedJSValue encodedValue, JSCell* base, StringImpl* uid, ReturnAddressPtr returnAddress)
</ins><span class="cx"> {
</span><span class="cx">     VM* vm = &amp;exec-&gt;vm();
</span><span class="cx">     NativeCallFrameTracer tracer(vm, exec);
</span><span class="cx">     
</span><ins>+    Identifier ident(vm, uid);
</ins><span class="cx">     StructureStubInfo&amp; stubInfo = exec-&gt;codeBlock()-&gt;getStubInfo(returnAddress);
</span><span class="cx">     AccessType accessType = static_cast&lt;AccessType&gt;(stubInfo.accessType);
</span><span class="cx"> 
</span><span class="lines">@@ -861,23 +875,24 @@
</span><span class="cx">     PutPropertySlot slot(false);
</span><span class="cx">     
</span><span class="cx">     ASSERT(base-&gt;isObject());
</span><del>-    asObject(base)-&gt;putDirect(exec-&gt;vm(), *propertyName, value, slot);
</del><ins>+    asObject(base)-&gt;putDirect(exec-&gt;vm(), ident, value, slot);
</ins><span class="cx">     
</span><span class="cx">     if (accessType != static_cast&lt;AccessType&gt;(stubInfo.accessType))
</span><span class="cx">         return;
</span><span class="cx">     
</span><span class="cx">     if (stubInfo.seen)
</span><del>-        dfgRepatchPutByID(exec, base, *propertyName, slot, stubInfo, Direct);
</del><ins>+        dfgRepatchPutByID(exec, base, ident, slot, stubInfo, Direct);
</ins><span class="cx">     else
</span><span class="cx">         stubInfo.seen = true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> V_FUNCTION_WRAPPER_WITH_RETURN_ADDRESS_EJCI(operationPutByIdStrictBuildList);
</span><del>-void DFG_OPERATION operationPutByIdStrictBuildListWithReturnAddress(ExecState* exec, EncodedJSValue encodedValue, JSCell* base, Identifier* propertyName, ReturnAddressPtr returnAddress)
</del><ins>+void DFG_OPERATION operationPutByIdStrictBuildListWithReturnAddress(ExecState* exec, EncodedJSValue encodedValue, JSCell* base, StringImpl* uid, ReturnAddressPtr returnAddress)
</ins><span class="cx"> {
</span><span class="cx">     VM* vm = &amp;exec-&gt;vm();
</span><span class="cx">     NativeCallFrameTracer tracer(vm, exec);
</span><span class="cx">     
</span><ins>+    Identifier ident(vm, uid);
</ins><span class="cx">     StructureStubInfo&amp; stubInfo = exec-&gt;codeBlock()-&gt;getStubInfo(returnAddress);
</span><span class="cx">     AccessType accessType = static_cast&lt;AccessType&gt;(stubInfo.accessType);
</span><span class="cx"> 
</span><span class="lines">@@ -885,20 +900,21 @@
</span><span class="cx">     JSValue baseValue(base);
</span><span class="cx">     PutPropertySlot slot(true);
</span><span class="cx">     
</span><del>-    baseValue.put(exec, *propertyName, value, slot);
</del><ins>+    baseValue.put(exec, ident, value, slot);
</ins><span class="cx">     
</span><span class="cx">     if (accessType != static_cast&lt;AccessType&gt;(stubInfo.accessType))
</span><span class="cx">         return;
</span><span class="cx">     
</span><del>-    dfgBuildPutByIdList(exec, baseValue, *propertyName, slot, stubInfo, NotDirect);
</del><ins>+    dfgBuildPutByIdList(exec, baseValue, ident, slot, stubInfo, NotDirect);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> V_FUNCTION_WRAPPER_WITH_RETURN_ADDRESS_EJCI(operationPutByIdNonStrictBuildList);
</span><del>-void DFG_OPERATION operationPutByIdNonStrictBuildListWithReturnAddress(ExecState* exec, EncodedJSValue encodedValue, JSCell* base, Identifier* propertyName, ReturnAddressPtr returnAddress)
</del><ins>+void DFG_OPERATION operationPutByIdNonStrictBuildListWithReturnAddress(ExecState* exec, EncodedJSValue encodedValue, JSCell* base, StringImpl* uid, ReturnAddressPtr returnAddress)
</ins><span class="cx"> {
</span><span class="cx">     VM* vm = &amp;exec-&gt;vm();
</span><span class="cx">     NativeCallFrameTracer tracer(vm, exec);
</span><span class="cx">     
</span><ins>+    Identifier ident(vm, uid);
</ins><span class="cx">     StructureStubInfo&amp; stubInfo = exec-&gt;codeBlock()-&gt;getStubInfo(returnAddress);
</span><span class="cx">     AccessType accessType = static_cast&lt;AccessType&gt;(stubInfo.accessType);
</span><span class="cx"> 
</span><span class="lines">@@ -906,20 +922,21 @@
</span><span class="cx">     JSValue baseValue(base);
</span><span class="cx">     PutPropertySlot slot(false);
</span><span class="cx">     
</span><del>-    baseValue.put(exec, *propertyName, value, slot);
</del><ins>+    baseValue.put(exec, ident, value, slot);
</ins><span class="cx">     
</span><span class="cx">     if (accessType != static_cast&lt;AccessType&gt;(stubInfo.accessType))
</span><span class="cx">         return;
</span><span class="cx">     
</span><del>-    dfgBuildPutByIdList(exec, baseValue, *propertyName, slot, stubInfo, NotDirect);
</del><ins>+    dfgBuildPutByIdList(exec, baseValue, ident, slot, stubInfo, NotDirect);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> V_FUNCTION_WRAPPER_WITH_RETURN_ADDRESS_EJCI(operationPutByIdDirectStrictBuildList);
</span><del>-void DFG_OPERATION operationPutByIdDirectStrictBuildListWithReturnAddress(ExecState* exec, EncodedJSValue encodedValue, JSCell* base, Identifier* propertyName, ReturnAddressPtr returnAddress)
</del><ins>+void DFG_OPERATION operationPutByIdDirectStrictBuildListWithReturnAddress(ExecState* exec, EncodedJSValue encodedValue, JSCell* base, StringImpl* uid, ReturnAddressPtr returnAddress)
</ins><span class="cx"> {
</span><span class="cx">     VM* vm = &amp;exec-&gt;vm();
</span><span class="cx">     NativeCallFrameTracer tracer(vm, exec);
</span><span class="cx">     
</span><ins>+    Identifier ident(vm, uid);
</ins><span class="cx">     StructureStubInfo&amp; stubInfo = exec-&gt;codeBlock()-&gt;getStubInfo(returnAddress);
</span><span class="cx">     AccessType accessType = static_cast&lt;AccessType&gt;(stubInfo.accessType);
</span><span class="cx">     
</span><span class="lines">@@ -927,20 +944,21 @@
</span><span class="cx">     PutPropertySlot slot(true);
</span><span class="cx">     
</span><span class="cx">     ASSERT(base-&gt;isObject());
</span><del>-    asObject(base)-&gt;putDirect(exec-&gt;vm(), *propertyName, value, slot);
</del><ins>+    asObject(base)-&gt;putDirect(exec-&gt;vm(), ident, value, slot);
</ins><span class="cx">     
</span><span class="cx">     if (accessType != static_cast&lt;AccessType&gt;(stubInfo.accessType))
</span><span class="cx">         return;
</span><span class="cx">     
</span><del>-    dfgBuildPutByIdList(exec, base, *propertyName, slot, stubInfo, Direct);
</del><ins>+    dfgBuildPutByIdList(exec, base, ident, slot, stubInfo, Direct);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> V_FUNCTION_WRAPPER_WITH_RETURN_ADDRESS_EJCI(operationPutByIdDirectNonStrictBuildList);
</span><del>-void DFG_OPERATION operationPutByIdDirectNonStrictBuildListWithReturnAddress(ExecState* exec, EncodedJSValue encodedValue, JSCell* base, Identifier* propertyName, ReturnAddressPtr returnAddress)
</del><ins>+void DFG_OPERATION operationPutByIdDirectNonStrictBuildListWithReturnAddress(ExecState* exec, EncodedJSValue encodedValue, JSCell* base, StringImpl* uid, ReturnAddressPtr returnAddress)
</ins><span class="cx"> {
</span><span class="cx">     VM* vm = &amp;exec-&gt;vm();
</span><span class="cx">     NativeCallFrameTracer tracer(vm, exec);
</span><span class="cx">     
</span><ins>+    Identifier ident(vm, uid);
</ins><span class="cx">     StructureStubInfo&amp; stubInfo = exec-&gt;codeBlock()-&gt;getStubInfo(returnAddress);
</span><span class="cx">     AccessType accessType = static_cast&lt;AccessType&gt;(stubInfo.accessType);
</span><span class="cx"> 
</span><span class="lines">@@ -948,12 +966,12 @@
</span><span class="cx">     PutPropertySlot slot(false);
</span><span class="cx">     
</span><span class="cx">     ASSERT(base-&gt;isObject());
</span><del>-    asObject(base)-&gt;putDirect(exec-&gt;vm(), *propertyName, value, slot);
</del><ins>+    asObject(base)-&gt;putDirect(exec-&gt;vm(), ident, value, slot);
</ins><span class="cx">     
</span><span class="cx">     if (accessType != static_cast&lt;AccessType&gt;(stubInfo.accessType))
</span><span class="cx">         return;
</span><span class="cx">     
</span><del>-    dfgBuildPutByIdList(exec, base, *propertyName, slot, stubInfo, Direct);
</del><ins>+    dfgBuildPutByIdList(exec, base, ident, slot, stubInfo, Direct);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> size_t DFG_OPERATION operationCompareLess(ExecState* exec, EncodedJSValue encodedOp1, EncodedJSValue encodedOp2)
</span><span class="lines">@@ -1229,30 +1247,31 @@
</span><span class="cx">     watchpointSet-&gt;notifyWrite();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-EncodedJSValue DFG_OPERATION operationResolve(ExecState* exec, Identifier* propertyName, ResolveOperations* operations)
</del><ins>+EncodedJSValue DFG_OPERATION operationResolve(ExecState* exec, StringImpl* uid, ResolveOperations* operations)
</ins><span class="cx"> {
</span><span class="cx">     VM* vm = &amp;exec-&gt;vm();
</span><span class="cx">     NativeCallFrameTracer tracer(vm, exec);
</span><del>-    return JSValue::encode(JSScope::resolve(exec, *propertyName, operations));
</del><ins>+    Identifier ident(vm, uid);
+    return JSValue::encode(JSScope::resolve(exec, ident, operations));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-EncodedJSValue DFG_OPERATION operationResolveBase(ExecState* exec, Identifier* propertyName, ResolveOperations* operations, PutToBaseOperation* putToBaseOperations)
</del><ins>+EncodedJSValue DFG_OPERATION operationResolveBase(ExecState* exec, StringImpl* uid, ResolveOperations* operations, PutToBaseOperation* putToBaseOperations)
</ins><span class="cx"> {
</span><span class="cx">     VM* vm = &amp;exec-&gt;vm();
</span><span class="cx">     NativeCallFrameTracer tracer(vm, exec);
</span><del>-    
-    return JSValue::encode(JSScope::resolveBase(exec, *propertyName, false, operations, putToBaseOperations));
</del><ins>+    Identifier ident(vm, uid);
+    return JSValue::encode(JSScope::resolveBase(exec, ident, false, operations, putToBaseOperations));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-EncodedJSValue DFG_OPERATION operationResolveBaseStrictPut(ExecState* exec, Identifier* propertyName, ResolveOperations* operations, PutToBaseOperation* putToBaseOperations)
</del><ins>+EncodedJSValue DFG_OPERATION operationResolveBaseStrictPut(ExecState* exec, StringImpl* uid, ResolveOperations* operations, PutToBaseOperation* putToBaseOperations)
</ins><span class="cx"> {
</span><span class="cx">     VM* vm = &amp;exec-&gt;vm();
</span><span class="cx">     NativeCallFrameTracer tracer(vm, exec);
</span><del>-    
-    return JSValue::encode(JSScope::resolveBase(exec, *propertyName, true, operations, putToBaseOperations));
</del><ins>+    Identifier ident(vm, uid);
+    return JSValue::encode(JSScope::resolveBase(exec, ident, true, operations, putToBaseOperations));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-EncodedJSValue DFG_OPERATION operationResolveGlobal(ExecState* exec, ResolveOperation* resolveOperation, JSGlobalObject* globalObject, Identifier* propertyName)
</del><ins>+EncodedJSValue DFG_OPERATION operationResolveGlobal(ExecState* exec, ResolveOperation* resolveOperation, JSGlobalObject* globalObject, StringImpl* uid)
</ins><span class="cx"> {
</span><span class="cx">     VM* vm = &amp;exec-&gt;vm();
</span><span class="cx">     NativeCallFrameTracer tracer(vm, exec);
</span><span class="lines">@@ -1260,7 +1279,8 @@
</span><span class="cx">     UNUSED_PARAM(resolveOperation);
</span><span class="cx">     UNUSED_PARAM(globalObject);
</span><span class="cx">     ASSERT(resolveOperation-&gt;m_operation == ResolveOperation::GetAndReturnGlobalProperty);
</span><del>-    return JSValue::encode(JSScope::resolveGlobal(exec, *propertyName, globalObject, resolveOperation));
</del><ins>+    Identifier ident(vm, uid);
+    return JSValue::encode(JSScope::resolveGlobal(exec, ident, globalObject, resolveOperation));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> EncodedJSValue DFG_OPERATION operationToPrimitive(ExecState* exec, EncodedJSValue value)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGOperationsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGOperations.h (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGOperations.h        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/JavaScriptCore/dfg/DFGOperations.h        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -55,7 +55,7 @@
</span><span class="cx">     S: size_t
</span><span class="cx">     Z: int32_t
</span><span class="cx">     D: double
</span><del>-    I: Identifier*
</del><ins>+    I: StringImpl*
</ins><span class="cx">     G: GlobalResolveInfo*
</span><span class="cx"> */
</span><span class="cx"> typedef EncodedJSValue DFG_OPERATION (*J_DFGOperation_E)(ExecState*);
</span><span class="lines">@@ -63,16 +63,16 @@
</span><span class="cx"> typedef EncodedJSValue DFG_OPERATION (*J_DFGOperation_EAZ)(ExecState*, JSArray*, int32_t);
</span><span class="cx"> typedef EncodedJSValue DFG_OPERATION (*J_DFGOperation_EC)(ExecState*, JSCell*);
</span><span class="cx"> typedef EncodedJSValue DFG_OPERATION (*J_DFGOperation_ECC)(ExecState*, JSCell*, JSCell*);
</span><del>-typedef EncodedJSValue DFG_OPERATION (*J_DFGOperation_ECI)(ExecState*, JSCell*, Identifier*);
</del><ins>+typedef EncodedJSValue DFG_OPERATION (*J_DFGOperation_ECI)(ExecState*, JSCell*, StringImpl*);
</ins><span class="cx"> typedef EncodedJSValue DFG_OPERATION (*J_DFGOperation_ECJ)(ExecState*, JSCell*, EncodedJSValue);
</span><span class="cx"> typedef EncodedJSValue DFG_OPERATION (*J_DFGOperation_EDA)(ExecState*, double, JSArray*);
</span><del>-typedef EncodedJSValue DFG_OPERATION (*J_DFGOperation_EGriJsgI)(ExecState*, ResolveOperation*, JSGlobalObject*, Identifier*);
-typedef EncodedJSValue DFG_OPERATION (*J_DFGOperation_EI)(ExecState*, Identifier*);
-typedef EncodedJSValue DFG_OPERATION (*J_DFGOperation_EIRo)(ExecState*, Identifier*, ResolveOperations*);
-typedef EncodedJSValue DFG_OPERATION (*J_DFGOperation_EIRoPtbo)(ExecState*, Identifier*, ResolveOperations*, PutToBaseOperation*);
</del><ins>+typedef EncodedJSValue DFG_OPERATION (*J_DFGOperation_EGriJsgI)(ExecState*, ResolveOperation*, JSGlobalObject*, StringImpl*);
+typedef EncodedJSValue DFG_OPERATION (*J_DFGOperation_EI)(ExecState*, StringImpl*);
+typedef EncodedJSValue DFG_OPERATION (*J_DFGOperation_EIRo)(ExecState*, StringImpl*, ResolveOperations*);
+typedef EncodedJSValue DFG_OPERATION (*J_DFGOperation_EIRoPtbo)(ExecState*, StringImpl*, ResolveOperations*, PutToBaseOperation*);
</ins><span class="cx"> typedef EncodedJSValue DFG_OPERATION (*J_DFGOperation_EJ)(ExecState*, EncodedJSValue);
</span><span class="cx"> typedef EncodedJSValue DFG_OPERATION (*J_DFGOperation_EJA)(ExecState*, EncodedJSValue, JSArray*);
</span><del>-typedef EncodedJSValue DFG_OPERATION (*J_DFGOperation_EJI)(ExecState*, EncodedJSValue, Identifier*);
</del><ins>+typedef EncodedJSValue DFG_OPERATION (*J_DFGOperation_EJI)(ExecState*, EncodedJSValue, StringImpl*);
</ins><span class="cx"> typedef EncodedJSValue DFG_OPERATION (*J_DFGOperation_EJJ)(ExecState*, EncodedJSValue, EncodedJSValue);
</span><span class="cx"> typedef EncodedJSValue DFG_OPERATION (*J_DFGOperation_EJP)(ExecState*, EncodedJSValue, void*);
</span><span class="cx"> typedef EncodedJSValue DFG_OPERATION (*J_DFGOperation_EP)(ExecState*, void*);
</span><span class="lines">@@ -110,7 +110,7 @@
</span><span class="cx"> typedef void DFG_OPERATION (*V_DFGOperation_ECJJ)(ExecState*, JSCell*, EncodedJSValue, EncodedJSValue);
</span><span class="cx"> typedef void DFG_OPERATION (*V_DFGOperation_ECZ)(ExecState*, JSCell*, int32_t);
</span><span class="cx"> typedef void DFG_OPERATION (*V_DFGOperation_ECC)(ExecState*, JSCell*, JSCell*);
</span><del>-typedef void DFG_OPERATION (*V_DFGOperation_EJCI)(ExecState*, EncodedJSValue, JSCell*, Identifier*);
</del><ins>+typedef void DFG_OPERATION (*V_DFGOperation_EJCI)(ExecState*, EncodedJSValue, JSCell*, StringImpl*);
</ins><span class="cx"> typedef void DFG_OPERATION (*V_DFGOperation_EJJJ)(ExecState*, EncodedJSValue, EncodedJSValue, EncodedJSValue);
</span><span class="cx"> typedef void DFG_OPERATION (*V_DFGOperation_EJPP)(ExecState*, EncodedJSValue, EncodedJSValue, void*);
</span><span class="cx"> typedef void DFG_OPERATION (*V_DFGOperation_EPZJ)(ExecState*, void*, int32_t, EncodedJSValue);
</span><span class="lines">@@ -138,17 +138,17 @@
</span><span class="cx"> EncodedJSValue DFG_OPERATION operationGetByVal(ExecState*, EncodedJSValue encodedBase, EncodedJSValue encodedProperty) WTF_INTERNAL;
</span><span class="cx"> EncodedJSValue DFG_OPERATION operationGetByValCell(ExecState*, JSCell*, EncodedJSValue encodedProperty) WTF_INTERNAL;
</span><span class="cx"> EncodedJSValue DFG_OPERATION operationGetByValArrayInt(ExecState*, JSArray*, int32_t) WTF_INTERNAL;
</span><del>-EncodedJSValue DFG_OPERATION operationGetById(ExecState*, EncodedJSValue, Identifier*) WTF_INTERNAL;
-EncodedJSValue DFG_OPERATION operationGetByIdBuildList(ExecState*, EncodedJSValue, Identifier*) WTF_INTERNAL;
-EncodedJSValue DFG_OPERATION operationGetByIdProtoBuildList(ExecState*, EncodedJSValue, Identifier*) WTF_INTERNAL;
-EncodedJSValue DFG_OPERATION operationGetByIdOptimize(ExecState*, EncodedJSValue, Identifier*) WTF_INTERNAL;
-EncodedJSValue DFG_OPERATION operationCallCustomGetter(ExecState*, JSCell*, PropertySlot::GetValueFunc, Identifier*) WTF_INTERNAL;
</del><ins>+EncodedJSValue DFG_OPERATION operationGetById(ExecState*, EncodedJSValue, StringImpl*) WTF_INTERNAL;
+EncodedJSValue DFG_OPERATION operationGetByIdBuildList(ExecState*, EncodedJSValue, StringImpl*) WTF_INTERNAL;
+EncodedJSValue DFG_OPERATION operationGetByIdProtoBuildList(ExecState*, EncodedJSValue, StringImpl*) WTF_INTERNAL;
+EncodedJSValue DFG_OPERATION operationGetByIdOptimize(ExecState*, EncodedJSValue, StringImpl*) WTF_INTERNAL;
+EncodedJSValue DFG_OPERATION operationCallCustomGetter(ExecState*, JSCell*, PropertySlot::GetValueFunc, StringImpl*) WTF_INTERNAL;
</ins><span class="cx"> EncodedJSValue DFG_OPERATION operationCallGetter(ExecState*, JSCell*, JSCell*) WTF_INTERNAL;
</span><span class="cx"> void DFG_OPERATION operationNotifyGlobalVarWrite(WatchpointSet* watchpointSet) WTF_INTERNAL;
</span><del>-EncodedJSValue DFG_OPERATION operationResolve(ExecState*, Identifier*, ResolveOperations*) WTF_INTERNAL;
-EncodedJSValue DFG_OPERATION operationResolveBase(ExecState*, Identifier*, ResolveOperations*, PutToBaseOperation*) WTF_INTERNAL;
-EncodedJSValue DFG_OPERATION operationResolveBaseStrictPut(ExecState*, Identifier*, ResolveOperations*, PutToBaseOperation*) WTF_INTERNAL;
-EncodedJSValue DFG_OPERATION operationResolveGlobal(ExecState*, ResolveOperation*, JSGlobalObject*, Identifier*) WTF_INTERNAL;
</del><ins>+EncodedJSValue DFG_OPERATION operationResolve(ExecState*, StringImpl*, ResolveOperations*) WTF_INTERNAL;
+EncodedJSValue DFG_OPERATION operationResolveBase(ExecState*, StringImpl*, ResolveOperations*, PutToBaseOperation*) WTF_INTERNAL;
+EncodedJSValue DFG_OPERATION operationResolveBaseStrictPut(ExecState*, StringImpl*, ResolveOperations*, PutToBaseOperation*) WTF_INTERNAL;
+EncodedJSValue DFG_OPERATION operationResolveGlobal(ExecState*, ResolveOperation*, JSGlobalObject*, StringImpl*) WTF_INTERNAL;
</ins><span class="cx"> EncodedJSValue DFG_OPERATION operationToPrimitive(ExecState*, EncodedJSValue) WTF_INTERNAL;
</span><span class="cx"> char* DFG_OPERATION operationNewArray(ExecState*, Structure*, void*, size_t) WTF_INTERNAL;
</span><span class="cx"> char* DFG_OPERATION operationNewArrayBuffer(ExecState*, Structure*, size_t, size_t) WTF_INTERNAL;
</span><span class="lines">@@ -168,18 +168,18 @@
</span><span class="cx"> EncodedJSValue DFG_OPERATION operationArrayPop(ExecState*, JSArray*) WTF_INTERNAL;
</span><span class="cx"> EncodedJSValue DFG_OPERATION operationArrayPopAndRecoverLength(ExecState*, JSArray*) WTF_INTERNAL;
</span><span class="cx"> EncodedJSValue DFG_OPERATION operationRegExpExec(ExecState*, JSCell*, JSCell*) WTF_INTERNAL;
</span><del>-void DFG_OPERATION operationPutByIdStrict(ExecState*, EncodedJSValue encodedValue, JSCell* base, Identifier*) WTF_INTERNAL;
-void DFG_OPERATION operationPutByIdNonStrict(ExecState*, EncodedJSValue encodedValue, JSCell* base, Identifier*) WTF_INTERNAL;
-void DFG_OPERATION operationPutByIdDirectStrict(ExecState*, EncodedJSValue encodedValue, JSCell* base, Identifier*) WTF_INTERNAL;
-void DFG_OPERATION operationPutByIdDirectNonStrict(ExecState*, EncodedJSValue encodedValue, JSCell* base, Identifier*) WTF_INTERNAL;
-void DFG_OPERATION operationPutByIdStrictOptimize(ExecState*, EncodedJSValue encodedValue, JSCell* base, Identifier*) WTF_INTERNAL;
-void DFG_OPERATION operationPutByIdNonStrictOptimize(ExecState*, EncodedJSValue encodedValue, JSCell* base, Identifier*) WTF_INTERNAL;
-void DFG_OPERATION operationPutByIdDirectStrictOptimize(ExecState*, EncodedJSValue encodedValue, JSCell* base, Identifier*) WTF_INTERNAL;
-void DFG_OPERATION operationPutByIdDirectNonStrictOptimize(ExecState*, EncodedJSValue encodedValue, JSCell* base, Identifier*) WTF_INTERNAL;
-void DFG_OPERATION operationPutByIdStrictBuildList(ExecState*, EncodedJSValue encodedValue, JSCell* base, Identifier*) WTF_INTERNAL;
-void DFG_OPERATION operationPutByIdNonStrictBuildList(ExecState*, EncodedJSValue encodedValue, JSCell* base, Identifier*) WTF_INTERNAL;
-void DFG_OPERATION operationPutByIdDirectStrictBuildList(ExecState*, EncodedJSValue encodedValue, JSCell* base, Identifier*) WTF_INTERNAL;
-void DFG_OPERATION operationPutByIdDirectNonStrictBuildList(ExecState*, EncodedJSValue encodedValue, JSCell* base, Identifier*) WTF_INTERNAL;
</del><ins>+void DFG_OPERATION operationPutByIdStrict(ExecState*, EncodedJSValue encodedValue, JSCell* base, StringImpl*) WTF_INTERNAL;
+void DFG_OPERATION operationPutByIdNonStrict(ExecState*, EncodedJSValue encodedValue, JSCell* base, StringImpl*) WTF_INTERNAL;
+void DFG_OPERATION operationPutByIdDirectStrict(ExecState*, EncodedJSValue encodedValue, JSCell* base, StringImpl*) WTF_INTERNAL;
+void DFG_OPERATION operationPutByIdDirectNonStrict(ExecState*, EncodedJSValue encodedValue, JSCell* base, StringImpl*) WTF_INTERNAL;
+void DFG_OPERATION operationPutByIdStrictOptimize(ExecState*, EncodedJSValue encodedValue, JSCell* base, StringImpl*) WTF_INTERNAL;
+void DFG_OPERATION operationPutByIdNonStrictOptimize(ExecState*, EncodedJSValue encodedValue, JSCell* base, StringImpl*) WTF_INTERNAL;
+void DFG_OPERATION operationPutByIdDirectStrictOptimize(ExecState*, EncodedJSValue encodedValue, JSCell* base, StringImpl*) WTF_INTERNAL;
+void DFG_OPERATION operationPutByIdDirectNonStrictOptimize(ExecState*, EncodedJSValue encodedValue, JSCell* base, StringImpl*) WTF_INTERNAL;
+void DFG_OPERATION operationPutByIdStrictBuildList(ExecState*, EncodedJSValue encodedValue, JSCell* base, StringImpl*) WTF_INTERNAL;
+void DFG_OPERATION operationPutByIdNonStrictBuildList(ExecState*, EncodedJSValue encodedValue, JSCell* base, StringImpl*) WTF_INTERNAL;
+void DFG_OPERATION operationPutByIdDirectStrictBuildList(ExecState*, EncodedJSValue encodedValue, JSCell* base, StringImpl*) WTF_INTERNAL;
+void DFG_OPERATION operationPutByIdDirectNonStrictBuildList(ExecState*, EncodedJSValue encodedValue, JSCell* base, StringImpl*) WTF_INTERNAL;
</ins><span class="cx"> // These comparisons return a boolean within a size_t such that the value is zero extended to fill the register.
</span><span class="cx"> size_t DFG_OPERATION operationRegExpTest(ExecState*, JSCell*, JSCell*) WTF_INTERNAL;
</span><span class="cx"> size_t DFG_OPERATION operationCompareLess(ExecState*, EncodedJSValue encodedOp1, EncodedJSValue encodedOp2) WTF_INTERNAL;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGRepatchcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGRepatch.cpp (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGRepatch.cpp        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/JavaScriptCore/dfg/DFGRepatch.cpp        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -458,7 +458,7 @@
</span><span class="cx">                 stubJit.setupArgumentsWithExecState(
</span><span class="cx">                     baseGPR,
</span><span class="cx">                     MacroAssembler::TrustedImmPtr(FunctionPtr(slot.customGetter()).executableAddress()),
</span><del>-                    MacroAssembler::TrustedImmPtr(const_cast&lt;Identifier*&gt;(&amp;ident)));
</del><ins>+                    MacroAssembler::TrustedImmPtr(ident.impl()));
</ins><span class="cx">                 operationFunction = operationCallCustomGetter;
</span><span class="cx">             }
</span><span class="cx">             
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGSpeculativeJITh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -580,9 +580,9 @@
</span><span class="cx">         return valueOfJSConstant(node).isNull();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    Identifier* identifier(unsigned index)
</del><ins>+    StringImpl* identifierUID(unsigned index)
</ins><span class="cx">     {
</span><del>-        return &amp;m_jit.codeBlock()-&gt;identifier(index);
</del><ins>+        return m_jit.graph().m_identifiers[index];
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Spill all VirtualRegisters back to the JSStack.
</span><span class="lines">@@ -1129,24 +1129,24 @@
</span><span class="cx">         m_jit.zeroExtend32ToPtr(GPRInfo::returnValueGPR, result);
</span><span class="cx">         return call;
</span><span class="cx">     }
</span><del>-    JITCompiler::Call callOperation(J_DFGOperation_EGriJsgI operation, GPRReg result, GPRReg arg1, GPRReg arg2, Identifier* identifier)
</del><ins>+    JITCompiler::Call callOperation(J_DFGOperation_EGriJsgI operation, GPRReg result, GPRReg arg1, GPRReg arg2, StringImpl* uid)
</ins><span class="cx">     {
</span><del>-        m_jit.setupArgumentsWithExecState(arg1, arg2, TrustedImmPtr(identifier));
</del><ins>+        m_jit.setupArgumentsWithExecState(arg1, arg2, TrustedImmPtr(uid));
</ins><span class="cx">         return appendCallWithExceptionCheckSetResult(operation, result);
</span><span class="cx">     }
</span><del>-    JITCompiler::Call callOperation(J_DFGOperation_EI operation, GPRReg result, Identifier* identifier)
</del><ins>+    JITCompiler::Call callOperation(J_DFGOperation_EI operation, GPRReg result, StringImpl* uid)
</ins><span class="cx">     {
</span><del>-        m_jit.setupArgumentsWithExecState(TrustedImmPtr(identifier));
</del><ins>+        m_jit.setupArgumentsWithExecState(TrustedImmPtr(uid));
</ins><span class="cx">         return appendCallWithExceptionCheckSetResult(operation, result);
</span><span class="cx">     }
</span><del>-    JITCompiler::Call callOperation(J_DFGOperation_EIRo operation, GPRReg result, Identifier* identifier, ResolveOperations* operations)
</del><ins>+    JITCompiler::Call callOperation(J_DFGOperation_EIRo operation, GPRReg result, StringImpl* uid, ResolveOperations* operations)
</ins><span class="cx">     {
</span><del>-        m_jit.setupArgumentsWithExecState(TrustedImmPtr(identifier), TrustedImmPtr(operations));
</del><ins>+        m_jit.setupArgumentsWithExecState(TrustedImmPtr(uid), TrustedImmPtr(operations));
</ins><span class="cx">         return appendCallWithExceptionCheckSetResult(operation, result);
</span><span class="cx">     }
</span><del>-    JITCompiler::Call callOperation(J_DFGOperation_EIRoPtbo operation, GPRReg result, Identifier* identifier, ResolveOperations* operations, PutToBaseOperation* putToBaseOperations)
</del><ins>+    JITCompiler::Call callOperation(J_DFGOperation_EIRoPtbo operation, GPRReg result, StringImpl* uid, ResolveOperations* operations, PutToBaseOperation* putToBaseOperations)
</ins><span class="cx">     {
</span><del>-        m_jit.setupArgumentsWithExecState(TrustedImmPtr(identifier), TrustedImmPtr(operations), TrustedImmPtr(putToBaseOperations));
</del><ins>+        m_jit.setupArgumentsWithExecState(TrustedImmPtr(uid), TrustedImmPtr(operations), TrustedImmPtr(putToBaseOperations));
</ins><span class="cx">         return appendCallWithExceptionCheckSetResult(operation, result);
</span><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_DFGOperation_EA operation, GPRReg result, GPRReg arg1)
</span><span class="lines">@@ -1179,14 +1179,14 @@
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(cell));
</span><span class="cx">         return appendCallWithExceptionCheckSetResult(operation, result);
</span><span class="cx">     }
</span><del>-    JITCompiler::Call callOperation(J_DFGOperation_ECI operation, GPRReg result, GPRReg arg1, Identifier* identifier)
</del><ins>+    JITCompiler::Call callOperation(J_DFGOperation_ECI operation, GPRReg result, GPRReg arg1, StringImpl* uid)
</ins><span class="cx">     {
</span><del>-        m_jit.setupArgumentsWithExecState(arg1, TrustedImmPtr(identifier));
</del><ins>+        m_jit.setupArgumentsWithExecState(arg1, TrustedImmPtr(uid));
</ins><span class="cx">         return appendCallWithExceptionCheckSetResult(operation, result);
</span><span class="cx">     }
</span><del>-    JITCompiler::Call callOperation(J_DFGOperation_EJI operation, GPRReg result, GPRReg arg1, Identifier* identifier)
</del><ins>+    JITCompiler::Call callOperation(J_DFGOperation_EJI operation, GPRReg result, GPRReg arg1, StringImpl* uid)
</ins><span class="cx">     {
</span><del>-        m_jit.setupArgumentsWithExecState(arg1, TrustedImmPtr(identifier));
</del><ins>+        m_jit.setupArgumentsWithExecState(arg1, TrustedImmPtr(uid));
</ins><span class="cx">         return appendCallWithExceptionCheckSetResult(operation, result);
</span><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_DFGOperation_EDA operation, GPRReg result, FPRReg arg1, GPRReg arg2)
</span><span class="lines">@@ -1288,9 +1288,9 @@
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2, TrustedImmPtr(pointer));
</span><span class="cx">         return appendCallWithExceptionCheck(operation);
</span><span class="cx">     }
</span><del>-    JITCompiler::Call callOperation(V_DFGOperation_EJCI operation, GPRReg arg1, GPRReg arg2, Identifier* identifier)
</del><ins>+    JITCompiler::Call callOperation(V_DFGOperation_EJCI operation, GPRReg arg1, GPRReg arg2, StringImpl* uid)
</ins><span class="cx">     {
</span><del>-        m_jit.setupArgumentsWithExecState(arg1, arg2, TrustedImmPtr(identifier));
</del><ins>+        m_jit.setupArgumentsWithExecState(arg1, arg2, TrustedImmPtr(uid));
</ins><span class="cx">         return appendCallWithExceptionCheck(operation);
</span><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(V_DFGOperation_EJJJ operation, GPRReg arg1, GPRReg arg2, GPRReg arg3)
</span><span class="lines">@@ -1354,9 +1354,9 @@
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, TrustedImmPtr(pointer));
</span><span class="cx">         return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</span><span class="cx">     }
</span><del>-    JITCompiler::Call callOperation(J_DFGOperation_EGriJsgI operation, GPRReg resultTag, GPRReg resultPayload, GPRReg arg1, GPRReg arg2, Identifier* identifier)
</del><ins>+    JITCompiler::Call callOperation(J_DFGOperation_EGriJsgI operation, GPRReg resultTag, GPRReg resultPayload, GPRReg arg1, GPRReg arg2, StringImpl* uid)
</ins><span class="cx">     {
</span><del>-        m_jit.setupArgumentsWithExecState(arg1, arg2, TrustedImmPtr(identifier));
</del><ins>+        m_jit.setupArgumentsWithExecState(arg1, arg2, TrustedImmPtr(uid));
</ins><span class="cx">         return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</span><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_DFGOperation_EP operation, GPRReg resultTag, GPRReg resultPayload, GPRReg arg1)
</span><span class="lines">@@ -1364,9 +1364,9 @@
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1);
</span><span class="cx">         return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</span><span class="cx">     }
</span><del>-    JITCompiler::Call callOperation(J_DFGOperation_EI operation, GPRReg resultTag, GPRReg resultPayload, Identifier* identifier)
</del><ins>+    JITCompiler::Call callOperation(J_DFGOperation_EI operation, GPRReg resultTag, GPRReg resultPayload, StringImpl* uid)
</ins><span class="cx">     {
</span><del>-        m_jit.setupArgumentsWithExecState(TrustedImmPtr(identifier));
</del><ins>+        m_jit.setupArgumentsWithExecState(TrustedImmPtr(uid));
</ins><span class="cx">         return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</span><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_DFGOperation_EA operation, GPRReg resultTag, GPRReg resultPayload, GPRReg arg1)
</span><span class="lines">@@ -1405,19 +1405,19 @@
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(cell));
</span><span class="cx">         return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</span><span class="cx">     }
</span><del>-    JITCompiler::Call callOperation(J_DFGOperation_ECI operation, GPRReg resultTag, GPRReg resultPayload, GPRReg arg1, Identifier* identifier)
</del><ins>+    JITCompiler::Call callOperation(J_DFGOperation_ECI operation, GPRReg resultTag, GPRReg resultPayload, GPRReg arg1, StringImpl* uid)
</ins><span class="cx">     {
</span><del>-        m_jit.setupArgumentsWithExecState(arg1, TrustedImmPtr(identifier));
</del><ins>+        m_jit.setupArgumentsWithExecState(arg1, TrustedImmPtr(uid));
</ins><span class="cx">         return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</span><span class="cx">     }
</span><del>-    JITCompiler::Call callOperation(J_DFGOperation_EJI operation, GPRReg resultTag, GPRReg resultPayload, GPRReg arg1Tag, GPRReg arg1Payload, Identifier* identifier)
</del><ins>+    JITCompiler::Call callOperation(J_DFGOperation_EJI operation, GPRReg resultTag, GPRReg resultPayload, GPRReg arg1Tag, GPRReg arg1Payload, StringImpl* uid)
</ins><span class="cx">     {
</span><del>-        m_jit.setupArgumentsWithExecState(EABI_32BIT_DUMMY_ARG arg1Payload, arg1Tag, TrustedImmPtr(identifier));
</del><ins>+        m_jit.setupArgumentsWithExecState(EABI_32BIT_DUMMY_ARG arg1Payload, arg1Tag, TrustedImmPtr(uid));
</ins><span class="cx">         return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</span><span class="cx">     }
</span><del>-    JITCompiler::Call callOperation(J_DFGOperation_EJI operation, GPRReg resultTag, GPRReg resultPayload, int32_t arg1Tag, GPRReg arg1Payload, Identifier* identifier)
</del><ins>+    JITCompiler::Call callOperation(J_DFGOperation_EJI operation, GPRReg resultTag, GPRReg resultPayload, int32_t arg1Tag, GPRReg arg1Payload, StringImpl* uid)
</ins><span class="cx">     {
</span><del>-        m_jit.setupArgumentsWithExecState(EABI_32BIT_DUMMY_ARG arg1Payload, TrustedImm32(arg1Tag), TrustedImmPtr(identifier));
</del><ins>+        m_jit.setupArgumentsWithExecState(EABI_32BIT_DUMMY_ARG arg1Payload, TrustedImm32(arg1Tag), TrustedImmPtr(uid));
</ins><span class="cx">         return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</span><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_DFGOperation_EDA operation, GPRReg resultTag, GPRReg resultPayload, FPRReg arg1, GPRReg arg2)
</span><span class="lines">@@ -1499,15 +1499,15 @@
</span><span class="cx">         return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    JITCompiler::Call callOperation(J_DFGOperation_EIRo operation, GPRReg resultTag, GPRReg resultPayload, Identifier* identifier, ResolveOperations* operations)
</del><ins>+    JITCompiler::Call callOperation(J_DFGOperation_EIRo operation, GPRReg resultTag, GPRReg resultPayload, StringImpl* uid, ResolveOperations* operations)
</ins><span class="cx">     {
</span><del>-        m_jit.setupArgumentsWithExecState(TrustedImmPtr(identifier), TrustedImmPtr(operations));
</del><ins>+        m_jit.setupArgumentsWithExecState(TrustedImmPtr(uid), TrustedImmPtr(operations));
</ins><span class="cx">         return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    JITCompiler::Call callOperation(J_DFGOperation_EIRoPtbo operation, GPRReg resultTag, GPRReg resultPayload, Identifier* identifier, ResolveOperations* operations, PutToBaseOperation* putToBaseOperations)
</del><ins>+    JITCompiler::Call callOperation(J_DFGOperation_EIRoPtbo operation, GPRReg resultTag, GPRReg resultPayload, StringImpl* uid, ResolveOperations* operations, PutToBaseOperation* putToBaseOperations)
</ins><span class="cx">     {
</span><del>-        m_jit.setupArgumentsWithExecState(TrustedImmPtr(identifier), TrustedImmPtr(operations), TrustedImmPtr(putToBaseOperations));
</del><ins>+        m_jit.setupArgumentsWithExecState(TrustedImmPtr(uid), TrustedImmPtr(operations), TrustedImmPtr(putToBaseOperations));
</ins><span class="cx">         return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -1527,9 +1527,9 @@
</span><span class="cx">         m_jit.setupArgumentsWithExecState(EABI_32BIT_DUMMY_ARG arg1Payload, arg1Tag, arg2, TrustedImmPtr(pointer));
</span><span class="cx">         return appendCallWithExceptionCheck(operation);
</span><span class="cx">     }
</span><del>-    JITCompiler::Call callOperation(V_DFGOperation_EJCI operation, GPRReg arg1Tag, GPRReg arg1Payload, GPRReg arg2, Identifier* identifier)
</del><ins>+    JITCompiler::Call callOperation(V_DFGOperation_EJCI operation, GPRReg arg1Tag, GPRReg arg1Payload, GPRReg arg2, StringImpl* uid)
</ins><span class="cx">     {
</span><del>-        m_jit.setupArgumentsWithExecState(EABI_32BIT_DUMMY_ARG arg1Payload, arg1Tag, arg2, TrustedImmPtr(identifier));
</del><ins>+        m_jit.setupArgumentsWithExecState(EABI_32BIT_DUMMY_ARG arg1Payload, arg1Tag, arg2, TrustedImmPtr(uid));
</ins><span class="cx">         return appendCallWithExceptionCheck(operation);
</span><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(V_DFGOperation_ECJJ operation, GPRReg arg1, GPRReg arg2Tag, GPRReg arg2Payload, GPRReg arg3Tag, GPRReg arg3Payload)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGSpeculativeJIT32_64cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -286,7 +286,7 @@
</span><span class="cx">                 structureCheck.m_jump, this, operationGetByIdOptimize,
</span><span class="cx">                 JSValueRegs(resultTagGPR, resultPayloadGPR),
</span><span class="cx">                 static_cast&lt;int32_t&gt;(JSValue::CellTag), basePayloadGPR,
</span><del>-                identifier(identifierNumber));
</del><ins>+                identifierUID(identifierNumber));
</ins><span class="cx">         } else {
</span><span class="cx">             JITCompiler::JumpList slowCases;
</span><span class="cx">             slowCases.append(structureCheck.m_jump);
</span><span class="lines">@@ -295,14 +295,14 @@
</span><span class="cx">                 slowCases, this, operationGetByIdOptimize,
</span><span class="cx">                 JSValueRegs(resultTagGPR, resultPayloadGPR),
</span><span class="cx">                 static_cast&lt;int32_t&gt;(JSValue::CellTag), basePayloadGPR,
</span><del>-                identifier(identifierNumber));
</del><ins>+                identifierUID(identifierNumber));
</ins><span class="cx">         }
</span><span class="cx">     } else {
</span><span class="cx">         if (!slowPathTarget.isSet()) {
</span><span class="cx">             slowPath = slowPathCall(
</span><span class="cx">                 structureCheck.m_jump, this, operationGetByIdOptimize,
</span><span class="cx">                 JSValueRegs(resultTagGPR, resultPayloadGPR), baseTagGPROrNone, basePayloadGPR,
</span><del>-                identifier(identifierNumber));
</del><ins>+                identifierUID(identifierNumber));
</ins><span class="cx">         } else {
</span><span class="cx">             JITCompiler::JumpList slowCases;
</span><span class="cx">             slowCases.append(structureCheck.m_jump);
</span><span class="lines">@@ -310,7 +310,7 @@
</span><span class="cx">             slowPath = slowPathCall(
</span><span class="cx">                 slowCases, this, operationGetByIdOptimize,
</span><span class="cx">                 JSValueRegs(resultTagGPR, resultPayloadGPR), baseTagGPROrNone, basePayloadGPR,
</span><del>-                identifier(identifierNumber));
</del><ins>+                identifierUID(identifierNumber));
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx">     m_jit.addPropertyAccess(
</span><span class="lines">@@ -351,14 +351,14 @@
</span><span class="cx">     if (!slowPathTarget.isSet()) {
</span><span class="cx">         slowPath = slowPathCall(
</span><span class="cx">             structureCheck.m_jump, this, optimizedCall, NoResult, valueTagGPR, valuePayloadGPR,
</span><del>-            basePayloadGPR, identifier(identifierNumber));
</del><ins>+            basePayloadGPR, identifierUID(identifierNumber));
</ins><span class="cx">     } else {
</span><span class="cx">         JITCompiler::JumpList slowCases;
</span><span class="cx">         slowCases.append(structureCheck.m_jump);
</span><span class="cx">         slowCases.append(slowPathTarget);
</span><span class="cx">         slowPath = slowPathCall(
</span><span class="cx">             slowCases, this, optimizedCall, NoResult, valueTagGPR, valuePayloadGPR,
</span><del>-            basePayloadGPR, identifier(identifierNumber));
</del><ins>+            basePayloadGPR, identifierUID(identifierNumber));
</ins><span class="cx">     }
</span><span class="cx">     RegisterSet currentlyUsedRegisters = usedRegisters();
</span><span class="cx">     currentlyUsedRegisters.clear(scratchGPR);
</span><span class="lines">@@ -4224,7 +4224,7 @@
</span><span class="cx">         
</span><span class="cx">         WatchpointSet* watchpointSet =
</span><span class="cx">             m_jit.globalObjectFor(node-&gt;codeOrigin)-&gt;symbolTable()-&gt;get(
</span><del>-                identifier(node-&gt;identifierNumberForCheck())-&gt;impl()).watchpointSet();
</del><ins>+                identifierUID(node-&gt;identifierNumberForCheck())).watchpointSet();
</ins><span class="cx">         addSlowPathGenerator(
</span><span class="cx">             slowPathCall(
</span><span class="cx">                 m_jit.branchTest8(
</span><span class="lines">@@ -4252,7 +4252,7 @@
</span><span class="cx">         
</span><span class="cx">     case GlobalVarWatchpoint: {
</span><span class="cx">         WatchpointSet* set = m_jit.globalObjectFor(node-&gt;codeOrigin)-&gt;symbolTable()-&gt;get(
</span><del>-            identifier(node-&gt;identifierNumberForCheck())-&gt;impl()).watchpointSet();
</del><ins>+            identifierUID(node-&gt;identifierNumberForCheck())).watchpointSet();
</ins><span class="cx">         m_jit.addLazily(speculationWatchpoint(), set);
</span><span class="cx">         
</span><span class="cx"> #if DFG_ENABLE(JIT_ASSERT)
</span><span class="lines">@@ -4473,7 +4473,7 @@
</span><span class="cx">         GPRResult resultPayload(this);
</span><span class="cx">         GPRResult2 resultTag(this);
</span><span class="cx">         ResolveOperationData&amp; data = m_jit.graph().m_resolveOperationsData[node-&gt;resolveOperationsDataIndex()];
</span><del>-        callOperation(operationResolve, resultTag.gpr(), resultPayload.gpr(), identifier(data.identifierNumber), data.resolveOperations);
</del><ins>+        callOperation(operationResolve, resultTag.gpr(), resultPayload.gpr(), identifierUID(data.identifierNumber), data.resolveOperations);
</ins><span class="cx">         jsValueResult(resultTag.gpr(), resultPayload.gpr(), node);
</span><span class="cx">         break;
</span><span class="cx">     }
</span><span class="lines">@@ -4483,7 +4483,7 @@
</span><span class="cx">         GPRResult resultPayload(this);
</span><span class="cx">         GPRResult2 resultTag(this);
</span><span class="cx">         ResolveOperationData&amp; data = m_jit.graph().m_resolveOperationsData[node-&gt;resolveOperationsDataIndex()];
</span><del>-        callOperation(operationResolveBase, resultTag.gpr(), resultPayload.gpr(), identifier(data.identifierNumber), data.resolveOperations, data.putToBaseOperation);
</del><ins>+        callOperation(operationResolveBase, resultTag.gpr(), resultPayload.gpr(), identifierUID(data.identifierNumber), data.resolveOperations, data.putToBaseOperation);
</ins><span class="cx">         jsValueResult(resultTag.gpr(), resultPayload.gpr(), node);
</span><span class="cx">         break;
</span><span class="cx">     }
</span><span class="lines">@@ -4493,7 +4493,7 @@
</span><span class="cx">         GPRResult resultPayload(this);
</span><span class="cx">         GPRResult2 resultTag(this);
</span><span class="cx">         ResolveOperationData&amp; data = m_jit.graph().m_resolveOperationsData[node-&gt;resolveOperationsDataIndex()];
</span><del>-        callOperation(operationResolveBaseStrictPut, resultTag.gpr(), resultPayload.gpr(), identifier(data.identifierNumber), data.resolveOperations, data.putToBaseOperation);
</del><ins>+        callOperation(operationResolveBaseStrictPut, resultTag.gpr(), resultPayload.gpr(), identifierUID(data.identifierNumber), data.resolveOperations, data.putToBaseOperation);
</ins><span class="cx">         jsValueResult(resultTag.gpr(), resultPayload.gpr(), node);
</span><span class="cx">         break;
</span><span class="cx">     }
</span><span class="lines">@@ -4536,7 +4536,7 @@
</span><span class="cx">             slowPathCall(
</span><span class="cx">                 structuresNotMatch, this, operationResolveGlobal,
</span><span class="cx">                 JSValueRegs(resultTagGPR, resultPayloadGPR), resolveInfoGPR, globalObjectGPR,
</span><del>-                &amp;m_jit.codeBlock()-&gt;identifier(data.identifierNumber)));
</del><ins>+                identifierUID(data.identifierNumber)));
</ins><span class="cx"> 
</span><span class="cx">         jsValueResult(resultTagGPR, resultPayloadGPR, node);
</span><span class="cx">         break;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGSpeculativeJIT64cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -255,14 +255,14 @@
</span><span class="cx">     if (!slowPathTarget.isSet()) {
</span><span class="cx">         slowPath = slowPathCall(
</span><span class="cx">             structureCheck.m_jump, this, operationGetByIdOptimize, resultGPR, baseGPR,
</span><del>-            identifier(identifierNumber), spillMode);
</del><ins>+            identifierUID(identifierNumber), spillMode);
</ins><span class="cx">     } else {
</span><span class="cx">         JITCompiler::JumpList slowCases;
</span><span class="cx">         slowCases.append(structureCheck.m_jump);
</span><span class="cx">         slowCases.append(slowPathTarget);
</span><span class="cx">         slowPath = slowPathCall(
</span><span class="cx">             slowCases, this, operationGetByIdOptimize, resultGPR, baseGPR,
</span><del>-            identifier(identifierNumber), spillMode);
</del><ins>+            identifierUID(identifierNumber), spillMode);
</ins><span class="cx">     }
</span><span class="cx">     m_jit.addPropertyAccess(
</span><span class="cx">         PropertyAccessRecord(
</span><span class="lines">@@ -303,14 +303,14 @@
</span><span class="cx">     if (!slowPathTarget.isSet()) {
</span><span class="cx">         slowPath = slowPathCall(
</span><span class="cx">             structureCheck.m_jump, this, optimizedCall, NoResult, valueGPR, baseGPR,
</span><del>-            identifier(identifierNumber));
</del><ins>+            identifierUID(identifierNumber));
</ins><span class="cx">     } else {
</span><span class="cx">         JITCompiler::JumpList slowCases;
</span><span class="cx">         slowCases.append(structureCheck.m_jump);
</span><span class="cx">         slowCases.append(slowPathTarget);
</span><span class="cx">         slowPath = slowPathCall(
</span><span class="cx">             slowCases, this, optimizedCall, NoResult, valueGPR, baseGPR,
</span><del>-            identifier(identifierNumber));
</del><ins>+            identifierUID(identifierNumber));
</ins><span class="cx">     }
</span><span class="cx">     RegisterSet currentlyUsedRegisters = usedRegisters();
</span><span class="cx">     currentlyUsedRegisters.clear(scratchGPR);
</span><span class="lines">@@ -4120,7 +4120,7 @@
</span><span class="cx">         
</span><span class="cx">         WatchpointSet* watchpointSet =
</span><span class="cx">             m_jit.globalObjectFor(node-&gt;codeOrigin)-&gt;symbolTable()-&gt;get(
</span><del>-                identifier(node-&gt;identifierNumberForCheck())-&gt;impl()).watchpointSet();
</del><ins>+                identifierUID(node-&gt;identifierNumberForCheck())).watchpointSet();
</ins><span class="cx">         addSlowPathGenerator(
</span><span class="cx">             slowPathCall(
</span><span class="cx">                 m_jit.branchTest8(
</span><span class="lines">@@ -4143,7 +4143,7 @@
</span><span class="cx">         
</span><span class="cx">     case GlobalVarWatchpoint: {
</span><span class="cx">         WatchpointSet* set = m_jit.globalObjectFor(node-&gt;codeOrigin)-&gt;symbolTable()-&gt;get(
</span><del>-            identifier(node-&gt;identifierNumberForCheck())-&gt;impl()).watchpointSet();
</del><ins>+            identifierUID(node-&gt;identifierNumberForCheck())).watchpointSet();
</ins><span class="cx">         m_jit.addLazily(speculationWatchpoint(), set);
</span><span class="cx">         
</span><span class="cx"> #if DFG_ENABLE(JIT_ASSERT)
</span><span class="lines">@@ -4361,7 +4361,7 @@
</span><span class="cx">         flushRegisters();
</span><span class="cx">         GPRResult result(this);
</span><span class="cx">         ResolveOperationData&amp; data = m_jit.graph().m_resolveOperationsData[node-&gt;resolveOperationsDataIndex()];
</span><del>-        callOperation(operationResolve, result.gpr(), identifier(data.identifierNumber), data.resolveOperations);
</del><ins>+        callOperation(operationResolve, result.gpr(), identifierUID(data.identifierNumber), data.resolveOperations);
</ins><span class="cx">         jsValueResult(result.gpr(), node);
</span><span class="cx">         break;
</span><span class="cx">     }
</span><span class="lines">@@ -4370,7 +4370,7 @@
</span><span class="cx">         flushRegisters();
</span><span class="cx">         GPRResult result(this);
</span><span class="cx">         ResolveOperationData&amp; data = m_jit.graph().m_resolveOperationsData[node-&gt;resolveOperationsDataIndex()];
</span><del>-        callOperation(operationResolveBase, result.gpr(), identifier(data.identifierNumber), data.resolveOperations, data.putToBaseOperation);
</del><ins>+        callOperation(operationResolveBase, result.gpr(), identifierUID(data.identifierNumber), data.resolveOperations, data.putToBaseOperation);
</ins><span class="cx">         jsValueResult(result.gpr(), node);
</span><span class="cx">         break;
</span><span class="cx">     }
</span><span class="lines">@@ -4379,7 +4379,7 @@
</span><span class="cx">         flushRegisters();
</span><span class="cx">         GPRResult result(this);
</span><span class="cx">         ResolveOperationData&amp; data = m_jit.graph().m_resolveOperationsData[node-&gt;resolveOperationsDataIndex()];
</span><del>-        callOperation(operationResolveBaseStrictPut, result.gpr(), identifier(data.identifierNumber), data.resolveOperations, data.putToBaseOperation);
</del><ins>+        callOperation(operationResolveBaseStrictPut, result.gpr(), identifierUID(data.identifierNumber), data.resolveOperations, data.putToBaseOperation);
</ins><span class="cx">         jsValueResult(result.gpr(), node);
</span><span class="cx">         break;
</span><span class="cx">     }
</span><span class="lines">@@ -4418,7 +4418,7 @@
</span><span class="cx">             slowPathCall(
</span><span class="cx">                 structuresDontMatch, this, operationResolveGlobal,
</span><span class="cx">                 resultGPR, resolveInfoGPR, globalObjectGPR,
</span><del>-                &amp;m_jit.codeBlock()-&gt;identifier(data.identifierNumber)));
</del><ins>+                identifierUID(data.identifierNumber)));
</ins><span class="cx"> 
</span><span class="cx">         jsValueResult(resultGPR, node);
</span><span class="cx">         break;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserSourceCodecppfromrev153141trunkSourceJavaScriptCorebytecodeReduceWhitespaceh"></a>
<div class="copfile"><h4>Copied: trunk/Source/JavaScriptCore/parser/SourceCode.cpp (from rev 153141, trunk/Source/JavaScriptCore/bytecode/ReduceWhitespace.h) (0 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/SourceCode.cpp                                (rev 0)
+++ trunk/Source/JavaScriptCore/parser/SourceCode.cpp        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -0,0 +1,42 @@
</span><ins>+/*
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include &quot;config.h&quot;
+#include &quot;SourceCode.h&quot;
+
+#include &lt;wtf/text/CString.h&gt;
+
+namespace JSC {
+
+CString SourceCode::toUTF8() const
+{
+    if (!m_provider)
+        return CString(&quot;&quot;, 0);
+    
+    return m_provider-&gt;source().impl()-&gt;utf8ForRange(m_startChar, m_endChar - m_startChar);
+}
+
+} // namespace JSC
+
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserSourceCodeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/SourceCode.h (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/SourceCode.h        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/JavaScriptCore/parser/SourceCode.h        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2008 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2008, 2013 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -86,6 +86,8 @@
</span><span class="cx">             return m_provider-&gt;getRange(m_startChar, m_endChar);
</span><span class="cx">         }
</span><span class="cx">         
</span><ins>+        CString toUTF8() const;
+        
</ins><span class="cx">         intptr_t providerID() const
</span><span class="cx">         {
</span><span class="cx">             if (!m_provider)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreprofilerProfilerBytecodescpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/profiler/ProfilerBytecodes.cpp (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/profiler/ProfilerBytecodes.cpp        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/JavaScriptCore/profiler/ProfilerBytecodes.cpp        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -56,8 +56,8 @@
</span><span class="cx">     JSObject* result = constructEmptyObject(exec);
</span><span class="cx">     
</span><span class="cx">     result-&gt;putDirect(exec-&gt;vm(), exec-&gt;propertyNames().bytecodesID, jsNumber(m_id));
</span><del>-    result-&gt;putDirect(exec-&gt;vm(), exec-&gt;propertyNames().inferredName, jsString(exec, m_inferredName));
-    result-&gt;putDirect(exec-&gt;vm(), exec-&gt;propertyNames().sourceCode, jsString(exec, m_sourceCode));
</del><ins>+    result-&gt;putDirect(exec-&gt;vm(), exec-&gt;propertyNames().inferredName, jsString(exec, String::fromUTF8(m_inferredName)));
+    result-&gt;putDirect(exec-&gt;vm(), exec-&gt;propertyNames().sourceCode, jsString(exec, String::fromUTF8(m_sourceCode)));
</ins><span class="cx">     result-&gt;putDirect(exec-&gt;vm(), exec-&gt;propertyNames().hash, jsString(exec, String::fromUTF8(toCString(m_hash))));
</span><span class="cx">     result-&gt;putDirect(exec-&gt;vm(), exec-&gt;propertyNames().instructionCount, jsNumber(m_instructionCount));
</span><span class="cx">     addSequenceProperties(exec, result);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreprofilerProfilerBytecodesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/profiler/ProfilerBytecodes.h (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/profiler/ProfilerBytecodes.h        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/JavaScriptCore/profiler/ProfilerBytecodes.h        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -40,8 +40,8 @@
</span><span class="cx">     ~Bytecodes();
</span><span class="cx">     
</span><span class="cx">     size_t id() const { return m_id; }
</span><del>-    const String&amp; inferredName() const { return m_inferredName; }
-    const String&amp; sourceCode() const { return m_sourceCode; }
</del><ins>+    const CString&amp; inferredName() const { return m_inferredName; }
+    const CString&amp; sourceCode() const { return m_sourceCode; }
</ins><span class="cx">     unsigned instructionCount() const { return m_instructionCount; }
</span><span class="cx">     CodeBlockHash hash() const { return m_hash; }
</span><span class="cx"> 
</span><span class="lines">@@ -51,8 +51,8 @@
</span><span class="cx">     
</span><span class="cx"> private:
</span><span class="cx">     size_t m_id;
</span><del>-    String m_inferredName;
-    String m_sourceCode;
</del><ins>+    CString m_inferredName;
+    CString m_sourceCode;
</ins><span class="cx">     CodeBlockHash m_hash;
</span><span class="cx">     unsigned m_instructionCount;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeIdentifierh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Identifier.h (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Identifier.h        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/JavaScriptCore/runtime/Identifier.h        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -59,6 +59,7 @@
</span><span class="cx">         int length() const { return m_string.length(); }
</span><span class="cx">         
</span><span class="cx">         CString ascii() const { return m_string.ascii(); }
</span><ins>+        CString utf8() const { return m_string.utf8(); }
</ins><span class="cx"> 
</span><span class="cx">         static Identifier createLCharFromUChar(VM* vm, const UChar* s, int length) { return Identifier(vm, add8(vm, s, length)); }
</span><span class="cx"> 
</span><span class="lines">@@ -247,6 +248,7 @@
</span><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     typedef HashMap&lt;RefPtr&lt;StringImpl&gt;, int, IdentifierRepHash, HashTraits&lt;RefPtr&lt;StringImpl&gt; &gt;, IdentifierMapIndexHashTraits&gt; IdentifierMap;
</span><ins>+    typedef HashMap&lt;StringImpl*, int, IdentifierRepHash, HashTraits&lt;StringImpl*&gt;, IdentifierMapIndexHashTraits&gt; BorrowedIdentifierMap;
</ins><span class="cx"> 
</span><span class="cx">     template&lt;typename U, typename V&gt;
</span><span class="cx">     HashSet&lt;StringImpl*&gt;::AddResult IdentifierTable::add(U value)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeStructurecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Structure.cpp (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Structure.cpp        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/JavaScriptCore/runtime/Structure.cpp        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -321,12 +321,12 @@
</span><span class="cx">     entry-&gt;specificValue.clear();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Structure* Structure::addPropertyTransitionToExistingStructureImpl(Structure* structure, PropertyName propertyName, unsigned attributes, JSCell* specificValue, PropertyOffset&amp; offset)
</del><ins>+Structure* Structure::addPropertyTransitionToExistingStructureImpl(Structure* structure, StringImpl* uid, unsigned attributes, JSCell* specificValue, PropertyOffset&amp; offset)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!structure-&gt;isDictionary());
</span><span class="cx">     ASSERT(structure-&gt;isObject());
</span><span class="cx"> 
</span><del>-    if (Structure* existingTransition = structure-&gt;m_transitionTable.get(propertyName.uid(), attributes)) {
</del><ins>+    if (Structure* existingTransition = structure-&gt;m_transitionTable.get(uid, attributes)) {
</ins><span class="cx">         JSCell* specificValueInPrevious = existingTransition-&gt;m_specificValueInPrevious.get();
</span><span class="cx">         if (specificValueInPrevious &amp;&amp; specificValueInPrevious != specificValue)
</span><span class="cx">             return 0;
</span><span class="lines">@@ -341,13 +341,13 @@
</span><span class="cx"> Structure* Structure::addPropertyTransitionToExistingStructure(Structure* structure, PropertyName propertyName, unsigned attributes, JSCell* specificValue, PropertyOffset&amp; offset)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(!isCompilationThread());
</span><del>-    return addPropertyTransitionToExistingStructureImpl(structure, propertyName, attributes, specificValue, offset);
</del><ins>+    return addPropertyTransitionToExistingStructureImpl(structure, propertyName.uid(), attributes, specificValue, offset);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-Structure* Structure::addPropertyTransitionToExistingStructureConcurrently(Structure* structure, PropertyName propertyName, unsigned attributes, JSCell* specificValue, PropertyOffset&amp; offset)
</del><ins>+Structure* Structure::addPropertyTransitionToExistingStructureConcurrently(Structure* structure, StringImpl* uid, unsigned attributes, JSCell* specificValue, PropertyOffset&amp; offset)
</ins><span class="cx"> {
</span><span class="cx">     Locker locker(structure-&gt;m_lock);
</span><del>-    return addPropertyTransitionToExistingStructureImpl(structure, propertyName, attributes, specificValue, offset);
</del><ins>+    return addPropertyTransitionToExistingStructureImpl(structure, uid, attributes, specificValue, offset);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool Structure::anyObjectInChainMayInterceptIndexedAccesses() const
</span><span class="lines">@@ -789,7 +789,7 @@
</span><span class="cx">     return PropertyTable::create(vm, numberOfSlotsForLastOffset(m_offset, m_inlineCapacity));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-PropertyOffset Structure::getConcurrently(VM&amp;, PropertyName propertyName, unsigned&amp; attributes, JSCell*&amp; specificValue)
</del><ins>+PropertyOffset Structure::getConcurrently(VM&amp;, StringImpl* uid, unsigned&amp; attributes, JSCell*&amp; specificValue)
</ins><span class="cx"> {
</span><span class="cx">     Vector&lt;Structure*, 8&gt; structures;
</span><span class="cx">     Structure* structure;
</span><span class="lines">@@ -798,7 +798,7 @@
</span><span class="cx">     findStructuresAndMapForMaterialization(structures, structure, table);
</span><span class="cx">     
</span><span class="cx">     if (table) {
</span><del>-        PropertyMapEntry* entry = table-&gt;find(propertyName.uid()).first;
</del><ins>+        PropertyMapEntry* entry = table-&gt;find(uid).first;
</ins><span class="cx">         if (entry) {
</span><span class="cx">             attributes = entry-&gt;attributes;
</span><span class="cx">             specificValue = entry-&gt;specificValue.get();
</span><span class="lines">@@ -811,7 +811,7 @@
</span><span class="cx">     
</span><span class="cx">     for (unsigned i = structures.size(); i--;) {
</span><span class="cx">         structure = structures[i];
</span><del>-        if (structure-&gt;m_nameInPrevious.get() != propertyName.uid())
</del><ins>+        if (structure-&gt;m_nameInPrevious.get() != uid)
</ins><span class="cx">             continue;
</span><span class="cx">         
</span><span class="cx">         attributes = structure-&gt;m_attributesInPrevious;
</span><span class="lines">@@ -970,13 +970,13 @@
</span><span class="cx">         thisObject-&gt;m_propertyTableUnsafe.clear();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool Structure::prototypeChainMayInterceptStoreTo(VM&amp; vm, PropertyName propertyName)
</del><ins>+bool Structure::prototypeChainMayInterceptStoreTo(VM&amp; vm, StringImpl* uid)
</ins><span class="cx"> {
</span><span class="cx">     // Note, this method is called from two kinds of places: (1) assertions and (2)
</span><span class="cx">     // the compilation thread. As such, it does things somewhat carefully to ensure
</span><span class="cx">     // thread safety. Currently that only affects the way we do Structure::get().
</span><span class="cx">     
</span><del>-    unsigned i = propertyName.asIndex();
</del><ins>+    unsigned i = toUInt32FromStringImpl(uid);
</ins><span class="cx">     if (i != PropertyName::NotAnIndex)
</span><span class="cx">         return anyObjectInChainMayInterceptIndexedAccesses();
</span><span class="cx">     
</span><span class="lines">@@ -989,7 +989,7 @@
</span><span class="cx">         
</span><span class="cx">         unsigned attributes;
</span><span class="cx">         JSCell* specificValue;
</span><del>-        PropertyOffset offset = current-&gt;getConcurrently(vm, propertyName, attributes, specificValue);
</del><ins>+        PropertyOffset offset = current-&gt;getConcurrently(vm, uid, attributes, specificValue);
</ins><span class="cx">         if (!JSC::isValidOffset(offset))
</span><span class="cx">             continue;
</span><span class="cx">         
</span><span class="lines">@@ -1000,6 +1000,11 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool Structure::prototypeChainMayInterceptStoreTo(VM&amp; vm, PropertyName propertyName)
+{
+    return prototypeChainMayInterceptStoreTo(vm, propertyName.uid());
+}
+
</ins><span class="cx"> #if DO_PROPERTYMAP_CONSTENCY_CHECK
</span><span class="cx"> 
</span><span class="cx"> void PropertyTable::checkConsistency()
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeStructureh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Structure.h (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Structure.h        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/JavaScriptCore/runtime/Structure.h        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -97,7 +97,7 @@
</span><span class="cx">     static void dumpStatistics();
</span><span class="cx"> 
</span><span class="cx">     JS_EXPORT_PRIVATE static Structure* addPropertyTransition(VM&amp;, Structure*, PropertyName, unsigned attributes, JSCell* specificValue, PropertyOffset&amp;);
</span><del>-    static Structure* addPropertyTransitionToExistingStructureConcurrently(Structure*, PropertyName, unsigned attributes, JSCell* specificValue, PropertyOffset&amp;);
</del><ins>+    static Structure* addPropertyTransitionToExistingStructureConcurrently(Structure*, StringImpl* uid, unsigned attributes, JSCell* specificValue, PropertyOffset&amp;);
</ins><span class="cx">     JS_EXPORT_PRIVATE static Structure* addPropertyTransitionToExistingStructure(Structure*, PropertyName, unsigned attributes, JSCell* specificValue, PropertyOffset&amp;);
</span><span class="cx">     static Structure* removePropertyTransition(VM&amp;, Structure*, PropertyName, PropertyOffset&amp;);
</span><span class="cx">     JS_EXPORT_PRIVATE static Structure* changePrototypeTransition(VM&amp;, Structure*, JSValue prototype);
</span><span class="lines">@@ -162,6 +162,7 @@
</span><span class="cx">     static void visitChildren(JSCell*, SlotVisitor&amp;);
</span><span class="cx">         
</span><span class="cx">     // Will just the prototype chain intercept this property access?
</span><ins>+    bool prototypeChainMayInterceptStoreTo(VM&amp;, StringImpl* uid);
</ins><span class="cx">     bool prototypeChainMayInterceptStoreTo(VM&amp;, PropertyName);
</span><span class="cx">         
</span><span class="cx">     bool transitionDidInvolveSpecificValue() const { return !!m_specificValueInPrevious; }
</span><span class="lines">@@ -242,8 +243,8 @@
</span><span class="cx">     PropertyOffset get(VM&amp;, const WTF::String&amp; name);
</span><span class="cx">     JS_EXPORT_PRIVATE PropertyOffset get(VM&amp;, PropertyName, unsigned&amp; attributes, JSCell*&amp; specificValue);
</span><span class="cx"> 
</span><del>-    PropertyOffset getConcurrently(VM&amp;, PropertyName);
-    PropertyOffset getConcurrently(VM&amp;, PropertyName, unsigned&amp; attributes, JSCell*&amp; specificValue);
</del><ins>+    PropertyOffset getConcurrently(VM&amp;, StringImpl* uid);
+    PropertyOffset getConcurrently(VM&amp;, StringImpl* uid, unsigned&amp; attributes, JSCell*&amp; specificValue);
</ins><span class="cx"> 
</span><span class="cx">     bool hasGetterSetterProperties() const { return m_hasGetterSetterProperties; }
</span><span class="cx">     bool hasReadOnlyOrGetterSetterPropertiesExcludingProto() const { return m_hasReadOnlyOrGetterSetterPropertiesExcludingProto; }
</span><span class="lines">@@ -368,7 +369,7 @@
</span><span class="cx"> 
</span><span class="cx">     static Structure* create(VM&amp;, const Structure*);
</span><span class="cx">     
</span><del>-    static Structure* addPropertyTransitionToExistingStructureImpl(Structure*, PropertyName, unsigned attributes, JSCell* specificValue, PropertyOffset&amp;);
</del><ins>+    static Structure* addPropertyTransitionToExistingStructureImpl(Structure*, StringImpl* uid, unsigned attributes, JSCell* specificValue, PropertyOffset&amp;);
</ins><span class="cx"> 
</span><span class="cx">     // This will return the structure that has a usable property table, that property table,
</span><span class="cx">     // and the list of structures that we visited before we got to it. If it returns a
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeStructureInlinesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/StructureInlines.h (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/StructureInlines.h        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/JavaScriptCore/runtime/StructureInlines.h        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -80,12 +80,12 @@
</span><span class="cx">     return entry ? entry-&gt;offset : invalidOffset;
</span><span class="cx"> }
</span><span class="cx">     
</span><del>-inline PropertyOffset Structure::getConcurrently(VM&amp; vm, PropertyName propertyName)
</del><ins>+inline PropertyOffset Structure::getConcurrently(VM&amp; vm, StringImpl* uid)
</ins><span class="cx"> {
</span><span class="cx">     unsigned attributesIgnored;
</span><span class="cx">     JSCell* specificValueIgnored;
</span><span class="cx">     return getConcurrently(
</span><del>-        vm, propertyName, attributesIgnored, specificValueIgnored);
</del><ins>+        vm, uid, attributesIgnored, specificValueIgnored);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline bool Structure::masqueradesAsUndefined(JSGlobalObject* lexicalGlobalObject)
</span></span></pre></div>
<a id="trunkSourceWTFChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/ChangeLog (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/ChangeLog        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/WTF/ChangeLog        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -1,3 +1,36 @@
</span><ins>+2013-04-30  Filip Pizlo  &lt;fpizlo@apple.com&gt;
+
+        fourthTier: DFG tries to ref/deref StringImpls in a ton of places
+        https://bugs.webkit.org/show_bug.cgi?id=115300
+
+        Reviewed by Geoffrey Garen.
+        
+        Make it possible to do more things directly to StringImpl*'s, including being
+        able to directly do utf8 conversion on a substring without creating the
+        substring first.
+        
+        Add assertions to StringImpl that it isn't being ref/deref'd from the
+        compilation thread.
+
+        * wtf/PrintStream.cpp:
+        (WTF::printInternal):
+        (WTF):
+        * wtf/PrintStream.h:
+        (WTF):
+        (WTF::printInternal):
+        * wtf/StringPrintStream.h:
+        (WTF):
+        (WTF::toCString):
+        * wtf/text/StringImpl.cpp:
+        (WTF::StringImpl::utf8ForRange):
+        (WTF::StringImpl::utf8):
+        (WTF):
+        * wtf/text/StringImpl.h:
+        (StringImpl):
+        (WTF::StringImpl::hasAtLeastOneRef):
+        (WTF::StringImpl::ref):
+        (WTF::StringImpl::deref):
+
</ins><span class="cx"> 2013-04-29  Filip Pizlo  &lt;fpizlo@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         fourthTier: String::utf8() should also be available as StringImpl::utf8() so that you don't have to ref() a StringImpl just to get its utf8()
</span></span></pre></div>
<a id="trunkSourceWTFwtfPrintStreamcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/PrintStream.cpp (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/PrintStream.cpp        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/WTF/wtf/PrintStream.cpp        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -62,6 +62,11 @@
</span><span class="cx">     out.print(string.utf8());
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void printInternal(PrintStream&amp; out, const StringImpl* string)
+{
+    out.print(string-&gt;utf8());
+}
+
</ins><span class="cx"> void printInternal(PrintStream&amp; out, bool value)
</span><span class="cx"> {
</span><span class="cx">     if (value)
</span></span></pre></div>
<a id="trunkSourceWTFwtfPrintStreamh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/PrintStream.h (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/PrintStream.h        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/WTF/wtf/PrintStream.h        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -37,6 +37,7 @@
</span><span class="cx"> 
</span><span class="cx"> class CString;
</span><span class="cx"> class String;
</span><ins>+class StringImpl;
</ins><span class="cx"> 
</span><span class="cx"> class PrintStream {
</span><span class="cx">     WTF_MAKE_FAST_ALLOCATED; WTF_MAKE_NONCOPYABLE(PrintStream);
</span><span class="lines">@@ -211,9 +212,11 @@
</span><span class="cx"> WTF_EXPORT_PRIVATE void printInternal(PrintStream&amp;, const char*);
</span><span class="cx"> WTF_EXPORT_PRIVATE void printInternal(PrintStream&amp;, const CString&amp;);
</span><span class="cx"> WTF_EXPORT_PRIVATE void printInternal(PrintStream&amp;, const String&amp;);
</span><ins>+WTF_EXPORT_PRIVATE void printInternal(PrintStream&amp;, const StringImpl*);
</ins><span class="cx"> inline void printInternal(PrintStream&amp; out, char* value) { printInternal(out, static_cast&lt;const char*&gt;(value)); }
</span><span class="cx"> inline void printInternal(PrintStream&amp; out, CString&amp; value) { printInternal(out, static_cast&lt;const CString&amp;&gt;(value)); }
</span><span class="cx"> inline void printInternal(PrintStream&amp; out, String&amp; value) { printInternal(out, static_cast&lt;const String&amp;&gt;(value)); }
</span><ins>+inline void printInternal(PrintStream&amp; out, StringImpl* value) { printInternal(out, static_cast&lt;const StringImpl*&gt;(value)); }
</ins><span class="cx"> WTF_EXPORT_PRIVATE void printInternal(PrintStream&amp;, bool);
</span><span class="cx"> WTF_EXPORT_PRIVATE void printInternal(PrintStream&amp;, int);
</span><span class="cx"> WTF_EXPORT_PRIVATE void printInternal(PrintStream&amp;, unsigned);
</span></span></pre></div>
<a id="trunkSourceWTFwtfStringPrintStreamh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/StringPrintStream.h (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/StringPrintStream.h        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/WTF/wtf/StringPrintStream.h        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -75,6 +75,14 @@
</span><span class="cx">     return stream.toCString();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+template&lt;typename T1, typename T2, typename T3, typename T4&gt;
+CString toCString(const T1&amp; value1, const T2&amp; value2, const T3&amp; value3, const T4&amp; value4)
+{
+    StringPrintStream stream;
+    stream.print(value1, value2, value3, value4);
+    return stream.toCString();
+}
+
</ins><span class="cx"> template&lt;typename T&gt;
</span><span class="cx"> String toString(const T&amp; value)
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkSourceWTFwtftextStringImplcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/text/StringImpl.cpp (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/text/StringImpl.cpp        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/WTF/wtf/text/StringImpl.cpp        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -1959,10 +1959,11 @@
</span><span class="cx">     *buffer++ = static_cast&lt;char&gt;((ch &amp; 0x3F) | 0x80);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-CString StringImpl::utf8(ConversionMode mode) const
</del><ins>+CString StringImpl::utf8ForRange(unsigned offset, unsigned length, ConversionMode mode) const
</ins><span class="cx"> {
</span><del>-    unsigned length = this-&gt;length();
-
</del><ins>+    ASSERT(offset &lt;= this-&gt;length());
+    ASSERT(offset + length &lt;= this-&gt;length());
+    
</ins><span class="cx">     if (!length)
</span><span class="cx">         return CString(&quot;&quot;, 0);
</span><span class="cx"> 
</span><span class="lines">@@ -1983,12 +1984,12 @@
</span><span class="cx">     char* buffer = bufferVector.data();
</span><span class="cx"> 
</span><span class="cx">     if (is8Bit()) {
</span><del>-        const LChar* characters = this-&gt;characters8();
</del><ins>+        const LChar* characters = this-&gt;characters8() + offset;
</ins><span class="cx"> 
</span><span class="cx">         ConversionResult result = convertLatin1ToUTF8(&amp;characters, characters + length, &amp;buffer, buffer + bufferVector.size());
</span><span class="cx">         ASSERT_UNUSED(result, result != targetExhausted); // (length * 3) should be sufficient for any conversion
</span><span class="cx">     } else {
</span><del>-        const UChar* characters = this-&gt;characters16();
</del><ins>+        const UChar* characters = this-&gt;characters16() + offset;
</ins><span class="cx"> 
</span><span class="cx">         if (mode == StrictConversionReplacingUnpairedSurrogatesWithFFFD) {
</span><span class="cx">             const UChar* charactersEnd = characters + length;
</span><span class="lines">@@ -2038,4 +2039,9 @@
</span><span class="cx">     return CString(bufferVector.data(), buffer - bufferVector.data());
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+CString StringImpl::utf8(ConversionMode mode) const
+{
+    return utf8ForRange(0, length(), mode);
+}
+
</ins><span class="cx"> } // namespace WTF
</span></span></pre></div>
<a id="trunkSourceWTFwtftextStringImplh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/text/StringImpl.h (153141 => 153142)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/text/StringImpl.h        2013-07-25 03:59:24 UTC (rev 153141)
+++ trunk/Source/WTF/wtf/text/StringImpl.h        2013-07-25 03:59:29 UTC (rev 153142)
</span><span class="lines">@@ -25,6 +25,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &lt;limits.h&gt;
</span><span class="cx"> #include &lt;wtf/ASCIICType.h&gt;
</span><ins>+#include &lt;wtf/CompilationThread.h&gt;
</ins><span class="cx"> #include &lt;wtf/Forward.h&gt;
</span><span class="cx"> #include &lt;wtf/StdLibExtras.h&gt;
</span><span class="cx"> #include &lt;wtf/StringHasher.h&gt;
</span><span class="lines">@@ -548,6 +549,7 @@
</span><span class="cx">     QStringData* qStringData() { return bufferOwnership() == BufferAdoptedQString ? m_qStringData : 0; }
</span><span class="cx"> #endif
</span><span class="cx">     
</span><ins>+    WTF_EXPORT_STRING_API CString utf8ForRange(unsigned offset, unsigned length, ConversionMode = LenientConversion) const;
</ins><span class="cx">     WTF_EXPORT_STRING_API CString utf8(ConversionMode = LenientConversion) const;
</span><span class="cx"> 
</span><span class="cx"> private:
</span><span class="lines">@@ -591,19 +593,27 @@
</span><span class="cx">             return existingHash();
</span><span class="cx">         return hashSlowCase();
</span><span class="cx">     }
</span><del>-
</del><ins>+    
</ins><span class="cx">     inline bool hasOneRef() const
</span><span class="cx">     {
</span><span class="cx">         return m_refCount == s_refCountIncrement;
</span><span class="cx">     }
</span><ins>+    
+    // This method is useful for assertions.
+    inline bool hasAtLeastOneRef() const
+    {
+        return !!m_refCount;
+    }
</ins><span class="cx"> 
</span><span class="cx">     inline void ref()
</span><span class="cx">     {
</span><ins>+        ASSERT(!isCompilationThread());
</ins><span class="cx">         m_refCount += s_refCountIncrement;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     inline void deref()
</span><span class="cx">     {
</span><ins>+        ASSERT(!isCompilationThread());        
</ins><span class="cx">         unsigned tempRefCount = m_refCount - s_refCountIncrement;
</span><span class="cx">         if (!tempRefCount) {
</span><span class="cx">             StringImpl::destroy(this);
</span></span></pre>
</div>
</div>

</body>
</html>