<!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>[201976] 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/201976">201976</a></dd>
<dt>Author</dt> <dd>mark.lam@apple.com</dd>
<dt>Date</dt> <dd>2016-06-11 12:58:07 -0700 (Sat, 11 Jun 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Minimize the amount of memcpy done for allocating Error stacks.
https://bugs.webkit.org/show_bug.cgi?id=158664

Reviewed by Darin Adler.

Currently, Vector&lt;StackFrame&gt; are being copied around multiple times in the
process of creating Error stacks.

This patch avoids this unnecessary copying by:
1. Sizing the StackFrame vector correctly to begin with, and skipping
   undesirable top frames before filling in the vector.
2. Using perfect forwarding or passing by reference to pass the vector data around
   instead of copying the vectors.
3. Changing the Exception object to take a Vector&lt;StackFrame&gt; instead of a
   RefCountedArray&lt;StackFrame&gt;.

This patch has passed the JSC and layout tests.  Benchmarks show that perf is
neutral.

* API/tests/testapi.mm:
(testObjectiveCAPI):
* inspector/ScriptCallStackFactory.cpp:
(Inspector::createScriptCallStackFromException):
* interpreter/Interpreter.cpp:
(JSC::GetStackTraceFunctor::GetStackTraceFunctor):
(JSC::GetStackTraceFunctor::operator()):
(JSC::Interpreter::getStackTrace):
(JSC::Interpreter::stackTraceAsString):
(JSC::findExceptionHandler):
* interpreter/Interpreter.h:
* runtime/Error.cpp:
(JSC::addErrorInfoAndGetBytecodeOffset):
* runtime/Exception.cpp:
(JSC::Exception::finishCreation):
* runtime/Exception.h:
(JSC::Exception::valueOffset):
(JSC::Exception::value):
(JSC::Exception::stack):
(JSC::Exception::didNotifyInspectorOfThrow):
(JSC::Exception::setDidNotifyInspectorOfThrow):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorScriptCallStackFactorycpp">trunk/Source/JavaScriptCore/inspector/ScriptCallStackFactory.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreinterpreterInterpretercpp">trunk/Source/JavaScriptCore/interpreter/Interpreter.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreinterpreterInterpreterh">trunk/Source/JavaScriptCore/interpreter/Interpreter.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeErrorcpp">trunk/Source/JavaScriptCore/runtime/Error.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeExceptioncpp">trunk/Source/JavaScriptCore/runtime/Exception.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeExceptionh">trunk/Source/JavaScriptCore/runtime/Exception.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (201975 => 201976)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2016-06-11 19:48:48 UTC (rev 201975)
+++ trunk/Source/JavaScriptCore/ChangeLog        2016-06-11 19:58:07 UTC (rev 201976)
</span><span class="lines">@@ -1,5 +1,48 @@
</span><span class="cx"> 2016-06-11  Mark Lam  &lt;mark.lam@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        Minimize the amount of memcpy done for allocating Error stacks.
+        https://bugs.webkit.org/show_bug.cgi?id=158664
+
+        Reviewed by Darin Adler.
+
+        Currently, Vector&lt;StackFrame&gt; are being copied around multiple times in the
+        process of creating Error stacks.
+
+        This patch avoids this unnecessary copying by:
+        1. Sizing the StackFrame vector correctly to begin with, and skipping
+           undesirable top frames before filling in the vector.
+        2. Using perfect forwarding or passing by reference to pass the vector data around
+           instead of copying the vectors.
+        3. Changing the Exception object to take a Vector&lt;StackFrame&gt; instead of a
+           RefCountedArray&lt;StackFrame&gt;.
+
+        This patch has passed the JSC and layout tests.  Benchmarks show that perf is
+        neutral.
+
+        * API/tests/testapi.mm:
+        (testObjectiveCAPI):
+        * inspector/ScriptCallStackFactory.cpp:
+        (Inspector::createScriptCallStackFromException):
+        * interpreter/Interpreter.cpp:
+        (JSC::GetStackTraceFunctor::GetStackTraceFunctor):
+        (JSC::GetStackTraceFunctor::operator()):
+        (JSC::Interpreter::getStackTrace):
+        (JSC::Interpreter::stackTraceAsString):
+        (JSC::findExceptionHandler):
+        * interpreter/Interpreter.h:
+        * runtime/Error.cpp:
+        (JSC::addErrorInfoAndGetBytecodeOffset):
+        * runtime/Exception.cpp:
+        (JSC::Exception::finishCreation):
+        * runtime/Exception.h:
+        (JSC::Exception::valueOffset):
+        (JSC::Exception::value):
+        (JSC::Exception::stack):
+        (JSC::Exception::didNotifyInspectorOfThrow):
+        (JSC::Exception::setDidNotifyInspectorOfThrow):
+
+2016-06-11  Mark Lam  &lt;mark.lam@apple.com&gt;
+
</ins><span class="cx">         Tests that overflows the stack should not be run with the sampling profiler.
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=158663
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorScriptCallStackFactorycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/ScriptCallStackFactory.cpp (201975 => 201976)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/ScriptCallStackFactory.cpp        2016-06-11 19:48:48 UTC (rev 201975)
+++ trunk/Source/JavaScriptCore/inspector/ScriptCallStackFactory.cpp        2016-06-11 19:58:07 UTC (rev 201976)
</span><span class="lines">@@ -137,7 +137,7 @@
</span><span class="cx"> Ref&lt;ScriptCallStack&gt; createScriptCallStackFromException(JSC::ExecState* exec, JSC::Exception* exception, size_t maxStackSize)
</span><span class="cx"> {
</span><span class="cx">     Vector&lt;ScriptCallFrame&gt; frames;
</span><del>-    RefCountedArray&lt;StackFrame&gt; stackTrace = exception-&gt;stack();
</del><ins>+    auto&amp; stackTrace = exception-&gt;stack();
</ins><span class="cx">     VM&amp; vm = exec-&gt;vm();
</span><span class="cx">     for (size_t i = 0; i &lt; stackTrace.size() &amp;&amp; i &lt; maxStackSize; i++) {
</span><span class="cx">         unsigned line;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinterpreterInterpretercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/interpreter/Interpreter.cpp (201975 => 201976)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/interpreter/Interpreter.cpp        2016-06-11 19:48:48 UTC (rev 201975)
+++ trunk/Source/JavaScriptCore/interpreter/Interpreter.cpp        2016-06-11 19:58:07 UTC (rev 201976)
</span><span class="lines">@@ -498,29 +498,35 @@
</span><span class="cx"> 
</span><span class="cx"> class GetStackTraceFunctor {
</span><span class="cx"> public:
</span><del>-    GetStackTraceFunctor(VM&amp; vm, Vector&lt;StackFrame&gt;&amp; results, size_t remainingCapacity)
</del><ins>+    GetStackTraceFunctor(VM&amp; vm, Vector&lt;StackFrame&gt;&amp; results, size_t framesToSkip, size_t capacity)
</ins><span class="cx">         : m_vm(vm)
</span><span class="cx">         , m_results(results)
</span><del>-        , m_remainingCapacityForFrameCapture(remainingCapacity)
</del><ins>+        , m_framesToSkip(framesToSkip)
+        , m_remainingCapacityForFrameCapture(capacity)
</ins><span class="cx">     {
</span><ins>+        m_results.reserveInitialCapacity(capacity);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     StackVisitor::Status operator()(StackVisitor&amp; visitor) const
</span><span class="cx">     {
</span><del>-        VM&amp; vm = m_vm;
</del><ins>+        if (m_framesToSkip &gt; 0) {
+            m_framesToSkip--;
+            return StackVisitor::Continue;
+        }
+
</ins><span class="cx">         if (m_remainingCapacityForFrameCapture) {
</span><span class="cx">             if (visitor-&gt;isJSFrame()
</span><span class="cx">                 &amp;&amp; !isWebAssemblyExecutable(visitor-&gt;codeBlock()-&gt;ownerExecutable())
</span><span class="cx">                 &amp;&amp; !visitor-&gt;codeBlock()-&gt;unlinkedCodeBlock()-&gt;isBuiltinFunction()) {
</span><span class="cx">                 StackFrame s = {
</span><del>-                    Strong&lt;JSObject&gt;(vm, visitor-&gt;callee()),
-                    Strong&lt;CodeBlock&gt;(vm, visitor-&gt;codeBlock()),
</del><ins>+                    Strong&lt;JSObject&gt;(m_vm, visitor-&gt;callee()),
+                    Strong&lt;CodeBlock&gt;(m_vm, visitor-&gt;codeBlock()),
</ins><span class="cx">                     visitor-&gt;bytecodeOffset()
</span><span class="cx">                 };
</span><span class="cx">                 m_results.append(s);
</span><span class="cx">             } else {
</span><span class="cx">                 StackFrame s = {
</span><del>-                    Strong&lt;JSObject&gt;(vm, visitor-&gt;callee()),
</del><ins>+                    Strong&lt;JSObject&gt;(m_vm, visitor-&gt;callee()),
</ins><span class="cx">                     Strong&lt;CodeBlock&gt;(),
</span><span class="cx">                     0 // unused value because codeBlock is null.
</span><span class="cx">                 };
</span><span class="lines">@@ -536,31 +542,43 @@
</span><span class="cx"> private:
</span><span class="cx">     VM&amp; m_vm;
</span><span class="cx">     Vector&lt;StackFrame&gt;&amp; m_results;
</span><ins>+    mutable size_t m_framesToSkip;
</ins><span class="cx">     mutable size_t m_remainingCapacityForFrameCapture;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-void Interpreter::getStackTrace(Vector&lt;StackFrame&gt;&amp; results, size_t maxStackSize)
</del><ins>+void Interpreter::getStackTrace(Vector&lt;StackFrame&gt;&amp; results, size_t framesToSkip, size_t maxStackSize)
</ins><span class="cx"> {
</span><span class="cx">     VM&amp; vm = m_vm;
</span><span class="cx">     CallFrame* callFrame = vm.topCallFrame;
</span><span class="cx">     if (!callFrame)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    GetStackTraceFunctor functor(vm, results, maxStackSize);
</del><ins>+    size_t framesCount = 0;
+    callFrame-&gt;iterate([&amp;] (StackVisitor&amp;) -&gt; StackVisitor::Status {
+        framesCount++;
+        return StackVisitor::Continue;
+    });
+    if (framesCount &lt;= framesToSkip)
+        return;
+
+    framesCount -= framesToSkip;
+    framesCount = std::min(maxStackSize, framesCount);
+
+    GetStackTraceFunctor functor(vm, results, framesToSkip, framesCount);
</ins><span class="cx">     callFrame-&gt;iterate(functor);
</span><ins>+    ASSERT(results.size() == results.capacity());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-JSString* Interpreter::stackTraceAsString(ExecState* exec, Vector&lt;StackFrame&gt; stackTrace)
</del><ins>+JSString* Interpreter::stackTraceAsString(VM&amp; vm, const Vector&lt;StackFrame&gt;&amp; stackTrace)
</ins><span class="cx"> {
</span><span class="cx">     // FIXME: JSStringJoiner could be more efficient than StringBuilder here.
</span><span class="cx">     StringBuilder builder;
</span><del>-    VM&amp; vm = exec-&gt;vm();
</del><span class="cx">     for (unsigned i = 0; i &lt; stackTrace.size(); i++) {
</span><span class="cx">         builder.append(String(stackTrace[i].toString(vm)));
</span><span class="cx">         if (i != stackTrace.size() - 1)
</span><span class="cx">             builder.append('\n');
</span><span class="cx">     }
</span><del>-    return jsString(&amp;exec-&gt;vm(), builder.toString());
</del><ins>+    return jsString(&amp;vm, builder.toString());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> ALWAYS_INLINE static HandlerInfo* findExceptionHandler(StackVisitor&amp; visitor, CodeBlock* codeBlock, CodeBlock::RequiredHandler requiredHandler)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinterpreterInterpreterh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/interpreter/Interpreter.h (201975 => 201976)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/interpreter/Interpreter.h        2016-06-11 19:48:48 UTC (rev 201975)
+++ trunk/Source/JavaScriptCore/interpreter/Interpreter.h        2016-06-11 19:58:07 UTC (rev 201976)
</span><span class="lines">@@ -217,7 +217,7 @@
</span><span class="cx">         NEVER_INLINE HandlerInfo* unwind(VM&amp;, CallFrame*&amp;, Exception*, UnwindStart);
</span><span class="cx">         void notifyDebuggerOfExceptionToBeThrown(CallFrame*, Exception*);
</span><span class="cx">         NEVER_INLINE void debug(CallFrame*, DebugHookID);
</span><del>-        JSString* stackTraceAsString(ExecState*, Vector&lt;StackFrame&gt;);
</del><ins>+        static JSString* stackTraceAsString(VM&amp;, const Vector&lt;StackFrame&gt;&amp;);
</ins><span class="cx"> 
</span><span class="cx">         static EncodedJSValue JSC_HOST_CALL constructWithErrorConstructor(ExecState*);
</span><span class="cx">         static EncodedJSValue JSC_HOST_CALL callErrorConstructor(ExecState*);
</span><span class="lines">@@ -226,7 +226,7 @@
</span><span class="cx"> 
</span><span class="cx">         JS_EXPORT_PRIVATE void dumpCallFrame(CallFrame*);
</span><span class="cx"> 
</span><del>-        void getStackTrace(Vector&lt;StackFrame&gt;&amp; results, size_t maxStackSize = std::numeric_limits&lt;size_t&gt;::max());
</del><ins>+        void getStackTrace(Vector&lt;StackFrame&gt;&amp; results, size_t framesToSkip = 0, size_t maxStackSize = std::numeric_limits&lt;size_t&gt;::max());
</ins><span class="cx"> 
</span><span class="cx">     private:
</span><span class="cx">         enum ExecutionFlag { Normal, InitializeAndReturn };
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeErrorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Error.cpp (201975 => 201976)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Error.cpp        2016-06-11 19:48:48 UTC (rev 201975)
+++ trunk/Source/JavaScriptCore/runtime/Error.cpp        2016-06-11 19:58:07 UTC (rev 201976)
</span><span class="lines">@@ -143,7 +143,8 @@
</span><span class="cx"> {
</span><span class="cx">     Vector&lt;StackFrame&gt; stackTrace = Vector&lt;StackFrame&gt;();
</span><span class="cx"> 
</span><del>-    vm.interpreter-&gt;getStackTrace(stackTrace);
</del><ins>+    size_t framesToSkip = useCurrentFrame ? 0 : 1;
+    vm.interpreter-&gt;getStackTrace(stackTrace, framesToSkip);
</ins><span class="cx">     if (!stackTrace.isEmpty()) {
</span><span class="cx"> 
</span><span class="cx">         ASSERT(exec == vm.topCallFrame || exec == exec-&gt;lexicalGlobalObject()-&gt;globalExec() || exec == exec-&gt;vmEntryGlobalObject()-&gt;globalExec());
</span><span class="lines">@@ -173,9 +174,7 @@
</span><span class="cx">         if (!frameSourceURL.isEmpty())
</span><span class="cx">             obj-&gt;putDirect(vm, vm.propertyNames-&gt;sourceURL, jsString(&amp;vm, frameSourceURL), ReadOnly | DontDelete);
</span><span class="cx"> 
</span><del>-        if (!useCurrentFrame)
-            stackTrace.remove(0);
-        obj-&gt;putDirect(vm, vm.propertyNames-&gt;stack, vm.interpreter-&gt;stackTraceAsString(vm.topCallFrame, stackTrace), DontEnum);
</del><ins>+        obj-&gt;putDirect(vm, vm.propertyNames-&gt;stack, Interpreter::stackTraceAsString(vm, stackTrace), DontEnum);
</ins><span class="cx"> 
</span><span class="cx">         return true;
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeExceptioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Exception.cpp (201975 => 201976)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Exception.cpp        2016-06-11 19:48:48 UTC (rev 201975)
+++ trunk/Source/JavaScriptCore/runtime/Exception.cpp        2016-06-11 19:58:07 UTC (rev 201976)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2016 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">@@ -77,7 +77,7 @@
</span><span class="cx">     Vector&lt;StackFrame&gt; stackTrace;
</span><span class="cx">     if (action == StackCaptureAction::CaptureStack)
</span><span class="cx">         vm.interpreter-&gt;getStackTrace(stackTrace);
</span><del>-    m_stack = RefCountedArray&lt;StackFrame&gt;(stackTrace);
</del><ins>+    m_stack = WTFMove(stackTrace);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace JSC
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeExceptionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Exception.h (201975 => 201976)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Exception.h        2016-06-11 19:48:48 UTC (rev 201975)
+++ trunk/Source/JavaScriptCore/runtime/Exception.h        2016-06-11 19:58:07 UTC (rev 201976)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2016 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">@@ -27,7 +27,7 @@
</span><span class="cx"> #define Exception_h
</span><span class="cx"> 
</span><span class="cx"> #include &quot;Interpreter.h&quot;
</span><del>-#include &lt;wtf/RefCountedArray.h&gt;
</del><ins>+#include &lt;wtf/Vector.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx">     
</span><span class="lines">@@ -57,7 +57,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JSValue value() const { return m_value.get(); }
</span><del>-    const RefCountedArray&lt;StackFrame&gt;&amp; stack() const { return m_stack; }
</del><ins>+    const Vector&lt;StackFrame&gt;&amp; stack() const { return m_stack; }
</ins><span class="cx"> 
</span><span class="cx">     bool didNotifyInspectorOfThrow() const { return m_didNotifyInspectorOfThrow; }
</span><span class="cx">     void setDidNotifyInspectorOfThrow() { m_didNotifyInspectorOfThrow = true; }
</span><span class="lines">@@ -69,7 +69,7 @@
</span><span class="cx">     void finishCreation(VM&amp;, JSValue thrownValue, StackCaptureAction);
</span><span class="cx"> 
</span><span class="cx">     WriteBarrier&lt;Unknown&gt; m_value;
</span><del>-    RefCountedArray&lt;StackFrame&gt; m_stack;
</del><ins>+    Vector&lt;StackFrame&gt; m_stack;
</ins><span class="cx">     bool m_didNotifyInspectorOfThrow { false };
</span><span class="cx"> 
</span><span class="cx">     friend class LLIntOffsetsExtractor;
</span></span></pre>
</div>
</div>

</body>
</html>