<!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>[199320] trunk/Source</title>
</head>
<body>

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

<h3>Log Message</h3>
<pre>Web Inspector: get rid of InspectorBasicValue and InspectorString subclasses
https://bugs.webkit.org/show_bug.cgi?id=156407
&lt;rdar://problem/25627659&gt;

Reviewed by Joseph Pecoraro.

Source/JavaScriptCore:

There's no point having these subclasses as they don't save any space.
Add a StringImpl to the union and merge some implementations of writeJSON.

Rename m_data to m_map and explicitly name the union as InspectorValue::m_value.
If the value is a string and the string is not empty or null (i.e., it has a
StringImpl), then we need to ref() and deref() the string as the InspectorValue
is created or destroyed.

Move uses of the subclass to InspectorValue and delete redundant methods.
Now, most InspectorValue methods are non-virtual so they can be templated.

* bindings/ScriptValue.cpp:
(Deprecated::jsToInspectorValue):
* inspector/InjectedScriptBase.cpp:
(Inspector::InjectedScriptBase::makeCall):
Don't used deleted subclasses.

* inspector/InspectorValues.cpp:
(Inspector::InspectorValue::null):
(Inspector::InspectorValue::create):
(Inspector::InspectorValue::asValue):
(Inspector::InspectorValue::asBoolean):
(Inspector::InspectorValue::asDouble):
(Inspector::InspectorValue::asInteger):
(Inspector::InspectorValue::asString):
These only need one implementation now.

(Inspector::InspectorValue::writeJSON):
Still a virtual method since Object and Array need their members.

(Inspector::InspectorObjectBase::InspectorObjectBase):
(Inspector::InspectorBasicValue::asBoolean): Deleted.
(Inspector::InspectorBasicValue::asDouble): Deleted.
(Inspector::InspectorBasicValue::asInteger): Deleted.
(Inspector::InspectorBasicValue::writeJSON): Deleted.
(Inspector::InspectorString::asString): Deleted.
(Inspector::InspectorString::writeJSON): Deleted.
(Inspector::InspectorString::create): Deleted.
(Inspector::InspectorBasicValue::create): Deleted.

* inspector/InspectorValues.h:
(Inspector::InspectorObjectBase::find):
(Inspector::InspectorObjectBase::setBoolean):
(Inspector::InspectorObjectBase::setInteger):
(Inspector::InspectorObjectBase::setDouble):
(Inspector::InspectorObjectBase::setString):
(Inspector::InspectorObjectBase::setValue):
(Inspector::InspectorObjectBase::setObject):
(Inspector::InspectorObjectBase::setArray):
(Inspector::InspectorArrayBase::pushBoolean):
(Inspector::InspectorArrayBase::pushInteger):
(Inspector::InspectorArrayBase::pushDouble):
(Inspector::InspectorArrayBase::pushString):
(Inspector::InspectorArrayBase::pushValue):
(Inspector::InspectorArrayBase::pushObject):
(Inspector::InspectorArrayBase::pushArray):
Use new factory methods.

* replay/EncodedValue.cpp:
(JSC::ScalarEncodingTraits&lt;bool&gt;::encodeValue):
(JSC::ScalarEncodingTraits&lt;double&gt;::encodeValue):
(JSC::ScalarEncodingTraits&lt;float&gt;::encodeValue):
(JSC::ScalarEncodingTraits&lt;int32_t&gt;::encodeValue):
(JSC::ScalarEncodingTraits&lt;int64_t&gt;::encodeValue):
(JSC::ScalarEncodingTraits&lt;uint32_t&gt;::encodeValue):
(JSC::ScalarEncodingTraits&lt;uint64_t&gt;::encodeValue):
* replay/EncodedValue.h:
Use new factory methods.

Source/WebCore:

* inspector/InspectorDatabaseAgent.cpp: Don't use deleted subclasses.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCorebindingsScriptValuecpp">trunk/Source/JavaScriptCore/bindings/ScriptValue.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorInjectedScriptBasecpp">trunk/Source/JavaScriptCore/inspector/InjectedScriptBase.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorInspectorValuescpp">trunk/Source/JavaScriptCore/inspector/InspectorValues.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorInspectorValuesh">trunk/Source/JavaScriptCore/inspector/InspectorValues.h</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayEncodedValuecpp">trunk/Source/JavaScriptCore/replay/EncodedValue.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayEncodedValueh">trunk/Source/JavaScriptCore/replay/EncodedValue.h</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreinspectorInspectorDatabaseAgentcpp">trunk/Source/WebCore/inspector/InspectorDatabaseAgent.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (199319 => 199320)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2016-04-11 23:16:31 UTC (rev 199319)
+++ trunk/Source/JavaScriptCore/ChangeLog        2016-04-11 23:22:16 UTC (rev 199320)
</span><span class="lines">@@ -1,3 +1,80 @@
</span><ins>+2016-04-11  Brian Burg  &lt;bburg@apple.com&gt;
+
+        Web Inspector: get rid of InspectorBasicValue and InspectorString subclasses
+        https://bugs.webkit.org/show_bug.cgi?id=156407
+        &lt;rdar://problem/25627659&gt;
+
+        Reviewed by Joseph Pecoraro.
+
+        There's no point having these subclasses as they don't save any space.
+        Add a StringImpl to the union and merge some implementations of writeJSON.
+
+        Rename m_data to m_map and explicitly name the union as InspectorValue::m_value.
+        If the value is a string and the string is not empty or null (i.e., it has a
+        StringImpl), then we need to ref() and deref() the string as the InspectorValue
+        is created or destroyed.
+
+        Move uses of the subclass to InspectorValue and delete redundant methods.
+        Now, most InspectorValue methods are non-virtual so they can be templated.
+
+        * bindings/ScriptValue.cpp:
+        (Deprecated::jsToInspectorValue):
+        * inspector/InjectedScriptBase.cpp:
+        (Inspector::InjectedScriptBase::makeCall):
+        Don't used deleted subclasses.
+
+        * inspector/InspectorValues.cpp:
+        (Inspector::InspectorValue::null):
+        (Inspector::InspectorValue::create):
+        (Inspector::InspectorValue::asValue):
+        (Inspector::InspectorValue::asBoolean):
+        (Inspector::InspectorValue::asDouble):
+        (Inspector::InspectorValue::asInteger):
+        (Inspector::InspectorValue::asString):
+        These only need one implementation now.
+
+        (Inspector::InspectorValue::writeJSON):
+        Still a virtual method since Object and Array need their members.
+
+        (Inspector::InspectorObjectBase::InspectorObjectBase):
+        (Inspector::InspectorBasicValue::asBoolean): Deleted.
+        (Inspector::InspectorBasicValue::asDouble): Deleted.
+        (Inspector::InspectorBasicValue::asInteger): Deleted.
+        (Inspector::InspectorBasicValue::writeJSON): Deleted.
+        (Inspector::InspectorString::asString): Deleted.
+        (Inspector::InspectorString::writeJSON): Deleted.
+        (Inspector::InspectorString::create): Deleted.
+        (Inspector::InspectorBasicValue::create): Deleted.
+
+        * inspector/InspectorValues.h:
+        (Inspector::InspectorObjectBase::find):
+        (Inspector::InspectorObjectBase::setBoolean):
+        (Inspector::InspectorObjectBase::setInteger):
+        (Inspector::InspectorObjectBase::setDouble):
+        (Inspector::InspectorObjectBase::setString):
+        (Inspector::InspectorObjectBase::setValue):
+        (Inspector::InspectorObjectBase::setObject):
+        (Inspector::InspectorObjectBase::setArray):
+        (Inspector::InspectorArrayBase::pushBoolean):
+        (Inspector::InspectorArrayBase::pushInteger):
+        (Inspector::InspectorArrayBase::pushDouble):
+        (Inspector::InspectorArrayBase::pushString):
+        (Inspector::InspectorArrayBase::pushValue):
+        (Inspector::InspectorArrayBase::pushObject):
+        (Inspector::InspectorArrayBase::pushArray):
+        Use new factory methods.
+
+        * replay/EncodedValue.cpp:
+        (JSC::ScalarEncodingTraits&lt;bool&gt;::encodeValue):
+        (JSC::ScalarEncodingTraits&lt;double&gt;::encodeValue):
+        (JSC::ScalarEncodingTraits&lt;float&gt;::encodeValue):
+        (JSC::ScalarEncodingTraits&lt;int32_t&gt;::encodeValue):
+        (JSC::ScalarEncodingTraits&lt;int64_t&gt;::encodeValue):
+        (JSC::ScalarEncodingTraits&lt;uint32_t&gt;::encodeValue):
+        (JSC::ScalarEncodingTraits&lt;uint64_t&gt;::encodeValue):
+        * replay/EncodedValue.h:
+        Use new factory methods.
+
</ins><span class="cx"> 2016-04-11  Filip Pizlo  &lt;fpizlo@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         It should be possible to edit StructureStubInfo without recompiling the world
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebindingsScriptValuecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bindings/ScriptValue.cpp (199319 => 199320)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bindings/ScriptValue.cpp        2016-04-11 23:16:31 UTC (rev 199319)
+++ trunk/Source/JavaScriptCore/bindings/ScriptValue.cpp        2016-04-11 23:22:16 UTC (rev 199320)
</span><span class="lines">@@ -112,13 +112,13 @@
</span><span class="cx">     if (value.isNull() || value.isUndefined())
</span><span class="cx">         return InspectorValue::null();
</span><span class="cx">     if (value.isBoolean())
</span><del>-        return InspectorBasicValue::create(value.asBoolean());
</del><ins>+        return InspectorValue::create(value.asBoolean());
</ins><span class="cx">     if (value.isNumber() &amp;&amp; value.isDouble())
</span><del>-        return InspectorBasicValue::create(value.asNumber());
</del><ins>+        return InspectorValue::create(value.asNumber());
</ins><span class="cx">     if (value.isNumber() &amp;&amp; value.isMachineInt())
</span><del>-        return InspectorBasicValue::create(static_cast&lt;int&gt;(value.asMachineInt()));
</del><ins>+        return InspectorValue::create(static_cast&lt;int&gt;(value.asMachineInt()));
</ins><span class="cx">     if (value.isString())
</span><del>-        return InspectorString::create(value.getString(scriptState));
</del><ins>+        return InspectorValue::create(value.getString(scriptState));
</ins><span class="cx"> 
</span><span class="cx">     if (value.isObject()) {
</span><span class="cx">         if (isJSArray(value)) {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorInjectedScriptBasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/InjectedScriptBase.cpp (199319 => 199320)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/InjectedScriptBase.cpp        2016-04-11 23:16:31 UTC (rev 199319)
+++ trunk/Source/JavaScriptCore/inspector/InjectedScriptBase.cpp        2016-04-11 23:22:16 UTC (rev 199320)
</span><span class="lines">@@ -99,9 +99,9 @@
</span><span class="cx">     if (!hadException) {
</span><span class="cx">         *result = resultValue.toInspectorValue(m_injectedScriptObject.scriptState());
</span><span class="cx">         if (!*result)
</span><del>-            *result = InspectorString::create(String::format(&quot;Object has too long reference chain (must not be longer than %d)&quot;, InspectorValue::maxDepth));
</del><ins>+            *result = InspectorValue::create(String::format(&quot;Object has too long reference chain (must not be longer than %d)&quot;, InspectorValue::maxDepth));
</ins><span class="cx">     } else
</span><del>-        *result = InspectorString::create(&quot;Exception while making a call.&quot;);
</del><ins>+        *result = InspectorValue::create(&quot;Exception while making a call.&quot;);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void InjectedScriptBase::makeEvalCall(ErrorString&amp; errorString, Deprecated::ScriptFunctionCall&amp; function, RefPtr&lt;Protocol::Runtime::RemoteObject&gt;* objectResult, Protocol::OptOutput&lt;bool&gt;* wasThrown, Protocol::OptOutput&lt;int&gt;* savedResultIndex)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorInspectorValuescpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/InspectorValues.cpp (199319 => 199320)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/InspectorValues.cpp        2016-04-11 23:16:31 UTC (rev 199319)
+++ trunk/Source/JavaScriptCore/inspector/InspectorValues.cpp        2016-04-11 23:22:16 UTC (rev 199320)
</span><span class="lines">@@ -363,17 +363,17 @@
</span><span class="cx">         result = InspectorValue::null();
</span><span class="cx">         break;
</span><span class="cx">     case BOOL_TRUE:
</span><del>-        result = InspectorBasicValue::create(true);
</del><ins>+        result = InspectorValue::create(true);
</ins><span class="cx">         break;
</span><span class="cx">     case BOOL_FALSE:
</span><del>-        result = InspectorBasicValue::create(false);
</del><ins>+        result = InspectorValue::create(false);
</ins><span class="cx">         break;
</span><span class="cx">     case NUMBER: {
</span><span class="cx">         bool ok;
</span><span class="cx">         double value = charactersToDouble(tokenStart, tokenEnd - tokenStart, &amp;ok);
</span><span class="cx">         if (!ok)
</span><span class="cx">             return nullptr;
</span><del>-        result = InspectorBasicValue::create(value);
</del><ins>+        result = InspectorValue::create(value);
</ins><span class="cx">         break;
</span><span class="cx">     }
</span><span class="cx">     case STRING: {
</span><span class="lines">@@ -381,7 +381,7 @@
</span><span class="cx">         bool ok = decodeString(tokenStart + 1, tokenEnd - 1, value);
</span><span class="cx">         if (!ok)
</span><span class="cx">             return nullptr;
</span><del>-        result = InspectorString::create(value);
</del><ins>+        result = InspectorValue::create(value);
</ins><span class="cx">         break;
</span><span class="cx">     }
</span><span class="cx">     case ARRAY_BEGIN: {
</span><span class="lines">@@ -498,59 +498,39 @@
</span><span class="cx"> 
</span><span class="cx"> } // anonymous namespace
</span><span class="cx"> 
</span><del>-bool InspectorValue::asBoolean(bool&amp;) const
</del><ins>+Ref&lt;InspectorValue&gt; InspectorValue::null()
</ins><span class="cx"> {
</span><del>-    return false;
</del><ins>+    return adoptRef(*new InspectorValue);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool InspectorValue::asDouble(double&amp;) const
</del><ins>+Ref&lt;InspectorValue&gt; InspectorValue::create(bool value)
</ins><span class="cx"> {
</span><del>-    return false;
</del><ins>+    return adoptRef(*new InspectorValue(value));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool InspectorValue::asDouble(float&amp;) const
</del><ins>+Ref&lt;InspectorValue&gt; InspectorValue::create(int value)
</ins><span class="cx"> {
</span><del>-    return false;
</del><ins>+    return adoptRef(*new InspectorValue(value));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool InspectorValue::asInteger(int&amp;) const
</del><ins>+Ref&lt;InspectorValue&gt; InspectorValue::create(double value)
</ins><span class="cx"> {
</span><del>-    return false;
</del><ins>+    return adoptRef(*new InspectorValue(value));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool InspectorValue::asInteger(unsigned&amp;) const
</del><ins>+Ref&lt;InspectorValue&gt; InspectorValue::create(const String&amp; value)
</ins><span class="cx"> {
</span><del>-    return false;
</del><ins>+    return adoptRef(*new InspectorValue(value));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool InspectorValue::asInteger(long&amp;) const
</del><ins>+Ref&lt;InspectorValue&gt; InspectorValue::create(const char* value)
</ins><span class="cx"> {
</span><del>-    return false;
</del><ins>+    return adoptRef(*new InspectorValue(value));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool InspectorValue::asInteger(long long&amp;) const
</del><ins>+bool InspectorValue::asValue(RefPtr&lt;Inspector::InspectorValue&gt; &amp; value)
</ins><span class="cx"> {
</span><del>-    return false;
-}
-
-bool InspectorValue::asInteger(unsigned long&amp;) const
-{
-    return false;
-}
-
-bool InspectorValue::asInteger(unsigned long long&amp;) const
-{
-    return false;
-}
-
-bool InspectorValue::asString(String&amp;) const
-{
-    return false;
-}
-
-bool InspectorValue::asValue(RefPtr&lt;InspectorValue&gt;&amp; output)
-{
-    output = this;
</del><ins>+    value = this;
</ins><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -587,110 +567,119 @@
</span><span class="cx">     return result.toString();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void InspectorValue::writeJSON(StringBuilder&amp; output) const
</del><ins>+bool InspectorValue::asBoolean(bool&amp; output) const
</ins><span class="cx"> {
</span><del>-    ASSERT(m_type == Type::Null);
-
-    output.appendLiteral(&quot;null&quot;);
-}
-
-bool InspectorBasicValue::asBoolean(bool&amp; output) const
-{
</del><span class="cx">     if (type() != Type::Boolean)
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    output = m_booleanValue;
</del><ins>+    output = m_value.boolean;
</ins><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool InspectorBasicValue::asDouble(double&amp; output) const
</del><ins>+bool InspectorValue::asDouble(double&amp; output) const
</ins><span class="cx"> {
</span><span class="cx">     if (type() != Type::Double)
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    output = m_doubleValue;
</del><ins>+    output = m_value.number;
</ins><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool InspectorBasicValue::asDouble(float&amp; output) const
</del><ins>+bool InspectorValue::asDouble(float&amp; output) const
</ins><span class="cx"> {
</span><span class="cx">     if (type() != Type::Double)
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    output = static_cast&lt;float&gt;(m_doubleValue);
</del><ins>+    output = static_cast&lt;float&gt;(m_value.number);
</ins><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool InspectorBasicValue::asInteger(int&amp; output) const
</del><ins>+bool InspectorValue::asInteger(int&amp; output) const
</ins><span class="cx"> {
</span><span class="cx">     if (type() != Type::Integer &amp;&amp; type() != Type::Double)
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    output = static_cast&lt;int&gt;(m_doubleValue);
</del><ins>+    output = static_cast&lt;int&gt;(m_value.number);
</ins><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool InspectorBasicValue::asInteger(unsigned&amp; output) const
</del><ins>+bool InspectorValue::asInteger(unsigned&amp; output) const
</ins><span class="cx"> {
</span><span class="cx">     if (type() != Type::Integer &amp;&amp; type() != Type::Double)
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    output = static_cast&lt;unsigned&gt;(m_doubleValue);
</del><ins>+    output = static_cast&lt;unsigned&gt;(m_value.number);
</ins><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool InspectorBasicValue::asInteger(long&amp; output) const
</del><ins>+bool InspectorValue::asInteger(long&amp; output) const
</ins><span class="cx"> {
</span><span class="cx">     if (type() != Type::Integer &amp;&amp; type() != Type::Double)
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    output = static_cast&lt;long&gt;(m_doubleValue);
</del><ins>+    output = static_cast&lt;long&gt;(m_value.number);
</ins><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool InspectorBasicValue::asInteger(long long&amp; output) const
</del><ins>+bool InspectorValue::asInteger(long long&amp; output) const
</ins><span class="cx"> {
</span><span class="cx">     if (type() != Type::Integer &amp;&amp; type() != Type::Double)
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    output = static_cast&lt;long long&gt;(m_doubleValue);
</del><ins>+    output = static_cast&lt;long long&gt;(m_value.number);
</ins><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool InspectorBasicValue::asInteger(unsigned long&amp; output) const
</del><ins>+bool InspectorValue::asInteger(unsigned long&amp; output) const
</ins><span class="cx"> {
</span><span class="cx">     if (type() != Type::Integer &amp;&amp; type() != Type::Double)
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    output = static_cast&lt;unsigned long&gt;(m_doubleValue);
</del><ins>+    output = static_cast&lt;unsigned long&gt;(m_value.number);
</ins><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool InspectorBasicValue::asInteger(unsigned long long&amp; output) const
</del><ins>+bool InspectorValue::asInteger(unsigned long long&amp; output) const
</ins><span class="cx"> {
</span><span class="cx">     if (type() != Type::Integer &amp;&amp; type() != Type::Double)
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    output = static_cast&lt;unsigned long long&gt;(m_doubleValue);
</del><ins>+    output = static_cast&lt;unsigned long long&gt;(m_value.number);
</ins><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void InspectorBasicValue::writeJSON(StringBuilder&amp; output) const
</del><ins>+bool InspectorValue::asString(String&amp; output) const
</ins><span class="cx"> {
</span><del>-    ASSERT(type() == Type::Boolean || type() == Type::Double || type() == Type::Integer);
</del><ins>+    if (type() != Type::String)
+        return false;
</ins><span class="cx"> 
</span><del>-    if (type() == Type::Boolean) {
-        if (m_booleanValue)
</del><ins>+    output = m_value.string;
+    return true;
+}
+
+void InspectorValue::writeJSON(StringBuilder&amp; output) const
+{
+    switch (m_type) {
+    case Type::Null:
+        output.appendLiteral(&quot;null&quot;);
+        break;
+    case Type::Boolean:
+        if (m_value.boolean)
</ins><span class="cx">             output.appendLiteral(&quot;true&quot;);
</span><span class="cx">         else
</span><span class="cx">             output.appendLiteral(&quot;false&quot;);
</span><del>-    } else if (type() == Type::Double || type() == Type::Integer) {
</del><ins>+        break;
+    case Type::String:
+        doubleQuoteString(m_value.string, output);
+        break;
+    case Type::Double:
+    case Type::Integer: {
</ins><span class="cx">         NumberToLStringBuffer buffer;
</span><del>-        if (!std::isfinite(m_doubleValue)) {
</del><ins>+        if (!std::isfinite(m_value.number)) {
</ins><span class="cx">             output.appendLiteral(&quot;null&quot;);
</span><span class="cx">             return;
</span><span class="cx">         }
</span><del>-        DecimalNumber decimal = m_doubleValue;
</del><ins>+        DecimalNumber decimal = m_value.number;
</ins><span class="cx">         unsigned length = 0;
</span><span class="cx">         if (decimal.bufferLengthForStringDecimal() &gt; WTF::NumberToStringBufferLength) {
</span><span class="cx">             // Not enough room for decimal. Use exponential format.
</span><span class="lines">@@ -703,21 +692,13 @@
</span><span class="cx">         } else
</span><span class="cx">             length = decimal.toStringDecimal(buffer, WTF::NumberToStringBufferLength);
</span><span class="cx">         output.append(buffer, length);
</span><ins>+        break;
</ins><span class="cx">     }
</span><ins>+    default:
+        ASSERT_NOT_REACHED();
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool InspectorString::asString(String&amp; output) const
-{
-    output = m_stringValue;
-    return true;
-}
-
-void InspectorString::writeJSON(StringBuilder&amp; output) const
-{
-    ASSERT(type() == Type::String);
-    doubleQuoteString(m_stringValue, output);
-}
-
</del><span class="cx"> InspectorObjectBase::~InspectorObjectBase()
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="lines">@@ -775,8 +756,8 @@
</span><span class="cx"> 
</span><span class="cx"> bool InspectorObjectBase::getValue(const String&amp; name, RefPtr&lt;InspectorValue&gt;&amp; output) const
</span><span class="cx"> {
</span><del>-    Dictionary::const_iterator findResult = m_data.find(name);
-    if (findResult == m_data.end())
</del><ins>+    Dictionary::const_iterator findResult = m_map.find(name);
+    if (findResult == m_map.end())
</ins><span class="cx">         return false;
</span><span class="cx"> 
</span><span class="cx">     output = findResult-&gt;value;
</span><span class="lines">@@ -785,7 +766,7 @@
</span><span class="cx"> 
</span><span class="cx"> void InspectorObjectBase::remove(const String&amp; name)
</span><span class="cx"> {
</span><del>-    m_data.remove(name);
</del><ins>+    m_map.remove(name);
</ins><span class="cx">     m_order.removeFirst(name);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -793,8 +774,8 @@
</span><span class="cx"> {
</span><span class="cx">     output.append('{');
</span><span class="cx">     for (size_t i = 0; i &lt; m_order.size(); ++i) {
</span><del>-        auto findResult = m_data.find(m_order[i]);
-        ASSERT(findResult != m_data.end());
</del><ins>+        auto findResult = m_map.find(m_order[i]);
+        ASSERT(findResult != m_map.end());
</ins><span class="cx">         if (i)
</span><span class="cx">             output.append(',');
</span><span class="cx">         doubleQuoteString(findResult-&gt;key, output);
</span><span class="lines">@@ -805,8 +786,8 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> InspectorObjectBase::InspectorObjectBase()
</span><del>-    : InspectorValue(Type::Object)
-    , m_data()
</del><ins>+    : Inspector::InspectorValue(Type::Object)
+    , m_map()
</ins><span class="cx">     , m_order()
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="lines">@@ -825,8 +806,8 @@
</span><span class="cx"> void InspectorArrayBase::writeJSON(StringBuilder&amp; output) const
</span><span class="cx"> {
</span><span class="cx">     output.append('[');
</span><del>-    for (Vector&lt;RefPtr&lt;InspectorValue&gt;&gt;::const_iterator it = m_data.begin(); it != m_data.end(); ++it) {
-        if (it != m_data.begin())
</del><ins>+    for (Vector&lt;RefPtr&lt;InspectorValue&gt;&gt;::const_iterator it = m_map.begin(); it != m_map.end(); ++it) {
+        if (it != m_map.begin())
</ins><span class="cx">             output.append(',');
</span><span class="cx">         (*it)-&gt;writeJSON(output);
</span><span class="cx">     }
</span><span class="lines">@@ -835,14 +816,14 @@
</span><span class="cx"> 
</span><span class="cx"> InspectorArrayBase::InspectorArrayBase()
</span><span class="cx">     : InspectorValue(Type::Array)
</span><del>-    , m_data()
</del><ins>+    , m_map()
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> RefPtr&lt;InspectorValue&gt; InspectorArrayBase::get(size_t index) const
</span><span class="cx"> {
</span><del>-    ASSERT_WITH_SECURITY_IMPLICATION(index &lt; m_data.size());
-    return m_data[index];
</del><ins>+    ASSERT_WITH_SECURITY_IMPLICATION(index &lt; m_map.size());
+    return m_map[index];
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Ref&lt;InspectorObject&gt; InspectorObject::create()
</span><span class="lines">@@ -855,34 +836,4 @@
</span><span class="cx">     return adoptRef(*new InspectorArray);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Ref&lt;InspectorValue&gt; InspectorValue::null()
-{
-    return adoptRef(*new InspectorValue);
-}
-
-Ref&lt;InspectorString&gt; InspectorString::create(const String&amp; value)
-{
-    return adoptRef(*new InspectorString(value));
-}
-
-Ref&lt;InspectorString&gt; InspectorString::create(const char* value)
-{
-    return adoptRef(*new InspectorString(value));
-}
-
-Ref&lt;InspectorBasicValue&gt; InspectorBasicValue::create(bool value)
-{
-    return adoptRef(*new InspectorBasicValue(value));
-}
-
-Ref&lt;InspectorBasicValue&gt; InspectorBasicValue::create(int value)
-{
-    return adoptRef(*new InspectorBasicValue(value));
-}
-
-Ref&lt;InspectorBasicValue&gt; InspectorBasicValue::create(double value)
-{
-    return adoptRef(*new InspectorBasicValue(value));
-}
-
</del><span class="cx"> } // namespace Inspector
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorInspectorValuesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/InspectorValues.h (199319 => 199320)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/InspectorValues.h        2016-04-11 23:16:31 UTC (rev 199319)
+++ trunk/Source/JavaScriptCore/inspector/InspectorValues.h        2016-04-11 23:22:16 UTC (rev 199320)
</span><span class="lines">@@ -51,11 +51,30 @@
</span><span class="cx"> public:
</span><span class="cx">     static const int maxDepth = 1000;
</span><span class="cx"> 
</span><del>-    InspectorValue()
-        : m_type(Type::Null) { }
-    virtual ~InspectorValue() { }
</del><ins>+    virtual ~InspectorValue()
+    {
+        switch (m_type) {
+        case Type::Null:
+        case Type::Boolean:
+        case Type::Double:
+        case Type::Integer:
+            break;
+        case Type::String:
+            if (m_value.string)
+                m_value.string-&gt;deref();
+            break;
+        case Type::Object:
+        case Type::Array:
+            break;
+        }
+    }
</ins><span class="cx"> 
</span><span class="cx">     static Ref&lt;InspectorValue&gt; null();
</span><ins>+    static Ref&lt;InspectorValue&gt; create(bool);
+    static Ref&lt;InspectorValue&gt; create(int);
+    static Ref&lt;InspectorValue&gt; create(double);
+    static Ref&lt;InspectorValue&gt; create(const String&amp;);
+    static Ref&lt;InspectorValue&gt; create(const char*);
</ins><span class="cx"> 
</span><span class="cx">     enum class Type {
</span><span class="cx">         Null = 0,
</span><span class="lines">@@ -64,24 +83,24 @@
</span><span class="cx">         Integer,
</span><span class="cx">         String,
</span><span class="cx">         Object,
</span><del>-        Array
</del><ins>+        Array,
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     Type type() const { return m_type; }
</span><del>-
</del><span class="cx">     bool isNull() const { return m_type == Type::Null; }
</span><span class="cx"> 
</span><del>-    virtual bool asBoolean(bool&amp;) const;
-    virtual bool asInteger(int&amp;) const;
-    virtual bool asInteger(unsigned&amp;) const;
-    virtual bool asInteger(long&amp;) const;
-    virtual bool asInteger(long long&amp;) const;
-    virtual bool asInteger(unsigned long&amp;) const;
-    virtual bool asInteger(unsigned long long&amp;) const;
-    virtual bool asDouble(double&amp;) const;
-    virtual bool asDouble(float&amp;) const;
-    virtual bool asString(String&amp;) const;
-    virtual bool asValue(RefPtr&lt;InspectorValue&gt;&amp;);
</del><ins>+    bool asBoolean(bool&amp;) const;
+    bool asInteger(int&amp;) const;
+    bool asInteger(unsigned&amp;) const;
+    bool asInteger(long&amp;) const;
+    bool asInteger(long long&amp;) const;
+    bool asInteger(unsigned long&amp;) const;
+    bool asInteger(unsigned long long&amp;) const;
+    bool asDouble(double&amp;) const;
+    bool asDouble(float&amp;) const;
+    bool asString(String&amp;) const;
+    bool asValue(RefPtr&lt;InspectorValue&gt;&amp;);
+
</ins><span class="cx">     virtual bool asObject(RefPtr&lt;InspectorObject&gt;&amp;);
</span><span class="cx">     virtual bool asArray(RefPtr&lt;InspectorArray&gt;&amp;);
</span><span class="cx"> 
</span><span class="lines">@@ -91,73 +110,56 @@
</span><span class="cx">     virtual void writeJSON(StringBuilder&amp; output) const;
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    explicit InspectorValue(Type type) : m_type(type) { }
</del><ins>+    InspectorValue()
+        : m_type(Type::Null) { }
</ins><span class="cx"> 
</span><del>-private:
-    Type m_type;
-};
</del><ins>+    explicit InspectorValue(Type type)
+        : m_type(type) { }
</ins><span class="cx"> 
</span><del>-class JS_EXPORT_PRIVATE InspectorBasicValue : public InspectorValue {
-public:
</del><ins>+    explicit InspectorValue(bool value)
+        : m_type(Type::Boolean)
+    {
+        m_value.boolean = value;
+    }
</ins><span class="cx"> 
</span><del>-    static Ref&lt;InspectorBasicValue&gt; create(bool);
-    static Ref&lt;InspectorBasicValue&gt; create(int);
-    static Ref&lt;InspectorBasicValue&gt; create(double);
</del><ins>+    explicit InspectorValue(int value)
+        : m_type(Type::Integer)
+    {
+        m_value.number = static_cast&lt;double&gt;(value);
+    }
</ins><span class="cx"> 
</span><del>-    bool asBoolean(bool&amp;) const override;
-    // Numbers from the frontend are always parsed as doubles, so we allow
-    // clients to convert to integral values with this function.
-    bool asInteger(int&amp;) const override;
-    bool asInteger(unsigned&amp;) const override;
-    bool asInteger(long&amp;) const override;
-    bool asInteger(long long&amp;) const override;
-    bool asInteger(unsigned long&amp;) const override;
-    bool asInteger(unsigned long long&amp;) const override;
-    bool asDouble(double&amp;) const override;
-    bool asDouble(float&amp;) const override;
</del><ins>+    explicit InspectorValue(double value)
+        : m_type(Type::Double)
+    {
+        m_value.number = value;
+    }
</ins><span class="cx"> 
</span><del>-    void writeJSON(StringBuilder&amp; output) const override;
</del><ins>+    explicit InspectorValue(const String&amp; value)
+        : m_type(Type::String)
+    {
+        m_value.string = value.impl();
+        if (m_value.string)
+            m_value.string-&gt;ref();
+    }
</ins><span class="cx"> 
</span><ins>+    explicit InspectorValue(const char* value)
+        : m_type(Type::String)
+    {
+        String wrapper(value);
+        m_value.string = wrapper.impl();
+        if (m_value.string)
+            m_value.string-&gt;ref();
+    }
+
</ins><span class="cx"> private:
</span><del>-    explicit InspectorBasicValue(bool value)
-        : InspectorValue(Type::Boolean)
-        , m_booleanValue(value) { }
-
-    explicit InspectorBasicValue(int value)
-        : InspectorValue(Type::Integer)
-        , m_doubleValue(static_cast&lt;double&gt;(value)) { }
-
-    explicit InspectorBasicValue(double value)
-        : InspectorValue(Type::Double)
-        , m_doubleValue(value) { }
-
</del><ins>+    Type m_type { Type::Null };
</ins><span class="cx">     union {
</span><del>-        bool m_booleanValue;
-        double m_doubleValue;
-    };
</del><ins>+        bool boolean;
+        double number;
+        StringImpl* string;
+    } m_value;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><del>-class JS_EXPORT_PRIVATE InspectorString : public InspectorValue {
-public:
-    static Ref&lt;InspectorString&gt; create(const String&amp;);
-    static Ref&lt;InspectorString&gt; create(const char*);
-
-    bool asString(String&amp; output) const override;
-
-    void writeJSON(StringBuilder&amp; output) const override;
-
-private:
-    explicit InspectorString(const String&amp; value)
-        : InspectorValue(Type::String)
-        , m_stringValue(value) { }
-
-    explicit InspectorString(const char* value)
-        : InspectorValue(Type::String)
-        , m_stringValue(value) { }
-
-    String m_stringValue;
-};
-
</del><span class="cx"> class JS_EXPORT_PRIVATE InspectorObjectBase : public InspectorValue {
</span><span class="cx"> private:
</span><span class="cx">     typedef HashMap&lt;String, RefPtr&lt;InspectorValue&gt;&gt; Dictionary;
</span><span class="lines">@@ -213,18 +215,18 @@
</span><span class="cx"> 
</span><span class="cx">     void writeJSON(StringBuilder&amp; output) const override;
</span><span class="cx"> 
</span><del>-    iterator begin() { return m_data.begin(); }
-    iterator end() { return m_data.end(); }
-    const_iterator begin() const { return m_data.begin(); }
-    const_iterator end() const { return m_data.end(); }
</del><ins>+    iterator begin() { return m_map.begin(); }
+    iterator end() { return m_map.end(); }
+    const_iterator begin() const { return m_map.begin(); }
+    const_iterator end() const { return m_map.end(); }
</ins><span class="cx"> 
</span><del>-    int size() const { return m_data.size(); }
</del><ins>+    int size() const { return m_map.size(); }
</ins><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="cx">     InspectorObjectBase();
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    Dictionary m_data;
</del><ins>+    Dictionary m_map;
</ins><span class="cx">     Vector&lt;String&gt; m_order;
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="lines">@@ -265,7 +267,7 @@
</span><span class="cx">     typedef Vector&lt;RefPtr&lt;InspectorValue&gt;&gt;::iterator iterator;
</span><span class="cx">     typedef Vector&lt;RefPtr&lt;InspectorValue&gt;&gt;::const_iterator const_iterator;
</span><span class="cx"> 
</span><del>-    unsigned length() const { return static_cast&lt;unsigned&gt;(m_data.size()); }
</del><ins>+    unsigned length() const { return static_cast&lt;unsigned&gt;(m_map.size()); }
</ins><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="cx">     virtual ~InspectorArrayBase();
</span><span class="lines">@@ -284,16 +286,16 @@
</span><span class="cx"> 
</span><span class="cx">     void writeJSON(StringBuilder&amp; output) const override;
</span><span class="cx"> 
</span><del>-    iterator begin() { return m_data.begin(); }
-    iterator end() { return m_data.end(); }
-    const_iterator begin() const { return m_data.begin(); }
-    const_iterator end() const { return m_data.end(); }
</del><ins>+    iterator begin() { return m_map.begin(); }
+    iterator end() { return m_map.end(); }
+    const_iterator begin() const { return m_map.begin(); }
+    const_iterator end() const { return m_map.end(); }
</ins><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="cx">     InspectorArrayBase();
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    Vector&lt;RefPtr&lt;InspectorValue&gt;&gt; m_data;
</del><ins>+    Vector&lt;RefPtr&lt;InspectorValue&gt;&gt; m_map;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> class InspectorArray : public InspectorArrayBase {
</span><span class="lines">@@ -319,91 +321,91 @@
</span><span class="cx"> 
</span><span class="cx"> inline InspectorObjectBase::iterator InspectorObjectBase::find(const String&amp; name)
</span><span class="cx"> {
</span><del>-    return m_data.find(name);
</del><ins>+    return m_map.find(name);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline InspectorObjectBase::const_iterator InspectorObjectBase::find(const String&amp; name) const
</span><span class="cx"> {
</span><del>-    return m_data.find(name);
</del><ins>+    return m_map.find(name);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline void InspectorObjectBase::setBoolean(const String&amp; name, bool value)
</span><span class="cx"> {
</span><del>-    setValue(name, InspectorBasicValue::create(value));
</del><ins>+    setValue(name, InspectorValue::create(value));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline void InspectorObjectBase::setInteger(const String&amp; name, int value)
</span><span class="cx"> {
</span><del>-    setValue(name, InspectorBasicValue::create(value));
</del><ins>+    setValue(name, InspectorValue::create(value));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline void InspectorObjectBase::setDouble(const String&amp; name, double value)
</span><span class="cx"> {
</span><del>-    setValue(name, InspectorBasicValue::create(value));
</del><ins>+    setValue(name, InspectorValue::create(value));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline void InspectorObjectBase::setString(const String&amp; name, const String&amp; value)
</span><span class="cx"> {
</span><del>-    setValue(name, InspectorString::create(value));
</del><ins>+    setValue(name, InspectorValue::create(value));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline void InspectorObjectBase::setValue(const String&amp; name, RefPtr&lt;InspectorValue&gt;&amp;&amp; value)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(value);
</span><del>-    if (m_data.set(name, WTFMove(value)).isNewEntry)
</del><ins>+    if (m_map.set(name, WTFMove(value)).isNewEntry)
</ins><span class="cx">         m_order.append(name);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline void InspectorObjectBase::setObject(const String&amp; name, RefPtr&lt;InspectorObjectBase&gt;&amp;&amp; value)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(value);
</span><del>-    if (m_data.set(name, WTFMove(value)).isNewEntry)
</del><ins>+    if (m_map.set(name, WTFMove(value)).isNewEntry)
</ins><span class="cx">         m_order.append(name);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline void InspectorObjectBase::setArray(const String&amp; name, RefPtr&lt;InspectorArrayBase&gt;&amp;&amp; value)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(value);
</span><del>-    if (m_data.set(name, WTFMove(value)).isNewEntry)
</del><ins>+    if (m_map.set(name, WTFMove(value)).isNewEntry)
</ins><span class="cx">         m_order.append(name);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline void InspectorArrayBase::pushBoolean(bool value)
</span><span class="cx"> {
</span><del>-    m_data.append(InspectorBasicValue::create(value));
</del><ins>+    m_map.append(InspectorValue::create(value));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline void InspectorArrayBase::pushInteger(int value)
</span><span class="cx"> {
</span><del>-    m_data.append(InspectorBasicValue::create(value));
</del><ins>+    m_map.append(InspectorValue::create(value));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline void InspectorArrayBase::pushDouble(double value)
</span><span class="cx"> {
</span><del>-    m_data.append(InspectorBasicValue::create(value));
</del><ins>+    m_map.append(InspectorValue::create(value));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline void InspectorArrayBase::pushString(const String&amp; value)
</span><span class="cx"> {
</span><del>-    m_data.append(InspectorString::create(value));
</del><ins>+    m_map.append(InspectorValue::create(value));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline void InspectorArrayBase::pushValue(RefPtr&lt;InspectorValue&gt;&amp;&amp; value)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(value);
</span><del>-    m_data.append(WTFMove(value));
</del><ins>+    m_map.append(WTFMove(value));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline void InspectorArrayBase::pushObject(RefPtr&lt;InspectorObjectBase&gt;&amp;&amp; value)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(value);
</span><del>-    m_data.append(WTFMove(value));
</del><ins>+    m_map.append(WTFMove(value));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline void InspectorArrayBase::pushArray(RefPtr&lt;InspectorArrayBase&gt;&amp;&amp; value)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(value);
</span><del>-    m_data.append(WTFMove(value));
</del><ins>+    m_map.append(WTFMove(value));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace Inspector
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayEncodedValuecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/replay/EncodedValue.cpp (199319 => 199320)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/EncodedValue.cpp        2016-04-11 23:16:31 UTC (rev 199319)
+++ trunk/Source/JavaScriptCore/replay/EncodedValue.cpp        2016-04-11 23:22:16 UTC (rev 199320)
</span><span class="lines">@@ -67,37 +67,37 @@
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt; EncodedValue ScalarEncodingTraits&lt;bool&gt;::encodeValue(const bool&amp; value)
</span><span class="cx"> {
</span><del>-    return EncodedValue(InspectorBasicValue::create(value));
</del><ins>+    return EncodedValue(InspectorValue::create(value));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt; EncodedValue ScalarEncodingTraits&lt;double&gt;::encodeValue(const double&amp; value)
</span><span class="cx"> {
</span><del>-    return EncodedValue(InspectorBasicValue::create(value));
</del><ins>+    return EncodedValue(InspectorValue::create(value));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt; EncodedValue ScalarEncodingTraits&lt;float&gt;::encodeValue(const float&amp; value)
</span><span class="cx"> {
</span><del>-    return EncodedValue(InspectorBasicValue::create((double)value));
</del><ins>+    return EncodedValue(InspectorValue::create((double)value));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt; EncodedValue ScalarEncodingTraits&lt;int32_t&gt;::encodeValue(const int32_t&amp; value)
</span><span class="cx"> {
</span><del>-    return EncodedValue(InspectorBasicValue::create((double)value));
</del><ins>+    return EncodedValue(InspectorValue::create((double)value));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt; EncodedValue ScalarEncodingTraits&lt;int64_t&gt;::encodeValue(const int64_t&amp; value)
</span><span class="cx"> {
</span><del>-    return EncodedValue(InspectorBasicValue::create((double)value));
</del><ins>+    return EncodedValue(InspectorValue::create((double)value));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt; EncodedValue ScalarEncodingTraits&lt;uint32_t&gt;::encodeValue(const uint32_t&amp; value)
</span><span class="cx"> {
</span><del>-    return EncodedValue(InspectorBasicValue::create((double)value));
</del><ins>+    return EncodedValue(InspectorValue::create((double)value));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt; EncodedValue ScalarEncodingTraits&lt;uint64_t&gt;::encodeValue(const uint64_t&amp; value)
</span><span class="cx"> {
</span><del>-    return EncodedValue(InspectorBasicValue::create((double)value));
</del><ins>+    return EncodedValue(InspectorValue::create((double)value));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt; bool EncodedValue::convertTo&lt;bool&gt;()
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayEncodedValueh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/replay/EncodedValue.h (199319 => 199320)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/EncodedValue.h        2016-04-11 23:16:31 UTC (rev 199319)
+++ trunk/Source/JavaScriptCore/replay/EncodedValue.h        2016-04-11 23:22:16 UTC (rev 199320)
</span><span class="lines">@@ -59,12 +59,12 @@
</span><span class="cx"> 
</span><span class="cx">     static EncodedValue createString(const String&amp; value)
</span><span class="cx">     {
</span><del>-        return EncodedValue(Inspector::InspectorString::create(value));
</del><ins>+        return EncodedValue(Inspector::InspectorValue::create(value));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     static EncodedValue createString(const char* value)
</span><span class="cx">     {
</span><del>-        return EncodedValue(Inspector::InspectorString::create(value));
</del><ins>+        return EncodedValue(Inspector::InspectorValue::create(value));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     template&lt;typename T&gt;
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (199319 => 199320)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-04-11 23:16:31 UTC (rev 199319)
+++ trunk/Source/WebCore/ChangeLog        2016-04-11 23:22:16 UTC (rev 199320)
</span><span class="lines">@@ -1,3 +1,13 @@
</span><ins>+2016-04-11  Brian Burg  &lt;bburg@apple.com&gt;
+
+        Web Inspector: get rid of InspectorBasicValue and InspectorString subclasses
+        https://bugs.webkit.org/show_bug.cgi?id=156407
+        &lt;rdar://problem/25627659&gt;
+
+        Reviewed by Joseph Pecoraro.
+
+        * inspector/InspectorDatabaseAgent.cpp: Don't use deleted subclasses.
+
</ins><span class="cx"> 2016-04-11  Commit Queue  &lt;commit-queue@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, rolling out r198909.
</span></span></pre></div>
<a id="trunkSourceWebCoreinspectorInspectorDatabaseAgentcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/inspector/InspectorDatabaseAgent.cpp (199319 => 199320)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/inspector/InspectorDatabaseAgent.cpp        2016-04-11 23:16:31 UTC (rev 199319)
+++ trunk/Source/WebCore/inspector/InspectorDatabaseAgent.cpp        2016-04-11 23:22:16 UTC (rev 199320)
</span><span class="lines">@@ -87,8 +87,8 @@
</span><span class="cx">         for (auto&amp; value : rowList-&gt;values()) {
</span><span class="cx">             RefPtr&lt;InspectorValue&gt; inspectorValue;
</span><span class="cx">             switch (value.type()) {
</span><del>-            case SQLValue::StringValue: inspectorValue = InspectorString::create(value.string()); break;
-            case SQLValue::NumberValue: inspectorValue = InspectorBasicValue::create(value.number()); break;
</del><ins>+            case SQLValue::StringValue: inspectorValue = InspectorValue::create(value.string()); break;
+            case SQLValue::NumberValue: inspectorValue = InspectorValue::create(value.number()); break;
</ins><span class="cx">             case SQLValue::NullValue: inspectorValue = InspectorValue::null(); break;
</span><span class="cx">             }
</span><span class="cx">             
</span></span></pre>
</div>
</div>

</body>
</html>