<!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>[205107] 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/205107">205107</a></dd>
<dt>Author</dt> <dd>sbarati@apple.com</dd>
<dt>Date</dt> <dd>2016-08-28 16:31:46 -0700 (Sun, 28 Aug 2016)</dd>
</dl>
<h3>Log Message</h3>
<pre>Make SpeculatedType a 64-bit integer
https://bugs.webkit.org/show_bug.cgi?id=161268
Reviewed by Filip Pizlo and Benjamin Poulain.
I'm going to introduce two new types into this and we only
have room for one in 32-bits. So, this patch widens SpeculatedType
to 64 bits. This also pulls this information through the DFG where
we needed to change DFGNode to support this.
* bytecode/SpeculatedType.h:
* dfg/DFGNode.cpp:
(JSC::DFG::Node::convertToPutHint):
(JSC::DFG::Node::promotedLocationDescriptor):
* dfg/DFGNode.h:
(JSC::DFG::Node::Node):
(JSC::DFG::Node::convertToCheckStructure):
(JSC::DFG::Node::constant):
(JSC::DFG::Node::convertToConstant):
(JSC::DFG::Node::convertToConstantStoragePointer):
(JSC::DFG::Node::convertToPutStack):
(JSC::DFG::Node::convertToGetStack):
(JSC::DFG::Node::convertToGetByOffset):
(JSC::DFG::Node::convertToMultiGetByOffset):
(JSC::DFG::Node::convertToPutByOffset):
(JSC::DFG::Node::convertToMultiPutByOffset):
(JSC::DFG::Node::convertToPhantomNewObject):
(JSC::DFG::Node::convertToPhantomNewFunction):
(JSC::DFG::Node::convertToPhantomNewGeneratorFunction):
(JSC::DFG::Node::convertToPhantomCreateActivation):
(JSC::DFG::Node::convertToGetLocal):
(JSC::DFG::Node::lazyJSValue):
(JSC::DFG::Node::initializationValueForActivation):
(JSC::DFG::Node::tryGetVariableAccessData):
(JSC::DFG::Node::variableAccessData):
(JSC::DFG::Node::unlinkedLocal):
(JSC::DFG::Node::unlinkedMachineLocal):
(JSC::DFG::Node::stackAccessData):
(JSC::DFG::Node::phi):
(JSC::DFG::Node::identifierNumber):
(JSC::DFG::Node::getPutInfo):
(JSC::DFG::Node::accessorAttributes):
(JSC::DFG::Node::newArrayBufferData):
(JSC::DFG::Node::indexingType):
(JSC::DFG::Node::typedArrayType):
(JSC::DFG::Node::inlineCapacity):
(JSC::DFG::Node::scopeOffset):
(JSC::DFG::Node::capturedArgumentsOffset):
(JSC::DFG::Node::variablePointer):
(JSC::DFG::Node::callVarargsData):
(JSC::DFG::Node::loadVarargsData):
(JSC::DFG::Node::targetBytecodeOffsetDuringParsing):
(JSC::DFG::Node::targetBlock):
(JSC::DFG::Node::branchData):
(JSC::DFG::Node::switchData):
(JSC::DFG::Node::getHeapPrediction):
(JSC::DFG::Node::cellOperand):
(JSC::DFG::Node::watchpointSet):
(JSC::DFG::Node::storagePointer):
(JSC::DFG::Node::uidOperand):
(JSC::DFG::Node::typeInfoOperand):
(JSC::DFG::Node::transition):
(JSC::DFG::Node::structureSet):
(JSC::DFG::Node::structure):
(JSC::DFG::Node::storageAccessData):
(JSC::DFG::Node::multiGetByOffsetData):
(JSC::DFG::Node::multiPutByOffsetData):
(JSC::DFG::Node::objectMaterializationData):
(JSC::DFG::Node::arrayMode):
(JSC::DFG::Node::arithMode):
(JSC::DFG::Node::arithRoundingMode):
(JSC::DFG::Node::setArithRoundingMode):
(JSC::DFG::Node::executionCounter):
(JSC::DFG::Node::typeLocation):
(JSC::DFG::Node::basicBlockLocation):
(JSC::DFG::Node::numberOfArgumentsToSkip):
(JSC::DFG::Node::OpInfoWrapper::OpInfoWrapper):
(JSC::DFG::Node::OpInfoWrapper::operator=):
* dfg/DFGOpInfo.h:
(JSC::DFG::OpInfo::OpInfo):
* dfg/DFGPromotedHeapLocation.h:
(JSC::DFG::PromotedLocationDescriptor::imm1):
(JSC::DFG::PromotedLocationDescriptor::imm2):</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeSpeculatedTypeh">trunk/Source/JavaScriptCore/bytecode/SpeculatedType.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGNodecpp">trunk/Source/JavaScriptCore/dfg/DFGNode.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGNodeh">trunk/Source/JavaScriptCore/dfg/DFGNode.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGOpInfoh">trunk/Source/JavaScriptCore/dfg/DFGOpInfo.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGPromotedHeapLocationh">trunk/Source/JavaScriptCore/dfg/DFGPromotedHeapLocation.h</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (205106 => 205107)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2016-08-28 22:38:41 UTC (rev 205106)
+++ trunk/Source/JavaScriptCore/ChangeLog        2016-08-28 23:31:46 UTC (rev 205107)
</span><span class="lines">@@ -1,3 +1,89 @@
</span><ins>+2016-08-28 Saam Barati <sbarati@apple.com>
+
+ Make SpeculatedType a 64-bit integer
+ https://bugs.webkit.org/show_bug.cgi?id=161268
+
+ Reviewed by Filip Pizlo and Benjamin Poulain.
+
+ I'm going to introduce two new types into this and we only
+ have room for one in 32-bits. So, this patch widens SpeculatedType
+ to 64 bits. This also pulls this information through the DFG where
+ we needed to change DFGNode to support this.
+
+ * bytecode/SpeculatedType.h:
+ * dfg/DFGNode.cpp:
+ (JSC::DFG::Node::convertToPutHint):
+ (JSC::DFG::Node::promotedLocationDescriptor):
+ * dfg/DFGNode.h:
+ (JSC::DFG::Node::Node):
+ (JSC::DFG::Node::convertToCheckStructure):
+ (JSC::DFG::Node::constant):
+ (JSC::DFG::Node::convertToConstant):
+ (JSC::DFG::Node::convertToConstantStoragePointer):
+ (JSC::DFG::Node::convertToPutStack):
+ (JSC::DFG::Node::convertToGetStack):
+ (JSC::DFG::Node::convertToGetByOffset):
+ (JSC::DFG::Node::convertToMultiGetByOffset):
+ (JSC::DFG::Node::convertToPutByOffset):
+ (JSC::DFG::Node::convertToMultiPutByOffset):
+ (JSC::DFG::Node::convertToPhantomNewObject):
+ (JSC::DFG::Node::convertToPhantomNewFunction):
+ (JSC::DFG::Node::convertToPhantomNewGeneratorFunction):
+ (JSC::DFG::Node::convertToPhantomCreateActivation):
+ (JSC::DFG::Node::convertToGetLocal):
+ (JSC::DFG::Node::lazyJSValue):
+ (JSC::DFG::Node::initializationValueForActivation):
+ (JSC::DFG::Node::tryGetVariableAccessData):
+ (JSC::DFG::Node::variableAccessData):
+ (JSC::DFG::Node::unlinkedLocal):
+ (JSC::DFG::Node::unlinkedMachineLocal):
+ (JSC::DFG::Node::stackAccessData):
+ (JSC::DFG::Node::phi):
+ (JSC::DFG::Node::identifierNumber):
+ (JSC::DFG::Node::getPutInfo):
+ (JSC::DFG::Node::accessorAttributes):
+ (JSC::DFG::Node::newArrayBufferData):
+ (JSC::DFG::Node::indexingType):
+ (JSC::DFG::Node::typedArrayType):
+ (JSC::DFG::Node::inlineCapacity):
+ (JSC::DFG::Node::scopeOffset):
+ (JSC::DFG::Node::capturedArgumentsOffset):
+ (JSC::DFG::Node::variablePointer):
+ (JSC::DFG::Node::callVarargsData):
+ (JSC::DFG::Node::loadVarargsData):
+ (JSC::DFG::Node::targetBytecodeOffsetDuringParsing):
+ (JSC::DFG::Node::targetBlock):
+ (JSC::DFG::Node::branchData):
+ (JSC::DFG::Node::switchData):
+ (JSC::DFG::Node::getHeapPrediction):
+ (JSC::DFG::Node::cellOperand):
+ (JSC::DFG::Node::watchpointSet):
+ (JSC::DFG::Node::storagePointer):
+ (JSC::DFG::Node::uidOperand):
+ (JSC::DFG::Node::typeInfoOperand):
+ (JSC::DFG::Node::transition):
+ (JSC::DFG::Node::structureSet):
+ (JSC::DFG::Node::structure):
+ (JSC::DFG::Node::storageAccessData):
+ (JSC::DFG::Node::multiGetByOffsetData):
+ (JSC::DFG::Node::multiPutByOffsetData):
+ (JSC::DFG::Node::objectMaterializationData):
+ (JSC::DFG::Node::arrayMode):
+ (JSC::DFG::Node::arithMode):
+ (JSC::DFG::Node::arithRoundingMode):
+ (JSC::DFG::Node::setArithRoundingMode):
+ (JSC::DFG::Node::executionCounter):
+ (JSC::DFG::Node::typeLocation):
+ (JSC::DFG::Node::basicBlockLocation):
+ (JSC::DFG::Node::numberOfArgumentsToSkip):
+ (JSC::DFG::Node::OpInfoWrapper::OpInfoWrapper):
+ (JSC::DFG::Node::OpInfoWrapper::operator=):
+ * dfg/DFGOpInfo.h:
+ (JSC::DFG::OpInfo::OpInfo):
+ * dfg/DFGPromotedHeapLocation.h:
+ (JSC::DFG::PromotedLocationDescriptor::imm1):
+ (JSC::DFG::PromotedLocationDescriptor::imm2):
+
</ins><span class="cx"> 2016-08-27 Don Olmstead <don.olmstead@am.sony.com>
</span><span class="cx">
</span><span class="cx"> Unused cxxabi.h include in JSGlobalObjectInspectorController.cpp
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeSpeculatedTypeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/SpeculatedType.h (205106 => 205107)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/SpeculatedType.h        2016-08-28 22:38:41 UTC (rev 205106)
+++ trunk/Source/JavaScriptCore/bytecode/SpeculatedType.h        2016-08-28 23:31:46 UTC (rev 205107)
</span><span class="lines">@@ -37,7 +37,7 @@
</span><span class="cx">
</span><span class="cx"> class Structure;
</span><span class="cx">
</span><del>-typedef uint32_t SpeculatedType;
</del><ins>+typedef uint64_t SpeculatedType;
</ins><span class="cx"> static const SpeculatedType SpecNone = 0; // We don't know anything yet.
</span><span class="cx"> static const SpeculatedType SpecFinalObject = 1u << 0; // It's definitely a JSFinalObject.
</span><span class="cx"> static const SpeculatedType SpecArray = 1u << 1; // It's definitely a JSArray.
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGNodecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGNode.cpp (205106 => 205107)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGNode.cpp        2016-08-28 22:38:41 UTC (rev 205106)
+++ trunk/Source/JavaScriptCore/dfg/DFGNode.cpp        2016-08-28 23:31:46 UTC (rev 205107)
</span><span class="lines">@@ -158,7 +158,7 @@
</span><span class="cx"> {
</span><span class="cx"> m_op = LazyJSConstant;
</span><span class="cx"> m_flags &= ~NodeMustGenerate;
</span><del>- m_opInfo = bitwise_cast<uintptr_t>(graph.m_lazyJSValues.add(value));
</del><ins>+ m_opInfo = graph.m_lazyJSValues.add(value);
</ins><span class="cx"> children.reset();
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -165,8 +165,8 @@
</span><span class="cx"> void Node::convertToPutHint(const PromotedLocationDescriptor& descriptor, Node* base, Node* value)
</span><span class="cx"> {
</span><span class="cx"> m_op = PutHint;
</span><del>- m_opInfo = descriptor.imm1().m_value;
- m_opInfo2 = descriptor.imm2().m_value;
</del><ins>+ m_opInfo = descriptor.imm1();
+ m_opInfo2 = descriptor.imm2();
</ins><span class="cx"> child1() = base->defaultEdge();
</span><span class="cx"> child2() = value->defaultEdge();
</span><span class="cx"> child3() = Edge();
</span><span class="lines">@@ -206,7 +206,7 @@
</span><span class="cx">
</span><span class="cx"> PromotedLocationDescriptor Node::promotedLocationDescriptor()
</span><span class="cx"> {
</span><del>- return PromotedLocationDescriptor(static_cast<PromotedLocationKind>(m_opInfo), m_opInfo2);
</del><ins>+ return PromotedLocationDescriptor(static_cast<PromotedLocationKind>(m_opInfo.as<uint32_t>()), m_opInfo2.as<uint32_t>());
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> } } // namespace JSC::DFG
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGNodeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGNode.h (205106 => 205107)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGNode.h        2016-08-28 22:38:41 UTC (rev 205106)
+++ trunk/Source/JavaScriptCore/dfg/DFGNode.h        2016-08-28 23:31:46 UTC (rev 205107)
</span><span class="lines">@@ -54,6 +54,7 @@
</span><span class="cx"> #include "StructureSet.h"
</span><span class="cx"> #include "TypeLocation.h"
</span><span class="cx"> #include "ValueProfile.h"
</span><ins>+#include <type_traits>
</ins><span class="cx"> #include <wtf/ListDump.h>
</span><span class="cx">
</span><span class="cx"> namespace JSC {
</span><span class="lines">@@ -254,8 +255,6 @@
</span><span class="cx"> , m_virtualRegister(VirtualRegister())
</span><span class="cx"> , m_refCount(1)
</span><span class="cx"> , m_prediction(SpecNone)
</span><del>- , m_opInfo(0)
- , m_opInfo2(0)
</del><span class="cx"> , owner(nullptr)
</span><span class="cx"> {
</span><span class="cx"> m_misc.replacement = nullptr;
</span><span class="lines">@@ -270,8 +269,6 @@
</span><span class="cx"> , m_virtualRegister(VirtualRegister())
</span><span class="cx"> , m_refCount(1)
</span><span class="cx"> , m_prediction(SpecNone)
</span><del>- , m_opInfo(0)
- , m_opInfo2(0)
</del><span class="cx"> , owner(nullptr)
</span><span class="cx"> {
</span><span class="cx"> m_misc.replacement = nullptr;
</span><span class="lines">@@ -288,7 +285,6 @@
</span><span class="cx"> , m_refCount(1)
</span><span class="cx"> , m_prediction(SpecNone)
</span><span class="cx"> , m_opInfo(imm.m_value)
</span><del>- , m_opInfo2(0)
</del><span class="cx"> , owner(nullptr)
</span><span class="cx"> {
</span><span class="cx"> m_misc.replacement = nullptr;
</span><span class="lines">@@ -304,7 +300,6 @@
</span><span class="cx"> , m_refCount(1)
</span><span class="cx"> , m_prediction(SpecNone)
</span><span class="cx"> , m_opInfo(imm.m_value)
</span><del>- , m_opInfo2(0)
</del><span class="cx"> , owner(nullptr)
</span><span class="cx"> {
</span><span class="cx"> m_misc.replacement = nullptr;
</span><span class="lines">@@ -406,7 +401,7 @@
</span><span class="cx"> void convertToCheckStructure(StructureSet* set)
</span><span class="cx"> {
</span><span class="cx"> setOpAndDefaultFlags(CheckStructure);
</span><del>- m_opInfo = bitwise_cast<uintptr_t>(set);
</del><ins>+ m_opInfo = set;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void convertToCheckStructureImmediate(Node* structure)
</span><span class="lines">@@ -471,7 +466,7 @@
</span><span class="cx"> return FrozenValue::emptySingleton();
</span><span class="cx"> }
</span><span class="cx">
</span><del>- return bitwise_cast<FrozenValue*>(m_opInfo);
</del><ins>+ return m_opInfo.as<FrozenValue*>();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> // Don't call this directly - use Graph::convertToConstant() instead!
</span><span class="lines">@@ -484,7 +479,7 @@
</span><span class="cx"> else
</span><span class="cx"> m_op = JSConstant;
</span><span class="cx"> m_flags &= ~NodeMustGenerate;
</span><del>- m_opInfo = bitwise_cast<uintptr_t>(value);
</del><ins>+ m_opInfo = value;
</ins><span class="cx"> children.reset();
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -494,7 +489,7 @@
</span><span class="cx"> {
</span><span class="cx"> ASSERT(op() == GetIndexedPropertyStorage);
</span><span class="cx"> m_op = ConstantStoragePointer;
</span><del>- m_opInfo = bitwise_cast<uintptr_t>(pointer);
</del><ins>+ m_opInfo = pointer;
</ins><span class="cx"> children.reset();
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -511,8 +506,8 @@
</span><span class="cx"> {
</span><span class="cx"> m_op = PutStack;
</span><span class="cx"> m_flags |= NodeMustGenerate;
</span><del>- m_opInfo = bitwise_cast<uintptr_t>(data);
- m_opInfo2 = 0;
</del><ins>+ m_opInfo = data;
+ m_opInfo2 = OpInfoWrapper();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void convertToGetStack(StackAccessData* data)
</span><span class="lines">@@ -519,8 +514,8 @@
</span><span class="cx"> {
</span><span class="cx"> m_op = GetStack;
</span><span class="cx"> m_flags &= ~NodeMustGenerate;
</span><del>- m_opInfo = bitwise_cast<uintptr_t>(data);
- m_opInfo2 = 0;
</del><ins>+ m_opInfo = data;
+ m_opInfo2 = OpInfoWrapper();
</ins><span class="cx"> children.reset();
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -527,7 +522,7 @@
</span><span class="cx"> void convertToGetByOffset(StorageAccessData& data, Edge storage, Edge base)
</span><span class="cx"> {
</span><span class="cx"> ASSERT(m_op == GetById || m_op == GetByIdFlush || m_op == MultiGetByOffset);
</span><del>- m_opInfo = bitwise_cast<uintptr_t>(&data);
</del><ins>+ m_opInfo = &data;
</ins><span class="cx"> children.setChild1(storage);
</span><span class="cx"> children.setChild2(base);
</span><span class="cx"> m_op = GetByOffset;
</span><span class="lines">@@ -537,7 +532,7 @@
</span><span class="cx"> void convertToMultiGetByOffset(MultiGetByOffsetData* data)
</span><span class="cx"> {
</span><span class="cx"> ASSERT(m_op == GetById || m_op == GetByIdFlush);
</span><del>- m_opInfo = bitwise_cast<intptr_t>(data);
</del><ins>+ m_opInfo = data;
</ins><span class="cx"> child1().setUseKind(CellUse);
</span><span class="cx"> m_op = MultiGetByOffset;
</span><span class="cx"> ASSERT(m_flags & NodeMustGenerate);
</span><span class="lines">@@ -546,7 +541,7 @@
</span><span class="cx"> void convertToPutByOffset(StorageAccessData& data, Edge storage, Edge base)
</span><span class="cx"> {
</span><span class="cx"> ASSERT(m_op == PutById || m_op == PutByIdDirect || m_op == PutByIdFlush || m_op == MultiPutByOffset);
</span><del>- m_opInfo = bitwise_cast<uintptr_t>(&data);
</del><ins>+ m_opInfo = &data;
</ins><span class="cx"> children.setChild3(children.child2());
</span><span class="cx"> children.setChild2(base);
</span><span class="cx"> children.setChild1(storage);
</span><span class="lines">@@ -556,7 +551,7 @@
</span><span class="cx"> void convertToMultiPutByOffset(MultiPutByOffsetData* data)
</span><span class="cx"> {
</span><span class="cx"> ASSERT(m_op == PutById || m_op == PutByIdDirect || m_op == PutByIdFlush);
</span><del>- m_opInfo = bitwise_cast<intptr_t>(data);
</del><ins>+ m_opInfo = data;
</ins><span class="cx"> m_op = MultiPutByOffset;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -572,8 +567,8 @@
</span><span class="cx"> m_op = PhantomNewObject;
</span><span class="cx"> m_flags &= ~NodeHasVarArgs;
</span><span class="cx"> m_flags |= NodeMustGenerate;
</span><del>- m_opInfo = 0;
- m_opInfo2 = 0;
</del><ins>+ m_opInfo = OpInfoWrapper();
+ m_opInfo2 = OpInfoWrapper();
</ins><span class="cx"> children = AdjacencyList();
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -582,8 +577,8 @@
</span><span class="cx"> ASSERT(m_op == NewFunction || m_op == NewGeneratorFunction);
</span><span class="cx"> m_op = PhantomNewFunction;
</span><span class="cx"> m_flags |= NodeMustGenerate;
</span><del>- m_opInfo = 0;
- m_opInfo2 = 0;
</del><ins>+ m_opInfo = OpInfoWrapper();
+ m_opInfo2 = OpInfoWrapper();
</ins><span class="cx"> children = AdjacencyList();
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -592,8 +587,8 @@
</span><span class="cx"> ASSERT(m_op == NewGeneratorFunction);
</span><span class="cx"> m_op = PhantomNewGeneratorFunction;
</span><span class="cx"> m_flags |= NodeMustGenerate;
</span><del>- m_opInfo = 0;
- m_opInfo2 = 0;
</del><ins>+ m_opInfo = OpInfoWrapper();
+ m_opInfo2 = OpInfoWrapper();
</ins><span class="cx"> children = AdjacencyList();
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -603,8 +598,8 @@
</span><span class="cx"> m_op = PhantomCreateActivation;
</span><span class="cx"> m_flags &= ~NodeHasVarArgs;
</span><span class="cx"> m_flags |= NodeMustGenerate;
</span><del>- m_opInfo = 0;
- m_opInfo2 = 0;
</del><ins>+ m_opInfo = OpInfoWrapper();
+ m_opInfo2 = OpInfoWrapper();
</ins><span class="cx"> children = AdjacencyList();
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -627,8 +622,8 @@
</span><span class="cx"> {
</span><span class="cx"> ASSERT(m_op == GetLocalUnlinked);
</span><span class="cx"> m_op = GetLocal;
</span><del>- m_opInfo = bitwise_cast<uintptr_t>(variable);
- m_opInfo2 = 0;
</del><ins>+ m_opInfo = variable;
+ m_opInfo2 = OpInfoWrapper();
</ins><span class="cx"> children.setChild1(Edge(phi));
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -738,7 +733,7 @@
</span><span class="cx"> LazyJSValue lazyJSValue()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(hasLazyJSValue());
</span><del>- return *bitwise_cast<LazyJSValue*>(m_opInfo);
</del><ins>+ return *m_opInfo.as<LazyJSValue*>();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> String tryGetString(Graph&);
</span><span class="lines">@@ -746,7 +741,7 @@
</span><span class="cx"> JSValue initializationValueForActivation() const
</span><span class="cx"> {
</span><span class="cx"> ASSERT(op() == CreateActivation);
</span><del>- return bitwise_cast<FrozenValue*>(m_opInfo2)->value();
</del><ins>+ return m_opInfo2.as<FrozenValue*>()->value();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool hasArgumentsChild()
</span><span class="lines">@@ -814,7 +809,7 @@
</span><span class="cx"> // access data doesn't have one because it hasn't been initialized yet.
</span><span class="cx"> VariableAccessData* tryGetVariableAccessData()
</span><span class="cx"> {
</span><del>- VariableAccessData* result = reinterpret_cast<VariableAccessData*>(m_opInfo);
</del><ins>+ VariableAccessData* result = m_opInfo.as<VariableAccessData*>();
</ins><span class="cx"> if (!result)
</span><span class="cx"> return 0;
</span><span class="cx"> return result->find();
</span><span class="lines">@@ -822,7 +817,7 @@
</span><span class="cx">
</span><span class="cx"> VariableAccessData* variableAccessData()
</span><span class="cx"> {
</span><del>- return reinterpret_cast<VariableAccessData*>(m_opInfo)->find();
</del><ins>+ return m_opInfo.as<VariableAccessData*>()->find();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> VirtualRegister local()
</span><span class="lines">@@ -852,7 +847,7 @@
</span><span class="cx"> VirtualRegister unlinkedLocal()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(hasUnlinkedLocal());
</span><del>- return static_cast<VirtualRegister>(m_opInfo);
</del><ins>+ return VirtualRegister(m_opInfo.as<int32_t>());
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool hasUnlinkedMachineLocal()
</span><span class="lines">@@ -869,7 +864,7 @@
</span><span class="cx"> VirtualRegister unlinkedMachineLocal()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(hasUnlinkedMachineLocal());
</span><del>- return VirtualRegister(m_opInfo2);
</del><ins>+ return VirtualRegister(m_opInfo2.as<int32_t>());
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool hasStackAccessData()
</span><span class="lines">@@ -886,7 +881,7 @@
</span><span class="cx"> StackAccessData* stackAccessData()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(hasStackAccessData());
</span><del>- return bitwise_cast<StackAccessData*>(m_opInfo);
</del><ins>+ return m_opInfo.as<StackAccessData*>();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool hasPhi()
</span><span class="lines">@@ -897,7 +892,7 @@
</span><span class="cx"> Node* phi()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(hasPhi());
</span><del>- return bitwise_cast<Node*>(m_opInfo);
</del><ins>+ return m_opInfo.as<Node*>();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool isStoreBarrier()
</span><span class="lines">@@ -932,7 +927,7 @@
</span><span class="cx"> unsigned identifierNumber()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(hasIdentifier());
</span><del>- return m_opInfo;
</del><ins>+ return m_opInfo.as<unsigned>();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool hasGetPutInfo()
</span><span class="lines">@@ -949,7 +944,7 @@
</span><span class="cx"> unsigned getPutInfo()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(hasGetPutInfo());
</span><del>- return m_opInfo2;
</del><ins>+ return m_opInfo2.as<unsigned>();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool hasAccessorAttributes()
</span><span class="lines">@@ -973,10 +968,10 @@
</span><span class="cx"> case PutGetterById:
</span><span class="cx"> case PutSetterById:
</span><span class="cx"> case PutGetterSetterById:
</span><del>- return m_opInfo2;
</del><ins>+ return m_opInfo2.as<int32_t>();
</ins><span class="cx"> case PutGetterByVal:
</span><span class="cx"> case PutSetterByVal:
</span><del>- return m_opInfo;
</del><ins>+ return m_opInfo.as<int32_t>();
</ins><span class="cx"> default:
</span><span class="cx"> RELEASE_ASSERT_NOT_REACHED();
</span><span class="cx"> return 0;
</span><span class="lines">@@ -1024,7 +1019,7 @@
</span><span class="cx"> NewArrayBufferData* newArrayBufferData()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(hasConstantBuffer());
</span><del>- return reinterpret_cast<NewArrayBufferData*>(m_opInfo);
</del><ins>+ return m_opInfo.as<NewArrayBufferData*>();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> unsigned startConstant()
</span><span class="lines">@@ -1062,7 +1057,7 @@
</span><span class="cx"> ASSERT(hasIndexingType());
</span><span class="cx"> if (op() == NewArrayBuffer)
</span><span class="cx"> return newArrayBufferData()->indexingType;
</span><del>- return m_opInfo;
</del><ins>+ return static_cast<IndexingType>(m_opInfo.as<uint32_t>());
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool hasTypedArrayType()
</span><span class="lines">@@ -1078,7 +1073,7 @@
</span><span class="cx"> TypedArrayType typedArrayType()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(hasTypedArrayType());
</span><del>- TypedArrayType result = static_cast<TypedArrayType>(m_opInfo);
</del><ins>+ TypedArrayType result = static_cast<TypedArrayType>(m_opInfo.as<uint32_t>());
</ins><span class="cx"> ASSERT(isTypedView(result));
</span><span class="cx"> return result;
</span><span class="cx"> }
</span><span class="lines">@@ -1091,7 +1086,7 @@
</span><span class="cx"> unsigned inlineCapacity()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(hasInlineCapacity());
</span><del>- return m_opInfo;
</del><ins>+ return m_opInfo.as<unsigned>();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void setIndexingType(IndexingType indexingType)
</span><span class="lines">@@ -1108,7 +1103,7 @@
</span><span class="cx"> ScopeOffset scopeOffset()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(hasScopeOffset());
</span><del>- return ScopeOffset(m_opInfo);
</del><ins>+ return ScopeOffset(m_opInfo.as<uint32_t>());
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool hasDirectArgumentsOffset()
</span><span class="lines">@@ -1119,7 +1114,7 @@
</span><span class="cx"> DirectArgumentsOffset capturedArgumentsOffset()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(hasDirectArgumentsOffset());
</span><del>- return DirectArgumentsOffset(m_opInfo);
</del><ins>+ return DirectArgumentsOffset(m_opInfo.as<uint32_t>());
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool hasRegisterPointer()
</span><span class="lines">@@ -1129,7 +1124,7 @@
</span><span class="cx">
</span><span class="cx"> WriteBarrier<Unknown>* variablePointer()
</span><span class="cx"> {
</span><del>- return bitwise_cast<WriteBarrier<Unknown>*>(m_opInfo);
</del><ins>+ return m_opInfo.as<WriteBarrier<Unknown>*>();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool hasCallVarargsData()
</span><span class="lines">@@ -1152,7 +1147,7 @@
</span><span class="cx"> CallVarargsData* callVarargsData()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(hasCallVarargsData());
</span><del>- return bitwise_cast<CallVarargsData*>(m_opInfo);
</del><ins>+ return m_opInfo.as<CallVarargsData*>();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool hasLoadVarargsData()
</span><span class="lines">@@ -1163,7 +1158,7 @@
</span><span class="cx"> LoadVarargsData* loadVarargsData()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(hasLoadVarargsData());
</span><del>- return bitwise_cast<LoadVarargsData*>(m_opInfo);
</del><ins>+ return m_opInfo.as<LoadVarargsData*>();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool hasResult()
</span><span class="lines">@@ -1259,25 +1254,25 @@
</span><span class="cx"> unsigned targetBytecodeOffsetDuringParsing()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(isJump());
</span><del>- return m_opInfo;
</del><ins>+ return m_opInfo.as<unsigned>();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> BasicBlock*& targetBlock()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(isJump());
</span><del>- return *bitwise_cast<BasicBlock**>(&m_opInfo);
</del><ins>+ return *bitwise_cast<BasicBlock**>(&m_opInfo.u.pointer);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> BranchData* branchData()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(isBranch());
</span><del>- return bitwise_cast<BranchData*>(m_opInfo);
</del><ins>+ return m_opInfo.as<BranchData*>();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> SwitchData* switchData()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(isSwitch());
</span><del>- return bitwise_cast<SwitchData*>(m_opInfo);
</del><ins>+ return m_opInfo.as<SwitchData*>();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> unsigned numSuccessors()
</span><span class="lines">@@ -1437,7 +1432,7 @@
</span><span class="cx"> SpeculatedType getHeapPrediction()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(hasHeapPrediction());
</span><del>- return static_cast<SpeculatedType>(m_opInfo2);
</del><ins>+ return m_opInfo2.as<SpeculatedType>();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void setHeapPrediction(SpeculatedType prediction)
</span><span class="lines">@@ -1466,7 +1461,7 @@
</span><span class="cx"> FrozenValue* cellOperand()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(hasCellOperand());
</span><del>- return reinterpret_cast<FrozenValue*>(m_opInfo);
</del><ins>+ return m_opInfo.as<FrozenValue*>();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> template<typename T>
</span><span class="lines">@@ -1478,7 +1473,7 @@
</span><span class="cx"> void setCellOperand(FrozenValue* value)
</span><span class="cx"> {
</span><span class="cx"> ASSERT(hasCellOperand());
</span><del>- m_opInfo = bitwise_cast<uintptr_t>(value);
</del><ins>+ m_opInfo = value;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool hasWatchpointSet()
</span><span class="lines">@@ -1489,7 +1484,7 @@
</span><span class="cx"> WatchpointSet* watchpointSet()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(hasWatchpointSet());
</span><del>- return reinterpret_cast<WatchpointSet*>(m_opInfo);
</del><ins>+ return m_opInfo.as<WatchpointSet*>();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool hasStoragePointer()
</span><span class="lines">@@ -1500,7 +1495,7 @@
</span><span class="cx"> void* storagePointer()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(hasStoragePointer());
</span><del>- return reinterpret_cast<void*>(m_opInfo);
</del><ins>+ return m_opInfo.as<void*>();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool hasUidOperand()
</span><span class="lines">@@ -1511,7 +1506,7 @@
</span><span class="cx"> UniquedStringImpl* uidOperand()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(hasUidOperand());
</span><del>- return reinterpret_cast<UniquedStringImpl*>(m_opInfo);
</del><ins>+ return m_opInfo.as<UniquedStringImpl*>();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool hasTypeInfoOperand()
</span><span class="lines">@@ -1521,8 +1516,8 @@
</span><span class="cx">
</span><span class="cx"> unsigned typeInfoOperand()
</span><span class="cx"> {
</span><del>- ASSERT(hasTypeInfoOperand() && m_opInfo <= UCHAR_MAX);
- return static_cast<unsigned>(m_opInfo);
</del><ins>+ ASSERT(hasTypeInfoOperand() && m_opInfo.as<uint32_t>() <= static_cast<uint32_t>(UCHAR_MAX));
+ return m_opInfo.as<uint32_t>();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool hasTransition()
</span><span class="lines">@@ -1540,7 +1535,7 @@
</span><span class="cx"> Transition* transition()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(hasTransition());
</span><del>- return reinterpret_cast<Transition*>(m_opInfo);
</del><ins>+ return m_opInfo.as<Transition*>();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool hasStructureSet()
</span><span class="lines">@@ -1558,7 +1553,7 @@
</span><span class="cx"> StructureSet& structureSet()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(hasStructureSet());
</span><del>- return *reinterpret_cast<StructureSet*>(m_opInfo);
</del><ins>+ return *m_opInfo.as<StructureSet*>();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool hasStructure()
</span><span class="lines">@@ -1576,7 +1571,7 @@
</span><span class="cx"> Structure* structure()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(hasStructure());
</span><del>- return reinterpret_cast<Structure*>(m_opInfo);
</del><ins>+ return m_opInfo.as<Structure*>();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool hasStorageAccessData()
</span><span class="lines">@@ -1594,7 +1589,7 @@
</span><span class="cx"> StorageAccessData& storageAccessData()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(hasStorageAccessData());
</span><del>- return *bitwise_cast<StorageAccessData*>(m_opInfo);
</del><ins>+ return *m_opInfo.as<StorageAccessData*>();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool hasMultiGetByOffsetData()
</span><span class="lines">@@ -1605,7 +1600,7 @@
</span><span class="cx"> MultiGetByOffsetData& multiGetByOffsetData()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(hasMultiGetByOffsetData());
</span><del>- return *reinterpret_cast<MultiGetByOffsetData*>(m_opInfo);
</del><ins>+ return *m_opInfo.as<MultiGetByOffsetData*>();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool hasMultiPutByOffsetData()
</span><span class="lines">@@ -1616,7 +1611,7 @@
</span><span class="cx"> MultiPutByOffsetData& multiPutByOffsetData()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(hasMultiPutByOffsetData());
</span><del>- return *reinterpret_cast<MultiPutByOffsetData*>(m_opInfo);
</del><ins>+ return *m_opInfo.as<MultiPutByOffsetData*>();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool hasObjectMaterializationData()
</span><span class="lines">@@ -1634,7 +1629,7 @@
</span><span class="cx"> ObjectMaterializationData& objectMaterializationData()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(hasObjectMaterializationData());
</span><del>- return *reinterpret_cast<ObjectMaterializationData*>(m_opInfo2);
</del><ins>+ return *m_opInfo2.as<ObjectMaterializationData*>();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool isObjectAllocation()
</span><span class="lines">@@ -1743,8 +1738,8 @@
</span><span class="cx"> {
</span><span class="cx"> ASSERT(hasArrayMode());
</span><span class="cx"> if (op() == ArrayifyToStructure)
</span><del>- return ArrayMode::fromWord(m_opInfo2);
- return ArrayMode::fromWord(m_opInfo);
</del><ins>+ return ArrayMode::fromWord(m_opInfo2.as<uint32_t>());
+ return ArrayMode::fromWord(m_opInfo.as<uint32_t>());
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool setArrayMode(ArrayMode arrayMode)
</span><span class="lines">@@ -1777,7 +1772,7 @@
</span><span class="cx"> Arith::Mode arithMode()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(hasArithMode());
</span><del>- return static_cast<Arith::Mode>(m_opInfo);
</del><ins>+ return static_cast<Arith::Mode>(m_opInfo.as<uint32_t>());
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void setArithMode(Arith::Mode mode)
</span><span class="lines">@@ -1793,13 +1788,13 @@
</span><span class="cx"> Arith::RoundingMode arithRoundingMode()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(hasArithRoundingMode());
</span><del>- return static_cast<Arith::RoundingMode>(m_opInfo);
</del><ins>+ return static_cast<Arith::RoundingMode>(m_opInfo.as<uint32_t>());
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void setArithRoundingMode(Arith::RoundingMode mode)
</span><span class="cx"> {
</span><span class="cx"> ASSERT(hasArithRoundingMode());
</span><del>- m_opInfo = static_cast<uintptr_t>(mode);
</del><ins>+ m_opInfo = static_cast<uint32_t>(mode);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool hasVirtualRegister()
</span><span class="lines">@@ -1828,7 +1823,7 @@
</span><span class="cx">
</span><span class="cx"> Profiler::ExecutionCounter* executionCounter()
</span><span class="cx"> {
</span><del>- return bitwise_cast<Profiler::ExecutionCounter*>(m_opInfo);
</del><ins>+ return m_opInfo.as<Profiler::ExecutionCounter*>();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool shouldGenerate()
</span><span class="lines">@@ -2271,7 +2266,7 @@
</span><span class="cx"> TypeLocation* typeLocation()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(hasTypeLocation());
</span><del>- return reinterpret_cast<TypeLocation*>(m_opInfo);
</del><ins>+ return m_opInfo.as<TypeLocation*>();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool hasBasicBlockLocation()
</span><span class="lines">@@ -2282,7 +2277,7 @@
</span><span class="cx"> BasicBlockLocation* basicBlockLocation()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(hasBasicBlockLocation());
</span><del>- return reinterpret_cast<BasicBlockLocation*>(m_opInfo);
</del><ins>+ return m_opInfo.as<BasicBlockLocation*>();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> Node* replacement() const
</span><span class="lines">@@ -2308,7 +2303,7 @@
</span><span class="cx"> unsigned numberOfArgumentsToSkip()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(op() == CreateRest || op() == GetRestLength);
</span><del>- return static_cast<unsigned>(m_opInfo);
</del><ins>+ return m_opInfo.as<unsigned>();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void dumpChildren(PrintStream& out)
</span><span class="lines">@@ -2345,8 +2340,71 @@
</span><span class="cx"> SpeculatedType m_prediction { SpecNone };
</span><span class="cx"> // Immediate values, accesses type-checked via accessors above. The first one is
</span><span class="cx"> // big enough to store a pointer.
</span><del>- uintptr_t m_opInfo;
- uintptr_t m_opInfo2;
</del><ins>+ struct OpInfoWrapper {
+ OpInfoWrapper()
+ {
+ u.int64 = 0;
+ }
+ OpInfoWrapper(uint32_t intValue)
+ {
+ u.int64 = 0;
+ u.int32 = intValue;
+ }
+ OpInfoWrapper(uint64_t intValue)
+ {
+ u.int64 = intValue;
+ }
+ OpInfoWrapper(void* pointer)
+ {
+ u.int64 = 0;
+ u.pointer = pointer;
+ }
+ OpInfoWrapper& operator=(uint32_t int32)
+ {
+ u.int64 = 0;
+ u.int32 = int32;
+ return *this;
+ }
+ OpInfoWrapper& operator=(int32_t int32)
+ {
+ u.int64 = 0;
+ u.int32 = int32;
+ return *this;
+ }
+ OpInfoWrapper& operator=(uint64_t int64)
+ {
+ u.int64 = int64;
+ return *this;
+ }
+ OpInfoWrapper& operator=(void* pointer)
+ {
+ u.int64 = 0;
+ u.pointer = pointer;
+ return *this;
+ }
+ template <typename T>
+ ALWAYS_INLINE auto as() const -> typename std::enable_if<std::is_pointer<T>::value, T>::type
+ {
+ return static_cast<T>(u.pointer);
+ }
+ template <typename T>
+ ALWAYS_INLINE auto as() const -> typename std::enable_if<std::is_integral<T>::value && sizeof(T) == 4, T>::type
+ {
+ return u.int32;
+ }
+ template <typename T>
+ ALWAYS_INLINE auto as() const -> typename std::enable_if<std::is_integral<T>::value && sizeof(T) == 8, T>::type
+ {
+ return u.int64;
+ }
+ union {
+ uint32_t int32;
+ uint64_t int64;
+ void* pointer;
+ } u;
+ };
+ OpInfoWrapper m_opInfo;
+ OpInfoWrapper m_opInfo2;
</ins><span class="cx">
</span><span class="cx"> // Miscellaneous data that is usually meaningless, but can hold some analysis results
</span><span class="cx"> // if you ask right. For example, if you do Graph::initializeNodeOwners(), Node::owner
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGOpInfoh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGOpInfo.h (205106 => 205107)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGOpInfo.h        2016-08-28 22:38:41 UTC (rev 205106)
+++ trunk/Source/JavaScriptCore/dfg/DFGOpInfo.h        2016-08-28 23:31:46 UTC (rev 205107)
</span><span class="lines">@@ -37,13 +37,14 @@
</span><span class="cx"> // a constant index, argument, or identifier) from a Node*.
</span><span class="cx"> struct OpInfo {
</span><span class="cx"> OpInfo() : m_value(0) { }
</span><del>- explicit OpInfo(int32_t value) : m_value(static_cast<uintptr_t>(value)) { }
- explicit OpInfo(uint32_t value) : m_value(static_cast<uintptr_t>(value)) { }
-#if OS(DARWIN) || USE(JSVALUE64)
- explicit OpInfo(size_t value) : m_value(static_cast<uintptr_t>(value)) { }
</del><ins>+ explicit OpInfo(int32_t value) : m_value(static_cast<uint64_t>(value)) { }
+ explicit OpInfo(uint32_t value) : m_value(static_cast<uint64_t>(value)) { }
+ explicit OpInfo(uint64_t value) : m_value(static_cast<uint64_t>(value)) { }
+#if OS(DARWIN)
+ explicit OpInfo(uintptr_t value) : m_value(static_cast<uint64_t>(value)) { }
</ins><span class="cx"> #endif
</span><del>- explicit OpInfo(void* value) : m_value(reinterpret_cast<uintptr_t>(value)) { }
- uintptr_t m_value;
</del><ins>+ explicit OpInfo(void* value) : m_value(static_cast<uint64_t>(reinterpret_cast<uintptr_t>(value))) { }
+ uint64_t m_value;
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> } } // namespace JSC::DFG
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGPromotedHeapLocationh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGPromotedHeapLocation.h (205106 => 205107)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGPromotedHeapLocation.h        2016-08-28 22:38:41 UTC (rev 205106)
+++ trunk/Source/JavaScriptCore/dfg/DFGPromotedHeapLocation.h        2016-08-28 23:31:46 UTC (rev 205107)
</span><span class="lines">@@ -87,8 +87,8 @@
</span><span class="cx"> PromotedLocationKind kind() const { return m_kind; }
</span><span class="cx"> unsigned info() const { return m_info; }
</span><span class="cx">
</span><del>- OpInfo imm1() const { return OpInfo(static_cast<uint32_t>(m_kind)); }
- OpInfo imm2() const { return OpInfo(static_cast<uint32_t>(m_info)); }
</del><ins>+ unsigned imm1() const { return static_cast<uint32_t>(m_kind); }
+ unsigned imm2() const { return static_cast<uint32_t>(m_info); }
</ins><span class="cx">
</span><span class="cx"> unsigned hash() const
</span><span class="cx"> {
</span></span></pre>
</div>
</div>
</body>
</html>