<!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>[185608] trunk</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/185608">185608</a></dd>
<dt>Author</dt> <dd>mark.lam@apple.com</dd>
<dt>Date</dt> <dd>2015-06-16 13:51:04 -0700 (Tue, 16 Jun 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Use NakedPtr&lt;Exception&gt;&amp; to return exception results.
https://bugs.webkit.org/show_bug.cgi?id=145870

Reviewed by Anders Carlsson and Filip Pizlo.

Source/JavaScriptCore:

Before <a href="http://trac.webkit.org/projects/webkit/changeset/185259">r185259</a>, calls into the VM takes a JSValue* exception result argument for
returning any uncaught exception that may have been thrown while executing JS code.
As a result, clients of the VM functions will declare a local JSValue exception
result which is automatically initialized to a null value (i.e. the empty value,
not the JS null value).

With <a href="http://trac.webkit.org/projects/webkit/changeset/185259">r185259</a>, the VM functions were changed to take an Exception*&amp; exception result
instead, and the VM functions are responsible for initializing the exception result
to null if no exception is thrown.

This introduces 2 issues:

1. the VM functions are vulnerable to modifications that may add early returns
   before the exception result is nullified.  This can result in the exception
   result being used without initialization.

2. Previously, a client could technically use the same exception result for more
   than one calls into the VM functions.  If an earlier call sets it to a thrown
   value, the thrown value will stick unless a subsequent call throws a different
   exception.

   With the new Exception*&amp; exception result, the VM functions will always clear
   the exception result before proceeding.  As a result, the client's exception
   result will be null after the second call even though the first call saw an
   exception thrown.  This is a change in the expected behavior.

To fix these issues, we'll introduce a NakedPtr smart pointer whose sole purpose
is to guarantee that the pointer is initialized.  The VM functions will now take
a NakedPtr&lt;Exception&gt;&amp; instead of the Exception*&amp;.  This ensures that the
exception result is initialized.

The VM functions be also reverted to only set the exception result if a new
exception is thrown.

* API/JSBase.cpp:
(JSEvaluateScript):
* API/JSScriptRef.cpp:
* bindings/ScriptFunctionCall.cpp:
(Deprecated::ScriptFunctionCall::call):
* bindings/ScriptFunctionCall.h:
* debugger/Debugger.cpp:
(JSC::Debugger::hasBreakpoint):
* debugger/Debugger.h:
* debugger/DebuggerCallFrame.cpp:
(JSC::DebuggerCallFrame::thisValue):
(JSC::DebuggerCallFrame::evaluate):
* debugger/DebuggerCallFrame.h:
(JSC::DebuggerCallFrame::isValid):
* inspector/InjectedScriptManager.cpp:
(Inspector::InjectedScriptManager::createInjectedScript):
* inspector/InspectorEnvironment.h:
* inspector/JSJavaScriptCallFrame.cpp:
(Inspector::JSJavaScriptCallFrame::evaluate):
* inspector/JavaScriptCallFrame.h:
(Inspector::JavaScriptCallFrame::vmEntryGlobalObject):
(Inspector::JavaScriptCallFrame::thisValue):
(Inspector::JavaScriptCallFrame::evaluate):
* inspector/ScriptDebugServer.cpp:
(Inspector::ScriptDebugServer::evaluateBreakpointAction):
* jsc.cpp:
(functionRun):
(functionLoad):
(runWithScripts):
(runInteractive):
* runtime/CallData.cpp:
(JSC::call):
* runtime/CallData.h:
* runtime/Completion.cpp:
(JSC::checkSyntax):
(JSC::evaluate):
* runtime/Completion.h:
(JSC::evaluate):

Source/WebCore:

No new WebCore tests because this functionality is already covered by existing tests.
API tests added for WTF::NakedPtr.

* bindings/js/JSCallbackData.cpp:
(WebCore::JSCallbackData::invokeCallback):
* bindings/js/JSCustomXPathNSResolver.cpp:
(WebCore::JSCustomXPathNSResolver::lookupNamespaceURI):
* bindings/js/JSErrorHandler.cpp:
(WebCore::JSErrorHandler::handleEvent):
* bindings/js/JSEventListener.cpp:
(WebCore::JSEventListener::handleEvent):
* bindings/js/JSMainThreadExecState.cpp:
(WebCore::JSMainThreadExecState::didLeaveScriptContext):
(WebCore::functionCallHandlerFromAnyThread):
(WebCore::evaluateHandlerFromAnyThread):
* bindings/js/JSMainThreadExecState.h:
(WebCore::JSMainThreadExecState::currentState):
(WebCore::JSMainThreadExecState::call):
(WebCore::JSMainThreadExecState::evaluate):
* bindings/js/JSMutationCallback.cpp:
(WebCore::JSMutationCallback::call):
* bindings/js/ScheduledAction.cpp:
(WebCore::ScheduledAction::executeFunctionInContext):
* bindings/js/ScriptController.cpp:
(WebCore::ScriptController::evaluateInWorld):
* bindings/js/WorkerScriptController.cpp:
(WebCore::WorkerScriptController::evaluate):
(WebCore::WorkerScriptController::setException):
* bindings/js/WorkerScriptController.h:
(WebCore::WorkerScriptController::workerGlobalScopeWrapper):
* bindings/objc/WebScriptObject.mm:
(-[WebScriptObject callWebScriptMethod:withArguments:]):
* workers/WorkerGlobalScope.cpp:
(WebCore::WorkerGlobalScope::importScripts):

Source/WTF:

Introducing the NakedPtr class.

* WTF.xcodeproj/project.pbxproj:
* wtf/NakedPtr.h: Added.
(WTF::NakedPtr::NakedPtr):
(WTF::NakedPtr::get):
(WTF::NakedPtr::clear):
(WTF::NakedPtr::operator*):
(WTF::NakedPtr::operator-&gt;):
(WTF::NakedPtr::operator T*):
(WTF::NakedPtr::operator!):
(WTF::NakedPtr::operator bool):
(WTF::=):
(WTF::NakedPtr&lt;T&gt;::swap):
(WTF::swap):

Tools:

* TestWebKitAPI/CMakeLists.txt:
* TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPI.vcxproj:
* TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPI.vcxproj.filters:
* TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
* TestWebKitAPI/Tests/WTF/NakedPtr.cpp: Added.
(TestWebKitAPI::TEST):
(TestWebKitAPI::nakedPtrFoo):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreAPIJSBasecpp">trunk/Source/JavaScriptCore/API/JSBase.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreAPIJSScriptRefcpp">trunk/Source/JavaScriptCore/API/JSScriptRef.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCorebindingsScriptFunctionCallcpp">trunk/Source/JavaScriptCore/bindings/ScriptFunctionCall.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorebindingsScriptFunctionCallh">trunk/Source/JavaScriptCore/bindings/ScriptFunctionCall.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredebuggerDebuggercpp">trunk/Source/JavaScriptCore/debugger/Debugger.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredebuggerDebuggerh">trunk/Source/JavaScriptCore/debugger/Debugger.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredebuggerDebuggerCallFramecpp">trunk/Source/JavaScriptCore/debugger/DebuggerCallFrame.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredebuggerDebuggerCallFrameh">trunk/Source/JavaScriptCore/debugger/DebuggerCallFrame.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorInjectedScriptManagercpp">trunk/Source/JavaScriptCore/inspector/InjectedScriptManager.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorInspectorEnvironmenth">trunk/Source/JavaScriptCore/inspector/InspectorEnvironment.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorJSJavaScriptCallFramecpp">trunk/Source/JavaScriptCore/inspector/JSJavaScriptCallFrame.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorJavaScriptCallFrameh">trunk/Source/JavaScriptCore/inspector/JavaScriptCallFrame.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorScriptDebugServercpp">trunk/Source/JavaScriptCore/inspector/ScriptDebugServer.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorejsccpp">trunk/Source/JavaScriptCore/jsc.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeCallDatacpp">trunk/Source/JavaScriptCore/runtime/CallData.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeCallDatah">trunk/Source/JavaScriptCore/runtime/CallData.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeCompletioncpp">trunk/Source/JavaScriptCore/runtime/Completion.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeCompletionh">trunk/Source/JavaScriptCore/runtime/Completion.h</a></li>
<li><a href="#trunkSourceWTFChangeLog">trunk/Source/WTF/ChangeLog</a></li>
<li><a href="#trunkSourceWTFWTFxcodeprojprojectpbxproj">trunk/Source/WTF/WTF.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSCallbackDatacpp">trunk/Source/WebCore/bindings/js/JSCallbackData.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSCustomXPathNSResolvercpp">trunk/Source/WebCore/bindings/js/JSCustomXPathNSResolver.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSErrorHandlercpp">trunk/Source/WebCore/bindings/js/JSErrorHandler.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSEventListenercpp">trunk/Source/WebCore/bindings/js/JSEventListener.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSMainThreadExecStatecpp">trunk/Source/WebCore/bindings/js/JSMainThreadExecState.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSMainThreadExecStateh">trunk/Source/WebCore/bindings/js/JSMainThreadExecState.h</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSMutationCallbackcpp">trunk/Source/WebCore/bindings/js/JSMutationCallback.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsScheduledActioncpp">trunk/Source/WebCore/bindings/js/ScheduledAction.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsScriptControllercpp">trunk/Source/WebCore/bindings/js/ScriptController.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsWorkerScriptControllercpp">trunk/Source/WebCore/bindings/js/WorkerScriptController.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsWorkerScriptControllerh">trunk/Source/WebCore/bindings/js/WorkerScriptController.h</a></li>
<li><a href="#trunkSourceWebCorebindingsobjcWebScriptObjectmm">trunk/Source/WebCore/bindings/objc/WebScriptObject.mm</a></li>
<li><a href="#trunkSourceWebCoreworkersWorkerGlobalScopecpp">trunk/Source/WebCore/workers/WorkerGlobalScope.cpp</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsTestWebKitAPICMakeListstxt">trunk/Tools/TestWebKitAPI/CMakeLists.txt</a></li>
<li><a href="#trunkToolsTestWebKitAPITestWebKitAPIvcxprojTestWebKitAPIvcxproj">trunk/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPI.vcxproj</a></li>
<li><a href="#trunkToolsTestWebKitAPITestWebKitAPIvcxprojTestWebKitAPIvcxprojfilters">trunk/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPI.vcxproj.filters</a></li>
<li><a href="#trunkToolsTestWebKitAPITestWebKitAPIxcodeprojprojectpbxproj">trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceWTFwtfNakedPtrh">trunk/Source/WTF/wtf/NakedPtr.h</a></li>
<li><a href="#trunkToolsTestWebKitAPITestsWTFNakedPtrcpp">trunk/Tools/TestWebKitAPI/Tests/WTF/NakedPtr.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreAPIJSBasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/API/JSBase.cpp (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/API/JSBase.cpp        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Source/JavaScriptCore/API/JSBase.cpp        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -64,7 +64,7 @@
</span><span class="cx">     JSGlobalObject* globalObject = exec-&gt;vmEntryGlobalObject();
</span><span class="cx">     SourceCode source = makeSource(script-&gt;string(), sourceURL ? sourceURL-&gt;string() : String(), TextPosition(OrdinalNumber::fromOneBasedInt(startingLineNumber), OrdinalNumber::first()));
</span><span class="cx"> 
</span><del>-    Exception* evaluationException;
</del><ins>+    NakedPtr&lt;Exception&gt; evaluationException;
</ins><span class="cx">     JSValue returnValue = evaluate(globalObject-&gt;globalExec(), source, jsThisObject, evaluationException);
</span><span class="cx"> 
</span><span class="cx">     if (evaluationException) {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreAPIJSScriptRefcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/API/JSScriptRef.cpp (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/API/JSScriptRef.cpp        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Source/JavaScriptCore/API/JSScriptRef.cpp        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -143,7 +143,7 @@
</span><span class="cx">         RELEASE_ASSERT_NOT_REACHED();
</span><span class="cx">         return 0;
</span><span class="cx">     }
</span><del>-    Exception* internalException;
</del><ins>+    NakedPtr&lt;Exception&gt; internalException;
</ins><span class="cx">     JSValue thisValue = thisValueRef ? toJS(exec, thisValueRef) : jsUndefined();
</span><span class="cx">     JSValue result = evaluate(exec, SourceCode(script), thisValue, internalException);
</span><span class="cx">     if (internalException) {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Source/JavaScriptCore/ChangeLog        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -1,3 +1,83 @@
</span><ins>+2015-06-16  Mark Lam  &lt;mark.lam@apple.com&gt;
+
+        Use NakedPtr&lt;Exception&gt;&amp; to return exception results.
+        https://bugs.webkit.org/show_bug.cgi?id=145870
+
+        Reviewed by Anders Carlsson and Filip Pizlo.
+
+        Before r185259, calls into the VM takes a JSValue* exception result argument for
+        returning any uncaught exception that may have been thrown while executing JS code.
+        As a result, clients of the VM functions will declare a local JSValue exception
+        result which is automatically initialized to a null value (i.e. the empty value,
+        not the JS null value).
+
+        With r185259, the VM functions were changed to take an Exception*&amp; exception result
+        instead, and the VM functions are responsible for initializing the exception result
+        to null if no exception is thrown.
+
+        This introduces 2 issues:
+
+        1. the VM functions are vulnerable to modifications that may add early returns
+           before the exception result is nullified.  This can result in the exception
+           result being used without initialization.
+
+        2. Previously, a client could technically use the same exception result for more
+           than one calls into the VM functions.  If an earlier call sets it to a thrown
+           value, the thrown value will stick unless a subsequent call throws a different
+           exception.
+
+           With the new Exception*&amp; exception result, the VM functions will always clear
+           the exception result before proceeding.  As a result, the client's exception
+           result will be null after the second call even though the first call saw an
+           exception thrown.  This is a change in the expected behavior.
+
+        To fix these issues, we'll introduce a NakedPtr smart pointer whose sole purpose
+        is to guarantee that the pointer is initialized.  The VM functions will now take
+        a NakedPtr&lt;Exception&gt;&amp; instead of the Exception*&amp;.  This ensures that the
+        exception result is initialized.
+
+        The VM functions be also reverted to only set the exception result if a new
+        exception is thrown.
+
+        * API/JSBase.cpp:
+        (JSEvaluateScript):
+        * API/JSScriptRef.cpp:
+        * bindings/ScriptFunctionCall.cpp:
+        (Deprecated::ScriptFunctionCall::call):
+        * bindings/ScriptFunctionCall.h:
+        * debugger/Debugger.cpp:
+        (JSC::Debugger::hasBreakpoint):
+        * debugger/Debugger.h:
+        * debugger/DebuggerCallFrame.cpp:
+        (JSC::DebuggerCallFrame::thisValue):
+        (JSC::DebuggerCallFrame::evaluate):
+        * debugger/DebuggerCallFrame.h:
+        (JSC::DebuggerCallFrame::isValid):
+        * inspector/InjectedScriptManager.cpp:
+        (Inspector::InjectedScriptManager::createInjectedScript):
+        * inspector/InspectorEnvironment.h:
+        * inspector/JSJavaScriptCallFrame.cpp:
+        (Inspector::JSJavaScriptCallFrame::evaluate):
+        * inspector/JavaScriptCallFrame.h:
+        (Inspector::JavaScriptCallFrame::vmEntryGlobalObject):
+        (Inspector::JavaScriptCallFrame::thisValue):
+        (Inspector::JavaScriptCallFrame::evaluate):
+        * inspector/ScriptDebugServer.cpp:
+        (Inspector::ScriptDebugServer::evaluateBreakpointAction):
+        * jsc.cpp:
+        (functionRun):
+        (functionLoad):
+        (runWithScripts):
+        (runInteractive):
+        * runtime/CallData.cpp:
+        (JSC::call):
+        * runtime/CallData.h:
+        * runtime/Completion.cpp:
+        (JSC::checkSyntax):
+        (JSC::evaluate):
+        * runtime/Completion.h:
+        (JSC::evaluate):
+
</ins><span class="cx"> 2015-06-15  Filip Pizlo  &lt;fpizlo@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         FTL boolify() UntypedUse is wrong in the masquerades-as-undefined case
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebindingsScriptFunctionCallcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bindings/ScriptFunctionCall.cpp (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bindings/ScriptFunctionCall.cpp        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Source/JavaScriptCore/bindings/ScriptFunctionCall.cpp        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -133,7 +133,7 @@
</span><span class="cx">         return Deprecated::ScriptValue();
</span><span class="cx"> 
</span><span class="cx">     JSValue result;
</span><del>-    Exception* exception;
</del><ins>+    NakedPtr&lt;Exception&gt; exception;
</ins><span class="cx">     if (m_callHandler)
</span><span class="cx">         result = m_callHandler(m_exec, function, callType, callData, thisObject, m_arguments, exception);
</span><span class="cx">     else
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebindingsScriptFunctionCallh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bindings/ScriptFunctionCall.h (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bindings/ScriptFunctionCall.h        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Source/JavaScriptCore/bindings/ScriptFunctionCall.h        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -71,7 +71,7 @@
</span><span class="cx"> 
</span><span class="cx"> class JS_EXPORT_PRIVATE ScriptFunctionCall : public ScriptCallArgumentHandler {
</span><span class="cx"> public:
</span><del>-    typedef JSC::JSValue (*ScriptFunctionCallHandler)(JSC::ExecState* exec, JSC::JSValue functionObject, JSC::CallType callType, const JSC::CallData&amp; callData, JSC::JSValue thisValue, const JSC::ArgList&amp; args, JSC::Exception*&amp; exception);
</del><ins>+    typedef JSC::JSValue (*ScriptFunctionCallHandler)(JSC::ExecState* exec, JSC::JSValue functionObject, JSC::CallType callType, const JSC::CallData&amp; callData, JSC::JSValue thisValue, const JSC::ArgList&amp; args, NakedPtr&lt;JSC::Exception&gt;&amp;);
</ins><span class="cx">     ScriptFunctionCall(const ScriptObject&amp; thisObject, const String&amp; name, ScriptFunctionCallHandler handler = nullptr);
</span><span class="cx">     ScriptValue call(bool&amp; hadException);
</span><span class="cx">     ScriptValue call();
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredebuggerDebuggercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/debugger/Debugger.cpp (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/debugger/Debugger.cpp        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Source/JavaScriptCore/debugger/Debugger.cpp        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -25,7 +25,6 @@
</span><span class="cx"> #include &quot;CodeBlock.h&quot;
</span><span class="cx"> #include &quot;DebuggerCallFrame.h&quot;
</span><span class="cx"> #include &quot;Error.h&quot;
</span><del>-
</del><span class="cx"> #include &quot;HeapIterationScope.h&quot;
</span><span class="cx"> #include &quot;Interpreter.h&quot;
</span><span class="cx"> #include &quot;JSCJSValueInlines.h&quot;
</span><span class="lines">@@ -487,7 +486,7 @@
</span><span class="cx">     // so make it looks like the debugger is already paused.
</span><span class="cx">     TemporaryPausedState pausedState(*this);
</span><span class="cx"> 
</span><del>-    Exception* exception;
</del><ins>+    NakedPtr&lt;Exception&gt; exception;
</ins><span class="cx">     DebuggerCallFrame* debuggerCallFrame = currentDebuggerCallFrame();
</span><span class="cx">     JSValue result = debuggerCallFrame-&gt;evaluate(breakpoint-&gt;condition, exception);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredebuggerDebuggerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/debugger/Debugger.h (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/debugger/Debugger.h        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Source/JavaScriptCore/debugger/Debugger.h        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -34,6 +34,7 @@
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><span class="cx"> class CodeBlock;
</span><ins>+class Exception;
</ins><span class="cx"> class ExecState;
</span><span class="cx"> class JSGlobalObject;
</span><span class="cx"> class SourceProvider;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredebuggerDebuggerCallFramecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/debugger/DebuggerCallFrame.cpp (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/debugger/DebuggerCallFrame.cpp        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Source/JavaScriptCore/debugger/DebuggerCallFrame.cpp        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -32,7 +32,6 @@
</span><span class="cx"> #include &quot;CodeBlock.h&quot;
</span><span class="cx"> #include &quot;DebuggerEvalEnabler.h&quot;
</span><span class="cx"> #include &quot;DebuggerScope.h&quot;
</span><del>-#include &quot;Exception.h&quot;
</del><span class="cx"> #include &quot;Interpreter.h&quot;
</span><span class="cx"> #include &quot;JSFunction.h&quot;
</span><span class="cx"> #include &quot;JSLexicalEnvironment.h&quot;
</span><span class="lines">@@ -177,10 +176,9 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // Evaluate some JavaScript code in the scope of this frame.
</span><del>-JSValue DebuggerCallFrame::evaluate(const String&amp; script, Exception*&amp; exception)
</del><ins>+JSValue DebuggerCallFrame::evaluate(const String&amp; script, NakedPtr&lt;Exception&gt;&amp; exception)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(isValid());
</span><del>-    exception = nullptr;
</del><span class="cx">     CallFrame* callFrame = m_callFrame;
</span><span class="cx">     if (!callFrame)
</span><span class="cx">         return jsNull();
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredebuggerDebuggerCallFrameh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/debugger/DebuggerCallFrame.h (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/debugger/DebuggerCallFrame.h        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Source/JavaScriptCore/debugger/DebuggerCallFrame.h        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;DebuggerPrimitives.h&quot;
</span><span class="cx"> #include &quot;Strong.h&quot;
</span><ins>+#include &lt;wtf/NakedPtr.h&gt;
</ins><span class="cx"> #include &lt;wtf/PassRefPtr.h&gt;
</span><span class="cx"> #include &lt;wtf/RefCounted.h&gt;
</span><span class="cx"> #include &lt;wtf/text/TextPosition.h&gt;
</span><span class="lines">@@ -67,7 +68,7 @@
</span><span class="cx">     JS_EXPORT_PRIVATE String functionName() const;
</span><span class="cx">     JS_EXPORT_PRIVATE Type type() const;
</span><span class="cx">     JS_EXPORT_PRIVATE JSValue thisValue() const;
</span><del>-    JSValue evaluate(const String&amp;, Exception*&amp;);
</del><ins>+    JSValue evaluate(const String&amp;, NakedPtr&lt;Exception&gt;&amp;);
</ins><span class="cx"> 
</span><span class="cx">     bool isValid() const { return !!m_callFrame; }
</span><span class="cx">     JS_EXPORT_PRIVATE void invalidate();
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorInjectedScriptManagercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/InjectedScriptManager.cpp (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/InjectedScriptManager.cpp        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Source/JavaScriptCore/inspector/InjectedScriptManager.cpp        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -139,7 +139,7 @@
</span><span class="cx">     JSGlobalObject* globalObject = scriptState-&gt;lexicalGlobalObject();
</span><span class="cx">     JSValue globalThisValue = scriptState-&gt;globalThisValue();
</span><span class="cx"> 
</span><del>-    Exception* evaluationException;
</del><ins>+    NakedPtr&lt;Exception&gt; evaluationException;
</ins><span class="cx">     InspectorEvaluateHandler evaluateHandler = m_environment.evaluateHandler();
</span><span class="cx">     JSValue functionValue = evaluateHandler(scriptState, sourceCode, globalThisValue, evaluationException);
</span><span class="cx">     if (evaluationException)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorInspectorEnvironmenth"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/InspectorEnvironment.h (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/InspectorEnvironment.h        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Source/JavaScriptCore/inspector/InspectorEnvironment.h        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -39,8 +39,8 @@
</span><span class="cx"> 
</span><span class="cx"> namespace Inspector {
</span><span class="cx"> 
</span><del>-typedef JSC::JSValue (*InspectorFunctionCallHandler)(JSC::ExecState* exec, JSC::JSValue functionObject, JSC::CallType callType, const JSC::CallData&amp; callData, JSC::JSValue thisValue, const JSC::ArgList&amp; args, JSC::Exception*&amp; returnedException);
-typedef JSC::JSValue (*InspectorEvaluateHandler)(JSC::ExecState*, const JSC::SourceCode&amp;, JSC::JSValue thisValue, JSC::Exception*&amp; returnedException);
</del><ins>+typedef JSC::JSValue (*InspectorFunctionCallHandler)(JSC::ExecState* exec, JSC::JSValue functionObject, JSC::CallType callType, const JSC::CallData&amp; callData, JSC::JSValue thisValue, const JSC::ArgList&amp; args, NakedPtr&lt;JSC::Exception&gt;&amp; returnedException);
+typedef JSC::JSValue (*InspectorEvaluateHandler)(JSC::ExecState*, const JSC::SourceCode&amp;, JSC::JSValue thisValue, NakedPtr&lt;JSC::Exception&gt;&amp; returnedException);
</ins><span class="cx"> 
</span><span class="cx"> class InspectorEnvironment {
</span><span class="cx"> public:
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorJSJavaScriptCallFramecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/JSJavaScriptCallFrame.cpp (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/JSJavaScriptCallFrame.cpp        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Source/JavaScriptCore/inspector/JSJavaScriptCallFrame.cpp        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -28,7 +28,6 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;DebuggerScope.h&quot;
</span><span class="cx"> #include &quot;Error.h&quot;
</span><del>-#include &quot;Exception.h&quot;
</del><span class="cx"> #include &quot;JSCJSValue.h&quot;
</span><span class="cx"> #include &quot;JSCellInlines.h&quot;
</span><span class="cx"> #include &quot;JSJavaScriptCallFramePrototype.h&quot;
</span><span class="lines">@@ -76,7 +75,7 @@
</span><span class="cx"> 
</span><span class="cx"> JSValue JSJavaScriptCallFrame::evaluate(ExecState* exec)
</span><span class="cx"> {
</span><del>-    Exception* exception;
</del><ins>+    NakedPtr&lt;Exception&gt; exception;
</ins><span class="cx">     JSValue result = impl().evaluate(exec-&gt;argument(0).toString(exec)-&gt;value(exec), exception);
</span><span class="cx">     if (exception)
</span><span class="cx">         exec-&gt;vm().throwException(exec, exception);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorJavaScriptCallFrameh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/JavaScriptCallFrame.h (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/JavaScriptCallFrame.h        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Source/JavaScriptCore/inspector/JavaScriptCallFrame.h        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -55,7 +55,7 @@
</span><span class="cx">     JSC::JSGlobalObject* vmEntryGlobalObject() const { return m_debuggerCallFrame-&gt;vmEntryGlobalObject(); }
</span><span class="cx"> 
</span><span class="cx">     JSC::JSValue thisValue() const { return m_debuggerCallFrame-&gt;thisValue(); }
</span><del>-    JSC::JSValue evaluate(const String&amp; script, JSC::Exception*&amp; exception) const  { return m_debuggerCallFrame-&gt;evaluate(script, exception); }
</del><ins>+    JSC::JSValue evaluate(const String&amp; script, NakedPtr&lt;JSC::Exception&gt;&amp; exception) const  { return m_debuggerCallFrame-&gt;evaluate(script, exception); }
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     JavaScriptCallFrame(PassRefPtr&lt;JSC::DebuggerCallFrame&gt;);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorScriptDebugServercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/ScriptDebugServer.cpp (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/ScriptDebugServer.cpp        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Source/JavaScriptCore/inspector/ScriptDebugServer.cpp        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -94,7 +94,7 @@
</span><span class="cx">         break;
</span><span class="cx">     }
</span><span class="cx">     case ScriptBreakpointActionTypeEvaluate: {
</span><del>-        Exception* exception;
</del><ins>+        NakedPtr&lt;Exception&gt; exception;
</ins><span class="cx">         debuggerCallFrame-&gt;evaluate(breakpointAction.data, exception);
</span><span class="cx">         if (exception)
</span><span class="cx">             reportException(debuggerCallFrame-&gt;exec(), exception);
</span><span class="lines">@@ -104,7 +104,7 @@
</span><span class="cx">         dispatchBreakpointActionSound(debuggerCallFrame-&gt;exec(), breakpointAction.identifier);
</span><span class="cx">         break;
</span><span class="cx">     case ScriptBreakpointActionTypeProbe: {
</span><del>-        Exception* exception;
</del><ins>+        NakedPtr&lt;Exception&gt; exception;
</ins><span class="cx">         JSValue result = debuggerCallFrame-&gt;evaluate(breakpointAction.data, exception);
</span><span class="cx">         if (exception)
</span><span class="cx">             reportException(debuggerCallFrame-&gt;exec(), exception);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejsccpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jsc.cpp (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jsc.cpp        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Source/JavaScriptCore/jsc.cpp        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -908,7 +908,7 @@
</span><span class="cx">     globalObject-&gt;putDirect(
</span><span class="cx">         exec-&gt;vm(), Identifier::fromString(globalObject-&gt;globalExec(), &quot;arguments&quot;), array);
</span><span class="cx"> 
</span><del>-    Exception* exception;
</del><ins>+    NakedPtr&lt;Exception&gt; exception;
</ins><span class="cx">     StopWatch stopWatch;
</span><span class="cx">     stopWatch.start();
</span><span class="cx">     evaluate(globalObject-&gt;globalExec(), jscSource(script.data(), fileName), JSValue(), exception);
</span><span class="lines">@@ -931,7 +931,7 @@
</span><span class="cx"> 
</span><span class="cx">     JSGlobalObject* globalObject = exec-&gt;lexicalGlobalObject();
</span><span class="cx">     
</span><del>-    Exception* evaluationException;
</del><ins>+    NakedPtr&lt;Exception&gt; evaluationException;
</ins><span class="cx">     JSValue result = evaluate(globalObject-&gt;globalExec(), jscSource(script.data(), fileName), JSValue(), evaluationException);
</span><span class="cx">     if (evaluationException)
</span><span class="cx">         exec-&gt;vm().throwException(exec, evaluationException);
</span><span class="lines">@@ -1294,7 +1294,7 @@
</span><span class="cx"> 
</span><span class="cx">         vm.startSampling();
</span><span class="cx"> 
</span><del>-        Exception* evaluationException;
</del><ins>+        NakedPtr&lt;Exception&gt; evaluationException;
</ins><span class="cx">         JSValue returnValue = evaluate(globalObject-&gt;globalExec(), jscSource(script, fileName), JSValue(), evaluationException);
</span><span class="cx">         success = success &amp;&amp; !evaluationException;
</span><span class="cx">         if (dump &amp;&amp; !evaluationException)
</span><span class="lines">@@ -1358,7 +1358,7 @@
</span><span class="cx">         }
</span><span class="cx">         
</span><span class="cx">         
</span><del>-        Exception* evaluationException;
</del><ins>+        NakedPtr&lt;Exception&gt; evaluationException;
</ins><span class="cx">         JSValue returnValue = evaluate(globalObject-&gt;globalExec(), makeSource(source, interpreterName), JSValue(), evaluationException);
</span><span class="cx"> #else
</span><span class="cx">         printf(&quot;%s&quot;, interactivePrompt);
</span><span class="lines">@@ -1374,7 +1374,7 @@
</span><span class="cx">             break;
</span><span class="cx">         line.append('\0');
</span><span class="cx"> 
</span><del>-        Exception* evaluationException;
</del><ins>+        NakedPtr&lt;Exception&gt; evaluationException;
</ins><span class="cx">         JSValue returnValue = evaluate(globalObject-&gt;globalExec(), jscSource(line.data(), interpreterName), JSValue(), evaluationException);
</span><span class="cx"> #endif
</span><span class="cx">         if (evaluationException)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeCallDatacpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/CallData.cpp (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/CallData.cpp        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Source/JavaScriptCore/runtime/CallData.cpp        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -26,7 +26,6 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;CallData.h&quot;
</span><span class="cx"> 
</span><del>-#include &quot;Exception.h&quot;
</del><span class="cx"> #include &quot;Executable.h&quot;
</span><span class="cx"> #include &quot;Interpreter.h&quot;
</span><span class="cx"> #include &quot;JSFunction.h&quot;
</span><span class="lines">@@ -40,15 +39,14 @@
</span><span class="cx">     return exec-&gt;interpreter()-&gt;executeCall(exec, asObject(functionObject), callType, callData, thisValue, args);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-JSValue call(ExecState* exec, JSValue functionObject, CallType callType, const CallData&amp; callData, JSValue thisValue, const ArgList&amp; args, Exception*&amp; returnedException)
</del><ins>+JSValue call(ExecState* exec, JSValue functionObject, CallType callType, const CallData&amp; callData, JSValue thisValue, const ArgList&amp; args, NakedPtr&lt;Exception&gt;&amp; returnedException)
</ins><span class="cx"> {
</span><span class="cx">     JSValue result = call(exec, functionObject, callType, callData, thisValue, args);
</span><span class="cx">     if (exec-&gt;hadException()) {
</span><span class="cx">         returnedException = exec-&gt;exception();
</span><span class="cx">         exec-&gt;clearException();
</span><span class="cx">         return jsUndefined();
</span><del>-    } else
-        returnedException = nullptr;
</del><ins>+    }
</ins><span class="cx">     RELEASE_ASSERT(result);
</span><span class="cx">     return result;
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeCallDatah"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/CallData.h (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/CallData.h        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Source/JavaScriptCore/runtime/CallData.h        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> #define CallData_h
</span><span class="cx"> 
</span><span class="cx"> #include &quot;JSCJSValue.h&quot;
</span><ins>+#include &lt;wtf/NakedPtr.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><span class="lines">@@ -59,7 +60,7 @@
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> JS_EXPORT_PRIVATE JSValue call(ExecState*, JSValue functionObject, CallType, const CallData&amp;, JSValue thisValue, const ArgList&amp;);
</span><del>-JS_EXPORT_PRIVATE JSValue call(ExecState*, JSValue functionObject, CallType, const CallData&amp;, JSValue thisValue, const ArgList&amp;, Exception*&amp; returnedException);
</del><ins>+JS_EXPORT_PRIVATE JSValue call(ExecState*, JSValue functionObject, CallType, const CallData&amp;, JSValue thisValue, const ArgList&amp;, NakedPtr&lt;Exception&gt;&amp; returnedException);
</ins><span class="cx"> 
</span><span class="cx"> } // namespace JSC
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeCompletioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Completion.cpp (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Completion.cpp        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Source/JavaScriptCore/runtime/Completion.cpp        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -61,12 +61,11 @@
</span><span class="cx">         JSParserStrictMode::NotStrict, JSParserCodeType::Program, error);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-JSValue evaluate(ExecState* exec, const SourceCode&amp; source, JSValue thisValue, Exception*&amp; returnedException)
</del><ins>+JSValue evaluate(ExecState* exec, const SourceCode&amp; source, JSValue thisValue, NakedPtr&lt;Exception&gt;&amp; returnedException)
</ins><span class="cx"> {
</span><span class="cx">     JSLockHolder lock(exec);
</span><span class="cx">     RELEASE_ASSERT(exec-&gt;vm().atomicStringTable() == wtfThreadData().atomicStringTable());
</span><span class="cx">     RELEASE_ASSERT(!exec-&gt;vm().isCollectorBusy());
</span><del>-    returnedException = nullptr;
</del><span class="cx"> 
</span><span class="cx">     CodeProfiling profile(source);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeCompletionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Completion.h (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Completion.h        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Source/JavaScriptCore/runtime/Completion.h        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -24,6 +24,7 @@
</span><span class="cx"> #define Completion_h
</span><span class="cx"> 
</span><span class="cx"> #include &quot;JSCJSValue.h&quot;
</span><ins>+#include &lt;wtf/NakedPtr.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><span class="lines">@@ -36,10 +37,10 @@
</span><span class="cx"> 
</span><span class="cx"> JS_EXPORT_PRIVATE bool checkSyntax(VM&amp;, const SourceCode&amp;, ParserError&amp;);
</span><span class="cx"> JS_EXPORT_PRIVATE bool checkSyntax(ExecState*, const SourceCode&amp;, JSValue* exception = 0);
</span><del>-JS_EXPORT_PRIVATE JSValue evaluate(ExecState*, const SourceCode&amp;, JSValue thisValue, Exception*&amp; returnedException);
</del><ins>+JS_EXPORT_PRIVATE JSValue evaluate(ExecState*, const SourceCode&amp;, JSValue thisValue, NakedPtr&lt;Exception&gt;&amp; returnedException);
</ins><span class="cx"> inline JSValue evaluate(ExecState* exec, const SourceCode&amp; sourceCode, JSValue thisValue = JSValue())
</span><span class="cx"> {
</span><del>-    Exception* unused;
</del><ins>+    NakedPtr&lt;Exception&gt; unused;
</ins><span class="cx">     return evaluate(exec, sourceCode, thisValue, unused);
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWTFChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/ChangeLog (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/ChangeLog        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Source/WTF/ChangeLog        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -1,3 +1,26 @@
</span><ins>+2015-06-16  Mark Lam  &lt;mark.lam@apple.com&gt;
+
+        Use NakedPtr&lt;Exception&gt;&amp; to return exception results.
+        https://bugs.webkit.org/show_bug.cgi?id=145870
+
+        Reviewed by Anders Carlsson and Filip Pizlo.
+
+        Introducing the NakedPtr class.
+
+        * WTF.xcodeproj/project.pbxproj:
+        * wtf/NakedPtr.h: Added.
+        (WTF::NakedPtr::NakedPtr):
+        (WTF::NakedPtr::get):
+        (WTF::NakedPtr::clear):
+        (WTF::NakedPtr::operator*):
+        (WTF::NakedPtr::operator-&gt;):
+        (WTF::NakedPtr::operator T*):
+        (WTF::NakedPtr::operator!):
+        (WTF::NakedPtr::operator bool):
+        (WTF::=):
+        (WTF::NakedPtr&lt;T&gt;::swap):
+        (WTF::swap):
+
</ins><span class="cx"> 2015-06-12  Zan Dobersek  &lt;zdobersek@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [GLib] Move files under Source/WTF/wtf/gobject to Source/WTF/wtf/glib
</span></span></pre></div>
<a id="trunkSourceWTFWTFxcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/WTF.xcodeproj/project.pbxproj (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/WTF.xcodeproj/project.pbxproj        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Source/WTF/WTF.xcodeproj/project.pbxproj        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -277,6 +277,7 @@
</span><span class="cx">                 E4A0AD3A1A96245500536DF6 /* WorkQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = E4A0AD381A96245500536DF6 /* WorkQueue.h */; };
</span><span class="cx">                 E4A0AD3D1A96253C00536DF6 /* WorkQueueCocoa.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4A0AD3C1A96253C00536DF6 /* WorkQueueCocoa.cpp */; };
</span><span class="cx">                 EB95E1F0161A72410089A2F5 /* ByteOrder.h in Headers */ = {isa = PBXBuildFile; fileRef = EB95E1EF161A72410089A2F5 /* ByteOrder.h */; };
</span><ins>+                FE8225311B2A1E5B00BA68FD /* NakedPtr.h in Headers */ = {isa = PBXBuildFile; fileRef = FE8225301B2A1E5B00BA68FD /* NakedPtr.h */; };
</ins><span class="cx">                 FE91E8811AB2A0200099895F /* SpinLock.h in Headers */ = {isa = PBXBuildFile; fileRef = FE91E8801AB2A0200099895F /* SpinLock.h */; };
</span><span class="cx">                 FEDACD3D1630F83F00C69634 /* StackStats.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FEDACD3B1630F83F00C69634 /* StackStats.cpp */; };
</span><span class="cx">                 FEDACD3E1630F83F00C69634 /* StackStats.h in Headers */ = {isa = PBXBuildFile; fileRef = FEDACD3C1630F83F00C69634 /* StackStats.h */; };
</span><span class="lines">@@ -568,6 +569,7 @@
</span><span class="cx">                 E4A0AD381A96245500536DF6 /* WorkQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WorkQueue.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 E4A0AD3C1A96253C00536DF6 /* WorkQueueCocoa.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WorkQueueCocoa.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 EB95E1EF161A72410089A2F5 /* ByteOrder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ByteOrder.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                FE8225301B2A1E5B00BA68FD /* NakedPtr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NakedPtr.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 FE91E8801AB2A0200099895F /* SpinLock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpinLock.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 FEDACD3B1630F83F00C69634 /* StackStats.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StackStats.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 FEDACD3C1630F83F00C69634 /* StackStats.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StackStats.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -782,6 +784,7 @@
</span><span class="cx">                                 A8A472CD151A825B004123FF /* MetaAllocator.cpp */,
</span><span class="cx">                                 A8A472CE151A825B004123FF /* MetaAllocator.h */,
</span><span class="cx">                                 A8A472CF151A825B004123FF /* MetaAllocatorHandle.h */,
</span><ins>+                                FE8225301B2A1E5B00BA68FD /* NakedPtr.h */,
</ins><span class="cx">                                 1A3F6BE6174ADA2100B2EEA7 /* NeverDestroyed.h */,
</span><span class="cx">                                 0F0D85B317234CB100338210 /* NoLock.h */,
</span><span class="cx">                                 A8A472D0151A825B004123FF /* Noncopyable.h */,
</span><span class="lines">@@ -1178,6 +1181,7 @@
</span><span class="cx">                                 FE91E8811AB2A0200099895F /* SpinLock.h in Headers */,
</span><span class="cx">                                 A8A4742C151A825B004123FF /* StringExtras.h in Headers */,
</span><span class="cx">                                 A8A4743F151A825B004123FF /* StringHash.h in Headers */,
</span><ins>+                                FE8225311B2A1E5B00BA68FD /* NakedPtr.h in Headers */,
</ins><span class="cx">                                 A748745417A0BDAE00FA04CB /* StringHashDumpContext.h in Headers */,
</span><span class="cx">                                 A8A4742D151A825B004123FF /* StringHasher.h in Headers */,
</span><span class="cx">                                 A8A47441151A825B004123FF /* StringImpl.h in Headers */,
</span></span></pre></div>
<a id="trunkSourceWTFwtfNakedPtrh"></a>
<div class="addfile"><h4>Added: trunk/Source/WTF/wtf/NakedPtr.h (0 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/NakedPtr.h                                (rev 0)
+++ trunk/Source/WTF/wtf/NakedPtr.h        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -0,0 +1,119 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef WTF_NakedPtr_h
+#define WTF_NakedPtr_h
+
+#include &lt;wtf/FastMalloc.h&gt;
+
+namespace WTF {
+
+// The purpose of this class is to ensure that the wrapped pointer will never be
+// used uninitialized.
+
+template &lt;typename T&gt; class NakedPtr {
+    WTF_MAKE_FAST_ALLOCATED;
+public:
+    ALWAYS_INLINE NakedPtr() : m_ptr(nullptr) { }
+    ALWAYS_INLINE NakedPtr(T* ptr) : m_ptr(ptr) { }
+    ALWAYS_INLINE NakedPtr(const NakedPtr&amp; o) : m_ptr(o.m_ptr) { }
+    template&lt;typename U&gt; NakedPtr(const NakedPtr&lt;U&gt;&amp; o) : m_ptr(o.get()) { }
+
+    ALWAYS_INLINE NakedPtr(NakedPtr&amp;&amp; o) : m_ptr(o.get()) { }
+    template&lt;typename U&gt; NakedPtr(NakedPtr&lt;U&gt;&amp;&amp; o) : m_ptr(o.get()) { }
+
+    T* get() const { return m_ptr; }
+
+    void clear() { m_ptr = nullptr; }
+
+    T&amp; operator*() const { ASSERT(m_ptr); return *m_ptr; }
+    ALWAYS_INLINE T* operator-&gt;() const { return m_ptr; }
+
+    operator T*() { return m_ptr; }
+
+    bool operator!() const { return !m_ptr; }
+    
+    explicit operator bool() const { return !!m_ptr; }
+
+    NakedPtr&amp; operator=(const NakedPtr&amp;);
+    NakedPtr&amp; operator=(T*);
+    template&lt;typename U&gt; NakedPtr&amp; operator=(const NakedPtr&lt;U&gt;&amp;);
+    NakedPtr&amp; operator=(NakedPtr&amp;&amp;);
+    template&lt;typename U&gt; NakedPtr&amp; operator=(NakedPtr&lt;U&gt;&amp;&amp;);
+
+    void swap(NakedPtr&amp;);
+
+private:
+    T* m_ptr;
+};
+
+template&lt;typename T&gt; inline NakedPtr&lt;T&gt;&amp; NakedPtr&lt;T&gt;::operator=(const NakedPtr&amp; o)
+{
+    m_ptr = o.m_ptr;
+    return *this;
+}
+
+template&lt;typename T&gt; inline NakedPtr&lt;T&gt;&amp; NakedPtr&lt;T&gt;::operator=(T* optr)
+{
+    m_ptr = optr;
+    return *this;
+}
+
+template&lt;typename T&gt; template&lt;typename U&gt; inline NakedPtr&lt;T&gt;&amp; NakedPtr&lt;T&gt;::operator=(const NakedPtr&lt;U&gt;&amp; o)
+{
+    NakedPtr ptr = o;
+    swap(ptr);
+    return *this;
+}
+
+template&lt;typename T&gt; inline NakedPtr&lt;T&gt;&amp; NakedPtr&lt;T&gt;::operator=(NakedPtr&amp;&amp; o)
+{
+    NakedPtr ptr = WTF::move(o);
+    swap(ptr);
+    return *this;
+}
+
+template&lt;typename T&gt; template&lt;typename U&gt; inline NakedPtr&lt;T&gt;&amp; NakedPtr&lt;T&gt;::operator=(NakedPtr&lt;U&gt;&amp;&amp; o)
+{
+    NakedPtr ptr = WTF::move(o);
+    swap(ptr);
+    return *this;
+}
+
+template&lt;class T&gt; inline void NakedPtr&lt;T&gt;::swap(NakedPtr&amp; o)
+{
+    std::swap(m_ptr, o.m_ptr);
+}
+
+template&lt;class T&gt; inline void swap(NakedPtr&lt;T&gt;&amp; a, NakedPtr&lt;T&gt;&amp; b)
+{
+    a.swap(b);
+}
+
+} // namespace WTF
+
+using WTF::NakedPtr;
+
+#endif // WTF_NakedPtr_h
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Source/WebCore/ChangeLog        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -1,3 +1,45 @@
</span><ins>+2015-06-16  Mark Lam  &lt;mark.lam@apple.com&gt;
+
+        Use NakedPtr&lt;Exception&gt;&amp; to return exception results.
+        https://bugs.webkit.org/show_bug.cgi?id=145870
+
+        Reviewed by Anders Carlsson and Filip Pizlo.
+
+        No new WebCore tests because this functionality is already covered by existing tests.
+        API tests added for WTF::NakedPtr.
+
+        * bindings/js/JSCallbackData.cpp:
+        (WebCore::JSCallbackData::invokeCallback):
+        * bindings/js/JSCustomXPathNSResolver.cpp:
+        (WebCore::JSCustomXPathNSResolver::lookupNamespaceURI):
+        * bindings/js/JSErrorHandler.cpp:
+        (WebCore::JSErrorHandler::handleEvent):
+        * bindings/js/JSEventListener.cpp:
+        (WebCore::JSEventListener::handleEvent):
+        * bindings/js/JSMainThreadExecState.cpp:
+        (WebCore::JSMainThreadExecState::didLeaveScriptContext):
+        (WebCore::functionCallHandlerFromAnyThread):
+        (WebCore::evaluateHandlerFromAnyThread):
+        * bindings/js/JSMainThreadExecState.h:
+        (WebCore::JSMainThreadExecState::currentState):
+        (WebCore::JSMainThreadExecState::call):
+        (WebCore::JSMainThreadExecState::evaluate):
+        * bindings/js/JSMutationCallback.cpp:
+        (WebCore::JSMutationCallback::call):
+        * bindings/js/ScheduledAction.cpp:
+        (WebCore::ScheduledAction::executeFunctionInContext):
+        * bindings/js/ScriptController.cpp:
+        (WebCore::ScriptController::evaluateInWorld):
+        * bindings/js/WorkerScriptController.cpp:
+        (WebCore::WorkerScriptController::evaluate):
+        (WebCore::WorkerScriptController::setException):
+        * bindings/js/WorkerScriptController.h:
+        (WebCore::WorkerScriptController::workerGlobalScopeWrapper):
+        * bindings/objc/WebScriptObject.mm:
+        (-[WebScriptObject callWebScriptMethod:withArguments:]):
+        * workers/WorkerGlobalScope.cpp:
+        (WebCore::WorkerGlobalScope::importScripts):
+
</ins><span class="cx"> 2015-06-16  Brent Fulgham  &lt;bfulgham@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         CSS Scroll Snap - support snapping to nested elements
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSCallbackDatacpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSCallbackData.cpp (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSCallbackData.cpp        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Source/WebCore/bindings/js/JSCallbackData.cpp        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -73,7 +73,7 @@
</span><span class="cx"> 
</span><span class="cx">     InspectorInstrumentationCookie cookie = JSMainThreadExecState::instrumentFunctionCall(context, callType, callData);
</span><span class="cx"> 
</span><del>-    Exception* exception;
</del><ins>+    NakedPtr&lt;Exception&gt; exception;
</ins><span class="cx">     JSValue result = context-&gt;isDocument()
</span><span class="cx">         ? JSMainThreadExecState::call(exec, function, callType, callData, thisValue, args, exception)
</span><span class="cx">         : JSC::call(exec, function, callType, callData, thisValue, args, exception);
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSCustomXPathNSResolvercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSCustomXPathNSResolver.cpp (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSCustomXPathNSResolver.cpp        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Source/WebCore/bindings/js/JSCustomXPathNSResolver.cpp        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -93,7 +93,7 @@
</span><span class="cx">     MarkedArgumentBuffer args;
</span><span class="cx">     args.append(jsStringWithCache(exec, prefix));
</span><span class="cx"> 
</span><del>-    Exception* exception;
</del><ins>+    NakedPtr&lt;Exception&gt; exception;
</ins><span class="cx">     JSValue retval = JSMainThreadExecState::call(exec, function, callType, callData, m_customResolver.get(), args, exception);
</span><span class="cx"> 
</span><span class="cx">     String result;
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSErrorHandlercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSErrorHandler.cpp (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSErrorHandler.cpp        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Source/WebCore/bindings/js/JSErrorHandler.cpp        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -98,7 +98,7 @@
</span><span class="cx">         VM&amp; vm = globalObject-&gt;vm();
</span><span class="cx">         VMEntryScope entryScope(vm, vm.entryScope ? vm.entryScope-&gt;globalObject() : globalObject);
</span><span class="cx"> 
</span><del>-        Exception* exception;
</del><ins>+        NakedPtr&lt;Exception&gt; exception;
</ins><span class="cx">         JSValue returnValue = scriptExecutionContext-&gt;isDocument()
</span><span class="cx">             ? JSMainThreadExecState::call(exec, jsFunction, callType, callData, globalObject, args, exception)
</span><span class="cx">             : JSC::call(exec, jsFunction, callType, callData, globalObject, args, exception);
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSEventListenercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSEventListener.cpp (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSEventListener.cpp        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Source/WebCore/bindings/js/JSEventListener.cpp        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -124,7 +124,7 @@
</span><span class="cx">         InspectorInstrumentationCookie cookie = JSMainThreadExecState::instrumentFunctionCall(scriptExecutionContext, callType, callData);
</span><span class="cx"> 
</span><span class="cx">         JSValue thisValue = handleEventFunction == jsFunction ? toJS(exec, globalObject, event-&gt;currentTarget()) : jsFunction;
</span><del>-        Exception* exception;
</del><ins>+        NakedPtr&lt;Exception&gt; exception;
</ins><span class="cx">         JSValue retval = scriptExecutionContext-&gt;isDocument()
</span><span class="cx">             ? JSMainThreadExecState::call(exec, handleEventFunction, callType, callData, thisValue, args, exception)
</span><span class="cx">             : JSC::call(exec, handleEventFunction, callType, callData, thisValue, args, exception);
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSMainThreadExecStatecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSMainThreadExecState.cpp (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSMainThreadExecState.cpp        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Source/WebCore/bindings/js/JSMainThreadExecState.cpp        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -46,14 +46,14 @@
</span><span class="cx">     MutationObserver::deliverAllMutations();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-JSC::JSValue functionCallHandlerFromAnyThread(JSC::ExecState* exec, JSC::JSValue functionObject, JSC::CallType callType, const JSC::CallData&amp; callData, JSC::JSValue thisValue, const JSC::ArgList&amp; args, JSC::Exception*&amp; returnedException)
</del><ins>+JSC::JSValue functionCallHandlerFromAnyThread(JSC::ExecState* exec, JSC::JSValue functionObject, JSC::CallType callType, const JSC::CallData&amp; callData, JSC::JSValue thisValue, const JSC::ArgList&amp; args, NakedPtr&lt;JSC::Exception&gt;&amp; returnedException)
</ins><span class="cx"> {
</span><span class="cx">     if (isMainThread())
</span><span class="cx">         return JSMainThreadExecState::call(exec, functionObject, callType, callData, thisValue, args, returnedException);
</span><span class="cx">     return JSC::call(exec, functionObject, callType, callData, thisValue, args, returnedException);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-JSC::JSValue evaluateHandlerFromAnyThread(JSC::ExecState* exec, const JSC::SourceCode&amp; source, JSC::JSValue thisValue, JSC::Exception*&amp; returnedException)
</del><ins>+JSC::JSValue evaluateHandlerFromAnyThread(JSC::ExecState* exec, const JSC::SourceCode&amp; source, JSC::JSValue thisValue, NakedPtr&lt;JSC::Exception&gt;&amp; returnedException)
</ins><span class="cx"> {
</span><span class="cx">     if (isMainThread())
</span><span class="cx">         return JSMainThreadExecState::evaluate(exec, source, thisValue, returnedException);
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSMainThreadExecStateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSMainThreadExecState.h (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSMainThreadExecState.h        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Source/WebCore/bindings/js/JSMainThreadExecState.h        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -50,13 +50,13 @@
</span><span class="cx">         return s_mainThreadState;
</span><span class="cx">     };
</span><span class="cx">     
</span><del>-    static JSC::JSValue call(JSC::ExecState* exec, JSC::JSValue functionObject, JSC::CallType callType, const JSC::CallData&amp; callData, JSC::JSValue thisValue, const JSC::ArgList&amp; args, JSC::Exception*&amp; returnedException)
</del><ins>+    static JSC::JSValue call(JSC::ExecState* exec, JSC::JSValue functionObject, JSC::CallType callType, const JSC::CallData&amp; callData, JSC::JSValue thisValue, const JSC::ArgList&amp; args, NakedPtr&lt;JSC::Exception&gt;&amp; returnedException)
</ins><span class="cx">     {
</span><span class="cx">         JSMainThreadExecState currentState(exec);
</span><span class="cx">         return JSC::call(exec, functionObject, callType, callData, thisValue, args, returnedException);
</span><span class="cx">     };
</span><span class="cx"> 
</span><del>-    static JSC::JSValue evaluate(JSC::ExecState* exec, const JSC::SourceCode&amp; source, JSC::JSValue thisValue, JSC::Exception*&amp; returnedException)
</del><ins>+    static JSC::JSValue evaluate(JSC::ExecState* exec, const JSC::SourceCode&amp; source, JSC::JSValue thisValue, NakedPtr&lt;JSC::Exception&gt;&amp; returnedException)
</ins><span class="cx">     {
</span><span class="cx">         JSMainThreadExecState currentState(exec);
</span><span class="cx">         return JSC::evaluate(exec, source, thisValue, returnedException);
</span><span class="lines">@@ -64,7 +64,7 @@
</span><span class="cx"> 
</span><span class="cx">     static JSC::JSValue evaluate(JSC::ExecState* exec, const JSC::SourceCode&amp; source, JSC::JSValue thisValue = JSC::JSValue())
</span><span class="cx">     {
</span><del>-        JSC::Exception* unused;
</del><ins>+        NakedPtr&lt;JSC::Exception&gt; unused;
</ins><span class="cx">         return evaluate(exec, source, thisValue, unused);
</span><span class="cx">     };
</span><span class="cx"> 
</span><span class="lines">@@ -127,8 +127,8 @@
</span><span class="cx">     JSC::ExecState* m_previousState;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-JSC::JSValue functionCallHandlerFromAnyThread(JSC::ExecState*, JSC::JSValue functionObject, JSC::CallType, const JSC::CallData&amp;, JSC::JSValue thisValue, const JSC::ArgList&amp; args, JSC::Exception*&amp; returnedException);
-JSC::JSValue evaluateHandlerFromAnyThread(JSC::ExecState*, const JSC::SourceCode&amp;, JSC::JSValue thisValue, JSC::Exception*&amp; returnedException);
</del><ins>+JSC::JSValue functionCallHandlerFromAnyThread(JSC::ExecState*, JSC::JSValue functionObject, JSC::CallType, const JSC::CallData&amp;, JSC::JSValue thisValue, const JSC::ArgList&amp; args, NakedPtr&lt;JSC::Exception&gt;&amp; returnedException);
+JSC::JSValue evaluateHandlerFromAnyThread(JSC::ExecState*, const JSC::SourceCode&amp;, JSC::JSValue thisValue, NakedPtr&lt;JSC::Exception&gt;&amp; returnedException);
</ins><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSMutationCallbackcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSMutationCallback.cpp (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSMutationCallback.cpp        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Source/WebCore/bindings/js/JSMutationCallback.cpp        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -87,7 +87,7 @@
</span><span class="cx"> 
</span><span class="cx">     InspectorInstrumentationCookie cookie = JSMainThreadExecState::instrumentFunctionCall(context, callType, callData);
</span><span class="cx"> 
</span><del>-    Exception* exception;
</del><ins>+    NakedPtr&lt;Exception&gt; exception;
</ins><span class="cx">     JSMainThreadExecState::call(exec, callback, callType, callData, jsObserver, args, exception);
</span><span class="cx"> 
</span><span class="cx">     InspectorInstrumentation::didCallFunction(cookie, context);
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsScheduledActioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/ScheduledAction.cpp (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/ScheduledAction.cpp        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Source/WebCore/bindings/js/ScheduledAction.cpp        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -99,7 +99,7 @@
</span><span class="cx"> 
</span><span class="cx">     InspectorInstrumentationCookie cookie = JSMainThreadExecState::instrumentFunctionCall(&amp;context, callType, callData);
</span><span class="cx"> 
</span><del>-    Exception* exception;
</del><ins>+    NakedPtr&lt;Exception&gt; exception;
</ins><span class="cx">     if (is&lt;Document&gt;(context))
</span><span class="cx">         JSMainThreadExecState::call(exec, m_function.get(), callType, callData, thisValue, args, exception);
</span><span class="cx">     else
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsScriptControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/ScriptController.cpp (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/ScriptController.cpp        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Source/WebCore/bindings/js/ScriptController.cpp        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -160,7 +160,7 @@
</span><span class="cx"> 
</span><span class="cx">     InspectorInstrumentationCookie cookie = InspectorInstrumentation::willEvaluateScript(m_frame, sourceURL, sourceCode.startLine());
</span><span class="cx"> 
</span><del>-    Exception* evaluationException;
</del><ins>+    NakedPtr&lt;Exception&gt; evaluationException;
</ins><span class="cx">     JSValue returnValue = JSMainThreadExecState::evaluate(exec, jsSourceCode, shell, evaluationException);
</span><span class="cx"> 
</span><span class="cx">     InspectorInstrumentation::didEvaluateScript(cookie, m_frame);
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsWorkerScriptControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/WorkerScriptController.cpp (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/WorkerScriptController.cpp        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Source/WebCore/bindings/js/WorkerScriptController.cpp        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -99,7 +99,7 @@
</span><span class="cx">     if (isExecutionForbidden())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    Exception* exception;
</del><ins>+    NakedPtr&lt;Exception&gt; exception;
</ins><span class="cx">     evaluate(sourceCode, exception);
</span><span class="cx">     if (exception) {
</span><span class="cx">         JSLockHolder lock(vm());
</span><span class="lines">@@ -107,9 +107,8 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WorkerScriptController::evaluate(const ScriptSourceCode&amp; sourceCode, JSC::Exception*&amp; returnedException)
</del><ins>+void WorkerScriptController::evaluate(const ScriptSourceCode&amp; sourceCode, NakedPtr&lt;JSC::Exception&gt;&amp; returnedException)
</ins><span class="cx"> {
</span><del>-    returnedException = nullptr;
</del><span class="cx">     if (isExecutionForbidden())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="lines">@@ -118,28 +117,26 @@
</span><span class="cx">     ExecState* exec = m_workerGlobalScopeWrapper-&gt;globalExec();
</span><span class="cx">     JSLockHolder lock(exec);
</span><span class="cx"> 
</span><del>-    JSC::Exception* evaluationException;
-    JSC::evaluate(exec, sourceCode.jsSourceCode(), m_workerGlobalScopeWrapper-&gt;globalThis(), evaluationException);
</del><ins>+    JSC::evaluate(exec, sourceCode.jsSourceCode(), m_workerGlobalScopeWrapper-&gt;globalThis(), returnedException);
</ins><span class="cx"> 
</span><span class="cx">     VM&amp; vm = exec-&gt;vm();
</span><del>-    if ((evaluationException &amp;&amp; isTerminatedExecutionException(evaluationException)) 
</del><ins>+    if ((returnedException &amp;&amp; isTerminatedExecutionException(returnedException))
</ins><span class="cx">         || (vm.watchdog &amp;&amp; vm.watchdog-&gt;didFire())) {
</span><span class="cx">         forbidExecution();
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (evaluationException) {
</del><ins>+    if (returnedException) {
</ins><span class="cx">         String errorMessage;
</span><span class="cx">         int lineNumber = 0;
</span><span class="cx">         int columnNumber = 0;
</span><span class="cx">         String sourceURL = sourceCode.url().string();
</span><span class="cx">         if (m_workerGlobalScope-&gt;sanitizeScriptError(errorMessage, lineNumber, columnNumber, sourceURL, sourceCode.cachedScript())) {
</span><span class="cx">             vm.throwException(exec, createError(exec, errorMessage.impl()));
</span><del>-            evaluationException = vm.exception();
</del><ins>+            returnedException = vm.exception();
</ins><span class="cx">             vm.clearException();
</span><span class="cx">         }
</span><span class="cx">     }
</span><del>-    returnedException = evaluationException;
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WorkerScriptController::setException(JSC::Exception* exception)
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsWorkerScriptControllerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/WorkerScriptController.h (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/WorkerScriptController.h        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Source/WebCore/bindings/js/WorkerScriptController.h        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> #include &lt;debugger/Debugger.h&gt;
</span><span class="cx"> #include &lt;heap/Strong.h&gt;
</span><span class="cx"> #include &lt;wtf/Forward.h&gt;
</span><ins>+#include &lt;wtf/NakedPtr.h&gt;
</ins><span class="cx"> #include &lt;wtf/Threading.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace Deprecated {
</span><span class="lines">@@ -60,7 +61,7 @@
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         void evaluate(const ScriptSourceCode&amp;);
</span><del>-        void evaluate(const ScriptSourceCode&amp;, JSC::Exception*&amp; returnedException);
</del><ins>+        void evaluate(const ScriptSourceCode&amp;, NakedPtr&lt;JSC::Exception&gt;&amp; returnedException);
</ins><span class="cx"> 
</span><span class="cx">         void setException(JSC::Exception*);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsobjcWebScriptObjectmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/objc/WebScriptObject.mm (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/objc/WebScriptObject.mm        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Source/WebCore/bindings/objc/WebScriptObject.mm        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -342,7 +342,7 @@
</span><span class="cx">     if (![self _isSafeScript])
</span><span class="cx">         return nil;
</span><span class="cx"> 
</span><del>-    JSC::Exception* exception;
</del><ins>+    NakedPtr&lt;JSC::Exception&gt; exception;
</ins><span class="cx">     JSC::JSValue result = JSMainThreadExecState::call(exec, function, callType, callData, [self _imp], argList, exception);
</span><span class="cx"> 
</span><span class="cx">     if (exception) {
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkerGlobalScopecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/WorkerGlobalScope.cpp (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/workers/WorkerGlobalScope.cpp        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Source/WebCore/workers/WorkerGlobalScope.cpp        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -197,7 +197,7 @@
</span><span class="cx"> 
</span><span class="cx">         InspectorInstrumentation::scriptImported(scriptExecutionContext(), scriptLoader-&gt;identifier(), scriptLoader-&gt;script());
</span><span class="cx"> 
</span><del>-        JSC::Exception* exception;
</del><ins>+        NakedPtr&lt;JSC::Exception&gt; exception;
</ins><span class="cx">         m_script-&gt;evaluate(ScriptSourceCode(scriptLoader-&gt;script(), scriptLoader-&gt;responseURL()), exception);
</span><span class="cx">         if (exception) {
</span><span class="cx">             m_script-&gt;setException(exception);
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Tools/ChangeLog        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -1,3 +1,18 @@
</span><ins>+2015-06-16  Mark Lam  &lt;mark.lam@apple.com&gt;
+
+        Use NakedPtr&lt;Exception&gt;&amp; to return exception results.
+        https://bugs.webkit.org/show_bug.cgi?id=145870
+
+        Reviewed by Anders Carlsson and Filip Pizlo.
+
+        * TestWebKitAPI/CMakeLists.txt:
+        * TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPI.vcxproj:
+        * TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPI.vcxproj.filters:
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+        * TestWebKitAPI/Tests/WTF/NakedPtr.cpp: Added.
+        (TestWebKitAPI::TEST):
+        (TestWebKitAPI::nakedPtrFoo):
+
</ins><span class="cx"> 2015-06-16  Tobias Reiss  &lt;tobi+webkit@basecode.de&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed. Adding myself as a committer.
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPICMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/CMakeLists.txt (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/CMakeLists.txt        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Tools/TestWebKitAPI/CMakeLists.txt        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -79,6 +79,7 @@
</span><span class="cx">     ${TESTWEBKITAPI_DIR}/Tests/WTF/MathExtras.cpp
</span><span class="cx">     ${TESTWEBKITAPI_DIR}/Tests/WTF/MediaTime.cpp
</span><span class="cx">     ${TESTWEBKITAPI_DIR}/Tests/WTF/MetaAllocator.cpp
</span><ins>+    ${TESTWEBKITAPI_DIR}/Tests/WTF/NakedPtr.cpp
</ins><span class="cx">     ${TESTWEBKITAPI_DIR}/Tests/WTF/RedBlackTree.cpp
</span><span class="cx">     ${TESTWEBKITAPI_DIR}/Tests/WTF/Ref.cpp
</span><span class="cx">     ${TESTWEBKITAPI_DIR}/Tests/WTF/RefPtr.cpp
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestWebKitAPIvcxprojTestWebKitAPIvcxproj"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPI.vcxproj (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPI.vcxproj        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPI.vcxproj        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -323,6 +323,7 @@
</span><span class="cx">     &lt;ClCompile Include=&quot;..\Tests\WTF\MathExtras.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\Tests\WTF\MediaTime.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\Tests\WTF\MetaAllocator.cpp&quot; /&gt;
</span><ins>+    &lt;ClCompile Include=&quot;..\Tests\WTF\NakedPtr.cpp&quot; /&gt;
</ins><span class="cx">     &lt;ClCompile Include=&quot;..\Tests\WTF\Optional.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\Tests\WTF\RedBlackTree.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\Tests\WTF\Ref.cpp&quot; /&gt;
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestWebKitAPIvcxprojTestWebKitAPIvcxprojfilters"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPI.vcxproj.filters (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPI.vcxproj.filters        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Tools/TestWebKitAPI/TestWebKitAPI.vcxproj/TestWebKitAPI.vcxproj.filters        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -75,6 +75,9 @@
</span><span class="cx">     &lt;ClCompile Include=&quot;..\Tests\WTF\MediaTime.cpp&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;Tests\WTF&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClCompile&gt;
</span><ins>+    &lt;ClCompile Include=&quot;..\Tests\WTF\NakedPtr.cpp&quot;&gt;
+      &lt;Filter&gt;Tests\WTF&lt;/Filter&gt;
+    &lt;/ClCompile&gt;
</ins><span class="cx">     &lt;ClCompile Include=&quot;..\Tests\WTF\Ref.cpp&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;Tests\WTF&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClCompile&gt;
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestWebKitAPIxcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj (185607 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj        2015-06-16 20:50:21 UTC (rev 185607)
+++ trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -300,6 +300,7 @@
</span><span class="cx">                 F6B7BE9717469B96008A3445 /* associate-form-controls.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = F6B7BE9617469B7E008A3445 /* associate-form-controls.html */; };
</span><span class="cx">                 F6F49C6B15545CA70007F39D /* DOMWindowExtensionNoCache_Bundle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F6F49C6615545C8D0007F39D /* DOMWindowExtensionNoCache_Bundle.cpp */; };
</span><span class="cx">                 F6FDDDD614241C6F004F1729 /* push-state.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = F6FDDDD514241C48004F1729 /* push-state.html */; };
</span><ins>+                FEB6F7511B2BA464009E4922 /* NakedPtr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FEB6F74E1B2BA44E009E4922 /* NakedPtr.cpp */; };
</ins><span class="cx"> /* End PBXBuildFile section */
</span><span class="cx"> 
</span><span class="cx"> /* Begin PBXContainerItemProxy section */
</span><span class="lines">@@ -728,6 +729,7 @@
</span><span class="cx">                 F6F49C6715545C8D0007F39D /* DOMWindowExtensionNoCache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DOMWindowExtensionNoCache.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 F6FDDDD214241AD4004F1729 /* PrivateBrowsingPushStateNoHistoryCallback.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PrivateBrowsingPushStateNoHistoryCallback.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 F6FDDDD514241C48004F1729 /* push-state.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = &quot;push-state.html&quot;; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                FEB6F74E1B2BA44E009E4922 /* NakedPtr.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NakedPtr.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx"> /* End PBXFileReference section */
</span><span class="cx"> 
</span><span class="cx"> /* Begin PBXFrameworksBuildPhase section */
</span><span class="lines">@@ -1073,6 +1075,7 @@
</span><span class="cx">                                 CD5497B315857F0C00B5BC30 /* MediaTime.cpp */,
</span><span class="cx">                                 0FC6C4CE141034AD005B7F0C /* MetaAllocator.cpp */,
</span><span class="cx">                                 93A427AC180DA60F00CD24D7 /* MoveOnly.h */,
</span><ins>+                                FEB6F74E1B2BA44E009E4922 /* NakedPtr.cpp */,
</ins><span class="cx">                                 1AFDE6541953B2C000C48FFA /* Optional.cpp */,
</span><span class="cx">                                 0FC6C4CB141027E0005B7F0C /* RedBlackTree.cpp */,
</span><span class="cx">                                 93A427AA180DA26400CD24D7 /* Ref.cpp */,
</span><span class="lines">@@ -1500,6 +1503,7 @@
</span><span class="cx">                                 7CCE7F021A411AE600447C4C /* NewFirstVisuallyNonEmptyLayout.cpp in Sources */,
</span><span class="cx">                                 7CCE7F031A411AE600447C4C /* NewFirstVisuallyNonEmptyLayoutFails.cpp in Sources */,
</span><span class="cx">                                 7CCE7F041A411AE600447C4C /* NewFirstVisuallyNonEmptyLayoutForImages.cpp in Sources */,
</span><ins>+                                FEB6F7511B2BA464009E4922 /* NakedPtr.cpp in Sources */,
</ins><span class="cx">                                 7CCE7F051A411AE600447C4C /* NewFirstVisuallyNonEmptyLayoutFrames.cpp in Sources */,
</span><span class="cx">                                 7CCE7F251A411AF600447C4C /* OpenAndCloseWindow.mm in Sources */,
</span><span class="cx">                                 7CCE7F3D1A411B8E00447C4C /* Optional.cpp in Sources */,
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsWTFNakedPtrcpp"></a>
<div class="addfile"><h4>Added: trunk/Tools/TestWebKitAPI/Tests/WTF/NakedPtr.cpp (0 => 185608)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/WTF/NakedPtr.cpp                                (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WTF/NakedPtr.cpp        2015-06-16 20:51:04 UTC (rev 185608)
</span><span class="lines">@@ -0,0 +1,230 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+
+#include &quot;RefLogger.h&quot;
+#include &lt;wtf/NakedPtr.h&gt;
+
+namespace TestWebKitAPI {
+
+// For these tests, we need a base class and a derived class. For this purpose,
+// we reuse the RefLogger and DerivedRefLogger classes.
+
+TEST(WTF_NakedPtr, Basic)
+{
+    DerivedRefLogger a(&quot;a&quot;);
+
+    NakedPtr&lt;RefLogger&gt; empty;
+    ASSERT_EQ(nullptr, empty.get());
+
+    {
+        NakedPtr&lt;RefLogger&gt; ptr(&amp;a);
+        ASSERT_EQ(&amp;a, ptr.get());
+        ASSERT_EQ(&amp;a, &amp;*ptr);
+        ASSERT_EQ(&amp;a.name, &amp;ptr-&gt;name);
+    }
+
+    {
+        NakedPtr&lt;RefLogger&gt; ptr = &amp;a;
+        ASSERT_EQ(&amp;a, ptr.get());
+    }
+
+    {
+        NakedPtr&lt;RefLogger&gt; p1 = &amp;a;
+        NakedPtr&lt;RefLogger&gt; p2(p1);
+        ASSERT_EQ(&amp;a, p1.get());
+        ASSERT_EQ(&amp;a, p2.get());
+    }
+
+    {
+        NakedPtr&lt;RefLogger&gt; p1 = &amp;a;
+        NakedPtr&lt;RefLogger&gt; p2 = p1;
+        ASSERT_EQ(&amp;a, p1.get());
+        ASSERT_EQ(&amp;a, p2.get());
+    }
+
+    {
+        NakedPtr&lt;RefLogger&gt; p1 = &amp;a;
+        NakedPtr&lt;RefLogger&gt; p2 = WTF::move(p1);
+        ASSERT_EQ(&amp;a, p1.get());
+        ASSERT_EQ(&amp;a, p2.get());
+    }
+
+    {
+        NakedPtr&lt;RefLogger&gt; p1 = &amp;a;
+        NakedPtr&lt;RefLogger&gt; p2(WTF::move(p1));
+        ASSERT_EQ(&amp;a, p1.get());
+        ASSERT_EQ(&amp;a, p2.get());
+    }
+
+    {
+        NakedPtr&lt;DerivedRefLogger&gt; p1 = &amp;a;
+        NakedPtr&lt;RefLogger&gt; p2 = p1;
+        ASSERT_EQ(&amp;a, p1.get());
+        ASSERT_EQ(&amp;a, p2.get());
+    }
+
+    {
+        NakedPtr&lt;DerivedRefLogger&gt; p1 = &amp;a;
+        NakedPtr&lt;RefLogger&gt; p2 = WTF::move(p1);
+        ASSERT_EQ(&amp;a, p1.get());
+        ASSERT_EQ(&amp;a, p2.get());
+    }
+
+    {
+        NakedPtr&lt;RefLogger&gt; ptr(&amp;a);
+        ASSERT_EQ(&amp;a, ptr.get());
+        ptr.clear();
+        ASSERT_EQ(nullptr, ptr.get());
+    }
+}
+
+TEST(WTF_NakedPtr, Assignment)
+{
+    DerivedRefLogger a(&quot;a&quot;);
+    RefLogger b(&quot;b&quot;);
+    DerivedRefLogger c(&quot;c&quot;);
+
+    {
+        NakedPtr&lt;RefLogger&gt; p1(&amp;a);
+        NakedPtr&lt;RefLogger&gt; p2(&amp;b);
+        ASSERT_EQ(&amp;a, p1.get());
+        ASSERT_EQ(&amp;b, p2.get());
+        p1 = p2;
+        ASSERT_EQ(&amp;b, p1.get());
+        ASSERT_EQ(&amp;b, p2.get());
+    }
+
+    {
+        NakedPtr&lt;RefLogger&gt; ptr(&amp;a);
+        ASSERT_EQ(&amp;a, ptr.get());
+        ptr = &amp;b;
+        ASSERT_EQ(&amp;b, ptr.get());
+    }
+
+    {
+        NakedPtr&lt;RefLogger&gt; ptr(&amp;a);
+        ASSERT_EQ(&amp;a, ptr.get());
+        ptr = nullptr;
+        ASSERT_EQ(nullptr, ptr.get());
+    }
+
+    {
+        NakedPtr&lt;RefLogger&gt; p1(&amp;a);
+        NakedPtr&lt;RefLogger&gt; p2(&amp;b);
+        ASSERT_EQ(&amp;a, p1.get());
+        ASSERT_EQ(&amp;b, p2.get());
+        p1 = WTF::move(p2);
+        ASSERT_EQ(&amp;b, p1.get());
+        ASSERT_EQ(&amp;b, p2.get());
+    }
+
+    {
+        NakedPtr&lt;RefLogger&gt; p1(&amp;a);
+        NakedPtr&lt;DerivedRefLogger&gt; p2(&amp;c);
+        ASSERT_EQ(&amp;a, p1.get());
+        ASSERT_EQ(&amp;c, p2.get());
+        p1 = p2;
+        ASSERT_EQ(&amp;c, p1.get());
+        ASSERT_EQ(&amp;c, p2.get());
+    }
+
+    {
+        NakedPtr&lt;RefLogger&gt; ptr(&amp;a);
+        ASSERT_EQ(&amp;a, ptr.get());
+        ptr = &amp;c;
+        ASSERT_EQ(&amp;c, ptr.get());
+    }
+
+    {
+        NakedPtr&lt;RefLogger&gt; p1(&amp;a);
+        NakedPtr&lt;DerivedRefLogger&gt; p2(&amp;c);
+        ASSERT_EQ(&amp;a, p1.get());
+        ASSERT_EQ(&amp;c, p2.get());
+        p1 = WTF::move(p2);
+        ASSERT_EQ(&amp;c, p1.get());
+        ASSERT_EQ(&amp;c, p2.get());
+    }
+
+    {
+        NakedPtr&lt;RefLogger&gt; ptr(&amp;a);
+        ASSERT_EQ(&amp;a, ptr.get());
+        ptr = ptr;
+        ASSERT_EQ(&amp;a, ptr.get());
+    }
+
+    {
+        NakedPtr&lt;RefLogger&gt; ptr(&amp;a);
+        ASSERT_EQ(&amp;a, ptr.get());
+        ptr = WTF::move(ptr);
+        ASSERT_EQ(&amp;a, ptr.get());
+    }
+}
+
+TEST(WTF_NakedPtr, Swap)
+{
+    RefLogger a(&quot;a&quot;);
+    RefLogger b(&quot;b&quot;);
+
+    {
+        NakedPtr&lt;RefLogger&gt; p1(&amp;a);
+        NakedPtr&lt;RefLogger&gt; p2(&amp;b);
+        ASSERT_EQ(&amp;a, p1.get());
+        ASSERT_EQ(&amp;b, p2.get());
+        p1.swap(p2);
+        ASSERT_EQ(&amp;b, p1.get());
+        ASSERT_EQ(&amp;a, p2.get());
+    }
+
+    {
+        NakedPtr&lt;RefLogger&gt; p1(&amp;a);
+        NakedPtr&lt;RefLogger&gt; p2(&amp;b);
+        ASSERT_EQ(&amp;a, p1.get());
+        ASSERT_EQ(&amp;b, p2.get());
+        std::swap(p1, p2);
+        ASSERT_EQ(&amp;b, p1.get());
+        ASSERT_EQ(&amp;a, p2.get());
+    }
+}
+
+NakedPtr&lt;RefLogger&gt; nakedPtrFoo(RefLogger&amp; logger)
+{
+    return NakedPtr&lt;RefLogger&gt;(&amp;logger);
+}
+
+TEST(WTF_NakedPtr, ReturnValue)
+{
+    DerivedRefLogger a(&quot;a&quot;);
+
+    {
+        auto ptr = nakedPtrFoo(a);
+        ASSERT_EQ(&amp;a, ptr.get());
+        ASSERT_EQ(&amp;a, &amp;*ptr);
+        ASSERT_EQ(&amp;a.name, &amp;ptr-&gt;name);
+    }
+}
+
+} // namespace TestWebKitAPI
</ins></span></pre>
</div>
</div>

</body>
</html>