<!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>[213209] trunk/Source/JavaScriptCore</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/213209">213209</a></dd>
<dt>Author</dt> <dd>utatane.tea@gmail.com</dd>
<dt>Date</dt> <dd>2017-03-01 00:15:45 -0800 (Wed, 01 Mar 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>[JSC] Allow UnlinkedCodeBlock to dump its bytecode sequence
https://bugs.webkit.org/show_bug.cgi?id=168968

Reviewed by Saam Barati.

This patch decouples dumping bytecode sequence from CodeBlock.
This change allows UnlinkedCodeBlock to dump its bytecode sequence.
It is useful because we now have complex phase between UnlinkedCodeBlock and CodeBlock,
called Generatorification.

We introduce BytecodeDumper&lt;Block&gt;. Both CodeBlock and UnlinkedCodeBlock can use
this class to dump bytecode sequence.

And this patch also adds Option::dumpBytecodesBeforeGeneratorification,
which dumps unlinked bytecode sequence before generatorification if it is enabled.

* CMakeLists.txt:
* JavaScriptCore.xcodeproj/project.pbxproj:
* bytecode/BytecodeDumper.cpp: Added.
(JSC::getStructureID):
(JSC::getSpecialPointer):
(JSC::getPutByIdFlags):
(JSC::getToThisStatus):
(JSC::getPointer):
(JSC::getStructureChain):
(JSC::getStructure):
(JSC::getCallLinkInfo):
(JSC::getBasicBlockLocation):
(JSC::BytecodeDumper&lt;Block&gt;::actualPointerFor):
(JSC::BytecodeDumper&lt;CodeBlock&gt;::actualPointerFor):
(JSC::beginDumpProfiling):
(JSC::BytecodeDumper&lt;Block&gt;::dumpValueProfiling):
(JSC::BytecodeDumper&lt;CodeBlock&gt;::dumpValueProfiling):
(JSC::BytecodeDumper&lt;Block&gt;::dumpArrayProfiling):
(JSC::BytecodeDumper&lt;CodeBlock&gt;::dumpArrayProfiling):
(JSC::BytecodeDumper&lt;Block&gt;::dumpProfilesForBytecodeOffset):
(JSC::dumpRareCaseProfile):
(JSC::dumpArithProfile):
(JSC::BytecodeDumper&lt;CodeBlock&gt;::dumpProfilesForBytecodeOffset):
(JSC::BytecodeDumper&lt;Block&gt;::vm):
(JSC::BytecodeDumper&lt;Block&gt;::identifier):
(JSC::regexpToSourceString):
(JSC::regexpName):
(JSC::printLocationAndOp):
(JSC::isConstantRegisterIndex):
(JSC::debugHookName):
(JSC::BytecodeDumper&lt;Block&gt;::registerName):
(JSC::idName):
(JSC::BytecodeDumper&lt;Block&gt;::constantName):
(JSC::BytecodeDumper&lt;Block&gt;::printUnaryOp):
(JSC::BytecodeDumper&lt;Block&gt;::printBinaryOp):
(JSC::BytecodeDumper&lt;Block&gt;::printConditionalJump):
(JSC::BytecodeDumper&lt;Block&gt;::printGetByIdOp):
(JSC::dumpStructure):
(JSC::dumpChain):
(JSC::BytecodeDumper&lt;Block&gt;::printGetByIdCacheStatus):
(JSC::BytecodeDumper&lt;Block&gt;::printPutByIdCacheStatus):
(JSC::BytecodeDumper&lt;Block&gt;::dumpCallLinkStatus):
(JSC::BytecodeDumper&lt;CodeBlock&gt;::dumpCallLinkStatus):
(JSC::BytecodeDumper&lt;Block&gt;::printCallOp):
(JSC::BytecodeDumper&lt;Block&gt;::printPutByIdOp):
(JSC::BytecodeDumper&lt;Block&gt;::printLocationOpAndRegisterOperand):
(JSC::BytecodeDumper&lt;Block&gt;::dumpBytecode):
(JSC::BytecodeDumper&lt;Block&gt;::dumpIdentifiers):
(JSC::BytecodeDumper&lt;Block&gt;::dumpConstants):
(JSC::BytecodeDumper&lt;Block&gt;::dumpRegExps):
(JSC::BytecodeDumper&lt;Block&gt;::dumpExceptionHandlers):
(JSC::BytecodeDumper&lt;Block&gt;::dumpSwitchJumpTables):
(JSC::BytecodeDumper&lt;Block&gt;::dumpStringSwitchJumpTables):
(JSC::BytecodeDumper&lt;Block&gt;::dumpBlock):
* bytecode/BytecodeDumper.h: Added.
(JSC::BytecodeDumper::BytecodeDumper):
(JSC::BytecodeDumper::block):
(JSC::BytecodeDumper::instructionsBegin):
* bytecode/BytecodeGeneratorification.cpp:
(JSC::BytecodeGeneratorification::BytecodeGeneratorification):
(JSC::performGeneratorification):
* bytecode/BytecodeLivenessAnalysis.cpp:
(JSC::BytecodeLivenessAnalysis::dumpResults):
* bytecode/CodeBlock.cpp:
(JSC::CodeBlock::dumpBytecode):
(JSC::CodeBlock::finishCreation):
(JSC::CodeBlock::propagateTransitions):
(JSC::CodeBlock::finalizeLLIntInlineCaches):
(JSC::CodeBlock::hasOpDebugForLineAndColumn):
(JSC::CodeBlock::usesOpcode):
(JSC::CodeBlock::valueProfileForBytecodeOffset):
(JSC::CodeBlock::arithProfileForPC):
(JSC::CodeBlock::insertBasicBlockBoundariesForControlFlowProfiler):
(JSC::idName): Deleted.
(JSC::CodeBlock::registerName): Deleted.
(JSC::CodeBlock::constantName): Deleted.
(JSC::regexpToSourceString): Deleted.
(JSC::regexpName): Deleted.
(JSC::debugHookName): Deleted.
(JSC::CodeBlock::printUnaryOp): Deleted.
(JSC::CodeBlock::printBinaryOp): Deleted.
(JSC::CodeBlock::printConditionalJump): Deleted.
(JSC::CodeBlock::printGetByIdOp): Deleted.
(JSC::dumpStructure): Deleted.
(JSC::dumpChain): Deleted.
(JSC::CodeBlock::printGetByIdCacheStatus): Deleted.
(JSC::CodeBlock::printPutByIdCacheStatus): Deleted.
(JSC::CodeBlock::printCallOp): Deleted.
(JSC::CodeBlock::printPutByIdOp): Deleted.
(JSC::CodeBlock::dumpExceptionHandlers): Deleted.
(JSC::CodeBlock::beginDumpProfiling): Deleted.
(JSC::CodeBlock::dumpValueProfiling): Deleted.
(JSC::CodeBlock::dumpArrayProfiling): Deleted.
(JSC::CodeBlock::dumpRareCaseProfile): Deleted.
(JSC::CodeBlock::dumpArithProfile): Deleted.
(JSC::CodeBlock::printLocationAndOp): Deleted.
(JSC::CodeBlock::printLocationOpAndRegisterOperand): Deleted.
* bytecode/CodeBlock.h:
(JSC::CodeBlock::constantRegisters):
(JSC::CodeBlock::numberOfRegExps):
(JSC::CodeBlock::bitVectors):
(JSC::CodeBlock::bitVector):
* bytecode/HandlerInfo.h:
(JSC::HandlerInfoBase::typeName):
* bytecode/UnlinkedCodeBlock.cpp:
(JSC::UnlinkedCodeBlock::dump):
* bytecode/UnlinkedCodeBlock.h:
(JSC::UnlinkedCodeBlock::getConstant):
* bytecode/UnlinkedInstructionStream.cpp:
(JSC::UnlinkedInstructionStream::UnlinkedInstructionStream):
* bytecode/UnlinkedInstructionStream.h:
(JSC::UnlinkedInstructionStream::Reader::next):
* runtime/Options.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreCMakeListstxt">trunk/Source/JavaScriptCore/CMakeLists.txt</a></li>
<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="#trunkSourceJavaScriptCorebytecodeBytecodeGeneratorificationcpp">trunk/Source/JavaScriptCore/bytecode/BytecodeGeneratorification.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeBytecodeLivenessAnalysiscpp">trunk/Source/JavaScriptCore/bytecode/BytecodeLivenessAnalysis.cpp</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="#trunkSourceJavaScriptCorebytecodeHandlerInfoh">trunk/Source/JavaScriptCore/bytecode/HandlerInfo.h</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeUnlinkedCodeBlockcpp">trunk/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeUnlinkedCodeBlockh">trunk/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.h</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeUnlinkedInstructionStreamcpp">trunk/Source/JavaScriptCore/bytecode/UnlinkedInstructionStream.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeUnlinkedInstructionStreamh">trunk/Source/JavaScriptCore/bytecode/UnlinkedInstructionStream.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeOptionsh">trunk/Source/JavaScriptCore/runtime/Options.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCorebytecodeBytecodeDumpercpp">trunk/Source/JavaScriptCore/bytecode/BytecodeDumper.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeBytecodeDumperh">trunk/Source/JavaScriptCore/bytecode/BytecodeDumper.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreCMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/CMakeLists.txt (213208 => 213209)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/CMakeLists.txt        2017-03-01 07:57:08 UTC (rev 213208)
+++ trunk/Source/JavaScriptCore/CMakeLists.txt        2017-03-01 08:15:45 UTC (rev 213209)
</span><span class="lines">@@ -194,6 +194,7 @@
</span><span class="cx">     bytecode/ArrayAllocationProfile.cpp
</span><span class="cx">     bytecode/ArrayProfile.cpp
</span><span class="cx">     bytecode/BytecodeBasicBlock.cpp
</span><ins>+    bytecode/BytecodeDumper.cpp
</ins><span class="cx">     bytecode/BytecodeGeneratorification.cpp
</span><span class="cx">     bytecode/BytecodeIntrinsicRegistry.cpp
</span><span class="cx">     bytecode/BytecodeLivenessAnalysis.cpp
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (213208 => 213209)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2017-03-01 07:57:08 UTC (rev 213208)
+++ trunk/Source/JavaScriptCore/ChangeLog        2017-03-01 08:15:45 UTC (rev 213209)
</span><span class="lines">@@ -1,3 +1,135 @@
</span><ins>+2017-03-01  Yusuke Suzuki  &lt;utatane.tea@gmail.com&gt;
+
+        [JSC] Allow UnlinkedCodeBlock to dump its bytecode sequence
+        https://bugs.webkit.org/show_bug.cgi?id=168968
+
+        Reviewed by Saam Barati.
+
+        This patch decouples dumping bytecode sequence from CodeBlock.
+        This change allows UnlinkedCodeBlock to dump its bytecode sequence.
+        It is useful because we now have complex phase between UnlinkedCodeBlock and CodeBlock,
+        called Generatorification.
+
+        We introduce BytecodeDumper&lt;Block&gt;. Both CodeBlock and UnlinkedCodeBlock can use
+        this class to dump bytecode sequence.
+
+        And this patch also adds Option::dumpBytecodesBeforeGeneratorification,
+        which dumps unlinked bytecode sequence before generatorification if it is enabled.
+
+        * CMakeLists.txt:
+        * JavaScriptCore.xcodeproj/project.pbxproj:
+        * bytecode/BytecodeDumper.cpp: Added.
+        (JSC::getStructureID):
+        (JSC::getSpecialPointer):
+        (JSC::getPutByIdFlags):
+        (JSC::getToThisStatus):
+        (JSC::getPointer):
+        (JSC::getStructureChain):
+        (JSC::getStructure):
+        (JSC::getCallLinkInfo):
+        (JSC::getBasicBlockLocation):
+        (JSC::BytecodeDumper&lt;Block&gt;::actualPointerFor):
+        (JSC::BytecodeDumper&lt;CodeBlock&gt;::actualPointerFor):
+        (JSC::beginDumpProfiling):
+        (JSC::BytecodeDumper&lt;Block&gt;::dumpValueProfiling):
+        (JSC::BytecodeDumper&lt;CodeBlock&gt;::dumpValueProfiling):
+        (JSC::BytecodeDumper&lt;Block&gt;::dumpArrayProfiling):
+        (JSC::BytecodeDumper&lt;CodeBlock&gt;::dumpArrayProfiling):
+        (JSC::BytecodeDumper&lt;Block&gt;::dumpProfilesForBytecodeOffset):
+        (JSC::dumpRareCaseProfile):
+        (JSC::dumpArithProfile):
+        (JSC::BytecodeDumper&lt;CodeBlock&gt;::dumpProfilesForBytecodeOffset):
+        (JSC::BytecodeDumper&lt;Block&gt;::vm):
+        (JSC::BytecodeDumper&lt;Block&gt;::identifier):
+        (JSC::regexpToSourceString):
+        (JSC::regexpName):
+        (JSC::printLocationAndOp):
+        (JSC::isConstantRegisterIndex):
+        (JSC::debugHookName):
+        (JSC::BytecodeDumper&lt;Block&gt;::registerName):
+        (JSC::idName):
+        (JSC::BytecodeDumper&lt;Block&gt;::constantName):
+        (JSC::BytecodeDumper&lt;Block&gt;::printUnaryOp):
+        (JSC::BytecodeDumper&lt;Block&gt;::printBinaryOp):
+        (JSC::BytecodeDumper&lt;Block&gt;::printConditionalJump):
+        (JSC::BytecodeDumper&lt;Block&gt;::printGetByIdOp):
+        (JSC::dumpStructure):
+        (JSC::dumpChain):
+        (JSC::BytecodeDumper&lt;Block&gt;::printGetByIdCacheStatus):
+        (JSC::BytecodeDumper&lt;Block&gt;::printPutByIdCacheStatus):
+        (JSC::BytecodeDumper&lt;Block&gt;::dumpCallLinkStatus):
+        (JSC::BytecodeDumper&lt;CodeBlock&gt;::dumpCallLinkStatus):
+        (JSC::BytecodeDumper&lt;Block&gt;::printCallOp):
+        (JSC::BytecodeDumper&lt;Block&gt;::printPutByIdOp):
+        (JSC::BytecodeDumper&lt;Block&gt;::printLocationOpAndRegisterOperand):
+        (JSC::BytecodeDumper&lt;Block&gt;::dumpBytecode):
+        (JSC::BytecodeDumper&lt;Block&gt;::dumpIdentifiers):
+        (JSC::BytecodeDumper&lt;Block&gt;::dumpConstants):
+        (JSC::BytecodeDumper&lt;Block&gt;::dumpRegExps):
+        (JSC::BytecodeDumper&lt;Block&gt;::dumpExceptionHandlers):
+        (JSC::BytecodeDumper&lt;Block&gt;::dumpSwitchJumpTables):
+        (JSC::BytecodeDumper&lt;Block&gt;::dumpStringSwitchJumpTables):
+        (JSC::BytecodeDumper&lt;Block&gt;::dumpBlock):
+        * bytecode/BytecodeDumper.h: Added.
+        (JSC::BytecodeDumper::BytecodeDumper):
+        (JSC::BytecodeDumper::block):
+        (JSC::BytecodeDumper::instructionsBegin):
+        * bytecode/BytecodeGeneratorification.cpp:
+        (JSC::BytecodeGeneratorification::BytecodeGeneratorification):
+        (JSC::performGeneratorification):
+        * bytecode/BytecodeLivenessAnalysis.cpp:
+        (JSC::BytecodeLivenessAnalysis::dumpResults):
+        * bytecode/CodeBlock.cpp:
+        (JSC::CodeBlock::dumpBytecode):
+        (JSC::CodeBlock::finishCreation):
+        (JSC::CodeBlock::propagateTransitions):
+        (JSC::CodeBlock::finalizeLLIntInlineCaches):
+        (JSC::CodeBlock::hasOpDebugForLineAndColumn):
+        (JSC::CodeBlock::usesOpcode):
+        (JSC::CodeBlock::valueProfileForBytecodeOffset):
+        (JSC::CodeBlock::arithProfileForPC):
+        (JSC::CodeBlock::insertBasicBlockBoundariesForControlFlowProfiler):
+        (JSC::idName): Deleted.
+        (JSC::CodeBlock::registerName): Deleted.
+        (JSC::CodeBlock::constantName): Deleted.
+        (JSC::regexpToSourceString): Deleted.
+        (JSC::regexpName): Deleted.
+        (JSC::debugHookName): Deleted.
+        (JSC::CodeBlock::printUnaryOp): Deleted.
+        (JSC::CodeBlock::printBinaryOp): Deleted.
+        (JSC::CodeBlock::printConditionalJump): Deleted.
+        (JSC::CodeBlock::printGetByIdOp): Deleted.
+        (JSC::dumpStructure): Deleted.
+        (JSC::dumpChain): Deleted.
+        (JSC::CodeBlock::printGetByIdCacheStatus): Deleted.
+        (JSC::CodeBlock::printPutByIdCacheStatus): Deleted.
+        (JSC::CodeBlock::printCallOp): Deleted.
+        (JSC::CodeBlock::printPutByIdOp): Deleted.
+        (JSC::CodeBlock::dumpExceptionHandlers): Deleted.
+        (JSC::CodeBlock::beginDumpProfiling): Deleted.
+        (JSC::CodeBlock::dumpValueProfiling): Deleted.
+        (JSC::CodeBlock::dumpArrayProfiling): Deleted.
+        (JSC::CodeBlock::dumpRareCaseProfile): Deleted.
+        (JSC::CodeBlock::dumpArithProfile): Deleted.
+        (JSC::CodeBlock::printLocationAndOp): Deleted.
+        (JSC::CodeBlock::printLocationOpAndRegisterOperand): Deleted.
+        * bytecode/CodeBlock.h:
+        (JSC::CodeBlock::constantRegisters):
+        (JSC::CodeBlock::numberOfRegExps):
+        (JSC::CodeBlock::bitVectors):
+        (JSC::CodeBlock::bitVector):
+        * bytecode/HandlerInfo.h:
+        (JSC::HandlerInfoBase::typeName):
+        * bytecode/UnlinkedCodeBlock.cpp:
+        (JSC::UnlinkedCodeBlock::dump):
+        * bytecode/UnlinkedCodeBlock.h:
+        (JSC::UnlinkedCodeBlock::getConstant):
+        * bytecode/UnlinkedInstructionStream.cpp:
+        (JSC::UnlinkedInstructionStream::UnlinkedInstructionStream):
+        * bytecode/UnlinkedInstructionStream.h:
+        (JSC::UnlinkedInstructionStream::Reader::next):
+        * runtime/Options.h:
+
</ins><span class="cx"> 2017-02-28  Mark Lam  &lt;mark.lam@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Change JSLock to stash PlatformThread instead of std::thread::id.
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj (213208 => 213209)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2017-03-01 07:57:08 UTC (rev 213208)
+++ trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2017-03-01 08:15:45 UTC (rev 213209)
</span><span class="lines">@@ -2337,6 +2337,8 @@
</span><span class="cx">                 E3C79CAB1DB9A4DC00D1ECA4 /* DOMJITEffect.h in Headers */ = {isa = PBXBuildFile; fileRef = E3C79CAA1DB9A4D600D1ECA4 /* DOMJITEffect.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 E3D239C81B829C1C00BBEF67 /* JSModuleEnvironment.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E3D239C61B829C1C00BBEF67 /* JSModuleEnvironment.cpp */; };
</span><span class="cx">                 E3D239C91B829C1C00BBEF67 /* JSModuleEnvironment.h in Headers */ = {isa = PBXBuildFile; fileRef = E3D239C71B829C1C00BBEF67 /* JSModuleEnvironment.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><ins>+                E3D877731E65C09E00BE945A /* BytecodeDumper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E3D877711E65C08900BE945A /* BytecodeDumper.cpp */; };
+                E3D877741E65C0A000BE945A /* BytecodeDumper.h in Headers */ = {isa = PBXBuildFile; fileRef = E3D877721E65C08900BE945A /* BytecodeDumper.h */; };
</ins><span class="cx">                 E3EF88741B66DF23003F26CB /* JSPropertyNameIterator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E3EF88721B66DF23003F26CB /* JSPropertyNameIterator.cpp */; };
</span><span class="cx">                 E3EF88751B66DF23003F26CB /* JSPropertyNameIterator.h in Headers */ = {isa = PBXBuildFile; fileRef = E3EF88731B66DF23003F26CB /* JSPropertyNameIterator.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 E3FF75331D9CEA1800C7E16D /* DOMJITGetterSetter.h in Headers */ = {isa = PBXBuildFile; fileRef = E3FF752F1D9CEA1200C7E16D /* DOMJITGetterSetter.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="lines">@@ -4878,6 +4880,8 @@
</span><span class="cx">                 E3D264281D38C042000BE174 /* BytecodeGraph.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BytecodeGraph.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 E3D264291D38C042000BE174 /* BytecodeRewriter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BytecodeRewriter.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 E3D2642A1D38C042000BE174 /* BytecodeRewriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BytecodeRewriter.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                E3D877711E65C08900BE945A /* BytecodeDumper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BytecodeDumper.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                E3D877721E65C08900BE945A /* BytecodeDumper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BytecodeDumper.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 E3EF88721B66DF23003F26CB /* JSPropertyNameIterator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSPropertyNameIterator.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 E3EF88731B66DF23003F26CB /* JSPropertyNameIterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSPropertyNameIterator.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 E3FF752F1D9CEA1200C7E16D /* DOMJITGetterSetter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DOMJITGetterSetter.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -7395,6 +7399,8 @@
</span><span class="cx">                                 C2FCAE0C17A9C24E0034C735 /* BytecodeBasicBlock.cpp */,
</span><span class="cx">                                 C2FCAE0D17A9C24E0034C735 /* BytecodeBasicBlock.h */,
</span><span class="cx">                                 0F21C27E14BEAA8000ADC64B /* BytecodeConventions.h */,
</span><ins>+                                E3D877711E65C08900BE945A /* BytecodeDumper.cpp */,
+                                E3D877721E65C08900BE945A /* BytecodeDumper.h */,
</ins><span class="cx">                                 E3D264261D38C042000BE174 /* BytecodeGeneratorification.cpp */,
</span><span class="cx">                                 E3D264271D38C042000BE174 /* BytecodeGeneratorification.h */,
</span><span class="cx">                                 E3D264281D38C042000BE174 /* BytecodeGraph.h */,
</span><span class="lines">@@ -8487,6 +8493,7 @@
</span><span class="cx">                                 0F0B83AB14BCF5BB00885B4F /* ExpressionRangeInfo.h in Headers */,
</span><span class="cx">                                 A7A8AF3817ADB5F3005AB174 /* Float32Array.h in Headers */,
</span><span class="cx">                                 A7A8AF3917ADB5F3005AB174 /* Float64Array.h in Headers */,
</span><ins>+                                E3D877741E65C0A000BE945A /* BytecodeDumper.h in Headers */,
</ins><span class="cx">                                 0F24E54317EA9F5900ABB217 /* FPRInfo.h in Headers */,
</span><span class="cx">                                 E34EDBF71DB5FFC900DC87A5 /* FrameTracers.h in Headers */,
</span><span class="cx">                                 0F5513A61D5A682C00C32BD8 /* FreeList.h in Headers */,
</span><span class="lines">@@ -10406,6 +10413,7 @@
</span><span class="cx">                                 2A05ABD51961DF2400341750 /* JSPropertyNameEnumerator.cpp in Sources */,
</span><span class="cx">                                 E3EF88741B66DF23003F26CB /* JSPropertyNameIterator.cpp in Sources */,
</span><span class="cx">                                 862553D116136DA9009F17D0 /* JSProxy.cpp in Sources */,
</span><ins>+                                E3D877731E65C09E00BE945A /* BytecodeDumper.cpp in Sources */,
</ins><span class="cx">                                 A552C37F1ADDB8FE00139726 /* JSRemoteInspector.cpp in Sources */,
</span><span class="cx">                                 9928FF3B18AC4AEC00B8CF12 /* JSReplayInputs.cpp in Sources */,
</span><span class="cx">                                 14874AE515EBDE4A002E3587 /* JSScope.cpp in Sources */,
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeBytecodeDumpercpp"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/bytecode/BytecodeDumper.cpp (0 => 213209)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/BytecodeDumper.cpp                                (rev 0)
+++ trunk/Source/JavaScriptCore/bytecode/BytecodeDumper.cpp        2017-03-01 08:15:45 UTC (rev 213209)
</span><span class="lines">@@ -0,0 +1,1797 @@
</span><ins>+/*
+ * Copyright (C) 2017 Yusuke Suzuki &lt;utatane.tea@gmail.com&gt;
+ *
+ * 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. AND ITS CONTRIBUTORS ``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 ITS 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;BytecodeDumper.h&quot;
+
+#include &quot;ArithProfile.h&quot;
+#include &quot;CallLinkStatus.h&quot;
+#include &quot;CodeBlock.h&quot;
+#include &quot;Error.h&quot;
+#include &quot;HeapInlines.h&quot;
+#include &quot;InterpreterInlines.h&quot;
+#include &quot;PolymorphicAccess.h&quot;
+#include &quot;PutByIdFlags.h&quot;
+#include &quot;StructureInlines.h&quot;
+#include &quot;ToThisStatus.h&quot;
+#include &quot;UnlinkedCodeBlock.h&quot;
+
+namespace JSC {
+
+static StructureID getStructureID(const Instruction&amp; instruction)
+{
+    return instruction.u.structureID;
+}
+
+static StructureID getStructureID(const UnlinkedInstruction&amp;)
+{
+    return 0;
+}
+
+static Special::Pointer getSpecialPointer(const Instruction&amp; instruction)
+{
+    return instruction.u.specialPointer;
+}
+
+static Special::Pointer getSpecialPointer(const UnlinkedInstruction&amp; instruction)
+{
+    return static_cast&lt;Special::Pointer&gt;(instruction.u.operand);
+}
+
+static PutByIdFlags getPutByIdFlags(const Instruction&amp; instruction)
+{
+    return instruction.u.putByIdFlags;
+}
+
+static PutByIdFlags getPutByIdFlags(const UnlinkedInstruction&amp; instruction)
+{
+    return static_cast&lt;PutByIdFlags&gt;(instruction.u.operand);
+}
+
+static ToThisStatus getToThisStatus(const Instruction&amp; instruction)
+{
+    return instruction.u.toThisStatus;
+}
+
+static ToThisStatus getToThisStatus(const UnlinkedInstruction&amp; instruction)
+{
+    return static_cast&lt;ToThisStatus&gt;(instruction.u.operand);
+}
+
+static void* getPointer(const Instruction&amp; instruction)
+{
+    return instruction.u.pointer;
+}
+
+static void* getPointer(const UnlinkedInstruction&amp;)
+{
+    return nullptr;
+}
+
+static StructureChain* getStructureChain(const Instruction&amp; instruction)
+{
+    return instruction.u.structureChain.get();
+}
+
+static StructureChain* getStructureChain(const UnlinkedInstruction&amp;)
+{
+    return nullptr;
+}
+
+static Structure* getStructure(const Instruction&amp; instruction)
+{
+    return instruction.u.structure.get();
+}
+
+static Structure* getStructure(const UnlinkedInstruction&amp;)
+{
+    return nullptr;
+}
+
+static LLIntCallLinkInfo* getCallLinkInfo(const Instruction&amp; instruction)
+{
+    return instruction.u.callLinkInfo;
+}
+
+static LLIntCallLinkInfo* getCallLinkInfo(const UnlinkedInstruction&amp;)
+{
+    return nullptr;
+}
+
+static BasicBlockLocation* getBasicBlockLocation(const Instruction&amp; instruction)
+{
+    return instruction.u.basicBlockLocation;
+}
+
+static BasicBlockLocation* getBasicBlockLocation(const UnlinkedInstruction&amp;)
+{
+    return nullptr;
+}
+
+template&lt;class Block&gt;
+void* BytecodeDumper&lt;Block&gt;::actualPointerFor(Special::Pointer) const
+{
+    return nullptr;
+}
+
+template&lt;&gt;
+void* BytecodeDumper&lt;CodeBlock&gt;::actualPointerFor(Special::Pointer pointer) const
+{
+    return block()-&gt;globalObject()-&gt;actualPointerFor(pointer);
+}
+
+static void beginDumpProfiling(PrintStream&amp; out, bool&amp; hasPrintedProfiling)
+{
+    if (hasPrintedProfiling) {
+        out.print(&quot;; &quot;);
+        return;
+    }
+
+    out.print(&quot;    &quot;);
+    hasPrintedProfiling = true;
+}
+
+template&lt;class Block&gt;
+void BytecodeDumper&lt;Block&gt;::dumpValueProfiling(PrintStream&amp;, const typename Block::Instruction*&amp; it, bool&amp;)
+{
+    ++it;
+}
+
+template&lt;&gt;
+void BytecodeDumper&lt;CodeBlock&gt;::dumpValueProfiling(PrintStream&amp; out, const typename CodeBlock::Instruction*&amp; it, bool&amp; hasPrintedProfiling)
+{
+    ConcurrentJSLocker locker(block()-&gt;m_lock);
+
+    ++it;
+    CString description = it-&gt;u.profile-&gt;briefDescription(locker);
+    if (!description.length())
+        return;
+    beginDumpProfiling(out, hasPrintedProfiling);
+    out.print(description);
+}
+
+template&lt;class Block&gt;
+void BytecodeDumper&lt;Block&gt;::dumpArrayProfiling(PrintStream&amp;, const typename Block::Instruction*&amp; it, bool&amp;)
+{
+    ++it;
+}
+
+template&lt;&gt;
+void BytecodeDumper&lt;CodeBlock&gt;::dumpArrayProfiling(PrintStream&amp; out, const typename CodeBlock::Instruction*&amp; it, bool&amp; hasPrintedProfiling)
+{
+    ConcurrentJSLocker locker(block()-&gt;m_lock);
+
+    ++it;
+    if (!it-&gt;u.arrayProfile)
+        return;
+    CString description = it-&gt;u.arrayProfile-&gt;briefDescription(locker, block());
+    if (!description.length())
+        return;
+    beginDumpProfiling(out, hasPrintedProfiling);
+    out.print(description);
+}
+
+template&lt;class Block&gt;
+void BytecodeDumper&lt;Block&gt;::dumpProfilesForBytecodeOffset(PrintStream&amp;, unsigned, bool&amp;)
+{
+}
+
+static void dumpRareCaseProfile(PrintStream&amp; out, const char* name, RareCaseProfile* profile, bool&amp; hasPrintedProfiling)
+{
+    if (!profile || !profile-&gt;m_counter)
+        return;
+
+    beginDumpProfiling(out, hasPrintedProfiling);
+    out.print(name, profile-&gt;m_counter);
+}
+
+static void dumpArithProfile(PrintStream&amp; out, ArithProfile* profile, bool&amp; hasPrintedProfiling)
+{
+    if (!profile)
+        return;
+
+    beginDumpProfiling(out, hasPrintedProfiling);
+    out.print(&quot;results: &quot;, *profile);
+}
+
+template&lt;&gt;
+void BytecodeDumper&lt;CodeBlock&gt;::dumpProfilesForBytecodeOffset(PrintStream&amp; out, unsigned location, bool&amp; hasPrintedProfiling)
+{
+    dumpRareCaseProfile(out, &quot;rare case: &quot;, block()-&gt;rareCaseProfileForBytecodeOffset(location), hasPrintedProfiling);
+    {
+        dumpArithProfile(out, block()-&gt;arithProfileForBytecodeOffset(location), hasPrintedProfiling);
+    }
+
+#if ENABLE(DFG_JIT)
+    Vector&lt;DFG::FrequentExitSite&gt; exitSites = block()-&gt;exitProfile().exitSitesFor(location);
+    if (!exitSites.isEmpty()) {
+        out.print(&quot; !! frequent exits: &quot;);
+        CommaPrinter comma;
+        for (auto&amp; exitSite : exitSites)
+            out.print(comma, exitSite.kind(), &quot; &quot;, exitSite.jitType());
+    }
+#else // ENABLE(DFG_JIT)
+    UNUSED_PARAM(location);
+#endif // ENABLE(DFG_JIT)
+}
+
+template&lt;class Block&gt;
+VM* BytecodeDumper&lt;Block&gt;::vm() const
+{
+    return block()-&gt;vm();
+}
+
+template&lt;class Block&gt;
+const Identifier&amp; BytecodeDumper&lt;Block&gt;::identifier(int index) const
+{
+    return block()-&gt;identifier(index);
+}
+
+static CString regexpToSourceString(RegExp* regExp)
+{
+    char postfix[5] = { '/', 0, 0, 0, 0 };
+    int index = 1;
+    if (regExp-&gt;global())
+        postfix[index++] = 'g';
+    if (regExp-&gt;ignoreCase())
+        postfix[index++] = 'i';
+    if (regExp-&gt;multiline())
+        postfix[index] = 'm';
+    if (regExp-&gt;sticky())
+        postfix[index++] = 'y';
+    if (regExp-&gt;unicode())
+        postfix[index++] = 'u';
+
+    return toCString(&quot;/&quot;, regExp-&gt;pattern().impl(), postfix);
+}
+
+static CString regexpName(int re, RegExp* regexp)
+{
+    return toCString(regexpToSourceString(regexp), &quot;(@re&quot;, re, &quot;)&quot;);
+}
+
+template&lt;class Instruction&gt;
+static void printLocationAndOp(PrintStream&amp; out, int location, const Instruction*&amp;, const char* op)
+{
+    out.printf(&quot;[%4d] %-17s &quot;, location, op);
+}
+
+static ALWAYS_INLINE bool isConstantRegisterIndex(int index)
+{
+    return index &gt;= FirstConstantRegisterIndex;
+}
+
+NEVER_INLINE static const char* debugHookName(int debugHookType)
+{
+    switch (static_cast&lt;DebugHookType&gt;(debugHookType)) {
+    case DidEnterCallFrame:
+        return &quot;didEnterCallFrame&quot;;
+    case WillLeaveCallFrame:
+        return &quot;willLeaveCallFrame&quot;;
+    case WillExecuteStatement:
+        return &quot;willExecuteStatement&quot;;
+    case WillExecuteExpression:
+        return &quot;willExecuteExpression&quot;;
+    case WillExecuteProgram:
+        return &quot;willExecuteProgram&quot;;
+    case DidExecuteProgram:
+        return &quot;didExecuteProgram&quot;;
+    case DidReachBreakpoint:
+        return &quot;didReachBreakpoint&quot;;
+    }
+
+    RELEASE_ASSERT_NOT_REACHED();
+    return &quot;&quot;;
+}
+
+template&lt;class Block&gt;
+CString BytecodeDumper&lt;Block&gt;::registerName(int r) const
+{
+    if (isConstantRegisterIndex(r))
+        return constantName(r);
+
+    return toCString(VirtualRegister(r));
+}
+
+static CString idName(int id0, const Identifier&amp; ident)
+{
+    return toCString(ident.impl(), &quot;(@id&quot;, id0, &quot;)&quot;);
+}
+
+template&lt;class Block&gt;
+CString BytecodeDumper&lt;Block&gt;::constantName(int index) const
+{
+    JSValue value = block()-&gt;getConstant(index);
+    return toCString(value, &quot;(&quot;, VirtualRegister(index), &quot;)&quot;);
+}
+
+template&lt;class Block&gt;
+void BytecodeDumper&lt;Block&gt;::printUnaryOp(PrintStream&amp; out, int location, const typename Block::Instruction*&amp; it, const char* op)
+{
+    int r0 = (++it)-&gt;u.operand;
+    int r1 = (++it)-&gt;u.operand;
+
+    printLocationAndOp(out, location, it, op);
+    out.printf(&quot;%s, %s&quot;, registerName(r0).data(), registerName(r1).data());
+}
+
+template&lt;class Block&gt;
+void BytecodeDumper&lt;Block&gt;::printBinaryOp(PrintStream&amp; out, int location, const typename Block::Instruction*&amp; it, const char* op)
+{
+    int r0 = (++it)-&gt;u.operand;
+    int r1 = (++it)-&gt;u.operand;
+    int r2 = (++it)-&gt;u.operand;
+    printLocationAndOp(out, location, it, op);
+    out.printf(&quot;%s, %s, %s&quot;, registerName(r0).data(), registerName(r1).data(), registerName(r2).data());
+}
+
+template&lt;class Block&gt;
+void BytecodeDumper&lt;Block&gt;::printConditionalJump(PrintStream&amp; out, const typename Block::Instruction*, const typename Block::Instruction*&amp; it, int location, const char* op)
+{
+    int r0 = (++it)-&gt;u.operand;
+    int offset = (++it)-&gt;u.operand;
+    printLocationAndOp(out, location, it, op);
+    out.printf(&quot;%s, %d(-&gt;%d)&quot;, registerName(r0).data(), offset, location + offset);
+}
+
+template&lt;class Block&gt;
+void BytecodeDumper&lt;Block&gt;::printGetByIdOp(PrintStream&amp; out, int location, const typename Block::Instruction*&amp; it)
+{
+    const char* op;
+    switch (vm()-&gt;interpreter-&gt;getOpcodeID(*it)) {
+    case op_get_by_id:
+        op = &quot;get_by_id&quot;;
+        break;
+    case op_get_by_id_proto_load:
+        op = &quot;get_by_id_proto_load&quot;;
+        break;
+    case op_get_by_id_unset:
+        op = &quot;get_by_id_unset&quot;;
+        break;
+    case op_get_array_length:
+        op = &quot;array_length&quot;;
+        break;
+    default:
+        RELEASE_ASSERT_NOT_REACHED();
+#if COMPILER_QUIRK(CONSIDERS_UNREACHABLE_CODE)
+        op = 0;
+#endif
+    }
+    int r0 = (++it)-&gt;u.operand;
+    int r1 = (++it)-&gt;u.operand;
+    int id0 = (++it)-&gt;u.operand;
+    printLocationAndOp(out, location, it, op);
+    out.printf(&quot;%s, %s, %s&quot;, registerName(r0).data(), registerName(r1).data(), idName(id0, identifier(id0)).data());
+    it += 4; // Increment up to the value profiler.
+}
+
+static void dumpStructure(PrintStream&amp; out, const char* name, Structure* structure, const Identifier&amp; ident)
+{
+    if (!structure)
+        return;
+
+    out.printf(&quot;%s = %p&quot;, name, structure);
+
+    PropertyOffset offset = structure-&gt;getConcurrently(ident.impl());
+    if (offset != invalidOffset)
+        out.printf(&quot; (offset = %d)&quot;, offset);
+}
+
+static void dumpChain(PrintStream&amp; out, StructureChain* chain, const Identifier&amp; ident)
+{
+    out.printf(&quot;chain = %p: [&quot;, chain);
+    bool first = true;
+    for (WriteBarrier&lt;Structure&gt;* currentStructure = chain-&gt;head(); *currentStructure; ++currentStructure) {
+        if (first)
+            first = false;
+        else
+            out.printf(&quot;, &quot;);
+        dumpStructure(out, &quot;struct&quot;, currentStructure-&gt;get(), ident);
+    }
+    out.printf(&quot;]&quot;);
+}
+
+template&lt;class Block&gt;
+void BytecodeDumper&lt;Block&gt;::printGetByIdCacheStatus(PrintStream&amp; out, int location, const StubInfoMap&amp; map)
+{
+    const auto* instruction = instructionsBegin() + location;
+
+    const Identifier&amp; ident = identifier(instruction[3].u.operand);
+
+    UNUSED_PARAM(ident); // tell the compiler to shut up in certain platform configurations.
+
+    if (vm()-&gt;interpreter-&gt;getOpcodeID(instruction[0]) == op_get_array_length)
+        out.printf(&quot; llint(array_length)&quot;);
+    else if (StructureID structureID = getStructureID(instruction[4])) {
+        Structure* structure = vm()-&gt;heap.structureIDTable().get(structureID);
+        out.printf(&quot; llint(&quot;);
+        dumpStructure(out, &quot;struct&quot;, structure, ident);
+        out.printf(&quot;)&quot;);
+        if (vm()-&gt;interpreter-&gt;getOpcodeID(instruction[0]) == op_get_by_id_proto_load)
+            out.printf(&quot; proto(%p)&quot;, getPointer(instruction[6]));
+    }
+
+#if ENABLE(JIT)
+    if (StructureStubInfo* stubPtr = map.get(CodeOrigin(location))) {
+        StructureStubInfo&amp; stubInfo = *stubPtr;
+        if (stubInfo.resetByGC)
+            out.print(&quot; (Reset By GC)&quot;);
+
+        out.printf(&quot; jit(&quot;);
+
+        Structure* baseStructure = nullptr;
+        PolymorphicAccess* stub = nullptr;
+
+        switch (stubInfo.cacheType) {
+        case CacheType::GetByIdSelf:
+            out.printf(&quot;self&quot;);
+            baseStructure = stubInfo.u.byIdSelf.baseObjectStructure.get();
+            break;
+        case CacheType::Stub:
+            out.printf(&quot;stub&quot;);
+            stub = stubInfo.u.stub;
+            break;
+        case CacheType::Unset:
+            out.printf(&quot;unset&quot;);
+            break;
+        case CacheType::ArrayLength:
+            out.printf(&quot;ArrayLength&quot;);
+            break;
+        default:
+            RELEASE_ASSERT_NOT_REACHED();
+            break;
+        }
+
+        if (baseStructure) {
+            out.printf(&quot;, &quot;);
+            dumpStructure(out, &quot;struct&quot;, baseStructure, ident);
+        }
+
+        if (stub)
+            out.print(&quot;, &quot;, *stub);
+
+        out.printf(&quot;)&quot;);
+    }
+#else
+    UNUSED_PARAM(map);
+#endif
+}
+
+template&lt;class Block&gt;
+void BytecodeDumper&lt;Block&gt;::printPutByIdCacheStatus(PrintStream&amp; out, int location, const StubInfoMap&amp; map)
+{
+    const auto* instruction = instructionsBegin() + location;
+
+    const Identifier&amp; ident = identifier(instruction[2].u.operand);
+
+    UNUSED_PARAM(ident); // tell the compiler to shut up in certain platform configurations.
+
+    out.print(&quot;, &quot;, getPutByIdFlags(instruction[8]));
+
+    if (StructureID structureID = getStructureID(instruction[4])) {
+        Structure* structure = vm()-&gt;heap.structureIDTable().get(structureID);
+        out.print(&quot; llint(&quot;);
+        if (StructureID newStructureID = getStructureID(instruction[6])) {
+            Structure* newStructure = vm()-&gt;heap.structureIDTable().get(newStructureID);
+            dumpStructure(out, &quot;prev&quot;, structure, ident);
+            out.print(&quot;, &quot;);
+            dumpStructure(out, &quot;next&quot;, newStructure, ident);
+            if (StructureChain* chain = getStructureChain(instruction[7])) {
+                out.print(&quot;, &quot;);
+                dumpChain(out, chain, ident);
+            }
+        } else
+            dumpStructure(out, &quot;struct&quot;, structure, ident);
+        out.print(&quot;)&quot;);
+    }
+
+#if ENABLE(JIT)
+    if (StructureStubInfo* stubPtr = map.get(CodeOrigin(location))) {
+        StructureStubInfo&amp; stubInfo = *stubPtr;
+        if (stubInfo.resetByGC)
+            out.print(&quot; (Reset By GC)&quot;);
+
+        out.printf(&quot; jit(&quot;);
+
+        switch (stubInfo.cacheType) {
+        case CacheType::PutByIdReplace:
+            out.print(&quot;replace, &quot;);
+            dumpStructure(out, &quot;struct&quot;, stubInfo.u.byIdSelf.baseObjectStructure.get(), ident);
+            break;
+        case CacheType::Stub: {
+            out.print(&quot;stub, &quot;, *stubInfo.u.stub);
+            break;
+        }
+        case CacheType::Unset:
+            out.printf(&quot;unset&quot;);
+            break;
+        default:
+            RELEASE_ASSERT_NOT_REACHED();
+            break;
+        }
+        out.printf(&quot;)&quot;);
+    }
+#else
+    UNUSED_PARAM(map);
+#endif
+}
+
+#if ENABLE(JIT)
+template&lt;typename Block&gt;
+void BytecodeDumper&lt;Block&gt;::dumpCallLinkStatus(PrintStream&amp;, unsigned, const CallLinkInfoMap&amp;)
+{
+}
+
+template&lt;&gt;
+void BytecodeDumper&lt;CodeBlock&gt;::dumpCallLinkStatus(PrintStream&amp; out, unsigned location, const CallLinkInfoMap&amp; map)
+{
+    if (block()-&gt;jitType() != JITCode::FTLJIT)
+        out.print(&quot; status(&quot;, CallLinkStatus::computeFor(block(), location, map), &quot;)&quot;);
+}
+#endif
+
+template&lt;class Block&gt;
+void BytecodeDumper&lt;Block&gt;::printCallOp(PrintStream&amp; out, int location, const typename Block::Instruction*&amp; it, const char* op, CacheDumpMode cacheDumpMode, bool&amp; hasPrintedProfiling, const CallLinkInfoMap&amp; map)
+{
+    int dst = (++it)-&gt;u.operand;
+    int func = (++it)-&gt;u.operand;
+    int argCount = (++it)-&gt;u.operand;
+    int registerOffset = (++it)-&gt;u.operand;
+    printLocationAndOp(out, location, it, op);
+    out.print(registerName(dst), &quot;, &quot;, registerName(func), &quot;, &quot;, argCount, &quot;, &quot;, registerOffset);
+    out.print(&quot; (this at &quot;, virtualRegisterForArgument(0, -registerOffset), &quot;)&quot;);
+    if (cacheDumpMode == DumpCaches) {
+        LLIntCallLinkInfo* callLinkInfo = getCallLinkInfo(it[1]);
+        if (callLinkInfo-&gt;lastSeenCallee) {
+            out.printf(
+                &quot; llint(%p, exec %p)&quot;,
+                callLinkInfo-&gt;lastSeenCallee.get(),
+                callLinkInfo-&gt;lastSeenCallee-&gt;executable());
+        }
+#if ENABLE(JIT)
+        if (CallLinkInfo* info = map.get(CodeOrigin(location))) {
+            JSFunction* target = info-&gt;lastSeenCallee();
+            if (target)
+                out.printf(&quot; jit(%p, exec %p)&quot;, target, target-&gt;executable());
+        }
+
+        dumpCallLinkStatus(out, location, map);
+#else
+        UNUSED_PARAM(map);
+#endif
+    }
+    ++it;
+    ++it;
+    dumpArrayProfiling(out, it, hasPrintedProfiling);
+    dumpValueProfiling(out, it, hasPrintedProfiling);
+}
+
+template&lt;class Block&gt;
+void BytecodeDumper&lt;Block&gt;::printPutByIdOp(PrintStream&amp; out, int location, const typename Block::Instruction*&amp; it, const char* op)
+{
+    int r0 = (++it)-&gt;u.operand;
+    int id0 = (++it)-&gt;u.operand;
+    int r1 = (++it)-&gt;u.operand;
+    printLocationAndOp(out, location, it, op);
+    out.printf(&quot;%s, %s, %s&quot;, registerName(r0).data(), idName(id0, identifier(id0)).data(), registerName(r1).data());
+    it += 5;
+}
+
+template&lt;class Block&gt;
+void BytecodeDumper&lt;Block&gt;::printLocationOpAndRegisterOperand(PrintStream&amp; out, int location, const typename Block::Instruction*&amp; it, const char* op, int operand)
+{
+    printLocationAndOp(out, location, it, op);
+    out.printf(&quot;%s&quot;, registerName(operand).data());
+}
+
+template&lt;class Block&gt;
+void BytecodeDumper&lt;Block&gt;::dumpBytecode(PrintStream&amp; out, const typename Block::Instruction* begin, const typename Block::Instruction*&amp; it, const StubInfoMap&amp; stubInfos, const CallLinkInfoMap&amp; callLinkInfos)
+{
+    int location = it - begin;
+    bool hasPrintedProfiling = false;
+    OpcodeID opcode = vm()-&gt;interpreter-&gt;getOpcodeID(*it);
+    switch (opcode) {
+    case op_enter: {
+        printLocationAndOp(out, location, it, &quot;enter&quot;);
+        break;
+    }
+    case op_get_scope: {
+        int r0 = (++it)-&gt;u.operand;
+        printLocationOpAndRegisterOperand(out, location, it, &quot;get_scope&quot;, r0);
+        break;
+    }
+    case op_create_direct_arguments: {
+        int r0 = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;create_direct_arguments&quot;);
+        out.printf(&quot;%s&quot;, registerName(r0).data());
+        break;
+    }
+    case op_create_scoped_arguments: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;create_scoped_arguments&quot;);
+        out.printf(&quot;%s, %s&quot;, registerName(r0).data(), registerName(r1).data());
+        break;
+    }
+    case op_create_cloned_arguments: {
+        int r0 = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;create_cloned_arguments&quot;);
+        out.printf(&quot;%s&quot;, registerName(r0).data());
+        break;
+    }
+    case op_argument_count: {
+        int r0 = (++it)-&gt;u.operand;
+        printLocationOpAndRegisterOperand(out, location, it, &quot;argument_count&quot;, r0);
+        break;
+    }
+    case op_get_argument: {
+        int r0 = (++it)-&gt;u.operand;
+        int index = (++it)-&gt;u.operand;
+        printLocationOpAndRegisterOperand(out, location, it, &quot;argument&quot;, r0);
+        out.printf(&quot;, %d&quot;, index);
+        dumpValueProfiling(out, it, hasPrintedProfiling);
+        break;
+    }
+    case op_create_rest: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        unsigned argumentOffset = (++it)-&gt;u.unsignedValue;
+        printLocationAndOp(out, location, it, &quot;create_rest&quot;);
+        out.printf(&quot;%s, %s, &quot;, registerName(r0).data(), registerName(r1).data());
+        out.printf(&quot;ArgumentsOffset: %u&quot;, argumentOffset);
+        break;
+    }
+    case op_get_rest_length: {
+        int r0 = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;get_rest_length&quot;);
+        out.printf(&quot;%s, &quot;, registerName(r0).data());
+        unsigned argumentOffset = (++it)-&gt;u.unsignedValue;
+        out.printf(&quot;ArgumentsOffset: %u&quot;, argumentOffset);
+        break;
+    }
+    case op_create_this: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        unsigned inferredInlineCapacity = (++it)-&gt;u.operand;
+        unsigned cachedFunction = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;create_this&quot;);
+        out.printf(&quot;%s, %s, %u, %u&quot;, registerName(r0).data(), registerName(r1).data(), inferredInlineCapacity, cachedFunction);
+        break;
+    }
+    case op_to_this: {
+        int r0 = (++it)-&gt;u.operand;
+        printLocationOpAndRegisterOperand(out, location, it, &quot;to_this&quot;, r0);
+        Structure* structure = getStructure(*(++it));
+        if (structure)
+            out.print(&quot;, cache(struct = &quot;, RawPointer(structure), &quot;)&quot;);
+        out.print(&quot;, &quot;, getToThisStatus(*(++it)));
+        break;
+    }
+    case op_check_tdz: {
+        int r0 = (++it)-&gt;u.operand;
+        printLocationOpAndRegisterOperand(out, location, it, &quot;op_check_tdz&quot;, r0);
+        break;
+    }
+    case op_new_object: {
+        int r0 = (++it)-&gt;u.operand;
+        unsigned inferredInlineCapacity = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;new_object&quot;);
+        out.printf(&quot;%s, %u&quot;, registerName(r0).data(), inferredInlineCapacity);
+        ++it; // Skip object allocation profile.
+        break;
+    }
+    case op_new_array: {
+        int dst = (++it)-&gt;u.operand;
+        int argv = (++it)-&gt;u.operand;
+        int argc = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;new_array&quot;);
+        out.printf(&quot;%s, %s, %d&quot;, registerName(dst).data(), registerName(argv).data(), argc);
+        ++it; // Skip array allocation profile.
+        break;
+    }
+    case op_new_array_with_spread: {
+        int dst = (++it)-&gt;u.operand;
+        int argv = (++it)-&gt;u.operand;
+        int argc = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;new_array_with_spread&quot;);
+        out.printf(&quot;%s, %s, %d, &quot;, registerName(dst).data(), registerName(argv).data(), argc);
+        unsigned bitVectorIndex = (++it)-&gt;u.unsignedValue;
+        const BitVector&amp; bitVector = block()-&gt;bitVector(bitVectorIndex);
+        out.print(&quot;BitVector:&quot;, bitVectorIndex, &quot;:&quot;);
+        for (unsigned i = 0; i &lt; static_cast&lt;unsigned&gt;(argc); i++) {
+            if (bitVector.get(i))
+                out.print(&quot;1&quot;);
+            else
+                out.print(&quot;0&quot;);
+        }
+        break;
+    }
+    case op_spread: {
+        int dst = (++it)-&gt;u.operand;
+        int arg = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;spread&quot;);
+        out.printf(&quot;%s, %s&quot;, registerName(dst).data(), registerName(arg).data());
+        break;
+    }
+    case op_new_array_with_size: {
+        int dst = (++it)-&gt;u.operand;
+        int length = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;new_array_with_size&quot;);
+        out.printf(&quot;%s, %s&quot;, registerName(dst).data(), registerName(length).data());
+        ++it; // Skip array allocation profile.
+        break;
+    }
+    case op_new_array_buffer: {
+        int dst = (++it)-&gt;u.operand;
+        int argv = (++it)-&gt;u.operand;
+        int argc = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;new_array_buffer&quot;);
+        out.printf(&quot;%s, %d, %d&quot;, registerName(dst).data(), argv, argc);
+        ++it; // Skip array allocation profile.
+        break;
+    }
+    case op_new_regexp: {
+        int r0 = (++it)-&gt;u.operand;
+        int re0 = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;new_regexp&quot;);
+        out.printf(&quot;%s, &quot;, registerName(r0).data());
+        if (r0 &gt;=0 &amp;&amp; r0 &lt; (int)block()-&gt;numberOfRegExps())
+            out.printf(&quot;%s&quot;, regexpName(re0, block()-&gt;regexp(re0)).data());
+        else
+            out.printf(&quot;bad_regexp(%d)&quot;, re0);
+        break;
+    }
+    case op_mov: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;mov&quot;);
+        out.printf(&quot;%s, %s&quot;, registerName(r0).data(), registerName(r1).data());
+        break;
+    }
+    case op_profile_type: {
+        int r0 = (++it)-&gt;u.operand;
+        ++it;
+        ++it;
+        ++it;
+        ++it;
+        printLocationAndOp(out, location, it, &quot;op_profile_type&quot;);
+        out.printf(&quot;%s&quot;, registerName(r0).data());
+        break;
+    }
+    case op_profile_control_flow: {
+        BasicBlockLocation* basicBlockLocation = getBasicBlockLocation(*(++it));
+        printLocationAndOp(out, location, it, &quot;profile_control_flow&quot;);
+        if (basicBlockLocation)
+            out.printf(&quot;[%d, %d]&quot;, basicBlockLocation-&gt;startOffset(), basicBlockLocation-&gt;endOffset());
+        break;
+    }
+    case op_not: {
+        printUnaryOp(out, location, it, &quot;not&quot;);
+        break;
+    }
+    case op_eq: {
+        printBinaryOp(out, location, it, &quot;eq&quot;);
+        break;
+    }
+    case op_eq_null: {
+        printUnaryOp(out, location, it, &quot;eq_null&quot;);
+        break;
+    }
+    case op_neq: {
+        printBinaryOp(out, location, it, &quot;neq&quot;);
+        break;
+    }
+    case op_neq_null: {
+        printUnaryOp(out, location, it, &quot;neq_null&quot;);
+        break;
+    }
+    case op_stricteq: {
+        printBinaryOp(out, location, it, &quot;stricteq&quot;);
+        break;
+    }
+    case op_nstricteq: {
+        printBinaryOp(out, location, it, &quot;nstricteq&quot;);
+        break;
+    }
+    case op_less: {
+        printBinaryOp(out, location, it, &quot;less&quot;);
+        break;
+    }
+    case op_lesseq: {
+        printBinaryOp(out, location, it, &quot;lesseq&quot;);
+        break;
+    }
+    case op_greater: {
+        printBinaryOp(out, location, it, &quot;greater&quot;);
+        break;
+    }
+    case op_greatereq: {
+        printBinaryOp(out, location, it, &quot;greatereq&quot;);
+        break;
+    }
+    case op_inc: {
+        int r0 = (++it)-&gt;u.operand;
+        printLocationOpAndRegisterOperand(out, location, it, &quot;inc&quot;, r0);
+        break;
+    }
+    case op_dec: {
+        int r0 = (++it)-&gt;u.operand;
+        printLocationOpAndRegisterOperand(out, location, it, &quot;dec&quot;, r0);
+        break;
+    }
+    case op_to_number: {
+        printUnaryOp(out, location, it, &quot;to_number&quot;);
+        dumpValueProfiling(out, it, hasPrintedProfiling);
+        break;
+    }
+    case op_to_string: {
+        printUnaryOp(out, location, it, &quot;to_string&quot;);
+        break;
+    }
+    case op_negate: {
+        printUnaryOp(out, location, it, &quot;negate&quot;);
+        ++it; // op_negate has an extra operand for the ArithProfile.
+        break;
+    }
+    case op_add: {
+        printBinaryOp(out, location, it, &quot;add&quot;);
+        ++it;
+        break;
+    }
+    case op_mul: {
+        printBinaryOp(out, location, it, &quot;mul&quot;);
+        ++it;
+        break;
+    }
+    case op_div: {
+        printBinaryOp(out, location, it, &quot;div&quot;);
+        ++it;
+        break;
+    }
+    case op_mod: {
+        printBinaryOp(out, location, it, &quot;mod&quot;);
+        break;
+    }
+    case op_pow: {
+        printBinaryOp(out, location, it, &quot;pow&quot;);
+        break;
+    }
+    case op_sub: {
+        printBinaryOp(out, location, it, &quot;sub&quot;);
+        ++it;
+        break;
+    }
+    case op_lshift: {
+        printBinaryOp(out, location, it, &quot;lshift&quot;);
+        break;
+    }
+    case op_rshift: {
+        printBinaryOp(out, location, it, &quot;rshift&quot;);
+        break;
+    }
+    case op_urshift: {
+        printBinaryOp(out, location, it, &quot;urshift&quot;);
+        break;
+    }
+    case op_bitand: {
+        printBinaryOp(out, location, it, &quot;bitand&quot;);
+        ++it;
+        break;
+    }
+    case op_bitxor: {
+        printBinaryOp(out, location, it, &quot;bitxor&quot;);
+        ++it;
+        break;
+    }
+    case op_bitor: {
+        printBinaryOp(out, location, it, &quot;bitor&quot;);
+        ++it;
+        break;
+    }
+    case op_overrides_has_instance: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        int r2 = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;overrides_has_instance&quot;);
+        out.printf(&quot;%s, %s, %s&quot;, registerName(r0).data(), registerName(r1).data(), registerName(r2).data());
+        break;
+    }
+    case op_instanceof: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        int r2 = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;instanceof&quot;);
+        out.printf(&quot;%s, %s, %s&quot;, registerName(r0).data(), registerName(r1).data(), registerName(r2).data());
+        break;
+    }
+    case op_instanceof_custom: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        int r2 = (++it)-&gt;u.operand;
+        int r3 = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;instanceof_custom&quot;);
+        out.printf(&quot;%s, %s, %s, %s&quot;, registerName(r0).data(), registerName(r1).data(), registerName(r2).data(), registerName(r3).data());
+        break;
+    }
+    case op_unsigned: {
+        printUnaryOp(out, location, it, &quot;unsigned&quot;);
+        break;
+    }
+    case op_typeof: {
+        printUnaryOp(out, location, it, &quot;typeof&quot;);
+        break;
+    }
+    case op_is_empty: {
+        printUnaryOp(out, location, it, &quot;is_empty&quot;);
+        break;
+    }
+    case op_is_undefined: {
+        printUnaryOp(out, location, it, &quot;is_undefined&quot;);
+        break;
+    }
+    case op_is_boolean: {
+        printUnaryOp(out, location, it, &quot;is_boolean&quot;);
+        break;
+    }
+    case op_is_number: {
+        printUnaryOp(out, location, it, &quot;is_number&quot;);
+        break;
+    }
+    case op_is_cell_with_type: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        int type = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;is_cell_with_type&quot;);
+        out.printf(&quot;%s, %s, %d&quot;, registerName(r0).data(), registerName(r1).data(), type);
+        break;
+    }
+    case op_is_object: {
+        printUnaryOp(out, location, it, &quot;is_object&quot;);
+        break;
+    }
+    case op_is_object_or_null: {
+        printUnaryOp(out, location, it, &quot;is_object_or_null&quot;);
+        break;
+    }
+    case op_is_function: {
+        printUnaryOp(out, location, it, &quot;is_function&quot;);
+        break;
+    }
+    case op_in: {
+        printBinaryOp(out, location, it, &quot;in&quot;);
+        dumpArrayProfiling(out, it, hasPrintedProfiling);
+        break;
+    }
+    case op_try_get_by_id: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        int id0 = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;try_get_by_id&quot;);
+        out.printf(&quot;%s, %s, %s&quot;, registerName(r0).data(), registerName(r1).data(), idName(id0, identifier(id0)).data());
+        dumpValueProfiling(out, it, hasPrintedProfiling);
+        break;
+    }
+    case op_get_by_id:
+    case op_get_by_id_proto_load:
+    case op_get_by_id_unset:
+    case op_get_array_length: {
+        printGetByIdOp(out, location, it);
+        printGetByIdCacheStatus(out, location, stubInfos);
+        dumpValueProfiling(out, it, hasPrintedProfiling);
+        break;
+    }
+    case op_get_by_id_with_this: {
+        printLocationAndOp(out, location, it, &quot;get_by_id_with_this&quot;);
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        int r2 = (++it)-&gt;u.operand;
+        int id0 = (++it)-&gt;u.operand;
+        out.printf(&quot;%s, %s, %s, %s&quot;, registerName(r0).data(), registerName(r1).data(), registerName(r2).data(), idName(id0, identifier(id0)).data());
+        dumpValueProfiling(out, it, hasPrintedProfiling);
+        break;
+    }
+    case op_get_by_val_with_this: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        int r2 = (++it)-&gt;u.operand;
+        int r3 = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;get_by_val_with_this&quot;);
+        out.printf(&quot;%s, %s, %s, %s&quot;, registerName(r0).data(), registerName(r1).data(), registerName(r2).data(), registerName(r3).data());
+        dumpValueProfiling(out, it, hasPrintedProfiling);
+        break;
+    }
+    case op_put_by_id: {
+        printPutByIdOp(out, location, it, &quot;put_by_id&quot;);
+        printPutByIdCacheStatus(out, location, stubInfos);
+        break;
+    }
+    case op_put_by_id_with_this: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        int id0 = (++it)-&gt;u.operand;
+        int r2 = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;put_by_id_with_this&quot;);
+        out.printf(&quot;%s, %s, %s, %s&quot;, registerName(r0).data(), registerName(r1).data(), idName(id0, identifier(id0)).data(), registerName(r2).data());
+        break;
+    }
+    case op_put_by_val_with_this: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        int r2 = (++it)-&gt;u.operand;
+        int r3 = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;put_by_val_with_this&quot;);
+        out.printf(&quot;%s, %s, %s, %s&quot;, registerName(r0).data(), registerName(r1).data(), registerName(r2).data(), registerName(r3).data());
+        break;
+    }
+    case op_put_getter_by_id: {
+        int r0 = (++it)-&gt;u.operand;
+        int id0 = (++it)-&gt;u.operand;
+        int n0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;put_getter_by_id&quot;);
+        out.printf(&quot;%s, %s, %d, %s&quot;, registerName(r0).data(), idName(id0, identifier(id0)).data(), n0, registerName(r1).data());
+        break;
+    }
+    case op_put_setter_by_id: {
+        int r0 = (++it)-&gt;u.operand;
+        int id0 = (++it)-&gt;u.operand;
+        int n0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;put_setter_by_id&quot;);
+        out.printf(&quot;%s, %s, %d, %s&quot;, registerName(r0).data(), idName(id0, identifier(id0)).data(), n0, registerName(r1).data());
+        break;
+    }
+    case op_put_getter_setter_by_id: {
+        int r0 = (++it)-&gt;u.operand;
+        int id0 = (++it)-&gt;u.operand;
+        int n0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        int r2 = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;put_getter_setter_by_id&quot;);
+        out.printf(&quot;%s, %s, %d, %s, %s&quot;, registerName(r0).data(), idName(id0, identifier(id0)).data(), n0, registerName(r1).data(), registerName(r2).data());
+        break;
+    }
+    case op_put_getter_by_val: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        int n0 = (++it)-&gt;u.operand;
+        int r2 = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;put_getter_by_val&quot;);
+        out.printf(&quot;%s, %s, %d, %s&quot;, registerName(r0).data(), registerName(r1).data(), n0, registerName(r2).data());
+        break;
+    }
+    case op_put_setter_by_val: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        int n0 = (++it)-&gt;u.operand;
+        int r2 = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;put_setter_by_val&quot;);
+        out.printf(&quot;%s, %s, %d, %s&quot;, registerName(r0).data(), registerName(r1).data(), n0, registerName(r2).data());
+        break;
+    }
+    case op_define_data_property: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        int r2 = (++it)-&gt;u.operand;
+        int r3 = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;define_data_property&quot;);
+        out.printf(&quot;%s, %s, %s, %s&quot;, registerName(r0).data(), registerName(r1).data(), registerName(r2).data(), registerName(r3).data());
+        break;
+    }
+    case op_define_accessor_property: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        int r2 = (++it)-&gt;u.operand;
+        int r3 = (++it)-&gt;u.operand;
+        int r4 = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;define_accessor_property&quot;);
+        out.printf(&quot;%s, %s, %s, %s, %s&quot;, registerName(r0).data(), registerName(r1).data(), registerName(r2).data(), registerName(r3).data(), registerName(r4).data());
+        break;
+    }
+    case op_del_by_id: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        int id0 = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;del_by_id&quot;);
+        out.printf(&quot;%s, %s, %s&quot;, registerName(r0).data(), registerName(r1).data(), idName(id0, identifier(id0)).data());
+        break;
+    }
+    case op_get_by_val: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        int r2 = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;get_by_val&quot;);
+        out.printf(&quot;%s, %s, %s&quot;, registerName(r0).data(), registerName(r1).data(), registerName(r2).data());
+        dumpArrayProfiling(out, it, hasPrintedProfiling);
+        dumpValueProfiling(out, it, hasPrintedProfiling);
+        break;
+    }
+    case op_put_by_val: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        int r2 = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;put_by_val&quot;);
+        out.printf(&quot;%s, %s, %s&quot;, registerName(r0).data(), registerName(r1).data(), registerName(r2).data());
+        dumpArrayProfiling(out, it, hasPrintedProfiling);
+        break;
+    }
+    case op_put_by_val_direct: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        int r2 = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;put_by_val_direct&quot;);
+        out.printf(&quot;%s, %s, %s&quot;, registerName(r0).data(), registerName(r1).data(), registerName(r2).data());
+        dumpArrayProfiling(out, it, hasPrintedProfiling);
+        break;
+    }
+    case op_del_by_val: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        int r2 = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;del_by_val&quot;);
+        out.printf(&quot;%s, %s, %s&quot;, registerName(r0).data(), registerName(r1).data(), registerName(r2).data());
+        break;
+    }
+    case op_put_by_index: {
+        int r0 = (++it)-&gt;u.operand;
+        unsigned n0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;put_by_index&quot;);
+        out.printf(&quot;%s, %u, %s&quot;, registerName(r0).data(), n0, registerName(r1).data());
+        break;
+    }
+    case op_jmp: {
+        int offset = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;jmp&quot;);
+        out.printf(&quot;%d(-&gt;%d)&quot;, offset, location + offset);
+        break;
+    }
+    case op_jtrue: {
+        printConditionalJump(out, begin, it, location, &quot;jtrue&quot;);
+        break;
+    }
+    case op_jfalse: {
+        printConditionalJump(out, begin, it, location, &quot;jfalse&quot;);
+        break;
+    }
+    case op_jeq_null: {
+        printConditionalJump(out, begin, it, location, &quot;jeq_null&quot;);
+        break;
+    }
+    case op_jneq_null: {
+        printConditionalJump(out, begin, it, location, &quot;jneq_null&quot;);
+        break;
+    }
+    case op_jneq_ptr: {
+        int r0 = (++it)-&gt;u.operand;
+        Special::Pointer pointer = getSpecialPointer(*(++it));
+        int offset = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;jneq_ptr&quot;);
+        out.printf(&quot;%s, %d (%p), %d(-&gt;%d)&quot;, registerName(r0).data(), pointer, actualPointerFor(pointer), offset, location + offset);
+        ++it;
+        break;
+    }
+    case op_jless: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        int offset = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;jless&quot;);
+        out.printf(&quot;%s, %s, %d(-&gt;%d)&quot;, registerName(r0).data(), registerName(r1).data(), offset, location + offset);
+        break;
+    }
+    case op_jlesseq: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        int offset = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;jlesseq&quot;);
+        out.printf(&quot;%s, %s, %d(-&gt;%d)&quot;, registerName(r0).data(), registerName(r1).data(), offset, location + offset);
+        break;
+    }
+    case op_jgreater: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        int offset = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;jgreater&quot;);
+        out.printf(&quot;%s, %s, %d(-&gt;%d)&quot;, registerName(r0).data(), registerName(r1).data(), offset, location + offset);
+        break;
+    }
+    case op_jgreatereq: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        int offset = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;jgreatereq&quot;);
+        out.printf(&quot;%s, %s, %d(-&gt;%d)&quot;, registerName(r0).data(), registerName(r1).data(), offset, location + offset);
+        break;
+    }
+    case op_jnless: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        int offset = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;jnless&quot;);
+        out.printf(&quot;%s, %s, %d(-&gt;%d)&quot;, registerName(r0).data(), registerName(r1).data(), offset, location + offset);
+        break;
+    }
+    case op_jnlesseq: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        int offset = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;jnlesseq&quot;);
+        out.printf(&quot;%s, %s, %d(-&gt;%d)&quot;, registerName(r0).data(), registerName(r1).data(), offset, location + offset);
+        break;
+    }
+    case op_jngreater: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        int offset = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;jngreater&quot;);
+        out.printf(&quot;%s, %s, %d(-&gt;%d)&quot;, registerName(r0).data(), registerName(r1).data(), offset, location + offset);
+        break;
+    }
+    case op_jngreatereq: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        int offset = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;jngreatereq&quot;);
+        out.printf(&quot;%s, %s, %d(-&gt;%d)&quot;, registerName(r0).data(), registerName(r1).data(), offset, location + offset);
+        break;
+    }
+    case op_loop_hint: {
+        printLocationAndOp(out, location, it, &quot;loop_hint&quot;);
+        break;
+    }
+    case op_check_traps: {
+        printLocationAndOp(out, location, it, &quot;check_traps&quot;);
+        break;
+    }
+    case op_log_shadow_chicken_prologue: {
+        int r0 = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;log_shadow_chicken_prologue&quot;);
+        out.printf(&quot;%s&quot;, registerName(r0).data());
+        break;
+    }
+    case op_log_shadow_chicken_tail: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;log_shadow_chicken_tail&quot;);
+        out.printf(&quot;%s, %s&quot;, registerName(r0).data(), registerName(r1).data());
+        break;
+    }
+    case op_switch_imm: {
+        int tableIndex = (++it)-&gt;u.operand;
+        int defaultTarget = (++it)-&gt;u.operand;
+        int scrutineeRegister = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;switch_imm&quot;);
+        out.printf(&quot;%d, %d(-&gt;%d), %s&quot;, tableIndex, defaultTarget, location + defaultTarget, registerName(scrutineeRegister).data());
+        break;
+    }
+    case op_switch_char: {
+        int tableIndex = (++it)-&gt;u.operand;
+        int defaultTarget = (++it)-&gt;u.operand;
+        int scrutineeRegister = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;switch_char&quot;);
+        out.printf(&quot;%d, %d(-&gt;%d), %s&quot;, tableIndex, defaultTarget, location + defaultTarget, registerName(scrutineeRegister).data());
+        break;
+    }
+    case op_switch_string: {
+        int tableIndex = (++it)-&gt;u.operand;
+        int defaultTarget = (++it)-&gt;u.operand;
+        int scrutineeRegister = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;switch_string&quot;);
+        out.printf(&quot;%d, %d(-&gt;%d), %s&quot;, tableIndex, defaultTarget, location + defaultTarget, registerName(scrutineeRegister).data());
+        break;
+    }
+    case op_new_func: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        int f0 = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;new_func&quot;);
+        out.printf(&quot;%s, %s, f%d&quot;, registerName(r0).data(), registerName(r1).data(), f0);
+        break;
+    }
+    case op_new_generator_func: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        int f0 = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;new_generator_func&quot;);
+        out.printf(&quot;%s, %s, f%d&quot;, registerName(r0).data(), registerName(r1).data(), f0);
+        break;
+    }
+    case op_new_async_func: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        int f0 = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;new_async_func&quot;);
+        out.printf(&quot;%s, %s, f%d&quot;, registerName(r0).data(), registerName(r1).data(), f0);
+        break;
+    }
+    case op_new_func_exp: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        int f0 = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;new_func_exp&quot;);
+        out.printf(&quot;%s, %s, f%d&quot;, registerName(r0).data(), registerName(r1).data(), f0);
+        break;
+    }
+    case op_new_generator_func_exp: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        int f0 = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;new_generator_func_exp&quot;);
+        out.printf(&quot;%s, %s, f%d&quot;, registerName(r0).data(), registerName(r1).data(), f0);
+        break;
+    }
+    case op_new_async_func_exp: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        int f0 = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;new_async_func_exp&quot;);
+        out.printf(&quot;%s, %s, f%d&quot;, registerName(r0).data(), registerName(r1).data(), f0);
+        break;
+    }
+    case op_set_function_name: {
+        int funcReg = (++it)-&gt;u.operand;
+        int nameReg = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;set_function_name&quot;);
+        out.printf(&quot;%s, %s&quot;, registerName(funcReg).data(), registerName(nameReg).data());
+        break;
+    }
+    case op_call: {
+        printCallOp(out, location, it, &quot;call&quot;, DumpCaches, hasPrintedProfiling, callLinkInfos);
+        break;
+    }
+    case op_tail_call: {
+        printCallOp(out, location, it, &quot;tail_call&quot;, DumpCaches, hasPrintedProfiling, callLinkInfos);
+        break;
+    }
+    case op_call_eval: {
+        printCallOp(out, location, it, &quot;call_eval&quot;, DontDumpCaches, hasPrintedProfiling, callLinkInfos);
+        break;
+    }
+
+    case op_construct_varargs:
+    case op_call_varargs:
+    case op_tail_call_varargs:
+    case op_tail_call_forward_arguments: {
+        int result = (++it)-&gt;u.operand;
+        int callee = (++it)-&gt;u.operand;
+        int thisValue = (++it)-&gt;u.operand;
+        int arguments = (++it)-&gt;u.operand;
+        int firstFreeRegister = (++it)-&gt;u.operand;
+        int varArgOffset = (++it)-&gt;u.operand;
+        ++it;
+        const char* opName;
+        if (opcode == op_call_varargs)
+            opName = &quot;call_varargs&quot;;
+        else if (opcode == op_construct_varargs)
+            opName = &quot;construct_varargs&quot;;
+        else if (opcode == op_tail_call_varargs)
+            opName = &quot;tail_call_varargs&quot;;
+        else if (opcode == op_tail_call_forward_arguments)
+            opName = &quot;tail_call_forward_arguments&quot;;
+        else
+            RELEASE_ASSERT_NOT_REACHED();
+
+        printLocationAndOp(out, location, it, opName);
+        out.printf(&quot;%s, %s, %s, %s, %d, %d&quot;, registerName(result).data(), registerName(callee).data(), registerName(thisValue).data(), registerName(arguments).data(), firstFreeRegister, varArgOffset);
+        dumpValueProfiling(out, it, hasPrintedProfiling);
+        break;
+    }
+
+    case op_ret: {
+        int r0 = (++it)-&gt;u.operand;
+        printLocationOpAndRegisterOperand(out, location, it, &quot;ret&quot;, r0);
+        break;
+    }
+    case op_construct: {
+        printCallOp(out, location, it, &quot;construct&quot;, DumpCaches, hasPrintedProfiling, callLinkInfos);
+        break;
+    }
+    case op_strcat: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        int count = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;strcat&quot;);
+        out.printf(&quot;%s, %s, %d&quot;, registerName(r0).data(), registerName(r1).data(), count);
+        break;
+    }
+    case op_to_primitive: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;to_primitive&quot;);
+        out.printf(&quot;%s, %s&quot;, registerName(r0).data(), registerName(r1).data());
+        break;
+    }
+    case op_get_enumerable_length: {
+        int dst = it[1].u.operand;
+        int base = it[2].u.operand;
+        printLocationAndOp(out, location, it, &quot;op_get_enumerable_length&quot;);
+        out.printf(&quot;%s, %s&quot;, registerName(dst).data(), registerName(base).data());
+        it += OPCODE_LENGTH(op_get_enumerable_length) - 1;
+        break;
+    }
+    case op_has_indexed_property: {
+        int dst = (++it)-&gt;u.operand;
+        int base = (++it)-&gt;u.operand;
+        int propertyName = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;op_has_indexed_property&quot;);
+        out.printf(&quot;%s, %s, %s&quot;, registerName(dst).data(), registerName(base).data(), registerName(propertyName).data());
+        dumpArrayProfiling(out, it, hasPrintedProfiling);
+        break;
+    }
+    case op_has_structure_property: {
+        int dst = it[1].u.operand;
+        int base = it[2].u.operand;
+        int propertyName = it[3].u.operand;
+        int enumerator = it[4].u.operand;
+        printLocationAndOp(out, location, it, &quot;op_has_structure_property&quot;);
+        out.printf(&quot;%s, %s, %s, %s&quot;, registerName(dst).data(), registerName(base).data(), registerName(propertyName).data(), registerName(enumerator).data());
+        it += OPCODE_LENGTH(op_has_structure_property) - 1;
+        break;
+    }
+    case op_has_generic_property: {
+        int dst = it[1].u.operand;
+        int base = it[2].u.operand;
+        int propertyName = it[3].u.operand;
+        printLocationAndOp(out, location, it, &quot;op_has_generic_property&quot;);
+        out.printf(&quot;%s, %s, %s&quot;, registerName(dst).data(), registerName(base).data(), registerName(propertyName).data());
+        it += OPCODE_LENGTH(op_has_generic_property) - 1;
+        break;
+    }
+    case op_get_direct_pname: {
+        int dst = (++it)-&gt;u.operand;
+        int base = (++it)-&gt;u.operand;
+        int propertyName = (++it)-&gt;u.operand;
+        int index = (++it)-&gt;u.operand;
+        int enumerator = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;op_get_direct_pname&quot;);
+        out.printf(&quot;%s, %s, %s, %s, %s&quot;, registerName(dst).data(), registerName(base).data(), registerName(propertyName).data(), registerName(index).data(), registerName(enumerator).data());
+        dumpValueProfiling(out, it, hasPrintedProfiling);
+        break;
+
+    }
+    case op_get_property_enumerator: {
+        int dst = it[1].u.operand;
+        int base = it[2].u.operand;
+        printLocationAndOp(out, location, it, &quot;op_get_property_enumerator&quot;);
+        out.printf(&quot;%s, %s&quot;, registerName(dst).data(), registerName(base).data());
+        it += OPCODE_LENGTH(op_get_property_enumerator) - 1;
+        break;
+    }
+    case op_enumerator_structure_pname: {
+        int dst = it[1].u.operand;
+        int enumerator = it[2].u.operand;
+        int index = it[3].u.operand;
+        printLocationAndOp(out, location, it, &quot;op_enumerator_structure_pname&quot;);
+        out.printf(&quot;%s, %s, %s&quot;, registerName(dst).data(), registerName(enumerator).data(), registerName(index).data());
+        it += OPCODE_LENGTH(op_enumerator_structure_pname) - 1;
+        break;
+    }
+    case op_enumerator_generic_pname: {
+        int dst = it[1].u.operand;
+        int enumerator = it[2].u.operand;
+        int index = it[3].u.operand;
+        printLocationAndOp(out, location, it, &quot;op_enumerator_generic_pname&quot;);
+        out.printf(&quot;%s, %s, %s&quot;, registerName(dst).data(), registerName(enumerator).data(), registerName(index).data());
+        it += OPCODE_LENGTH(op_enumerator_generic_pname) - 1;
+        break;
+    }
+    case op_to_index_string: {
+        int dst = it[1].u.operand;
+        int index = it[2].u.operand;
+        printLocationAndOp(out, location, it, &quot;op_to_index_string&quot;);
+        out.printf(&quot;%s, %s&quot;, registerName(dst).data(), registerName(index).data());
+        it += OPCODE_LENGTH(op_to_index_string) - 1;
+        break;
+    }
+    case op_push_with_scope: {
+        int dst = (++it)-&gt;u.operand;
+        int newScope = (++it)-&gt;u.operand;
+        int currentScope = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;push_with_scope&quot;);
+        out.printf(&quot;%s, %s, %s&quot;, registerName(dst).data(), registerName(newScope).data(), registerName(currentScope).data());
+        break;
+    }
+    case op_get_parent_scope: {
+        int dst = (++it)-&gt;u.operand;
+        int parentScope = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;get_parent_scope&quot;);
+        out.printf(&quot;%s, %s&quot;, registerName(dst).data(), registerName(parentScope).data());
+        break;
+    }
+    case op_create_lexical_environment: {
+        int dst = (++it)-&gt;u.operand;
+        int scope = (++it)-&gt;u.operand;
+        int symbolTable = (++it)-&gt;u.operand;
+        int initialValue = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;create_lexical_environment&quot;);
+        out.printf(&quot;%s, %s, %s, %s&quot;,
+            registerName(dst).data(), registerName(scope).data(), registerName(symbolTable).data(), registerName(initialValue).data());
+        break;
+    }
+    case op_catch: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;catch&quot;);
+        out.printf(&quot;%s, %s&quot;, registerName(r0).data(), registerName(r1).data());
+        break;
+    }
+    case op_throw: {
+        int r0 = (++it)-&gt;u.operand;
+        printLocationOpAndRegisterOperand(out, location, it, &quot;throw&quot;, r0);
+        break;
+    }
+    case op_throw_static_error: {
+        int k0 = (++it)-&gt;u.operand;
+        ErrorType k1 = static_cast&lt;ErrorType&gt;((++it)-&gt;u.unsignedValue);
+        printLocationAndOp(out, location, it, &quot;throw_static_error&quot;);
+        out.printf(&quot;%s, &quot;, constantName(k0).data());
+        out.print(k1);
+        break;
+    }
+    case op_debug: {
+        int debugHookType = (++it)-&gt;u.operand;
+        int hasBreakpointFlag = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;debug&quot;);
+        out.printf(&quot;%s, %d&quot;, debugHookName(debugHookType), hasBreakpointFlag);
+        break;
+    }
+    case op_assert: {
+        int condition = (++it)-&gt;u.operand;
+        int line = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;assert&quot;);
+        out.printf(&quot;%s, %d&quot;, registerName(condition).data(), line);
+        break;
+    }
+    case op_end: {
+        int r0 = (++it)-&gt;u.operand;
+        printLocationOpAndRegisterOperand(out, location, it, &quot;end&quot;, r0);
+        break;
+    }
+    case op_resolve_scope: {
+        int r0 = (++it)-&gt;u.operand;
+        int scope = (++it)-&gt;u.operand;
+        int id0 = (++it)-&gt;u.operand;
+        ResolveType resolveType = static_cast&lt;ResolveType&gt;((++it)-&gt;u.operand);
+        int depth = (++it)-&gt;u.operand;
+        void* pointer = getPointer(*(++it));
+        printLocationAndOp(out, location, it, &quot;resolve_scope&quot;);
+        out.printf(&quot;%s, %s, %s, &lt;%s&gt;, %d, %p&quot;, registerName(r0).data(), registerName(scope).data(), idName(id0, identifier(id0)).data(), resolveTypeName(resolveType), depth, pointer);
+        break;
+    }
+    case op_get_from_scope: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        int id0 = (++it)-&gt;u.operand;
+        GetPutInfo getPutInfo = GetPutInfo((++it)-&gt;u.operand);
+        ++it; // Structure
+        int operand = (++it)-&gt;u.operand; // Operand
+        printLocationAndOp(out, location, it, &quot;get_from_scope&quot;);
+        out.print(registerName(r0), &quot;, &quot;, registerName(r1));
+        if (static_cast&lt;unsigned&gt;(id0) == UINT_MAX)
+            out.print(&quot;, anonymous&quot;);
+        else
+            out.print(&quot;, &quot;, idName(id0, identifier(id0)));
+        out.print(&quot;, &quot;, getPutInfo.operand(), &quot;&lt;&quot;, resolveModeName(getPutInfo.resolveMode()), &quot;|&quot;, resolveTypeName(getPutInfo.resolveType()), &quot;|&quot;, initializationModeName(getPutInfo.initializationMode()), &quot;&gt;, &quot;, operand);
+        dumpValueProfiling(out, it, hasPrintedProfiling);
+        break;
+    }
+    case op_put_to_scope: {
+        int r0 = (++it)-&gt;u.operand;
+        int id0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        GetPutInfo getPutInfo = GetPutInfo((++it)-&gt;u.operand);
+        ++it; // Structure
+        int operand = (++it)-&gt;u.operand; // Operand
+        printLocationAndOp(out, location, it, &quot;put_to_scope&quot;);
+        out.print(registerName(r0));
+        if (static_cast&lt;unsigned&gt;(id0) == UINT_MAX)
+            out.print(&quot;, anonymous&quot;);
+        else
+            out.print(&quot;, &quot;, idName(id0, identifier(id0)));
+        out.print(&quot;, &quot;, registerName(r1), &quot;, &quot;, getPutInfo.operand(), &quot;&lt;&quot;, resolveModeName(getPutInfo.resolveMode()), &quot;|&quot;, resolveTypeName(getPutInfo.resolveType()), &quot;|&quot;, initializationModeName(getPutInfo.initializationMode()), &quot;&gt;, &lt;structure&gt;, &quot;, operand);
+        break;
+    }
+    case op_get_from_arguments: {
+        int r0 = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        int offset = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;get_from_arguments&quot;);
+        out.printf(&quot;%s, %s, %d&quot;, registerName(r0).data(), registerName(r1).data(), offset);
+        dumpValueProfiling(out, it, hasPrintedProfiling);
+        break;
+    }
+    case op_put_to_arguments: {
+        int r0 = (++it)-&gt;u.operand;
+        int offset = (++it)-&gt;u.operand;
+        int r1 = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;put_to_arguments&quot;);
+        out.printf(&quot;%s, %d, %s&quot;, registerName(r0).data(), offset, registerName(r1).data());
+        break;
+    }
+    case op_yield: {
+        int r0 = (++it)-&gt;u.operand;
+        unsigned yieldPoint = (++it)-&gt;u.unsignedValue;
+        int r1 = (++it)-&gt;u.operand;
+        printLocationAndOp(out, location, it, &quot;yield&quot;);
+        out.printf(&quot;%s, %u, %s&quot;, registerName(r0).data(), yieldPoint, registerName(r1).data());
+        break;
+    }
+    default:
+        RELEASE_ASSERT_NOT_REACHED();
+    }
+    dumpProfilesForBytecodeOffset(out, location, hasPrintedProfiling);
+    out.print(&quot;\n&quot;);
+}
+
+template&lt;class Block&gt;
+void BytecodeDumper&lt;Block&gt;::dumpBytecode(Block* block, PrintStream&amp; out, const typename Block::Instruction* begin, const typename Block::Instruction*&amp; it, const StubInfoMap&amp; stubInfos, const CallLinkInfoMap&amp; callLinkInfos)
+{
+    BytecodeDumper dumper(block, begin);
+    dumper.dumpBytecode(out, begin, it, stubInfos, callLinkInfos);
+}
+
+template&lt;class Block&gt;
+void BytecodeDumper&lt;Block&gt;::dumpIdentifiers(PrintStream&amp; out)
+{
+    if (size_t count = block()-&gt;numberOfIdentifiers()) {
+        out.printf(&quot;\nIdentifiers:\n&quot;);
+        size_t i = 0;
+        do {
+            out.printf(&quot;  id%u = %s\n&quot;, static_cast&lt;unsigned&gt;(i), identifier(i).string().utf8().data());
+            ++i;
+        } while (i != count);
+    }
+}
+
+template&lt;class Block&gt;
+void BytecodeDumper&lt;Block&gt;::dumpConstants(PrintStream&amp; out)
+{
+    if (!block()-&gt;constantRegisters().isEmpty()) {
+        out.printf(&quot;\nConstants:\n&quot;);
+        size_t i = 0;
+        for (const auto&amp; constant : block()-&gt;constantRegisters()) {
+            const char* sourceCodeRepresentationDescription = nullptr;
+            switch (block()-&gt;constantsSourceCodeRepresentation()[i]) {
+            case SourceCodeRepresentation::Double:
+                sourceCodeRepresentationDescription = &quot;: in source as double&quot;;
+                break;
+            case SourceCodeRepresentation::Integer:
+                sourceCodeRepresentationDescription = &quot;: in source as integer&quot;;
+                break;
+            case SourceCodeRepresentation::Other:
+                sourceCodeRepresentationDescription = &quot;&quot;;
+                break;
+            }
+            out.printf(&quot;   k%u = %s%s\n&quot;, static_cast&lt;unsigned&gt;(i), toCString(constant.get()).data(), sourceCodeRepresentationDescription);
+            ++i;
+        }
+    }
+}
+
+template&lt;class Block&gt;
+void BytecodeDumper&lt;Block&gt;::dumpRegExps(PrintStream&amp; out)
+{
+    if (size_t count = block()-&gt;numberOfRegExps()) {
+        out.printf(&quot;\nm_regexps:\n&quot;);
+        size_t i = 0;
+        do {
+            out.printf(&quot;  re%u = %s\n&quot;, static_cast&lt;unsigned&gt;(i), regexpToSourceString(block()-&gt;regexp(i)).data());
+            ++i;
+        } while (i &lt; count);
+    }
+}
+
+template&lt;class Block&gt;
+void BytecodeDumper&lt;Block&gt;::dumpExceptionHandlers(PrintStream&amp; out)
+{
+    if (unsigned count = block()-&gt;numberOfExceptionHandlers()) {
+        out.printf(&quot;\nException Handlers:\n&quot;);
+        unsigned i = 0;
+        do {
+            const auto&amp; handler = block()-&gt;exceptionHandler(i);
+            out.printf(&quot;\t %d: { start: [%4d] end: [%4d] target: [%4d] } %s\n&quot;, i + 1, handler.start, handler.end, handler.target, handler.typeName());
+            ++i;
+        } while (i &lt; count);
+    }
+}
+
+template&lt;class Block&gt;
+void BytecodeDumper&lt;Block&gt;::dumpSwitchJumpTables(PrintStream&amp; out)
+{
+    if (unsigned count = block()-&gt;numberOfSwitchJumpTables()) {
+        out.printf(&quot;Switch Jump Tables:\n&quot;);
+        unsigned i = 0;
+        do {
+            out.printf(&quot;  %1d = {\n&quot;, i);
+            const auto&amp; switchJumpTable = block()-&gt;switchJumpTable(i);
+            int entry = 0;
+            auto end = switchJumpTable.branchOffsets.end();
+            for (auto iter = switchJumpTable.branchOffsets.begin(); iter != end; ++iter, ++entry) {
+                if (!*iter)
+                    continue;
+                out.printf(&quot;\t\t%4d =&gt; %04d\n&quot;, entry + switchJumpTable.min, *iter);
+            }
+            out.printf(&quot;      }\n&quot;);
+            ++i;
+        } while (i &lt; count);
+    }
+}
+
+template&lt;class Block&gt;
+void BytecodeDumper&lt;Block&gt;::dumpStringSwitchJumpTables(PrintStream&amp; out)
+{
+    if (unsigned count = block()-&gt;numberOfStringSwitchJumpTables()) {
+        out.printf(&quot;\nString Switch Jump Tables:\n&quot;);
+        unsigned i = 0;
+        do {
+            out.printf(&quot;  %1d = {\n&quot;, i);
+            const auto&amp; stringSwitchJumpTable = block()-&gt;stringSwitchJumpTable(i);
+            auto end = stringSwitchJumpTable.offsetTable.end();
+            for (auto iter = stringSwitchJumpTable.offsetTable.begin(); iter != end; ++iter)
+                out.printf(&quot;\t\t\&quot;%s\&quot; =&gt; %04d\n&quot;, iter-&gt;key-&gt;utf8().data(), iter-&gt;value.branchOffset);
+            out.printf(&quot;      }\n&quot;);
+            ++i;
+        } while (i &lt; count);
+    }
+}
+
+template&lt;class Block&gt;
+void BytecodeDumper&lt;Block&gt;::dumpBlock(Block* block, const typename Block::UnpackedInstructions&amp; instructions, PrintStream&amp; out, const StubInfoMap&amp; stubInfos, const CallLinkInfoMap&amp; callLinkInfos)
+{
+    VM&amp; vm = *block-&gt;vm();
+    size_t instructionCount = 0;
+
+    for (size_t i = 0; i &lt; instructions.size(); i += opcodeLengths[vm.interpreter-&gt;getOpcodeID(instructions[i])])
+        ++instructionCount;
+
+    out.print(*block);
+    out.printf(
+        &quot;: %lu m_instructions; %lu bytes; %d parameter(s); %d callee register(s); %d variable(s)&quot;,
+        static_cast&lt;unsigned long&gt;(instructions.size()),
+        static_cast&lt;unsigned long&gt;(instructions.size() * sizeof(Instruction)),
+        block-&gt;numParameters(), block-&gt;numCalleeLocals(), block-&gt;m_numVars);
+    out.print(&quot;; scope at &quot;, block-&gt;scopeRegister());
+    out.printf(&quot;\n&quot;);
+
+    const auto* begin = instructions.begin();
+    const auto* end = instructions.end();
+    BytecodeDumper&lt;Block&gt; dumper(block, begin);
+    for (const auto* it = begin; it != end; ++it)
+        dumper.dumpBytecode(out, begin, it, stubInfos, callLinkInfos);
+
+    dumper.dumpIdentifiers(out);
+    dumper.dumpConstants(out);
+    dumper.dumpRegExps(out);
+    dumper.dumpExceptionHandlers(out);
+    dumper.dumpSwitchJumpTables(out);
+    dumper.dumpStringSwitchJumpTables(out);
+
+    out.printf(&quot;\n&quot;);
+}
+
+template class BytecodeDumper&lt;UnlinkedCodeBlock&gt;;
+template class BytecodeDumper&lt;CodeBlock&gt;;
+
+}
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeBytecodeDumperh"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/bytecode/BytecodeDumper.h (0 => 213209)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/BytecodeDumper.h                                (rev 0)
+++ trunk/Source/JavaScriptCore/bytecode/BytecodeDumper.h        2017-03-01 08:15:45 UTC (rev 213209)
</span><span class="lines">@@ -0,0 +1,94 @@
</span><ins>+/*
+ * Copyright (C) 2017 Yusuke Suzuki &lt;utatane.tea@gmail.com&gt;
+ *
+ * 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. AND ITS CONTRIBUTORS ``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 ITS 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.
+ */
+
+#pragma once
+
+#include &quot;CallLinkInfo.h&quot;
+#include &quot;StructureStubInfo.h&quot;
+#include &lt;wtf/StringPrintStream.h&gt;
+
+namespace JSC {
+
+struct Instruction;
+
+template&lt;class Block&gt;
+class BytecodeDumper {
+public:
+    typedef typename Block::Instruction Instruction;
+
+    static void dumpBytecode(Block*, PrintStream&amp; out, const Instruction* begin, const Instruction*&amp; it, const StubInfoMap&amp; = StubInfoMap(), const CallLinkInfoMap&amp; = CallLinkInfoMap());
+    static void dumpBlock(Block*, const typename Block::UnpackedInstructions&amp;, PrintStream&amp; out, const StubInfoMap&amp; = StubInfoMap(), const CallLinkInfoMap&amp; = CallLinkInfoMap());
+
+private:
+    BytecodeDumper(Block* block, const Instruction* instructionsBegin)
+        : m_block(block)
+        , m_instructionsBegin(instructionsBegin)
+    {
+    }
+
+    Block* block() const { return m_block; }
+    const Instruction* instructionsBegin() const { return m_instructionsBegin; }
+
+    ALWAYS_INLINE VM* vm() const;
+
+    CString registerName(int r) const;
+    CString constantName(int index) const;
+
+    const Identifier&amp; identifier(int index) const;
+
+    void dumpIdentifiers(PrintStream&amp; out);
+    void dumpConstants(PrintStream&amp; out);
+    void dumpRegExps(PrintStream&amp; out);
+    void dumpExceptionHandlers(PrintStream&amp; out);
+    void dumpSwitchJumpTables(PrintStream&amp; out);
+    void dumpStringSwitchJumpTables(PrintStream&amp; out);
+
+    void printUnaryOp(PrintStream&amp; out, int location, const Instruction*&amp; it, const char* op);
+    void printBinaryOp(PrintStream&amp; out, int location, const Instruction*&amp; it, const char* op);
+    void printConditionalJump(PrintStream&amp; out, const Instruction*, const Instruction*&amp; it, int location, const char* op);
+    void printGetByIdOp(PrintStream&amp; out, int location, const Instruction*&amp; it);
+    void printGetByIdCacheStatus(PrintStream&amp; out, int location, const StubInfoMap&amp;);
+    void printPutByIdCacheStatus(PrintStream&amp; out, int location, const StubInfoMap&amp;);
+    enum CacheDumpMode { DumpCaches, DontDumpCaches };
+    void printCallOp(PrintStream&amp; out, int location, const Instruction*&amp; it, const char* op, CacheDumpMode, bool&amp; hasPrintedProfiling, const CallLinkInfoMap&amp;);
+    void printPutByIdOp(PrintStream&amp; out, int location, const Instruction*&amp; it, const char* op);
+    void printLocationOpAndRegisterOperand(PrintStream&amp; out, int location, const Instruction*&amp; it, const char* op, int operand);
+    void dumpBytecode(PrintStream&amp; out, const Instruction* begin, const Instruction*&amp; it, const StubInfoMap&amp;, const CallLinkInfoMap&amp;);
+
+    void dumpValueProfiling(PrintStream&amp;, const Instruction*&amp;, bool&amp; hasPrintedProfiling);
+    void dumpArrayProfiling(PrintStream&amp;, const Instruction*&amp;, bool&amp; hasPrintedProfiling);
+    void dumpProfilesForBytecodeOffset(PrintStream&amp;, unsigned location, bool&amp; hasPrintedProfiling);
+
+    void* actualPointerFor(Special::Pointer) const;
+
+#if ENABLE(JIT)
+    void dumpCallLinkStatus(PrintStream&amp;, unsigned location, const CallLinkInfoMap&amp;);
+#endif
+
+    Block* m_block;
+    const Instruction* m_instructionsBegin;
+};
+
+}
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeBytecodeGeneratorificationcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/BytecodeGeneratorification.cpp (213208 => 213209)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/BytecodeGeneratorification.cpp        2017-03-01 07:57:08 UTC (rev 213208)
+++ trunk/Source/JavaScriptCore/bytecode/BytecodeGeneratorification.cpp        2017-03-01 08:15:45 UTC (rev 213209)
</span><span class="lines">@@ -27,6 +27,7 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;BytecodeGeneratorification.h&quot;
</span><span class="cx"> 
</span><ins>+#include &quot;BytecodeDumper.h&quot;
</ins><span class="cx"> #include &quot;BytecodeLivenessAnalysisInlines.h&quot;
</span><span class="cx"> #include &quot;BytecodeRewriter.h&quot;
</span><span class="cx"> #include &quot;BytecodeUseDef.h&quot;
</span><span class="lines">@@ -66,7 +67,7 @@
</span><span class="cx">                 }
</span><span class="cx"> 
</span><span class="cx">                 case op_yield: {
</span><del>-                    unsigned liveCalleeLocalsIndex = pc[2].u.index;
</del><ins>+                    unsigned liveCalleeLocalsIndex = pc[2].u.unsignedValue;
</ins><span class="cx">                     if (liveCalleeLocalsIndex &gt;= m_yields.size())
</span><span class="cx">                         m_yields.resize(liveCalleeLocalsIndex + 1);
</span><span class="cx">                     YieldData&amp; data = m_yields[liveCalleeLocalsIndex];
</span><span class="lines">@@ -261,6 +262,9 @@
</span><span class="cx"> 
</span><span class="cx"> void performGeneratorification(UnlinkedCodeBlock* codeBlock, UnlinkedCodeBlock::UnpackedInstructions&amp; instructions, SymbolTable* generatorFrameSymbolTable, int generatorFrameSymbolTableIndex)
</span><span class="cx"> {
</span><ins>+    if (Options::dumpBytecodesBeforeGeneratorification())
+        BytecodeDumper&lt;UnlinkedCodeBlock&gt;::dumpBlock(codeBlock, instructions, WTF::dataFile());
+
</ins><span class="cx">     BytecodeGeneratorification pass(codeBlock, instructions, generatorFrameSymbolTable, generatorFrameSymbolTableIndex);
</span><span class="cx">     pass.run();
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeBytecodeLivenessAnalysiscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/BytecodeLivenessAnalysis.cpp (213208 => 213209)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/BytecodeLivenessAnalysis.cpp        2017-03-01 07:57:08 UTC (rev 213208)
+++ trunk/Source/JavaScriptCore/bytecode/BytecodeLivenessAnalysis.cpp        2017-03-01 08:15:45 UTC (rev 213209)
</span><span class="lines">@@ -194,7 +194,7 @@
</span><span class="cx">             FastBitVector liveBefore = getLivenessInfoAtBytecodeOffset(bytecodeOffset);
</span><span class="cx">             dumpBitVector(liveBefore);
</span><span class="cx">             dataLogF(&quot;\n&quot;);
</span><del>-            codeBlock-&gt;dumpBytecode(WTF::dataFile(), codeBlock-&gt;globalObject()-&gt;globalExec(), instructionsBegin, currentInstruction);
</del><ins>+            codeBlock-&gt;dumpBytecode(WTF::dataFile(), instructionsBegin, currentInstruction);
</ins><span class="cx"> 
</span><span class="cx">             OpcodeID opcodeID = interpreter-&gt;getOpcodeID(instructionsBegin[bytecodeOffset].u.opcode);
</span><span class="cx">             unsigned opcodeLength = opcodeLengths[opcodeID];
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeCodeBlockcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp (213208 => 213209)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp        2017-03-01 07:57:08 UTC (rev 213208)
+++ trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp        2017-03-01 08:15:45 UTC (rev 213209)
</span><span class="lines">@@ -32,6 +32,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;ArithProfile.h&quot;
</span><span class="cx"> #include &quot;BasicBlockLocation.h&quot;
</span><ins>+#include &quot;BytecodeDumper.h&quot;
</ins><span class="cx"> #include &quot;BytecodeGenerator.h&quot;
</span><span class="cx"> #include &quot;BytecodeLivenessAnalysis.h&quot;
</span><span class="cx"> #include &quot;BytecodeUseDef.h&quot;
</span><span class="lines">@@ -49,7 +50,7 @@
</span><span class="cx"> #include &quot;FunctionExecutableDump.h&quot;
</span><span class="cx"> #include &quot;GetPutInfo.h&quot;
</span><span class="cx"> #include &quot;InlineCallFrame.h&quot;
</span><del>-#include &quot;Interpreter.h&quot;
</del><ins>+#include &quot;InterpreterInlines.h&quot;
</ins><span class="cx"> #include &quot;JIT.h&quot;
</span><span class="cx"> #include &quot;JITMathIC.h&quot;
</span><span class="cx"> #include &quot;JSCInlines.h&quot;
</span><span class="lines">@@ -204,324 +205,6 @@
</span><span class="cx">     dumpAssumingJITType(out, jitType());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static CString idName(int id0, const Identifier&amp; ident)
-{
-    return toCString(ident.impl(), &quot;(@id&quot;, id0, &quot;)&quot;);
-}
-
-CString CodeBlock::registerName(int r) const
-{
-    if (isConstantRegisterIndex(r))
-        return constantName(r);
-
-    return toCString(VirtualRegister(r));
-}
-
-CString CodeBlock::constantName(int index) const
-{
-    JSValue value = getConstant(index);
-    return toCString(value, &quot;(&quot;, VirtualRegister(index), &quot;)&quot;);
-}
-
-static CString regexpToSourceString(RegExp* regExp)
-{
-    char postfix[5] = { '/', 0, 0, 0, 0 };
-    int index = 1;
-    if (regExp-&gt;global())
-        postfix[index++] = 'g';
-    if (regExp-&gt;ignoreCase())
-        postfix[index++] = 'i';
-    if (regExp-&gt;multiline())
-        postfix[index] = 'm';
-    if (regExp-&gt;sticky())
-        postfix[index++] = 'y';
-    if (regExp-&gt;unicode())
-        postfix[index++] = 'u';
-
-    return toCString(&quot;/&quot;, regExp-&gt;pattern().impl(), postfix);
-}
-
-static CString regexpName(int re, RegExp* regexp)
-{
-    return toCString(regexpToSourceString(regexp), &quot;(@re&quot;, re, &quot;)&quot;);
-}
-
-NEVER_INLINE static const char* debugHookName(int debugHookType)
-{
-    switch (static_cast&lt;DebugHookType&gt;(debugHookType)) {
-        case DidEnterCallFrame:
-            return &quot;didEnterCallFrame&quot;;
-        case WillLeaveCallFrame:
-            return &quot;willLeaveCallFrame&quot;;
-        case WillExecuteStatement:
-            return &quot;willExecuteStatement&quot;;
-        case WillExecuteExpression:
-            return &quot;willExecuteExpression&quot;;
-        case WillExecuteProgram:
-            return &quot;willExecuteProgram&quot;;
-        case DidExecuteProgram:
-            return &quot;didExecuteProgram&quot;;
-        case DidReachBreakpoint:
-            return &quot;didReachBreakpoint&quot;;
-    }
-
-    RELEASE_ASSERT_NOT_REACHED();
-    return &quot;&quot;;
-}
-
-void CodeBlock::printUnaryOp(PrintStream&amp; out, ExecState* exec, int location, const Instruction*&amp; it, const char* op)
-{
-    int r0 = (++it)-&gt;u.operand;
-    int r1 = (++it)-&gt;u.operand;
-
-    printLocationAndOp(out, exec, location, it, op);
-    out.printf(&quot;%s, %s&quot;, registerName(r0).data(), registerName(r1).data());
-}
-
-void CodeBlock::printBinaryOp(PrintStream&amp; out, ExecState* exec, int location, const Instruction*&amp; it, const char* op)
-{
-    int r0 = (++it)-&gt;u.operand;
-    int r1 = (++it)-&gt;u.operand;
-    int r2 = (++it)-&gt;u.operand;
-    printLocationAndOp(out, exec, location, it, op);
-    out.printf(&quot;%s, %s, %s&quot;, registerName(r0).data(), registerName(r1).data(), registerName(r2).data());
-}
-
-void CodeBlock::printConditionalJump(PrintStream&amp; out, ExecState* exec, const Instruction*, const Instruction*&amp; it, int location, const char* op)
-{
-    int r0 = (++it)-&gt;u.operand;
-    int offset = (++it)-&gt;u.operand;
-    printLocationAndOp(out, exec, location, it, op);
-    out.printf(&quot;%s, %d(-&gt;%d)&quot;, registerName(r0).data(), offset, location + offset);
-}
-
-void CodeBlock::printGetByIdOp(PrintStream&amp; out, ExecState* exec, int location, const Instruction*&amp; it)
-{
-    const char* op;
-    switch (exec-&gt;interpreter()-&gt;getOpcodeID(it-&gt;u.opcode)) {
-    case op_get_by_id:
-        op = &quot;get_by_id&quot;;
-        break;
-    case op_get_by_id_proto_load:
-        op = &quot;get_by_id_proto_load&quot;;
-        break;
-    case op_get_by_id_unset:
-        op = &quot;get_by_id_unset&quot;;
-        break;
-    case op_get_array_length:
-        op = &quot;array_length&quot;;
-        break;
-    default:
-        RELEASE_ASSERT_NOT_REACHED();
-#if COMPILER_QUIRK(CONSIDERS_UNREACHABLE_CODE)
-        op = 0;
-#endif
-    }
-    int r0 = (++it)-&gt;u.operand;
-    int r1 = (++it)-&gt;u.operand;
-    int id0 = (++it)-&gt;u.operand;
-    printLocationAndOp(out, exec, location, it, op);
-    out.printf(&quot;%s, %s, %s&quot;, registerName(r0).data(), registerName(r1).data(), idName(id0, identifier(id0)).data());
-    it += 4; // Increment up to the value profiler.
-}
-
-static void dumpStructure(PrintStream&amp; out, const char* name, Structure* structure, const Identifier&amp; ident)
-{
-    if (!structure)
-        return;
-    
-    out.printf(&quot;%s = %p&quot;, name, structure);
-    
-    PropertyOffset offset = structure-&gt;getConcurrently(ident.impl());
-    if (offset != invalidOffset)
-        out.printf(&quot; (offset = %d)&quot;, offset);
-}
-
-static void dumpChain(PrintStream&amp; out, StructureChain* chain, const Identifier&amp; ident)
-{
-    out.printf(&quot;chain = %p: [&quot;, chain);
-    bool first = true;
-    for (WriteBarrier&lt;Structure&gt;* currentStructure = chain-&gt;head();
-         *currentStructure;
-         ++currentStructure) {
-        if (first)
-            first = false;
-        else
-            out.printf(&quot;, &quot;);
-        dumpStructure(out, &quot;struct&quot;, currentStructure-&gt;get(), ident);
-    }
-    out.printf(&quot;]&quot;);
-}
-
-void CodeBlock::printGetByIdCacheStatus(PrintStream&amp; out, ExecState* exec, int location, const StubInfoMap&amp; map)
-{
-    Instruction* instruction = instructions().begin() + location;
-
-    const Identifier&amp; ident = identifier(instruction[3].u.operand);
-    
-    UNUSED_PARAM(ident); // tell the compiler to shut up in certain platform configurations.
-    
-    if (exec-&gt;interpreter()-&gt;getOpcodeID(instruction[0].u.opcode) == op_get_array_length)
-        out.printf(&quot; llint(array_length)&quot;);
-    else if (StructureID structureID = instruction[4].u.structureID) {
-        Structure* structure = m_vm-&gt;heap.structureIDTable().get(structureID);
-        out.printf(&quot; llint(&quot;);
-        dumpStructure(out, &quot;struct&quot;, structure, ident);
-        out.printf(&quot;)&quot;);
-        if (exec-&gt;interpreter()-&gt;getOpcodeID(instruction[0].u.opcode) == op_get_by_id_proto_load)
-            out.printf(&quot; proto(%p)&quot;, instruction[6].u.pointer);
-    }
-
-#if ENABLE(JIT)
-    if (StructureStubInfo* stubPtr = map.get(CodeOrigin(location))) {
-        StructureStubInfo&amp; stubInfo = *stubPtr;
-        if (stubInfo.resetByGC)
-            out.print(&quot; (Reset By GC)&quot;);
-        
-        out.printf(&quot; jit(&quot;);
-            
-        Structure* baseStructure = nullptr;
-        PolymorphicAccess* stub = nullptr;
-            
-        switch (stubInfo.cacheType) {
-        case CacheType::GetByIdSelf:
-            out.printf(&quot;self&quot;);
-            baseStructure = stubInfo.u.byIdSelf.baseObjectStructure.get();
-            break;
-        case CacheType::Stub:
-            out.printf(&quot;stub&quot;);
-            stub = stubInfo.u.stub;
-            break;
-        case CacheType::Unset:
-            out.printf(&quot;unset&quot;);
-            break;
-        case CacheType::ArrayLength:
-            out.printf(&quot;ArrayLength&quot;);
-            break;
-        default:
-            RELEASE_ASSERT_NOT_REACHED();
-            break;
-        }
-            
-        if (baseStructure) {
-            out.printf(&quot;, &quot;);
-            dumpStructure(out, &quot;struct&quot;, baseStructure, ident);
-        }
-
-        if (stub)
-            out.print(&quot;, &quot;, *stub);
-
-        out.printf(&quot;)&quot;);
-    }
-#else
-    UNUSED_PARAM(map);
-#endif
-}
-
-void CodeBlock::printPutByIdCacheStatus(PrintStream&amp; out, int location, const StubInfoMap&amp; map)
-{
-    Instruction* instruction = instructions().begin() + location;
-
-    const Identifier&amp; ident = identifier(instruction[2].u.operand);
-    
-    UNUSED_PARAM(ident); // tell the compiler to shut up in certain platform configurations.
-
-    out.print(&quot;, &quot;, instruction[8].u.putByIdFlags);
-    
-    if (StructureID structureID = instruction[4].u.structureID) {
-        Structure* structure = m_vm-&gt;heap.structureIDTable().get(structureID);
-        out.print(&quot; llint(&quot;);
-        if (StructureID newStructureID = instruction[6].u.structureID) {
-            Structure* newStructure = m_vm-&gt;heap.structureIDTable().get(newStructureID);
-            dumpStructure(out, &quot;prev&quot;, structure, ident);
-            out.print(&quot;, &quot;);
-            dumpStructure(out, &quot;next&quot;, newStructure, ident);
-            if (StructureChain* chain = instruction[7].u.structureChain.get()) {
-                out.print(&quot;, &quot;);
-                dumpChain(out, chain, ident);
-            }
-        } else
-            dumpStructure(out, &quot;struct&quot;, structure, ident);
-        out.print(&quot;)&quot;);
-    }
-
-#if ENABLE(JIT)
-    if (StructureStubInfo* stubPtr = map.get(CodeOrigin(location))) {
-        StructureStubInfo&amp; stubInfo = *stubPtr;
-        if (stubInfo.resetByGC)
-            out.print(&quot; (Reset By GC)&quot;);
-        
-        out.printf(&quot; jit(&quot;);
-        
-        switch (stubInfo.cacheType) {
-        case CacheType::PutByIdReplace:
-            out.print(&quot;replace, &quot;);
-            dumpStructure(out, &quot;struct&quot;, stubInfo.u.byIdSelf.baseObjectStructure.get(), ident);
-            break;
-        case CacheType::Stub: {
-            out.print(&quot;stub, &quot;, *stubInfo.u.stub);
-            break;
-        }
-        case CacheType::Unset:
-            out.printf(&quot;unset&quot;);
-            break;
-        default:
-            RELEASE_ASSERT_NOT_REACHED();
-            break;
-        }
-        out.printf(&quot;)&quot;);
-    }
-#else
-    UNUSED_PARAM(map);
-#endif
-}
-
-void CodeBlock::printCallOp(PrintStream&amp; out, ExecState* exec, int location, const Instruction*&amp; it, const char* op, CacheDumpMode cacheDumpMode, bool&amp; hasPrintedProfiling, const CallLinkInfoMap&amp; map)
-{
-    int dst = (++it)-&gt;u.operand;
-    int func = (++it)-&gt;u.operand;
-    int argCount = (++it)-&gt;u.operand;
-    int registerOffset = (++it)-&gt;u.operand;
-    printLocationAndOp(out, exec, location, it, op);
-    out.print(registerName(dst), &quot;, &quot;, registerName(func), &quot;, &quot;, argCount, &quot;, &quot;, registerOffset);
-    out.print(&quot; (this at &quot;, virtualRegisterForArgument(0, -registerOffset), &quot;)&quot;);
-    if (cacheDumpMode == DumpCaches) {
-        LLIntCallLinkInfo* callLinkInfo = it[1].u.callLinkInfo;
-        if (callLinkInfo-&gt;lastSeenCallee) {
-            out.printf(
-                &quot; llint(%p, exec %p)&quot;,
-                callLinkInfo-&gt;lastSeenCallee.get(),
-                callLinkInfo-&gt;lastSeenCallee-&gt;executable());
-        }
-#if ENABLE(JIT)
-        if (CallLinkInfo* info = map.get(CodeOrigin(location))) {
-            JSFunction* target = info-&gt;lastSeenCallee();
-            if (target)
-                out.printf(&quot; jit(%p, exec %p)&quot;, target, target-&gt;executable());
-        }
-        
-        if (jitType() != JITCode::FTLJIT)
-            out.print(&quot; status(&quot;, CallLinkStatus::computeFor(this, location, map), &quot;)&quot;);
-#else
-        UNUSED_PARAM(map);
-#endif
-    }
-    ++it;
-    ++it;
-    dumpArrayProfiling(out, it, hasPrintedProfiling);
-    dumpValueProfiling(out, it, hasPrintedProfiling);
-}
-
-void CodeBlock::printPutByIdOp(PrintStream&amp; out, ExecState* exec, int location, const Instruction*&amp; it, const char* op)
-{
-    int r0 = (++it)-&gt;u.operand;
-    int id0 = (++it)-&gt;u.operand;
-    int r1 = (++it)-&gt;u.operand;
-    printLocationAndOp(out, exec, location, it, op);
-    out.printf(&quot;%s, %s, %s&quot;, registerName(r0).data(), idName(id0, identifier(id0)).data(), registerName(r1).data());
-    it += 5;
-}
-
</del><span class="cx"> void CodeBlock::dumpSource()
</span><span class="cx"> {
</span><span class="cx">     dumpSource(WTF::dataFile());
</span><span class="lines">@@ -549,1244 +232,24 @@
</span><span class="cx"> 
</span><span class="cx"> void CodeBlock::dumpBytecode(PrintStream&amp; out)
</span><span class="cx"> {
</span><del>-    // We only use the ExecState* for things that don't actually lead to JS execution,
-    // like converting a JSString to a String. Hence the globalExec is appropriate.
-    ExecState* exec = m_globalObject-&gt;globalExec();
-    
-    size_t instructionCount = 0;
-
-    for (size_t i = 0; i &lt; instructions().size(); i += opcodeLengths[exec-&gt;interpreter()-&gt;getOpcodeID(instructions()[i].u.opcode)])
-        ++instructionCount;
-
-    out.print(*this);
-    out.printf(
-        &quot;: %lu m_instructions; %lu bytes; %d parameter(s); %d callee register(s); %d variable(s)&quot;,
-        static_cast&lt;unsigned long&gt;(instructions().size()),
-        static_cast&lt;unsigned long&gt;(instructions().size() * sizeof(Instruction)),
-        m_numParameters, m_numCalleeLocals, m_numVars);
-    out.print(&quot;; scope at &quot;, scopeRegister());
-    out.printf(&quot;\n&quot;);
-    
</del><span class="cx">     StubInfoMap stubInfos;
</span><span class="cx">     CallLinkInfoMap callLinkInfos;
</span><span class="cx">     getStubInfoMap(stubInfos);
</span><span class="cx">     getCallLinkInfoMap(callLinkInfos);
</span><del>-    
-    const Instruction* begin = instructions().begin();
-    const Instruction* end = instructions().end();
-    for (const Instruction* it = begin; it != end; ++it)
-        dumpBytecode(out, exec, begin, it, stubInfos, callLinkInfos);
-    
-    if (numberOfIdentifiers()) {
-        out.printf(&quot;\nIdentifiers:\n&quot;);
-        size_t i = 0;
-        do {
-            out.printf(&quot;  id%u = %s\n&quot;, static_cast&lt;unsigned&gt;(i), identifier(i).string().utf8().data());
-            ++i;
-        } while (i != numberOfIdentifiers());
-    }
-
-    if (!m_constantRegisters.isEmpty()) {
-        out.printf(&quot;\nConstants:\n&quot;);
-        size_t i = 0;
-        do {
-            const char* sourceCodeRepresentationDescription = nullptr;
-            switch (m_constantsSourceCodeRepresentation[i]) {
-            case SourceCodeRepresentation::Double:
-                sourceCodeRepresentationDescription = &quot;: in source as double&quot;;
-                break;
-            case SourceCodeRepresentation::Integer:
-                sourceCodeRepresentationDescription = &quot;: in source as integer&quot;;
-                break;
-            case SourceCodeRepresentation::Other:
-                sourceCodeRepresentationDescription = &quot;&quot;;
-                break;
-            }
-            out.printf(&quot;   k%u = %s%s\n&quot;, static_cast&lt;unsigned&gt;(i), toCString(m_constantRegisters[i].get()).data(), sourceCodeRepresentationDescription);
-            ++i;
-        } while (i &lt; m_constantRegisters.size());
-    }
-
-    if (size_t count = m_unlinkedCode-&gt;numberOfRegExps()) {
-        out.printf(&quot;\nm_regexps:\n&quot;);
-        size_t i = 0;
-        do {
-            out.printf(&quot;  re%u = %s\n&quot;, static_cast&lt;unsigned&gt;(i), regexpToSourceString(m_unlinkedCode-&gt;regexp(i)).data());
-            ++i;
-        } while (i &lt; count);
-    }
-
-    dumpExceptionHandlers(out);
-    
-    if (m_rareData &amp;&amp; !m_rareData-&gt;m_switchJumpTables.isEmpty()) {
-        out.printf(&quot;Switch Jump Tables:\n&quot;);
-        unsigned i = 0;
-        do {
-            out.printf(&quot;  %1d = {\n&quot;, i);
-            int entry = 0;
-            Vector&lt;int32_t&gt;::const_iterator end = m_rareData-&gt;m_switchJumpTables[i].branchOffsets.end();
-            for (Vector&lt;int32_t&gt;::const_iterator iter = m_rareData-&gt;m_switchJumpTables[i].branchOffsets.begin(); iter != end; ++iter, ++entry) {
-                if (!*iter)
-                    continue;
-                out.printf(&quot;\t\t%4d =&gt; %04d\n&quot;, entry + m_rareData-&gt;m_switchJumpTables[i].min, *iter);
-            }
-            out.printf(&quot;      }\n&quot;);
-            ++i;
-        } while (i &lt; m_rareData-&gt;m_switchJumpTables.size());
-    }
-    
-    if (m_rareData &amp;&amp; !m_rareData-&gt;m_stringSwitchJumpTables.isEmpty()) {
-        out.printf(&quot;\nString Switch Jump Tables:\n&quot;);
-        unsigned i = 0;
-        do {
-            out.printf(&quot;  %1d = {\n&quot;, i);
-            StringJumpTable::StringOffsetTable::const_iterator end = m_rareData-&gt;m_stringSwitchJumpTables[i].offsetTable.end();
-            for (StringJumpTable::StringOffsetTable::const_iterator iter = m_rareData-&gt;m_stringSwitchJumpTables[i].offsetTable.begin(); iter != end; ++iter)
-                out.printf(&quot;\t\t\&quot;%s\&quot; =&gt; %04d\n&quot;, iter-&gt;key-&gt;utf8().data(), iter-&gt;value.branchOffset);
-            out.printf(&quot;      }\n&quot;);
-            ++i;
-        } while (i &lt; m_rareData-&gt;m_stringSwitchJumpTables.size());
-    }
-
-    out.printf(&quot;\n&quot;);
</del><ins>+    BytecodeDumper&lt;CodeBlock&gt;::dumpBlock(this, instructions(), out, stubInfos, callLinkInfos);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void CodeBlock::dumpExceptionHandlers(PrintStream&amp; out)
</del><ins>+void CodeBlock::dumpBytecode(PrintStream&amp; out, const Instruction* begin, const Instruction*&amp; it, const StubInfoMap&amp; stubInfos, const CallLinkInfoMap&amp; callLinkInfos)
</ins><span class="cx"> {
</span><del>-    if (m_rareData &amp;&amp; !m_rareData-&gt;m_exceptionHandlers.isEmpty()) {
-        out.printf(&quot;\nException Handlers:\n&quot;);
-        unsigned i = 0;
-        do {
-            HandlerInfo&amp; handler = m_rareData-&gt;m_exceptionHandlers[i];
-            out.printf(&quot;\t %d: { start: [%4d] end: [%4d] target: [%4d] } %s\n&quot;,
-                i + 1, handler.start, handler.end, handler.target, handler.typeName());
-            ++i;
-        } while (i &lt; m_rareData-&gt;m_exceptionHandlers.size());
-    }
</del><ins>+    BytecodeDumper&lt;CodeBlock&gt;::dumpBytecode(this, out, begin, it, stubInfos, callLinkInfos);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void CodeBlock::beginDumpProfiling(PrintStream&amp; out, bool&amp; hasPrintedProfiling)
-{
-    if (hasPrintedProfiling) {
-        out.print(&quot;; &quot;);
-        return;
-    }
-    
-    out.print(&quot;    &quot;);
-    hasPrintedProfiling = true;
-}
-
-void CodeBlock::dumpValueProfiling(PrintStream&amp; out, const Instruction*&amp; it, bool&amp; hasPrintedProfiling)
-{
-    ConcurrentJSLocker locker(m_lock);
-    
-    ++it;
-    CString description = it-&gt;u.profile-&gt;briefDescription(locker);
-    if (!description.length())
-        return;
-    beginDumpProfiling(out, hasPrintedProfiling);
-    out.print(description);
-}
-
-void CodeBlock::dumpArrayProfiling(PrintStream&amp; out, const Instruction*&amp; it, bool&amp; hasPrintedProfiling)
-{
-    ConcurrentJSLocker locker(m_lock);
-    
-    ++it;
-    if (!it-&gt;u.arrayProfile)
-        return;
-    CString description = it-&gt;u.arrayProfile-&gt;briefDescription(locker, this);
-    if (!description.length())
-        return;
-    beginDumpProfiling(out, hasPrintedProfiling);
-    out.print(description);
-}
-
-void CodeBlock::dumpRareCaseProfile(PrintStream&amp; out, const char* name, RareCaseProfile* profile, bool&amp; hasPrintedProfiling)
-{
-    if (!profile || !profile-&gt;m_counter)
-        return;
-
-    beginDumpProfiling(out, hasPrintedProfiling);
-    out.print(name, profile-&gt;m_counter);
-}
-
-void CodeBlock::dumpArithProfile(PrintStream&amp; out, ArithProfile* profile, bool&amp; hasPrintedProfiling)
-{
-    if (!profile)
-        return;
-    
-    beginDumpProfiling(out, hasPrintedProfiling);
-    out.print(&quot;results: &quot;, *profile);
-}
-
-void CodeBlock::printLocationAndOp(PrintStream&amp; out, ExecState*, int location, const Instruction*&amp;, const char* op)
-{
-    out.printf(&quot;[%4d] %-17s &quot;, location, op);
-}
-
-void CodeBlock::printLocationOpAndRegisterOperand(PrintStream&amp; out, ExecState* exec, int location, const Instruction*&amp; it, const char* op, int operand)
-{
-    printLocationAndOp(out, exec, location, it, op);
-    out.printf(&quot;%s&quot;, registerName(operand).data());
-}
-
</del><span class="cx"> void CodeBlock::dumpBytecode(
</span><del>-    PrintStream&amp; out, ExecState* exec, const Instruction* begin, const Instruction*&amp; it,
-    const StubInfoMap&amp; stubInfos, const CallLinkInfoMap&amp; callLinkInfos)
-{
-    int location = it - begin;
-    bool hasPrintedProfiling = false;
-    OpcodeID opcode = exec-&gt;interpreter()-&gt;getOpcodeID(it-&gt;u.opcode);
-    switch (opcode) {
-        case op_enter: {
-            printLocationAndOp(out, exec, location, it, &quot;enter&quot;);
-            break;
-        }
-        case op_get_scope: {
-            int r0 = (++it)-&gt;u.operand;
-            printLocationOpAndRegisterOperand(out, exec, location, it, &quot;get_scope&quot;, r0);
-            break;
-        }
-        case op_create_direct_arguments: {
-            int r0 = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;create_direct_arguments&quot;);
-            out.printf(&quot;%s&quot;, registerName(r0).data());
-            break;
-        }
-        case op_create_scoped_arguments: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;create_scoped_arguments&quot;);
-            out.printf(&quot;%s, %s&quot;, registerName(r0).data(), registerName(r1).data());
-            break;
-        }
-        case op_create_cloned_arguments: {
-            int r0 = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;create_cloned_arguments&quot;);
-            out.printf(&quot;%s&quot;, registerName(r0).data());
-            break;
-        }
-        case op_argument_count: {
-            int r0 = (++it)-&gt;u.operand;
-            printLocationOpAndRegisterOperand(out, exec, location, it, &quot;argument_count&quot;, r0);
-            break;
-        }
-        case op_get_argument: {
-            int r0 = (++it)-&gt;u.operand;
-            int index = (++it)-&gt;u.operand;
-            printLocationOpAndRegisterOperand(out, exec, location, it, &quot;argument&quot;, r0);
-            out.printf(&quot;, %d&quot;, index);
-            dumpValueProfiling(out, it, hasPrintedProfiling);
-            break;
-        }
-        case op_create_rest: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            unsigned argumentOffset = (++it)-&gt;u.unsignedValue;
-            printLocationAndOp(out, exec, location, it, &quot;create_rest&quot;);
-            out.printf(&quot;%s, %s, &quot;, registerName(r0).data(), registerName(r1).data());
-            out.printf(&quot;ArgumentsOffset: %u&quot;, argumentOffset);
-            break;
-        }
-        case op_get_rest_length: {
-            int r0 = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;get_rest_length&quot;);
-            out.printf(&quot;%s, &quot;, registerName(r0).data());
-            unsigned argumentOffset = (++it)-&gt;u.unsignedValue;
-            out.printf(&quot;ArgumentsOffset: %u&quot;, argumentOffset);
-            break;
-        }
-        case op_create_this: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            unsigned inferredInlineCapacity = (++it)-&gt;u.operand;
-            unsigned cachedFunction = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;create_this&quot;);
-            out.printf(&quot;%s, %s, %u, %u&quot;, registerName(r0).data(), registerName(r1).data(), inferredInlineCapacity, cachedFunction);
-            break;
-        }
-        case op_to_this: {
-            int r0 = (++it)-&gt;u.operand;
-            printLocationOpAndRegisterOperand(out, exec, location, it, &quot;to_this&quot;, r0);
-            Structure* structure = (++it)-&gt;u.structure.get();
-            if (structure)
-                out.print(&quot;, cache(struct = &quot;, RawPointer(structure), &quot;)&quot;);
-            out.print(&quot;, &quot;, (++it)-&gt;u.toThisStatus);
-            break;
-        }
-        case op_check_tdz: {
-            int r0 = (++it)-&gt;u.operand;
-            printLocationOpAndRegisterOperand(out, exec, location, it, &quot;op_check_tdz&quot;, r0);
-            break;
-        }
-        case op_new_object: {
-            int r0 = (++it)-&gt;u.operand;
-            unsigned inferredInlineCapacity = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;new_object&quot;);
-            out.printf(&quot;%s, %u&quot;, registerName(r0).data(), inferredInlineCapacity);
-            ++it; // Skip object allocation profile.
-            break;
-        }
-        case op_new_array: {
-            int dst = (++it)-&gt;u.operand;
-            int argv = (++it)-&gt;u.operand;
-            int argc = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;new_array&quot;);
-            out.printf(&quot;%s, %s, %d&quot;, registerName(dst).data(), registerName(argv).data(), argc);
-            ++it; // Skip array allocation profile.
-            break;
-        }
-        case op_new_array_with_spread: {
-            int dst = (++it)-&gt;u.operand;
-            int argv = (++it)-&gt;u.operand;
-            int argc = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;new_array_with_spread&quot;);
-            out.printf(&quot;%s, %s, %d, &quot;, registerName(dst).data(), registerName(argv).data(), argc);
-            unsigned bitVectorIndex = (++it)-&gt;u.unsignedValue;
-            const BitVector&amp; bitVector = m_unlinkedCode-&gt;bitVector(bitVectorIndex);
-            out.print(&quot;BitVector:&quot;, bitVectorIndex, &quot;:&quot;);
-            for (unsigned i = 0; i &lt; static_cast&lt;unsigned&gt;(argc); i++) {
-                if (bitVector.get(i))
-                    out.print(&quot;1&quot;);
-                else
-                    out.print(&quot;0&quot;);
-            }
-            break;
-        }
-        case op_spread: {
-            int dst = (++it)-&gt;u.operand;
-            int arg = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;spread&quot;);
-            out.printf(&quot;%s, %s&quot;, registerName(dst).data(), registerName(arg).data());
-            break;
-        }
-        case op_new_array_with_size: {
-            int dst = (++it)-&gt;u.operand;
-            int length = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;new_array_with_size&quot;);
-            out.printf(&quot;%s, %s&quot;, registerName(dst).data(), registerName(length).data());
-            ++it; // Skip array allocation profile.
-            break;
-        }
-        case op_new_array_buffer: {
-            int dst = (++it)-&gt;u.operand;
-            int argv = (++it)-&gt;u.operand;
-            int argc = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;new_array_buffer&quot;);
-            out.printf(&quot;%s, %d, %d&quot;, registerName(dst).data(), argv, argc);
-            ++it; // Skip array allocation profile.
-            break;
-        }
-        case op_new_regexp: {
-            int r0 = (++it)-&gt;u.operand;
-            int re0 = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;new_regexp&quot;);
-            out.printf(&quot;%s, &quot;, registerName(r0).data());
-            if (r0 &gt;=0 &amp;&amp; r0 &lt; (int)m_unlinkedCode-&gt;numberOfRegExps())
-                out.printf(&quot;%s&quot;, regexpName(re0, regexp(re0)).data());
-            else
-                out.printf(&quot;bad_regexp(%d)&quot;, re0);
-            break;
-        }
-        case op_mov: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;mov&quot;);
-            out.printf(&quot;%s, %s&quot;, registerName(r0).data(), registerName(r1).data());
-            break;
-        }
-        case op_profile_type: {
-            int r0 = (++it)-&gt;u.operand;
-            ++it;
-            ++it;
-            ++it;
-            ++it;
-            printLocationAndOp(out, exec, location, it, &quot;op_profile_type&quot;);
-            out.printf(&quot;%s&quot;, registerName(r0).data());
-            break;
-        }
-        case op_profile_control_flow: {
-            BasicBlockLocation* basicBlockLocation = (++it)-&gt;u.basicBlockLocation;
-            printLocationAndOp(out, exec, location, it, &quot;profile_control_flow&quot;);
-            out.printf(&quot;[%d, %d]&quot;, basicBlockLocation-&gt;startOffset(), basicBlockLocation-&gt;endOffset());
-            break;
-        }
-        case op_not: {
-            printUnaryOp(out, exec, location, it, &quot;not&quot;);
-            break;
-        }
-        case op_eq: {
-            printBinaryOp(out, exec, location, it, &quot;eq&quot;);
-            break;
-        }
-        case op_eq_null: {
-            printUnaryOp(out, exec, location, it, &quot;eq_null&quot;);
-            break;
-        }
-        case op_neq: {
-            printBinaryOp(out, exec, location, it, &quot;neq&quot;);
-            break;
-        }
-        case op_neq_null: {
-            printUnaryOp(out, exec, location, it, &quot;neq_null&quot;);
-            break;
-        }
-        case op_stricteq: {
-            printBinaryOp(out, exec, location, it, &quot;stricteq&quot;);
-            break;
-        }
-        case op_nstricteq: {
-            printBinaryOp(out, exec, location, it, &quot;nstricteq&quot;);
-            break;
-        }
-        case op_less: {
-            printBinaryOp(out, exec, location, it, &quot;less&quot;);
-            break;
-        }
-        case op_lesseq: {
-            printBinaryOp(out, exec, location, it, &quot;lesseq&quot;);
-            break;
-        }
-        case op_greater: {
-            printBinaryOp(out, exec, location, it, &quot;greater&quot;);
-            break;
-        }
-        case op_greatereq: {
-            printBinaryOp(out, exec, location, it, &quot;greatereq&quot;);
-            break;
-        }
-        case op_inc: {
-            int r0 = (++it)-&gt;u.operand;
-            printLocationOpAndRegisterOperand(out, exec, location, it, &quot;inc&quot;, r0);
-            break;
-        }
-        case op_dec: {
-            int r0 = (++it)-&gt;u.operand;
-            printLocationOpAndRegisterOperand(out, exec, location, it, &quot;dec&quot;, r0);
-            break;
-        }
-        case op_to_number: {
-            printUnaryOp(out, exec, location, it, &quot;to_number&quot;);
-            dumpValueProfiling(out, it, hasPrintedProfiling);
-            break;
-        }
-        case op_to_string: {
-            printUnaryOp(out, exec, location, it, &quot;to_string&quot;);
-            break;
-        }
-        case op_negate: {
-            printUnaryOp(out, exec, location, it, &quot;negate&quot;);
-            ++it; // op_negate has an extra operand for the ArithProfile.
-            break;
-        }
-        case op_add: {
-            printBinaryOp(out, exec, location, it, &quot;add&quot;);
-            ++it;
-            break;
-        }
-        case op_mul: {
-            printBinaryOp(out, exec, location, it, &quot;mul&quot;);
-            ++it;
-            break;
-        }
-        case op_div: {
-            printBinaryOp(out, exec, location, it, &quot;div&quot;);
-            ++it;
-            break;
-        }
-        case op_mod: {
-            printBinaryOp(out, exec, location, it, &quot;mod&quot;);
-            break;
-        }
-        case op_pow: {
-            printBinaryOp(out, exec, location, it, &quot;pow&quot;);
-            break;
-        }
-        case op_sub: {
-            printBinaryOp(out, exec, location, it, &quot;sub&quot;);
-            ++it;
-            break;
-        }
-        case op_lshift: {
-            printBinaryOp(out, exec, location, it, &quot;lshift&quot;);
-            break;            
-        }
-        case op_rshift: {
-            printBinaryOp(out, exec, location, it, &quot;rshift&quot;);
-            break;
-        }
-        case op_urshift: {
-            printBinaryOp(out, exec, location, it, &quot;urshift&quot;);
-            break;
-        }
-        case op_bitand: {
-            printBinaryOp(out, exec, location, it, &quot;bitand&quot;);
-            ++it;
-            break;
-        }
-        case op_bitxor: {
-            printBinaryOp(out, exec, location, it, &quot;bitxor&quot;);
-            ++it;
-            break;
-        }
-        case op_bitor: {
-            printBinaryOp(out, exec, location, it, &quot;bitor&quot;);
-            ++it;
-            break;
-        }
-        case op_overrides_has_instance: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            int r2 = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;overrides_has_instance&quot;);
-            out.printf(&quot;%s, %s, %s&quot;, registerName(r0).data(), registerName(r1).data(), registerName(r2).data());
-            break;
-        }
-        case op_instanceof: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            int r2 = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;instanceof&quot;);
-            out.printf(&quot;%s, %s, %s&quot;, registerName(r0).data(), registerName(r1).data(), registerName(r2).data());
-            break;
-        }
-        case op_instanceof_custom: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            int r2 = (++it)-&gt;u.operand;
-            int r3 = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;instanceof_custom&quot;);
-            out.printf(&quot;%s, %s, %s, %s&quot;, registerName(r0).data(), registerName(r1).data(), registerName(r2).data(), registerName(r3).data());
-            break;
-        }
-        case op_unsigned: {
-            printUnaryOp(out, exec, location, it, &quot;unsigned&quot;);
-            break;
-        }
-        case op_typeof: {
-            printUnaryOp(out, exec, location, it, &quot;typeof&quot;);
-            break;
-        }
-        case op_is_empty: {
-            printUnaryOp(out, exec, location, it, &quot;is_empty&quot;);
-            break;
-        }
-        case op_is_undefined: {
-            printUnaryOp(out, exec, location, it, &quot;is_undefined&quot;);
-            break;
-        }
-        case op_is_boolean: {
-            printUnaryOp(out, exec, location, it, &quot;is_boolean&quot;);
-            break;
-        }
-        case op_is_number: {
-            printUnaryOp(out, exec, location, it, &quot;is_number&quot;);
-            break;
-        }
-        case op_is_cell_with_type: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            int type = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;is_cell_with_type&quot;);
-            out.printf(&quot;%s, %s, %d&quot;, registerName(r0).data(), registerName(r1).data(), type);
-            break;
-        }
-        case op_is_object: {
-            printUnaryOp(out, exec, location, it, &quot;is_object&quot;);
-            break;
-        }
-        case op_is_object_or_null: {
-            printUnaryOp(out, exec, location, it, &quot;is_object_or_null&quot;);
-            break;
-        }
-        case op_is_function: {
-            printUnaryOp(out, exec, location, it, &quot;is_function&quot;);
-            break;
-        }
-        case op_in: {
-            printBinaryOp(out, exec, location, it, &quot;in&quot;);
-            dumpArrayProfiling(out, it, hasPrintedProfiling);
-            break;
-        }
-        case op_try_get_by_id: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            int id0 = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;try_get_by_id&quot;);
-            out.printf(&quot;%s, %s, %s&quot;, registerName(r0).data(), registerName(r1).data(), idName(id0, identifier(id0)).data());
-            dumpValueProfiling(out, it, hasPrintedProfiling);
-            break;
-        }
-        case op_get_by_id:
-        case op_get_by_id_proto_load:
-        case op_get_by_id_unset:
-        case op_get_array_length: {
-            printGetByIdOp(out, exec, location, it);
-            printGetByIdCacheStatus(out, exec, location, stubInfos);
-            dumpValueProfiling(out, it, hasPrintedProfiling);
-            break;
-        }
-        case op_get_by_id_with_this: {
-            printLocationAndOp(out, exec, location, it, &quot;get_by_id_with_this&quot;);
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            int r2 = (++it)-&gt;u.operand;
-            int id0 = (++it)-&gt;u.operand;
-            out.printf(&quot;%s, %s, %s, %s&quot;, registerName(r0).data(), registerName(r1).data(), registerName(r2).data(), idName(id0, identifier(id0)).data());
-            dumpValueProfiling(out, it, hasPrintedProfiling);
-            break;
-        }
-        case op_get_by_val_with_this: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            int r2 = (++it)-&gt;u.operand;
-            int r3 = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;get_by_val_with_this&quot;);
-            out.printf(&quot;%s, %s, %s, %s&quot;, registerName(r0).data(), registerName(r1).data(), registerName(r2).data(), registerName(r3).data());
-            dumpValueProfiling(out, it, hasPrintedProfiling);
-            break;
-        }
-        case op_put_by_id: {
-            printPutByIdOp(out, exec, location, it, &quot;put_by_id&quot;);
-            printPutByIdCacheStatus(out, location, stubInfos);
-            break;
-        }
-        case op_put_by_id_with_this: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            int id0 = (++it)-&gt;u.operand;
-            int r2 = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;put_by_id_with_this&quot;);
-            out.printf(&quot;%s, %s, %s, %s&quot;, registerName(r0).data(), registerName(r1).data(), idName(id0, identifier(id0)).data(), registerName(r2).data());
-            break;
-        }
-        case op_put_by_val_with_this: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            int r2 = (++it)-&gt;u.operand;
-            int r3 = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;put_by_val_with_this&quot;);
-            out.printf(&quot;%s, %s, %s, %s&quot;, registerName(r0).data(), registerName(r1).data(), registerName(r2).data(), registerName(r3).data());
-            break;
-        }
-        case op_put_getter_by_id: {
-            int r0 = (++it)-&gt;u.operand;
-            int id0 = (++it)-&gt;u.operand;
-            int n0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;put_getter_by_id&quot;);
-            out.printf(&quot;%s, %s, %d, %s&quot;, registerName(r0).data(), idName(id0, identifier(id0)).data(), n0, registerName(r1).data());
-            break;
-        }
-        case op_put_setter_by_id: {
-            int r0 = (++it)-&gt;u.operand;
-            int id0 = (++it)-&gt;u.operand;
-            int n0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;put_setter_by_id&quot;);
-            out.printf(&quot;%s, %s, %d, %s&quot;, registerName(r0).data(), idName(id0, identifier(id0)).data(), n0, registerName(r1).data());
-            break;
-        }
-        case op_put_getter_setter_by_id: {
-            int r0 = (++it)-&gt;u.operand;
-            int id0 = (++it)-&gt;u.operand;
-            int n0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            int r2 = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;put_getter_setter_by_id&quot;);
-            out.printf(&quot;%s, %s, %d, %s, %s&quot;, registerName(r0).data(), idName(id0, identifier(id0)).data(), n0, registerName(r1).data(), registerName(r2).data());
-            break;
-        }
-        case op_put_getter_by_val: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            int n0 = (++it)-&gt;u.operand;
-            int r2 = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;put_getter_by_val&quot;);
-            out.printf(&quot;%s, %s, %d, %s&quot;, registerName(r0).data(), registerName(r1).data(), n0, registerName(r2).data());
-            break;
-        }
-        case op_put_setter_by_val: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            int n0 = (++it)-&gt;u.operand;
-            int r2 = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;put_setter_by_val&quot;);
-            out.printf(&quot;%s, %s, %d, %s&quot;, registerName(r0).data(), registerName(r1).data(), n0, registerName(r2).data());
-            break;
-        }
-        case op_define_data_property: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            int r2 = (++it)-&gt;u.operand;
-            int r3 = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;define_data_property&quot;);
-            out.printf(&quot;%s, %s, %s, %s&quot;, registerName(r0).data(), registerName(r1).data(), registerName(r2).data(), registerName(r3).data());
-            break;
-        }
-        case op_define_accessor_property: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            int r2 = (++it)-&gt;u.operand;
-            int r3 = (++it)-&gt;u.operand;
-            int r4 = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;define_accessor_property&quot;);
-            out.printf(&quot;%s, %s, %s, %s, %s&quot;, registerName(r0).data(), registerName(r1).data(), registerName(r2).data(), registerName(r3).data(), registerName(r4).data());
-            break;
-        }
-        case op_del_by_id: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            int id0 = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;del_by_id&quot;);
-            out.printf(&quot;%s, %s, %s&quot;, registerName(r0).data(), registerName(r1).data(), idName(id0, identifier(id0)).data());
-            break;
-        }
-        case op_get_by_val: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            int r2 = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;get_by_val&quot;);
-            out.printf(&quot;%s, %s, %s&quot;, registerName(r0).data(), registerName(r1).data(), registerName(r2).data());
-            dumpArrayProfiling(out, it, hasPrintedProfiling);
-            dumpValueProfiling(out, it, hasPrintedProfiling);
-            break;
-        }
-        case op_put_by_val: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            int r2 = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;put_by_val&quot;);
-            out.printf(&quot;%s, %s, %s&quot;, registerName(r0).data(), registerName(r1).data(), registerName(r2).data());
-            dumpArrayProfiling(out, it, hasPrintedProfiling);
-            break;
-        }
-        case op_put_by_val_direct: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            int r2 = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;put_by_val_direct&quot;);
-            out.printf(&quot;%s, %s, %s&quot;, registerName(r0).data(), registerName(r1).data(), registerName(r2).data());
-            dumpArrayProfiling(out, it, hasPrintedProfiling);
-            break;
-        }
-        case op_del_by_val: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            int r2 = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;del_by_val&quot;);
-            out.printf(&quot;%s, %s, %s&quot;, registerName(r0).data(), registerName(r1).data(), registerName(r2).data());
-            break;
-        }
-        case op_put_by_index: {
-            int r0 = (++it)-&gt;u.operand;
-            unsigned n0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;put_by_index&quot;);
-            out.printf(&quot;%s, %u, %s&quot;, registerName(r0).data(), n0, registerName(r1).data());
-            break;
-        }
-        case op_jmp: {
-            int offset = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;jmp&quot;);
-            out.printf(&quot;%d(-&gt;%d)&quot;, offset, location + offset);
-            break;
-        }
-        case op_jtrue: {
-            printConditionalJump(out, exec, begin, it, location, &quot;jtrue&quot;);
-            break;
-        }
-        case op_jfalse: {
-            printConditionalJump(out, exec, begin, it, location, &quot;jfalse&quot;);
-            break;
-        }
-        case op_jeq_null: {
-            printConditionalJump(out, exec, begin, it, location, &quot;jeq_null&quot;);
-            break;
-        }
-        case op_jneq_null: {
-            printConditionalJump(out, exec, begin, it, location, &quot;jneq_null&quot;);
-            break;
-        }
-        case op_jneq_ptr: {
-            int r0 = (++it)-&gt;u.operand;
-            Special::Pointer pointer = (++it)-&gt;u.specialPointer;
-            int offset = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;jneq_ptr&quot;);
-            out.printf(&quot;%s, %d (%p), %d(-&gt;%d)&quot;, registerName(r0).data(), pointer, m_globalObject-&gt;actualPointerFor(pointer), offset, location + offset);
-            ++it;
-            break;
-        }
-        case op_jless: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            int offset = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;jless&quot;);
-            out.printf(&quot;%s, %s, %d(-&gt;%d)&quot;, registerName(r0).data(), registerName(r1).data(), offset, location + offset);
-            break;
-        }
-        case op_jlesseq: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            int offset = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;jlesseq&quot;);
-            out.printf(&quot;%s, %s, %d(-&gt;%d)&quot;, registerName(r0).data(), registerName(r1).data(), offset, location + offset);
-            break;
-        }
-        case op_jgreater: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            int offset = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;jgreater&quot;);
-            out.printf(&quot;%s, %s, %d(-&gt;%d)&quot;, registerName(r0).data(), registerName(r1).data(), offset, location + offset);
-            break;
-        }
-        case op_jgreatereq: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            int offset = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;jgreatereq&quot;);
-            out.printf(&quot;%s, %s, %d(-&gt;%d)&quot;, registerName(r0).data(), registerName(r1).data(), offset, location + offset);
-            break;
-        }
-        case op_jnless: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            int offset = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;jnless&quot;);
-            out.printf(&quot;%s, %s, %d(-&gt;%d)&quot;, registerName(r0).data(), registerName(r1).data(), offset, location + offset);
-            break;
-        }
-        case op_jnlesseq: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            int offset = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;jnlesseq&quot;);
-            out.printf(&quot;%s, %s, %d(-&gt;%d)&quot;, registerName(r0).data(), registerName(r1).data(), offset, location + offset);
-            break;
-        }
-        case op_jngreater: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            int offset = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;jngreater&quot;);
-            out.printf(&quot;%s, %s, %d(-&gt;%d)&quot;, registerName(r0).data(), registerName(r1).data(), offset, location + offset);
-            break;
-        }
-        case op_jngreatereq: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            int offset = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;jngreatereq&quot;);
-            out.printf(&quot;%s, %s, %d(-&gt;%d)&quot;, registerName(r0).data(), registerName(r1).data(), offset, location + offset);
-            break;
-        }
-        case op_loop_hint: {
-            printLocationAndOp(out, exec, location, it, &quot;loop_hint&quot;);
-            break;
-        }
-        case op_check_traps: {
-            printLocationAndOp(out, exec, location, it, &quot;check_traps&quot;);
-            break;
-        }
-        case op_log_shadow_chicken_prologue: {
-            int r0 = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;log_shadow_chicken_prologue&quot;);
-            out.printf(&quot;%s&quot;, registerName(r0).data());
-            break;
-        }
-        case op_log_shadow_chicken_tail: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;log_shadow_chicken_tail&quot;);
-            out.printf(&quot;%s, %s&quot;, registerName(r0).data(), registerName(r1).data());
-            break;
-        }
-        case op_switch_imm: {
-            int tableIndex = (++it)-&gt;u.operand;
-            int defaultTarget = (++it)-&gt;u.operand;
-            int scrutineeRegister = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;switch_imm&quot;);
-            out.printf(&quot;%d, %d(-&gt;%d), %s&quot;, tableIndex, defaultTarget, location + defaultTarget, registerName(scrutineeRegister).data());
-            break;
-        }
-        case op_switch_char: {
-            int tableIndex = (++it)-&gt;u.operand;
-            int defaultTarget = (++it)-&gt;u.operand;
-            int scrutineeRegister = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;switch_char&quot;);
-            out.printf(&quot;%d, %d(-&gt;%d), %s&quot;, tableIndex, defaultTarget, location + defaultTarget, registerName(scrutineeRegister).data());
-            break;
-        }
-        case op_switch_string: {
-            int tableIndex = (++it)-&gt;u.operand;
-            int defaultTarget = (++it)-&gt;u.operand;
-            int scrutineeRegister = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;switch_string&quot;);
-            out.printf(&quot;%d, %d(-&gt;%d), %s&quot;, tableIndex, defaultTarget, location + defaultTarget, registerName(scrutineeRegister).data());
-            break;
-        }
-        case op_new_func: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            int f0 = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;new_func&quot;);
-            out.printf(&quot;%s, %s, f%d&quot;, registerName(r0).data(), registerName(r1).data(), f0);
-            break;
-        }
-        case op_new_generator_func: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            int f0 = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;new_generator_func&quot;);
-            out.printf(&quot;%s, %s, f%d&quot;, registerName(r0).data(), registerName(r1).data(), f0);
-            break;
-        }
-        case op_new_async_func: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            int f0 = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;new_async_func&quot;);
-            out.printf(&quot;%s, %s, f%d&quot;, registerName(r0).data(), registerName(r1).data(), f0);
-            break;
-        }
-        case op_new_func_exp: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            int f0 = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;new_func_exp&quot;);
-            out.printf(&quot;%s, %s, f%d&quot;, registerName(r0).data(), registerName(r1).data(), f0);
-            break;
-        }
-        case op_new_generator_func_exp: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            int f0 = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;new_generator_func_exp&quot;);
-            out.printf(&quot;%s, %s, f%d&quot;, registerName(r0).data(), registerName(r1).data(), f0);
-            break;
-        }
-        case op_new_async_func_exp: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            int f0 = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;new_async_func_exp&quot;);
-            out.printf(&quot;%s, %s, f%d&quot;, registerName(r0).data(), registerName(r1).data(), f0);
-            break;
-        }
-        case op_set_function_name: {
-            int funcReg = (++it)-&gt;u.operand;
-            int nameReg = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;set_function_name&quot;);
-            out.printf(&quot;%s, %s&quot;, registerName(funcReg).data(), registerName(nameReg).data());
-            break;
-        }
-        case op_call: {
-            printCallOp(out, exec, location, it, &quot;call&quot;, DumpCaches, hasPrintedProfiling, callLinkInfos);
-            break;
-        }
-        case op_tail_call: {
-            printCallOp(out, exec, location, it, &quot;tail_call&quot;, DumpCaches, hasPrintedProfiling, callLinkInfos);
-            break;
-        }
-        case op_call_eval: {
-            printCallOp(out, exec, location, it, &quot;call_eval&quot;, DontDumpCaches, hasPrintedProfiling, callLinkInfos);
-            break;
-        }
-            
-        case op_construct_varargs:
-        case op_call_varargs:
-        case op_tail_call_varargs:
-        case op_tail_call_forward_arguments: {
-            int result = (++it)-&gt;u.operand;
-            int callee = (++it)-&gt;u.operand;
-            int thisValue = (++it)-&gt;u.operand;
-            int arguments = (++it)-&gt;u.operand;
-            int firstFreeRegister = (++it)-&gt;u.operand;
-            int varArgOffset = (++it)-&gt;u.operand;
-            ++it;
-            const char* opName;
-            if (opcode == op_call_varargs)
-                opName = &quot;call_varargs&quot;;
-            else if (opcode == op_construct_varargs)
-                opName = &quot;construct_varargs&quot;;
-            else if (opcode == op_tail_call_varargs)
-                opName = &quot;tail_call_varargs&quot;;
-            else if (opcode == op_tail_call_forward_arguments)
-                opName = &quot;tail_call_forward_arguments&quot;;
-            else
-                RELEASE_ASSERT_NOT_REACHED();
-
-            printLocationAndOp(out, exec, location, it, opName);
-            out.printf(&quot;%s, %s, %s, %s, %d, %d&quot;, registerName(result).data(), registerName(callee).data(), registerName(thisValue).data(), registerName(arguments).data(), firstFreeRegister, varArgOffset);
-            dumpValueProfiling(out, it, hasPrintedProfiling);
-            break;
-        }
-
-        case op_ret: {
-            int r0 = (++it)-&gt;u.operand;
-            printLocationOpAndRegisterOperand(out, exec, location, it, &quot;ret&quot;, r0);
-            break;
-        }
-        case op_construct: {
-            printCallOp(out, exec, location, it, &quot;construct&quot;, DumpCaches, hasPrintedProfiling, callLinkInfos);
-            break;
-        }
-        case op_strcat: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            int count = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;strcat&quot;);
-            out.printf(&quot;%s, %s, %d&quot;, registerName(r0).data(), registerName(r1).data(), count);
-            break;
-        }
-        case op_to_primitive: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;to_primitive&quot;);
-            out.printf(&quot;%s, %s&quot;, registerName(r0).data(), registerName(r1).data());
-            break;
-        }
-        case op_get_enumerable_length: {
-            int dst = it[1].u.operand;
-            int base = it[2].u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;op_get_enumerable_length&quot;);
-            out.printf(&quot;%s, %s&quot;, registerName(dst).data(), registerName(base).data());
-            it += OPCODE_LENGTH(op_get_enumerable_length) - 1;
-            break;
-        }
-        case op_has_indexed_property: {
-            int dst = it[1].u.operand;
-            int base = it[2].u.operand;
-            int propertyName = it[3].u.operand;
-            ArrayProfile* arrayProfile = it[4].u.arrayProfile;
-            printLocationAndOp(out, exec, location, it, &quot;op_has_indexed_property&quot;);
-            out.printf(&quot;%s, %s, %s, %p&quot;, registerName(dst).data(), registerName(base).data(), registerName(propertyName).data(), arrayProfile);
-            it += OPCODE_LENGTH(op_has_indexed_property) - 1;
-            break;
-        }
-        case op_has_structure_property: {
-            int dst = it[1].u.operand;
-            int base = it[2].u.operand;
-            int propertyName = it[3].u.operand;
-            int enumerator = it[4].u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;op_has_structure_property&quot;);
-            out.printf(&quot;%s, %s, %s, %s&quot;, registerName(dst).data(), registerName(base).data(), registerName(propertyName).data(), registerName(enumerator).data());
-            it += OPCODE_LENGTH(op_has_structure_property) - 1;
-            break;
-        }
-        case op_has_generic_property: {
-            int dst = it[1].u.operand;
-            int base = it[2].u.operand;
-            int propertyName = it[3].u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;op_has_generic_property&quot;);
-            out.printf(&quot;%s, %s, %s&quot;, registerName(dst).data(), registerName(base).data(), registerName(propertyName).data());
-            it += OPCODE_LENGTH(op_has_generic_property) - 1;
-            break;
-        }
-        case op_get_direct_pname: {
-            int dst = it[1].u.operand;
-            int base = it[2].u.operand;
-            int propertyName = it[3].u.operand;
-            int index = it[4].u.operand;
-            int enumerator = it[5].u.operand;
-            ValueProfile* profile = it[6].u.profile;
-            printLocationAndOp(out, exec, location, it, &quot;op_get_direct_pname&quot;);
-            out.printf(&quot;%s, %s, %s, %s, %s, %p&quot;, registerName(dst).data(), registerName(base).data(), registerName(propertyName).data(), registerName(index).data(), registerName(enumerator).data(), profile);
-            it += OPCODE_LENGTH(op_get_direct_pname) - 1;
-            break;
-
-        }
-        case op_get_property_enumerator: {
-            int dst = it[1].u.operand;
-            int base = it[2].u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;op_get_property_enumerator&quot;);
-            out.printf(&quot;%s, %s&quot;, registerName(dst).data(), registerName(base).data());
-            it += OPCODE_LENGTH(op_get_property_enumerator) - 1;
-            break;
-        }
-        case op_enumerator_structure_pname: {
-            int dst = it[1].u.operand;
-            int enumerator = it[2].u.operand;
-            int index = it[3].u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;op_enumerator_structure_pname&quot;);
-            out.printf(&quot;%s, %s, %s&quot;, registerName(dst).data(), registerName(enumerator).data(), registerName(index).data());
-            it += OPCODE_LENGTH(op_enumerator_structure_pname) - 1;
-            break;
-        }
-        case op_enumerator_generic_pname: {
-            int dst = it[1].u.operand;
-            int enumerator = it[2].u.operand;
-            int index = it[3].u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;op_enumerator_generic_pname&quot;);
-            out.printf(&quot;%s, %s, %s&quot;, registerName(dst).data(), registerName(enumerator).data(), registerName(index).data());
-            it += OPCODE_LENGTH(op_enumerator_generic_pname) - 1;
-            break;
-        }
-        case op_to_index_string: {
-            int dst = it[1].u.operand;
-            int index = it[2].u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;op_to_index_string&quot;);
-            out.printf(&quot;%s, %s&quot;, registerName(dst).data(), registerName(index).data());
-            it += OPCODE_LENGTH(op_to_index_string) - 1;
-            break;
-        }
-        case op_push_with_scope: {
-            int dst = (++it)-&gt;u.operand;
-            int newScope = (++it)-&gt;u.operand;
-            int currentScope = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;push_with_scope&quot;);
-            out.printf(&quot;%s, %s, %s&quot;, registerName(dst).data(), registerName(newScope).data(), registerName(currentScope).data());
-            break;
-        }
-        case op_get_parent_scope: {
-            int dst = (++it)-&gt;u.operand;
-            int parentScope = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;get_parent_scope&quot;);
-            out.printf(&quot;%s, %s&quot;, registerName(dst).data(), registerName(parentScope).data());
-            break;
-        }
-        case op_create_lexical_environment: {
-            int dst = (++it)-&gt;u.operand;
-            int scope = (++it)-&gt;u.operand;
-            int symbolTable = (++it)-&gt;u.operand;
-            int initialValue = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;create_lexical_environment&quot;);
-            out.printf(&quot;%s, %s, %s, %s&quot;, 
-                registerName(dst).data(), registerName(scope).data(), registerName(symbolTable).data(), registerName(initialValue).data());
-            break;
-        }
-        case op_catch: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;catch&quot;);
-            out.printf(&quot;%s, %s&quot;, registerName(r0).data(), registerName(r1).data());
-            break;
-        }
-        case op_throw: {
-            int r0 = (++it)-&gt;u.operand;
-            printLocationOpAndRegisterOperand(out, exec, location, it, &quot;throw&quot;, r0);
-            break;
-        }
-        case op_throw_static_error: {
-            int k0 = (++it)-&gt;u.operand;
-            ErrorType k1 = static_cast&lt;ErrorType&gt;((++it)-&gt;u.unsignedValue);
-            printLocationAndOp(out, exec, location, it, &quot;throw_static_error&quot;);
-            out.printf(&quot;%s, &quot;, constantName(k0).data());
-            out.print(k1);
-            break;
-        }
-        case op_debug: {
-            int debugHookType = (++it)-&gt;u.operand;
-            int hasBreakpointFlag = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;debug&quot;);
-            out.printf(&quot;%s, %d&quot;, debugHookName(debugHookType), hasBreakpointFlag);
-            break;
-        }
-        case op_assert: {
-            int condition = (++it)-&gt;u.operand;
-            int line = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;assert&quot;);
-            out.printf(&quot;%s, %d&quot;, registerName(condition).data(), line);
-            break;
-        }
-        case op_end: {
-            int r0 = (++it)-&gt;u.operand;
-            printLocationOpAndRegisterOperand(out, exec, location, it, &quot;end&quot;, r0);
-            break;
-        }
-        case op_resolve_scope: {
-            int r0 = (++it)-&gt;u.operand;
-            int scope = (++it)-&gt;u.operand;
-            int id0 = (++it)-&gt;u.operand;
-            ResolveType resolveType = static_cast&lt;ResolveType&gt;((++it)-&gt;u.operand);
-            int depth = (++it)-&gt;u.operand;
-            void* pointer = (++it)-&gt;u.pointer;
-            printLocationAndOp(out, exec, location, it, &quot;resolve_scope&quot;);
-            out.printf(&quot;%s, %s, %s, &lt;%s&gt;, %d, %p&quot;, registerName(r0).data(), registerName(scope).data(), idName(id0, identifier(id0)).data(), resolveTypeName(resolveType), depth, pointer);
-            break;
-        }
-        case op_get_from_scope: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            int id0 = (++it)-&gt;u.operand;
-            GetPutInfo getPutInfo = GetPutInfo((++it)-&gt;u.operand);
-            ++it; // Structure
-            int operand = (++it)-&gt;u.operand; // Operand
-            printLocationAndOp(out, exec, location, it, &quot;get_from_scope&quot;);
-            out.print(registerName(r0), &quot;, &quot;, registerName(r1));
-            if (static_cast&lt;unsigned&gt;(id0) == UINT_MAX)
-                out.print(&quot;, anonymous&quot;);
-            else
-                out.print(&quot;, &quot;, idName(id0, identifier(id0)));
-            out.print(&quot;, &quot;, getPutInfo.operand(), &quot;&lt;&quot;, resolveModeName(getPutInfo.resolveMode()), &quot;|&quot;, resolveTypeName(getPutInfo.resolveType()), &quot;|&quot;, initializationModeName(getPutInfo.initializationMode()), &quot;&gt;, &quot;, operand);
-            dumpValueProfiling(out, it, hasPrintedProfiling);
-            break;
-        }
-        case op_put_to_scope: {
-            int r0 = (++it)-&gt;u.operand;
-            int id0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            GetPutInfo getPutInfo = GetPutInfo((++it)-&gt;u.operand);
-            ++it; // Structure
-            int operand = (++it)-&gt;u.operand; // Operand
-            printLocationAndOp(out, exec, location, it, &quot;put_to_scope&quot;);
-            out.print(registerName(r0));
-            if (static_cast&lt;unsigned&gt;(id0) == UINT_MAX)
-                out.print(&quot;, anonymous&quot;);
-            else
-                out.print(&quot;, &quot;, idName(id0, identifier(id0)));
-            out.print(&quot;, &quot;, registerName(r1), &quot;, &quot;, getPutInfo.operand(), &quot;&lt;&quot;, resolveModeName(getPutInfo.resolveMode()), &quot;|&quot;, resolveTypeName(getPutInfo.resolveType()), &quot;|&quot;, initializationModeName(getPutInfo.initializationMode()), &quot;&gt;, &lt;structure&gt;, &quot;, operand);
-            break;
-        }
-        case op_get_from_arguments: {
-            int r0 = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            int offset = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;get_from_arguments&quot;);
-            out.printf(&quot;%s, %s, %d&quot;, registerName(r0).data(), registerName(r1).data(), offset);
-            dumpValueProfiling(out, it, hasPrintedProfiling);
-            break;
-        }
-        case op_put_to_arguments: {
-            int r0 = (++it)-&gt;u.operand;
-            int offset = (++it)-&gt;u.operand;
-            int r1 = (++it)-&gt;u.operand;
-            printLocationAndOp(out, exec, location, it, &quot;put_to_arguments&quot;);
-            out.printf(&quot;%s, %d, %s&quot;, registerName(r0).data(), offset, registerName(r1).data());
-            break;
-        }
-        default:
-            RELEASE_ASSERT_NOT_REACHED();
-    }
-
-    dumpRareCaseProfile(out, &quot;rare case: &quot;, rareCaseProfileForBytecodeOffset(location), hasPrintedProfiling);
-    {
-        dumpArithProfile(out, arithProfileForBytecodeOffset(location), hasPrintedProfiling);
-    }
-    
-#if ENABLE(DFG_JIT)
-    Vector&lt;DFG::FrequentExitSite&gt; exitSites = exitProfile().exitSitesFor(location);
-    if (!exitSites.isEmpty()) {
-        out.print(&quot; !! frequent exits: &quot;);
-        CommaPrinter comma;
-        for (auto&amp; exitSite : exitSites)
-            out.print(comma, exitSite.kind(), &quot; &quot;, exitSite.jitType());
-    }
-#else // ENABLE(DFG_JIT)
-    UNUSED_PARAM(location);
-#endif // ENABLE(DFG_JIT)
-    out.print(&quot;\n&quot;);
-}
-
-void CodeBlock::dumpBytecode(
</del><span class="cx">     PrintStream&amp; out, unsigned bytecodeOffset,
</span><span class="cx">     const StubInfoMap&amp; stubInfos, const CallLinkInfoMap&amp; callLinkInfos)
</span><span class="cx"> {
</span><del>-    ExecState* exec = m_globalObject-&gt;globalExec();
</del><span class="cx">     const Instruction* it = instructions().begin() + bytecodeOffset;
</span><del>-    dumpBytecode(out, exec, instructions().begin(), it, stubInfos, callLinkInfos);
</del><ins>+    dumpBytecode(out, instructions().begin(), it, stubInfos, callLinkInfos);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #define FOR_EACH_MEMBER_VECTOR(macro) \
</span><span class="lines">@@ -2320,7 +783,7 @@
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         case op_debug: {
</span><del>-            if (pc[1].u.index == DidReachBreakpoint)
</del><ins>+            if (pc[1].u.unsignedValue == DidReachBreakpoint)
</ins><span class="cx">                 m_hasDebuggerStatement = true;
</span><span class="cx">             break;
</span><span class="cx">         }
</span><span class="lines">@@ -2647,7 +1110,7 @@
</span><span class="cx">         const Vector&lt;unsigned&gt;&amp; propertyAccessInstructions = m_unlinkedCode-&gt;propertyAccessInstructions();
</span><span class="cx">         for (size_t i = 0; i &lt; propertyAccessInstructions.size(); ++i) {
</span><span class="cx">             Instruction* instruction = &amp;instructions()[propertyAccessInstructions[i]];
</span><del>-            switch (interpreter-&gt;getOpcodeID(instruction[0].u.opcode)) {
</del><ins>+            switch (interpreter-&gt;getOpcodeID(instruction[0])) {
</ins><span class="cx">             case op_put_by_id: {
</span><span class="cx">                 StructureID oldStructureID = instruction[4].u.structureID;
</span><span class="cx">                 StructureID newStructureID = instruction[6].u.structureID;
</span><span class="lines">@@ -2781,7 +1244,7 @@
</span><span class="cx">     const Vector&lt;unsigned&gt;&amp; propertyAccessInstructions = m_unlinkedCode-&gt;propertyAccessInstructions();
</span><span class="cx">     for (size_t size = propertyAccessInstructions.size(), i = 0; i &lt; size; ++i) {
</span><span class="cx">         Instruction* curInstruction = &amp;instructions()[propertyAccessInstructions[i]];
</span><del>-        switch (interpreter-&gt;getOpcodeID(curInstruction[0].u.opcode)) {
</del><ins>+        switch (interpreter-&gt;getOpcodeID(curInstruction[0])) {
</ins><span class="cx">         case op_get_by_id:
</span><span class="cx">         case op_get_by_id_proto_load:
</span><span class="cx">         case op_get_by_id_unset: {
</span><span class="lines">@@ -2859,7 +1322,7 @@
</span><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         default:
</span><del>-            OpcodeID opcodeID = interpreter-&gt;getOpcodeID(curInstruction[0].u.opcode);
</del><ins>+            OpcodeID opcodeID = interpreter-&gt;getOpcodeID(curInstruction[0]);
</ins><span class="cx">             ASSERT_WITH_MESSAGE_UNUSED(opcodeID, false, &quot;Unhandled opcode in CodeBlock::finalizeUnconditionally, %s(%d) at bc %u&quot;, opcodeNames[opcodeID], opcodeID, propertyAccessInstructions[i]);
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="lines">@@ -3241,7 +1704,7 @@
</span><span class="cx">     const Instruction* begin = instructions().begin();
</span><span class="cx">     const Instruction* end = instructions().end();
</span><span class="cx">     for (const Instruction* it = begin; it != end;) {
</span><del>-        OpcodeID opcodeID = interpreter-&gt;getOpcodeID(it-&gt;u.opcode);
</del><ins>+        OpcodeID opcodeID = interpreter-&gt;getOpcodeID(*it);
</ins><span class="cx">         if (opcodeID == op_debug) {
</span><span class="cx">             unsigned bytecodeOffset = it - begin;
</span><span class="cx">             int unused;
</span><span class="lines">@@ -4188,7 +2651,7 @@
</span><span class="cx">     unsigned instructionCount = instructions().size();
</span><span class="cx">     
</span><span class="cx">     for (unsigned bytecodeOffset = 0; bytecodeOffset &lt; instructionCount; ) {
</span><del>-        switch (interpreter-&gt;getOpcodeID(instructionsBegin[bytecodeOffset].u.opcode)) {
</del><ins>+        switch (interpreter-&gt;getOpcodeID(instructionsBegin[bytecodeOffset])) {
</ins><span class="cx"> #define DEFINE_OP(curOpcode, length)        \
</span><span class="cx">         case curOpcode:                     \
</span><span class="cx">             if (curOpcode == opcodeID)      \
</span><span class="lines">@@ -4233,7 +2696,7 @@
</span><span class="cx"> 
</span><span class="cx"> ValueProfile* CodeBlock::valueProfileForBytecodeOffset(int bytecodeOffset)
</span><span class="cx"> {
</span><del>-    OpcodeID opcodeID = m_vm-&gt;interpreter-&gt;getOpcodeID(instructions()[bytecodeOffset].u.opcode);
</del><ins>+    OpcodeID opcodeID = m_vm-&gt;interpreter-&gt;getOpcodeID(instructions()[bytecodeOffset]);
</ins><span class="cx">     unsigned length = opcodeLength(opcodeID);
</span><span class="cx">     return instructions()[bytecodeOffset + length - 1].u.profile;
</span><span class="cx"> }
</span><span class="lines">@@ -4322,7 +2785,7 @@
</span><span class="cx"> 
</span><span class="cx"> ArithProfile* CodeBlock::arithProfileForPC(Instruction* pc)
</span><span class="cx"> {
</span><del>-    auto opcodeID = vm()-&gt;interpreter-&gt;getOpcodeID(pc[0].u.opcode);
</del><ins>+    auto opcodeID = vm()-&gt;interpreter-&gt;getOpcodeID(pc[0]);
</ins><span class="cx">     switch (opcodeID) {
</span><span class="cx">     case op_negate:
</span><span class="cx">         return bitwise_cast&lt;ArithProfile*&gt;(&amp;pc[3].u.operand);
</span><span class="lines">@@ -4369,12 +2832,12 @@
</span><span class="cx">         // Because op_profile_control_flow is emitted at the beginning of every basic block, finding 
</span><span class="cx">         // the next op_profile_control_flow will give us the text range of a single basic block.
</span><span class="cx">         size_t startIdx = bytecodeOffsets[i];
</span><del>-        RELEASE_ASSERT(vm()-&gt;interpreter-&gt;getOpcodeID(instructions[startIdx].u.opcode) == op_profile_control_flow);
</del><ins>+        RELEASE_ASSERT(vm()-&gt;interpreter-&gt;getOpcodeID(instructions[startIdx]) == op_profile_control_flow);
</ins><span class="cx">         int basicBlockStartOffset = instructions[startIdx + 1].u.operand;
</span><span class="cx">         int basicBlockEndOffset;
</span><span class="cx">         if (i + 1 &lt; offsetsLength) {
</span><span class="cx">             size_t endIdx = bytecodeOffsets[i + 1];
</span><del>-            RELEASE_ASSERT(vm()-&gt;interpreter-&gt;getOpcodeID(instructions[endIdx].u.opcode) == op_profile_control_flow);
</del><ins>+            RELEASE_ASSERT(vm()-&gt;interpreter-&gt;getOpcodeID(instructions[endIdx]) == op_profile_control_flow);
</ins><span class="cx">             basicBlockEndOffset = instructions[endIdx + 1].u.operand - 1;
</span><span class="cx">         } else {
</span><span class="cx">             basicBlockEndOffset = m_sourceOffset + ownerScriptExecutable()-&gt;source().length() - 1; // Offset before the closing brace.
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeCodeBlockh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/CodeBlock.h (213208 => 213209)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/CodeBlock.h        2017-03-01 07:57:08 UTC (rev 213208)
+++ trunk/Source/JavaScriptCore/bytecode/CodeBlock.h        2017-03-01 08:15:45 UTC (rev 213209)
</span><span class="lines">@@ -191,9 +191,9 @@
</span><span class="cx"> 
</span><span class="cx">     void dumpBytecode();
</span><span class="cx">     void dumpBytecode(PrintStream&amp;);
</span><del>-    void dumpBytecode(
-        PrintStream&amp;, unsigned bytecodeOffset,
-        const StubInfoMap&amp; = StubInfoMap(), const CallLinkInfoMap&amp; = CallLinkInfoMap());
</del><ins>+    void dumpBytecode(PrintStream&amp; out, const Instruction* begin, const Instruction*&amp; it, const StubInfoMap&amp; = StubInfoMap(), const CallLinkInfoMap&amp; = CallLinkInfoMap());
+    void dumpBytecode(PrintStream&amp; out, unsigned bytecodeOffset, const StubInfoMap&amp; = StubInfoMap(), const CallLinkInfoMap&amp; = CallLinkInfoMap());
+
</ins><span class="cx">     void dumpExceptionHandlers(PrintStream&amp;);
</span><span class="cx">     void printStructures(PrintStream&amp;, const Instruction*);
</span><span class="cx">     void printStructure(PrintStream&amp;, const char* name, const Instruction*, int operand);
</span><span class="lines">@@ -542,6 +542,7 @@
</span><span class="cx">         return result;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    const Vector&lt;WriteBarrier&lt;Unknown&gt;&gt;&amp; constantRegisters() { return m_constantRegisters; }
</ins><span class="cx">     WriteBarrier&lt;Unknown&gt;&amp; constantRegister(int index) { return m_constantRegisters[index - FirstConstantRegisterIndex]; }
</span><span class="cx">     static ALWAYS_INLINE bool isConstantRegisterIndex(int index) { return index &gt;= FirstConstantRegisterIndex; }
</span><span class="cx">     ALWAYS_INLINE JSValue getConstant(int index) const { return m_constantRegisters[index - FirstConstantRegisterIndex].get(); }
</span><span class="lines">@@ -552,7 +553,11 @@
</span><span class="cx">     FunctionExecutable* functionExpr(int index) { return m_functionExprs[index].get(); }
</span><span class="cx">     
</span><span class="cx">     RegExp* regexp(int index) const { return m_unlinkedCode-&gt;regexp(index); }
</span><ins>+    unsigned numberOfRegExps() const { return m_unlinkedCode-&gt;numberOfRegExps(); }
</ins><span class="cx"> 
</span><ins>+    const Vector&lt;BitVector&gt;&amp; bitVectors() const { return m_unlinkedCode-&gt;bitVectors(); }
+    const BitVector&amp; bitVector(size_t i) { return m_unlinkedCode-&gt;bitVector(i); }
+
</ins><span class="cx">     unsigned numberOfConstantBuffers() const
</span><span class="cx">     {
</span><span class="cx">         if (!m_rareData)
</span><span class="lines">@@ -917,30 +922,6 @@
</span><span class="cx">         m_constantRegisters[index - FirstConstantRegisterIndex].set(m_globalObject-&gt;vm(), this, value);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    void dumpBytecode(
-        PrintStream&amp;, ExecState*, const Instruction* begin, const Instruction*&amp;,
-        const StubInfoMap&amp; = StubInfoMap(), const CallLinkInfoMap&amp; = CallLinkInfoMap());
-
-    CString registerName(int r) const;
-    CString constantName(int index) const;
-    void printUnaryOp(PrintStream&amp;, ExecState*, int location, const Instruction*&amp;, const char* op);
-    void printBinaryOp(PrintStream&amp;, ExecState*, int location, const Instruction*&amp;, const char* op);
-    void printConditionalJump(PrintStream&amp;, ExecState*, const Instruction*, const Instruction*&amp;, int location, const char* op);
-    void printGetByIdOp(PrintStream&amp;, ExecState*, int location, const Instruction*&amp;);
-    void printGetByIdCacheStatus(PrintStream&amp;, ExecState*, int location, const StubInfoMap&amp;);
-    enum CacheDumpMode { DumpCaches, DontDumpCaches };
-    void printCallOp(PrintStream&amp;, ExecState*, int location, const Instruction*&amp;, const char* op, CacheDumpMode, bool&amp; hasPrintedProfiling, const CallLinkInfoMap&amp;);
-    void printPutByIdOp(PrintStream&amp;, ExecState*, int location, const Instruction*&amp;, const char* op);
-    void printPutByIdCacheStatus(PrintStream&amp;, int location, const StubInfoMap&amp;);
-    void printLocationAndOp(PrintStream&amp;, ExecState*, int location, const Instruction*&amp;, const char* op);
-    void printLocationOpAndRegisterOperand(PrintStream&amp;, ExecState*, int location, const Instruction*&amp; it, const char* op, int operand);
-
-    void beginDumpProfiling(PrintStream&amp;, bool&amp; hasPrintedProfiling);
-    void dumpValueProfiling(PrintStream&amp;, const Instruction*&amp;, bool&amp; hasPrintedProfiling);
-    void dumpArrayProfiling(PrintStream&amp;, const Instruction*&amp;, bool&amp; hasPrintedProfiling);
-    void dumpRareCaseProfile(PrintStream&amp;, const char* name, RareCaseProfile*, bool&amp; hasPrintedProfiling);
-    void dumpArithProfile(PrintStream&amp;, ArithProfile*, bool&amp; hasPrintedProfiling);
-
</del><span class="cx">     bool shouldVisitStrongly(const ConcurrentJSLocker&amp;);
</span><span class="cx">     bool shouldJettisonDueToWeakReference();
</span><span class="cx">     bool shouldJettisonDueToOldAge(const ConcurrentJSLocker&amp;);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeHandlerInfoh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/HandlerInfo.h (213208 => 213209)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/HandlerInfo.h        2017-03-01 07:57:08 UTC (rev 213208)
+++ trunk/Source/JavaScriptCore/bytecode/HandlerInfo.h        2017-03-01 08:15:45 UTC (rev 213209)
</span><span class="lines">@@ -46,7 +46,7 @@
</span><span class="cx">     HandlerType type() const { return static_cast&lt;HandlerType&gt;(typeBits); }
</span><span class="cx">     void setType(HandlerType type) { typeBits = static_cast&lt;uint32_t&gt;(type); }
</span><span class="cx"> 
</span><del>-    const char* typeName()
</del><ins>+    const char* typeName() const
</ins><span class="cx">     {
</span><span class="cx">         switch (type()) {
</span><span class="cx">         case HandlerType::Catch:
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeUnlinkedCodeBlockcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.cpp (213208 => 213209)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.cpp        2017-03-01 07:57:08 UTC (rev 213208)
+++ trunk/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.cpp        2017-03-01 08:15:45 UTC (rev 213209)
</span><span class="lines">@@ -413,4 +413,8 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void UnlinkedCodeBlock::dump(PrintStream&amp;) const
+{
+}
+
</ins><span class="cx"> } // namespace JSC
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeUnlinkedCodeBlockh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.h (213208 => 213209)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.h        2017-03-01 07:57:08 UTC (rev 213208)
+++ trunk/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.h        2017-03-01 08:15:45 UTC (rev 213209)
</span><span class="lines">@@ -104,7 +104,7 @@
</span><span class="cx">     union {
</span><span class="cx">         OpcodeID opcode;
</span><span class="cx">         int32_t operand;
</span><del>-        unsigned index;
</del><ins>+        unsigned unsignedValue;
</ins><span class="cx">     } u;
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="lines">@@ -215,6 +215,7 @@
</span><span class="cx">     const Vector&lt;WriteBarrier&lt;Unknown&gt;&gt;&amp; constantRegisters() { return m_constantRegisters; }
</span><span class="cx">     const WriteBarrier&lt;Unknown&gt;&amp; constantRegister(int index) const { return m_constantRegisters[index - FirstConstantRegisterIndex]; }
</span><span class="cx">     ALWAYS_INLINE bool isConstantRegisterIndex(int index) const { return index &gt;= FirstConstantRegisterIndex; }
</span><ins>+    ALWAYS_INLINE JSValue getConstant(int index) const { return m_constantRegisters[index - FirstConstantRegisterIndex].get(); }
</ins><span class="cx">     const Vector&lt;SourceCodeRepresentation&gt;&amp; constantsSourceCodeRepresentation() { return m_constantsSourceCodeRepresentation; }
</span><span class="cx"> 
</span><span class="cx">     // Jumps
</span><span class="lines">@@ -380,6 +381,8 @@
</span><span class="cx">     TriState didOptimize() const { return m_didOptimize; }
</span><span class="cx">     void setDidOptimize(TriState didOptimize) { m_didOptimize = didOptimize; }
</span><span class="cx"> 
</span><ins>+    void dump(PrintStream&amp;) const;
+
</ins><span class="cx"> protected:
</span><span class="cx">     UnlinkedCodeBlock(VM*, Structure*, CodeType, const ExecutableInfo&amp;, DebuggerMode);
</span><span class="cx">     ~UnlinkedCodeBlock();
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeUnlinkedInstructionStreamcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/UnlinkedInstructionStream.cpp (213208 => 213209)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/UnlinkedInstructionStream.cpp        2017-03-01 07:57:08 UTC (rev 213208)
+++ trunk/Source/JavaScriptCore/bytecode/UnlinkedInstructionStream.cpp        2017-03-01 08:15:45 UTC (rev 213209)
</span><span class="lines">@@ -95,7 +95,7 @@
</span><span class="cx">         unsigned opLength = opcodeLength(opcode);
</span><span class="cx"> 
</span><span class="cx">         for (unsigned j = 1; j &lt; opLength; ++j)
</span><del>-            append32(ptr, pc[j].u.index);
</del><ins>+            append32(ptr, pc[j].u.unsignedValue);
</ins><span class="cx"> 
</span><span class="cx">         i += opLength;
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeUnlinkedInstructionStreamh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/UnlinkedInstructionStream.h (213208 => 213209)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/UnlinkedInstructionStream.h        2017-03-01 07:57:08 UTC (rev 213208)
+++ trunk/Source/JavaScriptCore/bytecode/UnlinkedInstructionStream.h        2017-03-01 08:15:45 UTC (rev 213209)
</span><span class="lines">@@ -142,7 +142,7 @@
</span><span class="cx">     m_unpackedBuffer[0].u.opcode = static_cast&lt;OpcodeID&gt;(read8());
</span><span class="cx">     unsigned opLength = opcodeLength(m_unpackedBuffer[0].u.opcode);
</span><span class="cx">     for (unsigned i = 1; i &lt; opLength; ++i)
</span><del>-        m_unpackedBuffer[i].u.index = read32();
</del><ins>+        m_unpackedBuffer[i].u.unsignedValue = read32();
</ins><span class="cx">     return m_unpackedBuffer;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeOptionsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Options.h (213208 => 213209)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Options.h        2017-03-01 07:57:08 UTC (rev 213208)
+++ trunk/Source/JavaScriptCore/runtime/Options.h        2017-03-01 08:15:45 UTC (rev 213209)
</span><span class="lines">@@ -132,6 +132,7 @@
</span><span class="cx">     v(bool, dumpBytecodeLivenessResults, false, Normal, nullptr) \
</span><span class="cx">     v(bool, validateBytecode, false, Normal, nullptr) \
</span><span class="cx">     v(bool, forceDebuggerBytecodeGeneration, false, Normal, nullptr) \
</span><ins>+    v(bool, dumpBytecodesBeforeGeneratorification, false, Normal, nullptr) \
</ins><span class="cx">     \
</span><span class="cx">     v(bool, useFunctionDotArguments, true, Normal, nullptr) \
</span><span class="cx">     v(bool, useTailCalls, true, Normal, nullptr) \
</span></span></pre>
</div>
</div>

</body>
</html>