<!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>[182114] 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/182114">182114</a></dd>
<dt>Author</dt> <dd>saambarati1@gmail.com</dd>
<dt>Date</dt> <dd>2015-03-28 10:28:11 -0700 (Sat, 28 Mar 2015)</dd>
</dl>
<h3>Log Message</h3>
<pre>Web Inspector: ES6: Better support for Symbol types in Type Profiler
https://bugs.webkit.org/show_bug.cgi?id=141257
Reviewed by Joseph Pecoraro.
Source/JavaScriptCore:
ES6 introduces the new primitive type Symbol. This patch makes JSC's
type profiler support this new primitive type.
* dfg/DFGFixupPhase.cpp:
(JSC::DFG::FixupPhase::fixupNode):
* inspector/protocol/Runtime.json:
* runtime/RuntimeType.cpp:
(JSC::runtimeTypeForValue):
* runtime/RuntimeType.h:
(JSC::runtimeTypeIsPrimitive):
* runtime/TypeSet.cpp:
(JSC::TypeSet::addTypeInformation):
(JSC::TypeSet::dumpTypes):
(JSC::TypeSet::doesTypeConformTo):
(JSC::TypeSet::displayName):
(JSC::TypeSet::inspectorTypeSet):
(JSC::TypeSet::toJSONString):
* runtime/TypeSet.h:
(JSC::TypeSet::seenTypes):
* tests/typeProfiler/driver/driver.js:
* tests/typeProfiler/symbol.js: Added.
(wrapper.foo):
(wrapper.bar):
(wrapper.bar.bar.baz):
(wrapper):
Source/WebInspectorUI:
The Web Inspector's visualization of JSC's type profiler
should have support for the Symbol type.
* UserInterface/Models/TypeSet.js:
(WebInspector.TypeSet):
(WebInspector.TypeSet.prototype.get primitiveTypeNames):
* UserInterface/Views/TypeTokenView.css:
TypeTokenView will display Symbol type tokens using the same color that
Symbol values are displayed as formatted values.
(.type-token-symbol):
* UserInterface/Views/TypeTokenView.js:
(WebInspector.TypeTokenView.prototype._displayTypeName):
(WebInspector.TypeTokenView):</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGFixupPhasecpp">trunk/Source/JavaScriptCore/dfg/DFGFixupPhase.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorprotocolRuntimejson">trunk/Source/JavaScriptCore/inspector/protocol/Runtime.json</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeRuntimeTypecpp">trunk/Source/JavaScriptCore/runtime/RuntimeType.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeRuntimeTypeh">trunk/Source/JavaScriptCore/runtime/RuntimeType.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeTypeSetcpp">trunk/Source/JavaScriptCore/runtime/TypeSet.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeTypeSeth">trunk/Source/JavaScriptCore/runtime/TypeSet.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreteststypeProfilerdriverdriverjs">trunk/Source/JavaScriptCore/tests/typeProfiler/driver/driver.js</a></li>
<li><a href="#trunkSourceWebInspectorUIChangeLog">trunk/Source/WebInspectorUI/ChangeLog</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceModelsTypeSetjs">trunk/Source/WebInspectorUI/UserInterface/Models/TypeSet.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsTypeTokenViewcss">trunk/Source/WebInspectorUI/UserInterface/Views/TypeTokenView.css</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsTypeTokenViewjs">trunk/Source/WebInspectorUI/UserInterface/Views/TypeTokenView.js</a></li>
</ul>
<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreteststypeProfilersymboljs">trunk/Source/JavaScriptCore/tests/typeProfiler/symbol.js</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (182113 => 182114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2015-03-28 16:38:00 UTC (rev 182113)
+++ trunk/Source/JavaScriptCore/ChangeLog        2015-03-28 17:28:11 UTC (rev 182114)
</span><span class="lines">@@ -1,3 +1,36 @@
</span><ins>+2015-03-28 Saam Barati <saambarati1@gmail.com>
+
+ Web Inspector: ES6: Better support for Symbol types in Type Profiler
+ https://bugs.webkit.org/show_bug.cgi?id=141257
+
+ Reviewed by Joseph Pecoraro.
+
+ ES6 introduces the new primitive type Symbol. This patch makes JSC's
+ type profiler support this new primitive type.
+
+ * dfg/DFGFixupPhase.cpp:
+ (JSC::DFG::FixupPhase::fixupNode):
+ * inspector/protocol/Runtime.json:
+ * runtime/RuntimeType.cpp:
+ (JSC::runtimeTypeForValue):
+ * runtime/RuntimeType.h:
+ (JSC::runtimeTypeIsPrimitive):
+ * runtime/TypeSet.cpp:
+ (JSC::TypeSet::addTypeInformation):
+ (JSC::TypeSet::dumpTypes):
+ (JSC::TypeSet::doesTypeConformTo):
+ (JSC::TypeSet::displayName):
+ (JSC::TypeSet::inspectorTypeSet):
+ (JSC::TypeSet::toJSONString):
+ * runtime/TypeSet.h:
+ (JSC::TypeSet::seenTypes):
+ * tests/typeProfiler/driver/driver.js:
+ * tests/typeProfiler/symbol.js: Added.
+ (wrapper.foo):
+ (wrapper.bar):
+ (wrapper.bar.bar.baz):
+ (wrapper):
+
</ins><span class="cx"> 2015-03-27 Saam Barati <saambarati1@gmail.com>
</span><span class="cx">
</span><span class="cx"> Deconstruction parameters are bound too late
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGFixupPhasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGFixupPhase.cpp (182113 => 182114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGFixupPhase.cpp        2015-03-28 16:38:00 UTC (rev 182113)
+++ trunk/Source/JavaScriptCore/dfg/DFGFixupPhase.cpp        2015-03-28 17:28:11 UTC (rev 182114)
</span><span class="lines">@@ -1148,7 +1148,7 @@
</span><span class="cx"> // (The other direction does not hold in general).
</span><span class="cx">
</span><span class="cx"> RefPtr<TypeSet> typeSet = node->typeLocation()->m_instructionTypeSet;
</span><del>- uint8_t seenTypes = typeSet->seenTypes();
</del><ins>+ RuntimeTypeMask seenTypes = typeSet->seenTypes();
</ins><span class="cx"> if (typeSet->doesTypeConformTo(TypeMachineInt)) {
</span><span class="cx"> node->convertToCheck();
</span><span class="cx"> if (node->child1()->shouldSpeculateInt32())
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorprotocolRuntimejson"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/protocol/Runtime.json (182113 => 182114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/protocol/Runtime.json        2015-03-28 16:38:00 UTC (rev 182113)
+++ trunk/Source/JavaScriptCore/inspector/protocol/Runtime.json        2015-03-28 17:28:11 UTC (rev 182114)
</span><span class="lines">@@ -154,7 +154,8 @@
</span><span class="cx"> { "name": "isInteger", "type": "boolean", "description": "Indicates if this type description has been type Integer." },
</span><span class="cx"> { "name": "isNumber", "type": "boolean", "description": "Indicates if this type description has been type Number." },
</span><span class="cx"> { "name": "isString", "type": "boolean", "description": "Indicates if this type description has been type String." },
</span><del>- { "name": "isObject", "type": "boolean", "description": "Indicates if this type description has been type Object." }
</del><ins>+ { "name": "isObject", "type": "boolean", "description": "Indicates if this type description has been type Object." },
+ { "name": "isSymbol", "type": "boolean", "description": "Indicates if this type description has been type Symbol." }
</ins><span class="cx"> ]
</span><span class="cx"> },
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeRuntimeTypecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/RuntimeType.cpp (182113 => 182114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/RuntimeType.cpp        2015-03-28 16:38:00 UTC (rev 182113)
+++ trunk/Source/JavaScriptCore/runtime/RuntimeType.cpp        2015-03-28 17:28:11 UTC (rev 182114)
</span><span class="lines">@@ -51,6 +51,8 @@
</span><span class="cx"> return TypeObject;
</span><span class="cx"> if (value.isFunction())
</span><span class="cx"> return TypeFunction;
</span><ins>+ if (value.isSymbol())
+ return TypeSymbol;
</ins><span class="cx">
</span><span class="cx"> return TypeNothing;
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeRuntimeTypeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/RuntimeType.h (182113 => 182114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/RuntimeType.h        2015-03-28 16:38:00 UTC (rev 182113)
+++ trunk/Source/JavaScriptCore/runtime/RuntimeType.h        2015-03-28 17:28:11 UTC (rev 182114)
</span><span class="lines">@@ -31,7 +31,7 @@
</span><span class="cx">
</span><span class="cx"> namespace JSC {
</span><span class="cx">
</span><del>-enum RuntimeType : uint8_t {
</del><ins>+enum RuntimeType : uint16_t {
</ins><span class="cx"> TypeNothing = 0x0,
</span><span class="cx"> TypeFunction = 0x1,
</span><span class="cx"> TypeUndefined = 0x2,
</span><span class="lines">@@ -40,13 +40,21 @@
</span><span class="cx"> TypeMachineInt = 0x10,
</span><span class="cx"> TypeNumber = 0x20,
</span><span class="cx"> TypeString = 0x40,
</span><del>- TypeObject = 0x80
</del><ins>+ TypeObject = 0x80,
+ TypeSymbol = 0x100
</ins><span class="cx"> };
</span><span class="cx">
</span><ins>+typedef uint16_t RuntimeTypeMask;
+
</ins><span class="cx"> class JSValue;
</span><span class="cx"> RuntimeType runtimeTypeForValue(JSValue);
</span><span class="cx"> String runtimeTypeAsString(RuntimeType);
</span><span class="cx">
</span><ins>+ALWAYS_INLINE bool runtimeTypeIsPrimitive(RuntimeTypeMask type)
+{
+ return type & ~(TypeFunction | TypeObject);
+}
+
</ins><span class="cx"> } // namespace JSC
</span><span class="cx">
</span><span class="cx"> #endif // RuntimeType_h
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeTypeSetcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/TypeSet.cpp (182113 => 182114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/TypeSet.cpp        2015-03-28 16:38:00 UTC (rev 182113)
+++ trunk/Source/JavaScriptCore/runtime/TypeSet.cpp        2015-03-28 17:28:11 UTC (rev 182114)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2008, 2014 Apple Inc. All Rights Reserved.
</del><ins>+ * Copyright (C) 2014, 2015 Apple Inc. All Rights Reserved.
</ins><span class="cx"> *
</span><span class="cx"> * Redistribution and use in source and binary forms, with or without
</span><span class="cx"> * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -47,7 +47,7 @@
</span><span class="cx"> RefPtr<StructureShape> newShape = prpNewShape;
</span><span class="cx"> m_seenTypes = m_seenTypes | type;
</span><span class="cx">
</span><del>- if (structure && newShape && type != TypeString) {
</del><ins>+ if (structure && newShape && !runtimeTypeIsPrimitive(type)) {
</ins><span class="cx"> if (!m_structureSet.contains(structure)) {
</span><span class="cx"> m_structureSet.add(structure);
</span><span class="cx"> // Make one more pass making sure that:
</span><span class="lines">@@ -93,21 +93,23 @@
</span><span class="cx"> StringBuilder seen;
</span><span class="cx">
</span><span class="cx"> if (m_seenTypes & TypeFunction)
</span><del>- seen.append("Function ");
</del><ins>+ seen.appendLiteral("Function ");
</ins><span class="cx"> if (m_seenTypes & TypeUndefined)
</span><del>- seen.append("Undefined ");
</del><ins>+ seen.appendLiteral("Undefined ");
</ins><span class="cx"> if (m_seenTypes & TypeNull)
</span><del>- seen.append("Null ");
</del><ins>+ seen.appendLiteral("Null ");
</ins><span class="cx"> if (m_seenTypes & TypeBoolean)
</span><del>- seen.append("Boolean ");
</del><ins>+ seen.appendLiteral("Boolean ");
</ins><span class="cx"> if (m_seenTypes & TypeMachineInt)
</span><del>- seen.append("MachineInt ");
</del><ins>+ seen.appendLiteral("MachineInt ");
</ins><span class="cx"> if (m_seenTypes & TypeNumber)
</span><del>- seen.append("Number ");
</del><ins>+ seen.appendLiteral("Number ");
</ins><span class="cx"> if (m_seenTypes & TypeString)
</span><del>- seen.append("String ");
</del><ins>+ seen.appendLiteral("String ");
</ins><span class="cx"> if (m_seenTypes & TypeObject)
</span><del>- seen.append("Object ");
</del><ins>+ seen.appendLiteral("Object ");
+ if (m_seenTypes & TypeSymbol)
+ seen.appendLiteral("Symbol ");
</ins><span class="cx">
</span><span class="cx"> for (size_t i = 0; i < m_structureHistory.size(); i++) {
</span><span class="cx"> RefPtr<StructureShape> shape = m_structureHistory.at(i);
</span><span class="lines">@@ -116,7 +118,7 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> if (m_structureHistory.size())
</span><del>- seen.append("\nStructures:[ ");
</del><ins>+ seen.appendLiteral("\nStructures:[ ");
</ins><span class="cx"> for (size_t i = 0; i < m_structureHistory.size(); i++) {
</span><span class="cx"> seen.append(m_structureHistory.at(i)->stringRepresentation());
</span><span class="cx"> seen.append(' ');
</span><span class="lines">@@ -125,14 +127,14 @@
</span><span class="cx"> seen.append(']');
</span><span class="cx">
</span><span class="cx"> if (m_structureHistory.size()) {
</span><del>- seen.append("\nLeast Common Ancestor: ");
</del><ins>+ seen.appendLiteral("\nLeast Common Ancestor: ");
</ins><span class="cx"> seen.append(leastCommonAncestor());
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> return seen.toString();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-bool TypeSet::doesTypeConformTo(uint8_t test) const
</del><ins>+bool TypeSet::doesTypeConformTo(RuntimeTypeMask test) const
</ins><span class="cx"> {
</span><span class="cx"> // This function checks if our seen types conform to the types described by the test bitstring. (i.e we haven't seen more types than test).
</span><span class="cx"> // We are <= to those types if ANDing with the bitstring doesn't zero out any of our bits.
</span><span class="lines">@@ -183,6 +185,8 @@
</span><span class="cx"> return ASCIILiteral("Number");
</span><span class="cx"> if (doesTypeConformTo(TypeString))
</span><span class="cx"> return ASCIILiteral("String");
</span><ins>+ if (doesTypeConformTo(TypeSymbol))
+ return ASCIILiteral("Symbol");
</ins><span class="cx">
</span><span class="cx"> if (doesTypeConformTo(TypeNull | TypeUndefined))
</span><span class="cx"> return ASCIILiteral("(?)");
</span><span class="lines">@@ -197,6 +201,8 @@
</span><span class="cx"> return ASCIILiteral("Number?");
</span><span class="cx"> if (doesTypeConformTo(TypeString | TypeNull | TypeUndefined))
</span><span class="cx"> return ASCIILiteral("String?");
</span><ins>+ if (doesTypeConformTo(TypeSymbol | TypeNull | TypeUndefined))
+ return ASCIILiteral("Symbol?");
</ins><span class="cx">
</span><span class="cx"> if (doesTypeConformTo(TypeObject | TypeFunction | TypeString))
</span><span class="cx"> return ASCIILiteral("Object");
</span><span class="lines">@@ -232,6 +238,7 @@
</span><span class="cx"> .setIsNumber((m_seenTypes & TypeNumber) != TypeNothing)
</span><span class="cx"> .setIsString((m_seenTypes & TypeString) != TypeNothing)
</span><span class="cx"> .setIsObject((m_seenTypes & TypeObject) != TypeNothing)
</span><ins>+ .setIsSymbol((m_seenTypes & TypeSymbol) != TypeNothing)
</ins><span class="cx"> .release();
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -288,6 +295,12 @@
</span><span class="cx"> hasAnItem = true;
</span><span class="cx"> json.append("\"String\"");
</span><span class="cx"> }
</span><ins>+ if (m_seenTypes & TypeSymbol) {
+ if (hasAnItem)
+ json.append(",");
+ hasAnItem = true;
+ json.append("\"Symbol\"");
+ }
</ins><span class="cx"> json.append("]");
</span><span class="cx">
</span><span class="cx"> json.append(",");
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeTypeSeth"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/TypeSet.h (182113 => 182114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/TypeSet.h        2015-03-28 16:38:00 UTC (rev 182113)
+++ trunk/Source/JavaScriptCore/runtime/TypeSet.h        2015-03-28 17:28:11 UTC (rev 182114)
</span><span class="lines">@@ -94,12 +94,12 @@
</span><span class="cx"> String leastCommonAncestor() const;
</span><span class="cx"> Ref<Inspector::Protocol::Runtime::TypeSet> inspectorTypeSet() const;
</span><span class="cx"> bool isEmpty() const { return m_seenTypes == TypeNothing; }
</span><del>- bool doesTypeConformTo(uint8_t test) const;
- uint8_t seenTypes() const { return m_seenTypes; }
</del><ins>+ bool doesTypeConformTo(RuntimeTypeMask test) const;
+ RuntimeTypeMask seenTypes() const { return m_seenTypes; }
</ins><span class="cx"> StructureSet structureSet() const { return m_structureSet; };
</span><span class="cx">
</span><span class="cx"> private:
</span><del>- uint8_t m_seenTypes;
</del><ins>+ RuntimeTypeMask m_seenTypes;
</ins><span class="cx"> bool m_isOverflown;
</span><span class="cx"> Vector<RefPtr<StructureShape>> m_structureHistory;
</span><span class="cx"> StructureSet m_structureSet;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreteststypeProfilerdriverdriverjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/tests/typeProfiler/driver/driver.js (182113 => 182114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/tests/typeProfiler/driver/driver.js        2015-03-28 16:38:00 UTC (rev 182113)
+++ trunk/Source/JavaScriptCore/tests/typeProfiler/driver/driver.js        2015-03-28 17:28:11 UTC (rev 182114)
</span><span class="lines">@@ -7,6 +7,7 @@
</span><span class="cx"> Many: "(many)",
</span><span class="cx"> String: "String",
</span><span class="cx"> Undefined: "Undefined",
</span><ins>+ Symbol: "Symbol",
</ins><span class="cx"> UndefinedOrNull: "(?)"
</span><span class="cx"> };
</span><span class="cx">
</span><span class="lines">@@ -14,7 +15,8 @@
</span><span class="cx"> Boolean:"Boolean?",
</span><span class="cx"> Integer: "Integer?",
</span><span class="cx"> Number: "Number?",
</span><del>- String: "String?"
</del><ins>+ String: "String?",
+ Symbol: "Symbol?"
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> function assert(condition, reason) {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreteststypeProfilersymboljs"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/tests/typeProfiler/symbol.js (0 => 182114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/tests/typeProfiler/symbol.js         (rev 0)
+++ trunk/Source/JavaScriptCore/tests/typeProfiler/symbol.js        2015-03-28 17:28:11 UTC (rev 182114)
</span><span class="lines">@@ -0,0 +1,44 @@
</span><ins>+load("./driver/driver.js");
+
+function wrapper() {
+ var s1 = Symbol();
+
+ var sCaptured = Symbol();
+ function foo() {
+ sCaptured = null;
+ }
+ foo();
+
+ function bar(s3) { return s3; }
+ for (var i = 0; i < 1000; i++)
+ bar(i)
+ bar(Symbol())
+
+ function baz(s4) { return s4; }
+ for (var i = 0; i < 1000; i++)
+ baz(Symbol())
+ baz("hello")
+}
+
+wrapper();
+
+// ====== End test cases ======
+
+var types = findTypeForExpression(wrapper, "s1");
+assert(types.instructionTypeSet.primitiveTypeNames.length === 1, "Primitive type names should contain one type");
+assert(types.instructionTypeSet.primitiveTypeNames.indexOf(T.Symbol) !== -1, "Primitive type names should contain 'Symbol'");
+
+types = findTypeForExpression(wrapper, "sCaptured");
+assert(types.globalTypeSet.primitiveTypeNames.length === 2, "Primitive type names should contain two items.");
+assert(types.globalTypeSet.primitiveTypeNames.indexOf(T.Symbol) !== -1, "Primitive type names should contain 'Symbol'");
+assert(types.globalTypeSet.primitiveTypeNames.indexOf(T.Null) !== -1, "Primitive type names should contain 'Null'");
+
+types = findTypeForExpression(wrapper, "s3");
+assert(types.instructionTypeSet.primitiveTypeNames.length === 2, "Primitive type names should contain 2 items");
+assert(types.instructionTypeSet.primitiveTypeNames.indexOf(T.Integer) !== -1, "Primitive type names should contain 'Integer'");
+assert(types.instructionTypeSet.primitiveTypeNames.indexOf(T.Symbol) !== -1, "Primitive type names should contain 'Symbol'");
+
+types = findTypeForExpression(wrapper, "s4");
+assert(types.instructionTypeSet.primitiveTypeNames.length === 2, "Primitive type names should contain 2 items");
+assert(types.instructionTypeSet.primitiveTypeNames.indexOf(T.String) !== -1, "Primitive type names should contain 'String'");
+assert(types.instructionTypeSet.primitiveTypeNames.indexOf(T.Symbol) !== -1, "Primitive type names should contain 'Symbol'");
</ins></span></pre></div>
<a id="trunkSourceWebInspectorUIChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/ChangeLog (182113 => 182114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/ChangeLog        2015-03-28 16:38:00 UTC (rev 182113)
+++ trunk/Source/WebInspectorUI/ChangeLog        2015-03-28 17:28:11 UTC (rev 182114)
</span><span class="lines">@@ -1,3 +1,25 @@
</span><ins>+2015-03-28 Saam Barati <saambarati1@gmail.com>
+
+ Web Inspector: ES6: Better support for Symbol types in Type Profiler
+ https://bugs.webkit.org/show_bug.cgi?id=141257
+
+ Reviewed by Joseph Pecoraro.
+
+ The Web Inspector's visualization of JSC's type profiler
+ should have support for the Symbol type.
+
+ * UserInterface/Models/TypeSet.js:
+ (WebInspector.TypeSet):
+ (WebInspector.TypeSet.prototype.get primitiveTypeNames):
+ * UserInterface/Views/TypeTokenView.css:
+ TypeTokenView will display Symbol type tokens using the same color that
+ Symbol values are displayed as formatted values.
+
+ (.type-token-symbol):
+ * UserInterface/Views/TypeTokenView.js:
+ (WebInspector.TypeTokenView.prototype._displayTypeName):
+ (WebInspector.TypeTokenView):
+
</ins><span class="cx"> 2015-03-28 Joseph Pecoraro <pecoraro@apple.com>
</span><span class="cx">
</span><span class="cx"> Web Inspector: Adopt Array.prototype.includes and String.prototype.includes
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceModelsTypeSetjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Models/TypeSet.js (182113 => 182114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Models/TypeSet.js        2015-03-28 16:38:00 UTC (rev 182113)
+++ trunk/Source/WebInspectorUI/UserInterface/Models/TypeSet.js        2015-03-28 17:28:11 UTC (rev 182114)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2014 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2014, 2015 Apple Inc. All rights reserved.
</ins><span class="cx"> * Copyright (C) Saam Barati.
</span><span class="cx"> *
</span><span class="cx"> * Redistribution and use in source and binary forms, with or without
</span><span class="lines">@@ -50,6 +50,8 @@
</span><span class="cx"> bitString |= WebInspector.TypeSet.TypeBit.String;
</span><span class="cx"> if (typeSet.isObject)
</span><span class="cx"> bitString |= WebInspector.TypeSet.TypeBit.Object;
</span><ins>+ if (typeSet.isSymbol)
+ bitString |= WebInspector.TypeSet.TypeBit.Symbol;
</ins><span class="cx">
</span><span class="cx"> console.assert(bitString);
</span><span class="cx"> this._bitString = bitString;
</span><span class="lines">@@ -101,6 +103,8 @@
</span><span class="cx"> this._primitiveTypeNames.push("Boolean");
</span><span class="cx"> if (typeSet.isString)
</span><span class="cx"> this._primitiveTypeNames.push("String");
</span><ins>+ if (typeSet.isSymbol)
+ this._primitiveTypeNames.push("Symbol");
</ins><span class="cx">
</span><span class="cx"> // It's implied that type Integer is contained in type Number. Don't put
</span><span class="cx"> // both 'Integer' and 'Number' into the set because this could imply that
</span><span class="lines">@@ -122,7 +126,8 @@
</span><span class="cx"> "Integer" : 0x10,
</span><span class="cx"> "Number" : 0x20,
</span><span class="cx"> "String" : 0x40,
</span><del>- "Object" : 0x80
</del><ins>+ "Object" : 0x80,
+ "Symbol" : 0x100
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> WebInspector.TypeSet.NullOrUndefinedTypeBits = WebInspector.TypeSet.TypeBit.Null | WebInspector.TypeSet.TypeBit.Undefined;
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsTypeTokenViewcss"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/TypeTokenView.css (182113 => 182114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/TypeTokenView.css        2015-03-28 16:38:00 UTC (rev 182113)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/TypeTokenView.css        2015-03-28 17:28:11 UTC (rev 182114)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2014 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2014, 2015 Apple Inc. All rights reserved.
</ins><span class="cx"> *
</span><span class="cx"> * Redistribution and use in source and binary forms, with or without
</span><span class="cx"> * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -55,6 +55,10 @@
</span><span class="cx"> background-color: rgb(223, 53, 46);
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+.type-token-symbol {
+ background-color: rgb(63, 169, 156);
+}
+
</ins><span class="cx"> .type-token-default {
</span><span class="cx"> background-color: rgb(118, 174, 29);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsTypeTokenViewjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/TypeTokenView.js (182113 => 182114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/TypeTokenView.js        2015-03-28 16:38:00 UTC (rev 182113)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/TypeTokenView.js        2015-03-28 17:28:11 UTC (rev 182114)
</span><span class="lines">@@ -160,6 +160,8 @@
</span><span class="cx"> return "Number";
</span><span class="cx"> if (typeSet.isContainedIn(WebInspector.TypeSet.TypeBit.String))
</span><span class="cx"> return "String";
</span><ins>+ if (typeSet.isContainedIn(WebInspector.TypeSet.TypeBit.Symbol))
+ return "Symbol";
</ins><span class="cx">
</span><span class="cx"> if (typeSet.isContainedIn(WebInspector.TypeSet.NullOrUndefinedTypeBits))
</span><span class="cx"> return "(?)";
</span><span class="lines">@@ -174,6 +176,8 @@
</span><span class="cx"> return "Number?";
</span><span class="cx"> if (typeSet.isContainedIn(WebInspector.TypeSet.TypeBit.String | WebInspector.TypeSet.NullOrUndefinedTypeBits))
</span><span class="cx"> return "String?";
</span><ins>+ if (typeSet.isContainedIn(WebInspector.TypeSet.TypeBit.Symbol | WebInspector.TypeSet.NullOrUndefinedTypeBits))
+ return "Symbol?";
</ins><span class="cx">
</span><span class="cx"> if (typeSet.isContainedIn(WebInspector.TypeSet.TypeBit.Object | WebInspector.TypeSet.TypeBit.Function | WebInspector.TypeSet.TypeBit.String))
</span><span class="cx"> return "Object";
</span><span class="lines">@@ -191,6 +195,7 @@
</span><span class="cx">
</span><span class="cx"> WebInspector.TypeTokenView.ColorClassForType = {
</span><span class="cx"> "String": "type-token-string",
</span><ins>+ "Symbol": "type-token-symbol",
</ins><span class="cx"> "Function": "type-token-function",
</span><span class="cx"> "Number": "type-token-number",
</span><span class="cx"> "Integer": "type-token-number",
</span></span></pre>
</div>
</div>
</body>
</html>