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

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

<h3>Log Message</h3>
<pre>WebAssembly: Make to a compilation API that allows for multi-VM concurrent compilations of Wasm Modules
https://bugs.webkit.org/show_bug.cgi?id=170488

Reviewed by JF Bastien.

Source/JavaScriptCore:

This patch adds a class called Wasm::Module. It contains the bits from
JSWebAssemblyModule that were not VM specific. JSWebAssemblyModule
now has a Ref&lt;Wasm::Module&gt;. Similarly, there is now a Wasm::CodeBlock,
which owns the non-VM-specific bits that JSWebAssemblyCodeBlock used
to own.
        
This patch also simplifies how we verify and compile code. Wasm::Module
now has an API for both sync/async validation and compilation. This
API abstracts away how Wasm::Plan works.
        
This is hopefully the last patch needed before we can implement
window.postMessage for a JSWebAssemblyModule. I think all that's
needed now to implement postMessage is simply creating a new
JSWebAssemblyModule with the underlying Wasm::Module.
        
This patch is neutral on WasmBench.
        
Finally, this patch changes the promise deferred timer to
allow for new tasks to be added while we're executing
a task. Before, we'd deadlock if this happened.

* CMakeLists.txt:
* JavaScriptCore.xcodeproj/project.pbxproj:
* jsc.cpp:
(functionTestWasmModuleFunctions):
* runtime/PromiseDeferredTimer.cpp:
(JSC::PromiseDeferredTimer::doWork):
(JSC::PromiseDeferredTimer::scheduleWorkSoon):
* runtime/PromiseDeferredTimer.h:
* wasm/WasmB3IRGenerator.cpp:
* wasm/WasmBinding.cpp:
(JSC::Wasm::wasmToJs):
(JSC::Wasm::wasmToWasm):
(JSC::Wasm::exitStubGenerator): Deleted.
* wasm/WasmBinding.h:
* wasm/WasmCodeBlock.cpp: Added.
(JSC::Wasm::CodeBlock::CodeBlock):
(JSC::Wasm::CodeBlock::waitUntilFinished):
(JSC::Wasm::CodeBlock::compileAsync):
(JSC::Wasm::CodeBlock::isSafeToRun):
* wasm/WasmCodeBlock.h: Added.
(JSC::Wasm::CodeBlock::create):
(JSC::Wasm::CodeBlock::compilationFinished):
(JSC::Wasm::CodeBlock::runnable):
(JSC::Wasm::CodeBlock::errorMessage):
(JSC::Wasm::CodeBlock::functionImportCount):
(JSC::Wasm::CodeBlock::jsEntrypointCalleeFromFunctionIndexSpace):
(JSC::Wasm::CodeBlock::wasmEntrypointCalleeFromFunctionIndexSpace):
* wasm/WasmModule.cpp: Added.
(JSC::Wasm::Module::Module):
(JSC::Wasm::makeValidationResult):
(JSC::Wasm::Module::validateSyncImpl):
(JSC::Wasm::Module::getOrCreateCodeBlock):
(JSC::Wasm::Module::compileSync):
(JSC::Wasm::Module::makeValidationCallback):
(JSC::Wasm::Module::compileAsync):
* wasm/WasmModule.h: Added.
(JSC::Wasm::Module::create):
(JSC::Wasm::Module::validateSync):
(JSC::Wasm::Module::validateAsync):
(JSC::Wasm::Module::signatureIndexFromFunctionIndexSpace):
(JSC::Wasm::Module::moduleInformation):
(JSC::Wasm::Module::nonNullCodeBlock):
* wasm/WasmPlan.cpp:
(JSC::Wasm::Plan::Plan):
(JSC::Wasm::Plan::addCompletionTask):
(JSC::Wasm::Plan::prepare):
(JSC::Wasm::Plan::compileFunctions):
(JSC::Wasm::Plan::complete):
(JSC::Wasm::Plan::tryRemoveVMAndCancelIfLast):
(JSC::Wasm::Plan::cancel): Deleted.
* wasm/WasmPlan.h:
(JSC::Wasm::Plan::dontFinalize):
(JSC::Wasm::Plan::takeWasmToWasmExitStubs):
(JSC::Wasm::Plan::mode):
(JSC::Wasm::Plan::takeWasmExitStubs): Deleted.
(JSC::Wasm::Plan::vm): Deleted.
* wasm/WasmWorklist.cpp:
(JSC::Wasm::Worklist::stopAllPlansForVM):
* wasm/js/JSWebAssemblyCodeBlock.cpp:
(JSC::JSWebAssemblyCodeBlock::JSWebAssemblyCodeBlock):
(JSC::JSWebAssemblyCodeBlock::isSafeToRun):
(JSC::JSWebAssemblyCodeBlock::initialize): Deleted.
* wasm/js/JSWebAssemblyCodeBlock.h:
(JSC::JSWebAssemblyCodeBlock::create):
(JSC::JSWebAssemblyCodeBlock::functionImportCount):
(JSC::JSWebAssemblyCodeBlock::jsEntrypointCalleeFromFunctionIndexSpace):
(JSC::JSWebAssemblyCodeBlock::wasmEntrypointCalleeFromFunctionIndexSpace):
(JSC::JSWebAssemblyCodeBlock::wasmToJsCallStubForImport):
(JSC::JSWebAssemblyCodeBlock::mode): Deleted.
(JSC::JSWebAssemblyCodeBlock::initialized): Deleted.
(JSC::JSWebAssemblyCodeBlock::plan): Deleted.
(JSC::JSWebAssemblyCodeBlock::runnable): Deleted.
(JSC::JSWebAssemblyCodeBlock::errorMessage): Deleted.
(JSC::JSWebAssemblyCodeBlock::setJSEntrypointCallee): Deleted.
(JSC::JSWebAssemblyCodeBlock::setWasmEntrypointCallee): Deleted.
* wasm/js/JSWebAssemblyInstance.cpp:
(JSC::JSWebAssemblyInstance::finalizeCreation):
(JSC::JSWebAssemblyInstance::addUnitializedCodeBlock): Deleted.
* wasm/js/JSWebAssemblyInstance.h:
(JSC::JSWebAssemblyInstance::initialized): Deleted.
* wasm/js/JSWebAssemblyModule.cpp:
(JSC::JSWebAssemblyModule::createStub):
(JSC::JSWebAssemblyModule::JSWebAssemblyModule):
(JSC::JSWebAssemblyModule::finishCreation):
* wasm/js/JSWebAssemblyModule.h:
(JSC::JSWebAssemblyModule::moduleInformation):
(JSC::JSWebAssemblyModule::signatureIndexFromFunctionIndexSpace):
(JSC::JSWebAssemblyModule::module):
* wasm/js/WebAssemblyFunction.cpp:
(JSC::WebAssemblyFunction::create):
* wasm/js/WebAssemblyInstanceConstructor.cpp:
(JSC::constructJSWebAssemblyInstance):
* wasm/js/WebAssemblyModuleConstructor.cpp:
(JSC::WebAssemblyModuleConstructor::createModule):
* wasm/js/WebAssemblyPrototype.cpp:
(JSC::reject):
(JSC::webAssemblyCompileFunc):
(JSC::resolve):
(JSC::instantiate):
(JSC::compileAndInstantiate):
(JSC::webAssemblyValidateFunc):

Source/WTF:

* wtf/SharedTask.h: Make SharedTaskFunctor forward its arguments.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreCMakeListstxt">trunk/Source/JavaScriptCore/CMakeLists.txt</a></li>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj">trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceJavaScriptCorejsccpp">trunk/Source/JavaScriptCore/jsc.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimePromiseDeferredTimercpp">trunk/Source/JavaScriptCore/runtime/PromiseDeferredTimer.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimePromiseDeferredTimerh">trunk/Source/JavaScriptCore/runtime/PromiseDeferredTimer.h</a></li>
<li><a href="#trunkSourceJavaScriptCorewasmWasmB3IRGeneratorcpp">trunk/Source/JavaScriptCore/wasm/WasmB3IRGenerator.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorewasmWasmBindingcpp">trunk/Source/JavaScriptCore/wasm/WasmBinding.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorewasmWasmBindingh">trunk/Source/JavaScriptCore/wasm/WasmBinding.h</a></li>
<li><a href="#trunkSourceJavaScriptCorewasmWasmPlancpp">trunk/Source/JavaScriptCore/wasm/WasmPlan.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorewasmWasmPlanh">trunk/Source/JavaScriptCore/wasm/WasmPlan.h</a></li>
<li><a href="#trunkSourceJavaScriptCorewasmWasmWorklistcpp">trunk/Source/JavaScriptCore/wasm/WasmWorklist.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorewasmjsJSWebAssemblyCodeBlockcpp">trunk/Source/JavaScriptCore/wasm/js/JSWebAssemblyCodeBlock.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorewasmjsJSWebAssemblyCodeBlockh">trunk/Source/JavaScriptCore/wasm/js/JSWebAssemblyCodeBlock.h</a></li>
<li><a href="#trunkSourceJavaScriptCorewasmjsJSWebAssemblyInstancecpp">trunk/Source/JavaScriptCore/wasm/js/JSWebAssemblyInstance.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorewasmjsJSWebAssemblyInstanceh">trunk/Source/JavaScriptCore/wasm/js/JSWebAssemblyInstance.h</a></li>
<li><a href="#trunkSourceJavaScriptCorewasmjsJSWebAssemblyModulecpp">trunk/Source/JavaScriptCore/wasm/js/JSWebAssemblyModule.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorewasmjsJSWebAssemblyModuleh">trunk/Source/JavaScriptCore/wasm/js/JSWebAssemblyModule.h</a></li>
<li><a href="#trunkSourceJavaScriptCorewasmjsWebAssemblyFunctioncpp">trunk/Source/JavaScriptCore/wasm/js/WebAssemblyFunction.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorewasmjsWebAssemblyInstanceConstructorcpp">trunk/Source/JavaScriptCore/wasm/js/WebAssemblyInstanceConstructor.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorewasmjsWebAssemblyModuleConstructorcpp">trunk/Source/JavaScriptCore/wasm/js/WebAssemblyModuleConstructor.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorewasmjsWebAssemblyPrototypecpp">trunk/Source/JavaScriptCore/wasm/js/WebAssemblyPrototype.cpp</a></li>
<li><a href="#trunkSourceWTFChangeLog">trunk/Source/WTF/ChangeLog</a></li>
<li><a href="#trunkSourceWTFwtfSharedTaskh">trunk/Source/WTF/wtf/SharedTask.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCorewasmWasmCodeBlockcpp">trunk/Source/JavaScriptCore/wasm/WasmCodeBlock.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorewasmWasmCodeBlockh">trunk/Source/JavaScriptCore/wasm/WasmCodeBlock.h</a></li>
<li><a href="#trunkSourceJavaScriptCorewasmWasmModulecpp">trunk/Source/JavaScriptCore/wasm/WasmModule.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorewasmWasmModuleh">trunk/Source/JavaScriptCore/wasm/WasmModule.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreCMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/CMakeLists.txt (215102 => 215103)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/CMakeLists.txt        2017-04-07 18:15:22 UTC (rev 215102)
+++ trunk/Source/JavaScriptCore/CMakeLists.txt        2017-04-07 18:25:14 UTC (rev 215103)
</span><span class="lines">@@ -938,11 +938,13 @@
</span><span class="cx">     wasm/WasmBinding.cpp
</span><span class="cx">     wasm/WasmCallee.cpp
</span><span class="cx">     wasm/WasmCallingConvention.cpp
</span><ins>+    wasm/WasmCodeBlock.cpp
</ins><span class="cx">     wasm/WasmContext.cpp
</span><span class="cx">     wasm/WasmFaultSignalHandler.cpp
</span><span class="cx">     wasm/WasmFormat.cpp
</span><span class="cx">     wasm/WasmMemory.cpp
</span><span class="cx">     wasm/WasmMemoryInformation.cpp
</span><ins>+    wasm/WasmModule.cpp
</ins><span class="cx">     wasm/WasmModuleInformation.cpp
</span><span class="cx">     wasm/WasmModuleParser.cpp
</span><span class="cx">     wasm/WasmPageCount.cpp
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (215102 => 215103)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2017-04-07 18:15:22 UTC (rev 215102)
+++ trunk/Source/JavaScriptCore/ChangeLog        2017-04-07 18:25:14 UTC (rev 215103)
</span><span class="lines">@@ -1,3 +1,133 @@
</span><ins>+2017-04-07  Saam Barati  &lt;sbarati@apple.com&gt;
+
+        WebAssembly: Make to a compilation API that allows for multi-VM concurrent compilations of Wasm Modules
+        https://bugs.webkit.org/show_bug.cgi?id=170488
+
+        Reviewed by JF Bastien.
+
+        This patch adds a class called Wasm::Module. It contains the bits from
+        JSWebAssemblyModule that were not VM specific. JSWebAssemblyModule
+        now has a Ref&lt;Wasm::Module&gt;. Similarly, there is now a Wasm::CodeBlock,
+        which owns the non-VM-specific bits that JSWebAssemblyCodeBlock used
+        to own.
+        
+        This patch also simplifies how we verify and compile code. Wasm::Module
+        now has an API for both sync/async validation and compilation. This
+        API abstracts away how Wasm::Plan works.
+        
+        This is hopefully the last patch needed before we can implement
+        window.postMessage for a JSWebAssemblyModule. I think all that's
+        needed now to implement postMessage is simply creating a new
+        JSWebAssemblyModule with the underlying Wasm::Module.
+        
+        This patch is neutral on WasmBench.
+        
+        Finally, this patch changes the promise deferred timer to
+        allow for new tasks to be added while we're executing
+        a task. Before, we'd deadlock if this happened.
+
+        * CMakeLists.txt:
+        * JavaScriptCore.xcodeproj/project.pbxproj:
+        * jsc.cpp:
+        (functionTestWasmModuleFunctions):
+        * runtime/PromiseDeferredTimer.cpp:
+        (JSC::PromiseDeferredTimer::doWork):
+        (JSC::PromiseDeferredTimer::scheduleWorkSoon):
+        * runtime/PromiseDeferredTimer.h:
+        * wasm/WasmB3IRGenerator.cpp:
+        * wasm/WasmBinding.cpp:
+        (JSC::Wasm::wasmToJs):
+        (JSC::Wasm::wasmToWasm):
+        (JSC::Wasm::exitStubGenerator): Deleted.
+        * wasm/WasmBinding.h:
+        * wasm/WasmCodeBlock.cpp: Added.
+        (JSC::Wasm::CodeBlock::CodeBlock):
+        (JSC::Wasm::CodeBlock::waitUntilFinished):
+        (JSC::Wasm::CodeBlock::compileAsync):
+        (JSC::Wasm::CodeBlock::isSafeToRun):
+        * wasm/WasmCodeBlock.h: Added.
+        (JSC::Wasm::CodeBlock::create):
+        (JSC::Wasm::CodeBlock::compilationFinished):
+        (JSC::Wasm::CodeBlock::runnable):
+        (JSC::Wasm::CodeBlock::errorMessage):
+        (JSC::Wasm::CodeBlock::functionImportCount):
+        (JSC::Wasm::CodeBlock::jsEntrypointCalleeFromFunctionIndexSpace):
+        (JSC::Wasm::CodeBlock::wasmEntrypointCalleeFromFunctionIndexSpace):
+        * wasm/WasmModule.cpp: Added.
+        (JSC::Wasm::Module::Module):
+        (JSC::Wasm::makeValidationResult):
+        (JSC::Wasm::Module::validateSyncImpl):
+        (JSC::Wasm::Module::getOrCreateCodeBlock):
+        (JSC::Wasm::Module::compileSync):
+        (JSC::Wasm::Module::makeValidationCallback):
+        (JSC::Wasm::Module::compileAsync):
+        * wasm/WasmModule.h: Added.
+        (JSC::Wasm::Module::create):
+        (JSC::Wasm::Module::validateSync):
+        (JSC::Wasm::Module::validateAsync):
+        (JSC::Wasm::Module::signatureIndexFromFunctionIndexSpace):
+        (JSC::Wasm::Module::moduleInformation):
+        (JSC::Wasm::Module::nonNullCodeBlock):
+        * wasm/WasmPlan.cpp:
+        (JSC::Wasm::Plan::Plan):
+        (JSC::Wasm::Plan::addCompletionTask):
+        (JSC::Wasm::Plan::prepare):
+        (JSC::Wasm::Plan::compileFunctions):
+        (JSC::Wasm::Plan::complete):
+        (JSC::Wasm::Plan::tryRemoveVMAndCancelIfLast):
+        (JSC::Wasm::Plan::cancel): Deleted.
+        * wasm/WasmPlan.h:
+        (JSC::Wasm::Plan::dontFinalize):
+        (JSC::Wasm::Plan::takeWasmToWasmExitStubs):
+        (JSC::Wasm::Plan::mode):
+        (JSC::Wasm::Plan::takeWasmExitStubs): Deleted.
+        (JSC::Wasm::Plan::vm): Deleted.
+        * wasm/WasmWorklist.cpp:
+        (JSC::Wasm::Worklist::stopAllPlansForVM):
+        * wasm/js/JSWebAssemblyCodeBlock.cpp:
+        (JSC::JSWebAssemblyCodeBlock::JSWebAssemblyCodeBlock):
+        (JSC::JSWebAssemblyCodeBlock::isSafeToRun):
+        (JSC::JSWebAssemblyCodeBlock::initialize): Deleted.
+        * wasm/js/JSWebAssemblyCodeBlock.h:
+        (JSC::JSWebAssemblyCodeBlock::create):
+        (JSC::JSWebAssemblyCodeBlock::functionImportCount):
+        (JSC::JSWebAssemblyCodeBlock::jsEntrypointCalleeFromFunctionIndexSpace):
+        (JSC::JSWebAssemblyCodeBlock::wasmEntrypointCalleeFromFunctionIndexSpace):
+        (JSC::JSWebAssemblyCodeBlock::wasmToJsCallStubForImport):
+        (JSC::JSWebAssemblyCodeBlock::mode): Deleted.
+        (JSC::JSWebAssemblyCodeBlock::initialized): Deleted.
+        (JSC::JSWebAssemblyCodeBlock::plan): Deleted.
+        (JSC::JSWebAssemblyCodeBlock::runnable): Deleted.
+        (JSC::JSWebAssemblyCodeBlock::errorMessage): Deleted.
+        (JSC::JSWebAssemblyCodeBlock::setJSEntrypointCallee): Deleted.
+        (JSC::JSWebAssemblyCodeBlock::setWasmEntrypointCallee): Deleted.
+        * wasm/js/JSWebAssemblyInstance.cpp:
+        (JSC::JSWebAssemblyInstance::finalizeCreation):
+        (JSC::JSWebAssemblyInstance::addUnitializedCodeBlock): Deleted.
+        * wasm/js/JSWebAssemblyInstance.h:
+        (JSC::JSWebAssemblyInstance::initialized): Deleted.
+        * wasm/js/JSWebAssemblyModule.cpp:
+        (JSC::JSWebAssemblyModule::createStub):
+        (JSC::JSWebAssemblyModule::JSWebAssemblyModule):
+        (JSC::JSWebAssemblyModule::finishCreation):
+        * wasm/js/JSWebAssemblyModule.h:
+        (JSC::JSWebAssemblyModule::moduleInformation):
+        (JSC::JSWebAssemblyModule::signatureIndexFromFunctionIndexSpace):
+        (JSC::JSWebAssemblyModule::module):
+        * wasm/js/WebAssemblyFunction.cpp:
+        (JSC::WebAssemblyFunction::create):
+        * wasm/js/WebAssemblyInstanceConstructor.cpp:
+        (JSC::constructJSWebAssemblyInstance):
+        * wasm/js/WebAssemblyModuleConstructor.cpp:
+        (JSC::WebAssemblyModuleConstructor::createModule):
+        * wasm/js/WebAssemblyPrototype.cpp:
+        (JSC::reject):
+        (JSC::webAssemblyCompileFunc):
+        (JSC::resolve):
+        (JSC::instantiate):
+        (JSC::compileAndInstantiate):
+        (JSC::webAssemblyValidateFunc):
+
</ins><span class="cx"> 2017-04-07  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [GTK] Update the priorities used in glib main loop sources
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj (215102 => 215103)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2017-04-07 18:15:22 UTC (rev 215102)
+++ trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2017-04-07 18:25:14 UTC (rev 215103)
</span><span class="lines">@@ -1321,6 +1321,8 @@
</span><span class="cx">                 52678F8E1A031009006A306D /* BasicBlockLocation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 52678F8C1A031009006A306D /* BasicBlockLocation.cpp */; };
</span><span class="cx">                 52678F8F1A031009006A306D /* BasicBlockLocation.h in Headers */ = {isa = PBXBuildFile; fileRef = 52678F8D1A031009006A306D /* BasicBlockLocation.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 52678F911A04177C006A306D /* ControlFlowProfiler.h in Headers */ = {isa = PBXBuildFile; fileRef = 52678F901A04177C006A306D /* ControlFlowProfiler.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><ins>+                526AC4B61E977C5D003500E1 /* WasmCodeBlock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 526AC4B41E977C5D003500E1 /* WasmCodeBlock.cpp */; };
+                526AC4B71E977C5D003500E1 /* WasmCodeBlock.h in Headers */ = {isa = PBXBuildFile; fileRef = 526AC4B51E977C5D003500E1 /* WasmCodeBlock.h */; settings = {ATTRIBUTES = (Private, ); }; };
</ins><span class="cx">                 527773DE1AAF83AC00BDE7E8 /* RuntimeType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 527773DD1AAF83AC00BDE7E8 /* RuntimeType.cpp */; };
</span><span class="cx">                 52B310FB1974AE610080857C /* FunctionHasExecutedCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 52B310FA1974AE610080857C /* FunctionHasExecutedCache.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 52B310FD1974AE870080857C /* FunctionHasExecutedCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 52B310FC1974AE870080857C /* FunctionHasExecutedCache.cpp */; };
</span><span class="lines">@@ -1490,6 +1492,8 @@
</span><span class="cx">                 72AAF7CD1D0D31B3005E60BE /* JSCustomGetterSetterFunction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 72AAF7CB1D0D318B005E60BE /* JSCustomGetterSetterFunction.cpp */; };
</span><span class="cx">                 72AAF7CE1D0D31B3005E60BE /* JSCustomGetterSetterFunction.h in Headers */ = {isa = PBXBuildFile; fileRef = 72AAF7CC1D0D318B005E60BE /* JSCustomGetterSetterFunction.h */; };
</span><span class="cx">                 78274D8E4C4D4FCD9A1DC6E6 /* TemplateRegistryKey.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BDB4B5E099CD4C1BB3C1CF05 /* TemplateRegistryKey.cpp */; };
</span><ins>+                790081381E95A8EC0052D7CD /* WasmModule.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 790081361E95A8EC0052D7CD /* WasmModule.cpp */; };
+                790081391E95A8EC0052D7CD /* WasmModule.h in Headers */ = {isa = PBXBuildFile; fileRef = 790081371E95A8EC0052D7CD /* WasmModule.h */; settings = {ATTRIBUTES = (Private, ); }; };
</ins><span class="cx">                 7905BB681D12050E0019FE57 /* InlineAccess.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7905BB661D12050E0019FE57 /* InlineAccess.cpp */; };
</span><span class="cx">                 7905BB691D12050E0019FE57 /* InlineAccess.h in Headers */ = {isa = PBXBuildFile; fileRef = 7905BB671D12050E0019FE57 /* InlineAccess.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 79160DBD1C8E3EC8008C085A /* ProxyRevoke.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 79160DBB1C8E3EC8008C085A /* ProxyRevoke.cpp */; };
</span><span class="lines">@@ -3831,6 +3835,8 @@
</span><span class="cx">                 52678F8C1A031009006A306D /* BasicBlockLocation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BasicBlockLocation.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 52678F8D1A031009006A306D /* BasicBlockLocation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BasicBlockLocation.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 52678F901A04177C006A306D /* ControlFlowProfiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ControlFlowProfiler.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                526AC4B41E977C5D003500E1 /* WasmCodeBlock.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WasmCodeBlock.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                526AC4B51E977C5D003500E1 /* WasmCodeBlock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WasmCodeBlock.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 527773DD1AAF83AC00BDE7E8 /* RuntimeType.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RuntimeType.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 52B310FA1974AE610080857C /* FunctionHasExecutedCache.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FunctionHasExecutedCache.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 52B310FC1974AE870080857C /* FunctionHasExecutedCache.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = FunctionHasExecutedCache.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -4043,6 +4049,8 @@
</span><span class="cx">                 72AAF7CB1D0D318B005E60BE /* JSCustomGetterSetterFunction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSCustomGetterSetterFunction.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 72AAF7CC1D0D318B005E60BE /* JSCustomGetterSetterFunction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSCustomGetterSetterFunction.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 77B25CB2C3094A92A38E1DB3 /* JSModuleLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSModuleLoader.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                790081361E95A8EC0052D7CD /* WasmModule.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WasmModule.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                790081371E95A8EC0052D7CD /* WasmModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WasmModule.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 7905BB661D12050E0019FE57 /* InlineAccess.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InlineAccess.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 7905BB671D12050E0019FE57 /* InlineAccess.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InlineAccess.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 79160DBB1C8E3EC8008C085A /* ProxyRevoke.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ProxyRevoke.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -6321,6 +6329,8 @@
</span><span class="cx">                                 525C0DD81E935847002184CD /* WasmCallee.h */,
</span><span class="cx">                                 53FD04D11D7AB187003287D3 /* WasmCallingConvention.cpp */,
</span><span class="cx">                                 53FD04D21D7AB187003287D3 /* WasmCallingConvention.h */,
</span><ins>+                                526AC4B41E977C5D003500E1 /* WasmCodeBlock.cpp */,
+                                526AC4B51E977C5D003500E1 /* WasmCodeBlock.h */,
</ins><span class="cx">                                 AD412B311E7B2E8A008AF157 /* WasmContext.cpp */,
</span><span class="cx">                                 AD412B321E7B2E8A008AF157 /* WasmContext.h */,
</span><span class="cx">                                 79DAE2791E03C82200B526AA /* WasmExceptionType.h */,
</span><span class="lines">@@ -6327,6 +6337,8 @@
</span><span class="cx">                                 AD2FCC321DC4045300B3E736 /* WasmFormat.cpp */,
</span><span class="cx">                                 7BC547D21B69599B00959B58 /* WasmFormat.h */,
</span><span class="cx">                                 53F40E8A1D5901BB0099A1B6 /* WasmFunctionParser.h */,
</span><ins>+                                790081361E95A8EC0052D7CD /* WasmModule.cpp */,
+                                790081371E95A8EC0052D7CD /* WasmModule.h */,
</ins><span class="cx">                                 535557151D9DFA32006D583B /* WasmMemory.cpp */,
</span><span class="cx">                                 535557131D9D9EA5006D583B /* WasmMemory.h */,
</span><span class="cx">                                 79B759711DFA4C600052174C /* WasmMemoryInformation.cpp */,
</span><span class="lines">@@ -8774,6 +8786,7 @@
</span><span class="cx">                                 DC3D2B0A1D34316200BA918C /* HeapCell.h in Headers */,
</span><span class="cx">                                 0F070A491D543A93006E7232 /* HeapCellInlines.h in Headers */,
</span><span class="cx">                                 0F32BD111BB34F190093A57F /* HeapHelperPool.h in Headers */,
</span><ins>+                                526AC4B71E977C5D003500E1 /* WasmCodeBlock.h in Headers */,
</ins><span class="cx">                                 C2DA778318E259990066FCB6 /* HeapInlines.h in Headers */,
</span><span class="cx">                                 2AD8932B17E3868F00668276 /* HeapIterationScope.h in Headers */,
</span><span class="cx">                                 A5339EC91BB4B4600054F005 /* HeapObserver.h in Headers */,
</span><span class="lines">@@ -8922,6 +8935,7 @@
</span><span class="cx">                                 A58C024218E4A41A00032BC5 /* JSContextPrivate.h in Headers */,
</span><span class="cx">                                 BC18C41E0E16F5CD00B34460 /* JSContextRef.h in Headers */,
</span><span class="cx">                                 A5EA70EE19F5B5C40098F5EC /* JSContextRefInspectorSupport.h in Headers */,
</span><ins>+                                790081391E95A8EC0052D7CD /* WasmModule.h in Headers */,
</ins><span class="cx">                                 A5D2E665195E174000A518E7 /* JSContextRefInternal.h in Headers */,
</span><span class="cx">                                 0FF4B4C71E8893C500DBBE86 /* AirCFG.h in Headers */,
</span><span class="cx">                                 148CD1D8108CF902008163C6 /* JSContextRefPrivate.h in Headers */,
</span><span class="lines">@@ -10366,6 +10380,7 @@
</span><span class="cx">                                 0FB105851675480F00F8AB6E /* ExitKind.cpp in Sources */,
</span><span class="cx">                                 0F5513A81D5A68CD00C32BD8 /* FreeList.cpp in Sources */,
</span><span class="cx">                                 0FEA0A1C1708B00700BB722C /* FTLAbstractHeap.cpp in Sources */,
</span><ins>+                                790081381E95A8EC0052D7CD /* WasmModule.cpp in Sources */,
</ins><span class="cx">                                 0FEA0A1E1708B00700BB722C /* FTLAbstractHeapRepository.cpp in Sources */,
</span><span class="cx">                                 0F485327187DFDEC0083B687 /* FTLAvailableRecovery.cpp in Sources */,
</span><span class="cx">                                 0FEA0A09170513DB00BB722C /* FTLCapabilities.cpp in Sources */,
</span><span class="lines">@@ -10546,6 +10561,7 @@
</span><span class="cx">                                 798937781DCAB57300F8D4FB /* JSFixedArray.cpp in Sources */,
</span><span class="cx">                                 140566D6107EC271005DBC8D /* JSFunction.cpp in Sources */,
</span><span class="cx">                                 70B7919B1C024A46002481E2 /* JSGeneratorFunction.cpp in Sources */,
</span><ins>+                                526AC4B61E977C5D003500E1 /* WasmCodeBlock.cpp in Sources */,
</ins><span class="cx">                                 797E07A91B8FCFB9008400BA /* JSGlobalLexicalEnvironment.cpp in Sources */,
</span><span class="cx">                                 147F39D2107EC37600427A48 /* JSGlobalObject.cpp in Sources */,
</span><span class="cx">                                 A5FD0085189B1B7E00633231 /* JSGlobalObjectConsoleAgent.cpp in Sources */,
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejsccpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jsc.cpp (215102 => 215103)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jsc.cpp        2017-04-07 18:15:22 UTC (rev 215102)
+++ trunk/Source/JavaScriptCore/jsc.cpp        2017-04-07 18:25:14 UTC (rev 215103)
</span><span class="lines">@@ -3191,7 +3191,7 @@
</span><span class="cx">     if (exec-&gt;argumentCount() != functionCount + 2)
</span><span class="cx">         CRASH();
</span><span class="cx"> 
</span><del>-    Ref&lt;Wasm::Plan&gt; plan = adoptRef(*new Wasm::Plan(vm, static_cast&lt;uint8_t*&gt;(source-&gt;vector()), source-&gt;length(), Wasm::Plan::FullCompile, Wasm::Plan::dontFinalize));
</del><ins>+    Ref&lt;Wasm::Plan&gt; plan = adoptRef(*new Wasm::Plan(vm, static_cast&lt;uint8_t*&gt;(source-&gt;vector()), source-&gt;length(), Wasm::Plan::FullCompile, Wasm::Plan::dontFinalize()));
</ins><span class="cx">     Wasm::ensureWorklist().enqueue(plan.copyRef());
</span><span class="cx">     Wasm::ensureWorklist().completePlanSynchronously(plan.get());
</span><span class="cx">     if (plan-&gt;failed()) {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimePromiseDeferredTimercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/PromiseDeferredTimer.cpp (215102 => 215103)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/PromiseDeferredTimer.cpp        2017-04-07 18:15:22 UTC (rev 215102)
+++ trunk/Source/JavaScriptCore/runtime/PromiseDeferredTimer.cpp        2017-04-07 18:25:14 UTC (rev 215103)
</span><span class="lines">@@ -44,10 +44,12 @@
</span><span class="cx"> void PromiseDeferredTimer::doWork()
</span><span class="cx"> {
</span><span class="cx">     ASSERT(m_vm-&gt;currentThreadIsHoldingAPILock());
</span><del>-    LockHolder locker(m_taskLock);
</del><ins>+    m_taskLock.lock();
</ins><span class="cx">     cancelTimer();
</span><del>-    if (!m_runTasks)
</del><ins>+    if (!m_runTasks) {
+        m_taskLock.unlock();
</ins><span class="cx">         return;
</span><ins>+    }
</ins><span class="cx"> 
</span><span class="cx">     while (!m_tasks.isEmpty()) {
</span><span class="cx">         JSPromiseDeferred* ticket;
</span><span class="lines">@@ -57,17 +59,27 @@
</span><span class="cx"> 
</span><span class="cx">         // We may have already canceled these promises.
</span><span class="cx">         if (m_pendingPromises.contains(ticket)) {
</span><ins>+            // Allow tasks we run now to schedule work.
+            m_currentlyRunningTask = true;
+            m_taskLock.unlock(); 
+
</ins><span class="cx">             task();
</span><span class="cx">             m_vm-&gt;drainMicrotasks();
</span><ins>+
+            m_taskLock.lock();
+            m_currentlyRunningTask = false;
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (m_pendingPromises.isEmpty() &amp;&amp; m_shouldStopRunLoopWhenAllPromisesFinish)
</del><ins>+    if (m_pendingPromises.isEmpty() &amp;&amp; m_shouldStopRunLoopWhenAllPromisesFinish) {
</ins><span class="cx"> #if USE(CF)
</span><span class="cx">         CFRunLoopStop(m_runLoop.get());
</span><span class="cx"> #else
</span><span class="cx">         RunLoop::current().stop();
</span><span class="cx"> #endif
</span><ins>+    }
+
+    m_taskLock.unlock();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void PromiseDeferredTimer::runRunLoop()
</span><span class="lines">@@ -121,7 +133,7 @@
</span><span class="cx"> {
</span><span class="cx">     LockHolder locker(m_taskLock);
</span><span class="cx">     m_tasks.append(std::make_tuple(ticket, WTFMove(task)));
</span><del>-    if (!isScheduled())
</del><ins>+    if (!isScheduled() &amp;&amp; !m_currentlyRunningTask)
</ins><span class="cx">         scheduleTimer(0);
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimePromiseDeferredTimerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/PromiseDeferredTimer.h (215102 => 215103)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/PromiseDeferredTimer.h        2017-04-07 18:15:22 UTC (rev 215102)
+++ trunk/Source/JavaScriptCore/runtime/PromiseDeferredTimer.h        2017-04-07 18:25:14 UTC (rev 215103)
</span><span class="lines">@@ -64,6 +64,7 @@
</span><span class="cx">     Lock m_taskLock;
</span><span class="cx">     bool m_runTasks { true };
</span><span class="cx">     bool m_shouldStopRunLoopWhenAllPromisesFinish { false };
</span><ins>+    bool m_currentlyRunningTask { false };
</ins><span class="cx">     Vector&lt;std::tuple&lt;JSPromiseDeferred*, Task&gt;&gt; m_tasks;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorewasmWasmB3IRGeneratorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/wasm/WasmB3IRGenerator.cpp (215102 => 215103)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/wasm/WasmB3IRGenerator.cpp        2017-04-07 18:15:22 UTC (rev 215102)
+++ trunk/Source/JavaScriptCore/wasm/WasmB3IRGenerator.cpp        2017-04-07 18:25:14 UTC (rev 215103)
</span><span class="lines">@@ -936,7 +936,7 @@
</span><span class="cx">                 patchpoint-&gt;append(jumpDestination, ValueRep::SomeRegister);
</span><span class="cx">                 // We need to clobber all potential pinned registers since we might be leaving the instance.
</span><span class="cx">                 patchpoint-&gt;clobberLate(PinnedRegisterInfo::get().toSave());
</span><del>-                patchpoint-&gt;setGenerator([unlinkedWasmToWasmCalls, functionIndex, returnType] (CCallHelpers&amp; jit, const B3::StackmapGenerationParams&amp; params) {
</del><ins>+                patchpoint-&gt;setGenerator([functionIndex, returnType] (CCallHelpers&amp; jit, const B3::StackmapGenerationParams&amp; params) {
</ins><span class="cx">                     AllowMacroScratchRegisterUsage allowScratch(jit);
</span><span class="cx">                     jit.call(params[returnType == Void ? 0 : 1].gpr());
</span><span class="cx">                 });
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorewasmWasmBindingcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/wasm/WasmBinding.cpp (215102 => 215103)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/wasm/WasmBinding.cpp        2017-04-07 18:15:22 UTC (rev 215102)
+++ trunk/Source/JavaScriptCore/wasm/WasmBinding.cpp        2017-04-07 18:25:14 UTC (rev 215103)
</span><span class="lines">@@ -49,7 +49,7 @@
</span><span class="cx">     jit.loadPtr(JIT::Address(result, JSWebAssemblyInstance::offsetOfImportFunction(importIndex)), result);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static MacroAssemblerCodeRef wasmToJs(VM* vm, Bag&lt;CallLinkInfo&gt;&amp; callLinkInfos, SignatureIndex signatureIndex, unsigned importIndex)
</del><ins>+MacroAssemblerCodeRef wasmToJs(VM* vm, Bag&lt;CallLinkInfo&gt;&amp; callLinkInfos, SignatureIndex signatureIndex, unsigned importIndex)
</ins><span class="cx"> {
</span><span class="cx">     // FIXME: This function doesn't properly abstract away the calling convention.
</span><span class="cx">     // It'd be super easy to do so: https://bugs.webkit.org/show_bug.cgi?id=169401
</span><span class="lines">@@ -422,7 +422,7 @@
</span><span class="cx">     return FINALIZE_CODE(patchBuffer, (&quot;WebAssembly-&gt;JavaScript import[%i] %s&quot;, importIndex, signature.toString().ascii().data()));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static MacroAssemblerCodeRef wasmToWasm(unsigned importIndex)
</del><ins>+MacroAssemblerCodeRef wasmToWasm(unsigned importIndex)
</ins><span class="cx"> {
</span><span class="cx">     const PinnedRegisterInfo&amp; pinnedRegs = PinnedRegisterInfo::get();
</span><span class="cx">     JIT jit;
</span><span class="lines">@@ -462,14 +462,6 @@
</span><span class="cx">     return FINALIZE_CODE(patchBuffer, (&quot;WebAssembly-&gt;WebAssembly import[%i]&quot;, importIndex));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-WasmExitStubs exitStubGenerator(VM* vm, Bag&lt;CallLinkInfo&gt;&amp; callLinkInfos, SignatureIndex signatureIndex, unsigned importIndex)
-{
-    WasmExitStubs stubs;
-    stubs.wasmToJs = wasmToJs(vm, callLinkInfos, signatureIndex, importIndex);
-    stubs.wasmToWasm = wasmToWasm(importIndex);
-    return stubs;
-}
-
</del><span class="cx"> } } // namespace JSC::Wasm
</span><span class="cx"> 
</span><span class="cx"> #endif // ENABLE(WEBASSEMBLY)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorewasmWasmBindingh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/wasm/WasmBinding.h (215102 => 215103)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/wasm/WasmBinding.h        2017-04-07 18:15:22 UTC (rev 215102)
+++ trunk/Source/JavaScriptCore/wasm/WasmBinding.h        2017-04-07 18:25:14 UTC (rev 215103)
</span><span class="lines">@@ -38,7 +38,8 @@
</span><span class="cx"> 
</span><span class="cx"> namespace Wasm {
</span><span class="cx"> 
</span><del>-WasmExitStubs exitStubGenerator(VM*, Bag&lt;CallLinkInfo&gt;&amp;, SignatureIndex, unsigned);
</del><ins>+MacroAssemblerCodeRef wasmToWasm(unsigned importIndex);
+MacroAssemblerCodeRef wasmToJs(VM*, Bag&lt;CallLinkInfo&gt;&amp; callLinkInfos, SignatureIndex, unsigned importIndex);
</ins><span class="cx"> 
</span><span class="cx"> } } // namespace JSC::Wasm
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorewasmWasmCodeBlockcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/wasm/WasmCodeBlock.cpp (0 => 215103)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/wasm/WasmCodeBlock.cpp                                (rev 0)
+++ trunk/Source/JavaScriptCore/wasm/WasmCodeBlock.cpp        2017-04-07 18:25:14 UTC (rev 215103)
</span><span class="lines">@@ -0,0 +1,125 @@
</span><ins>+
+/*
+ * Copyright (C) 2017 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;WasmCodeBlock.h&quot;
+
+#if ENABLE(WEBASSEMBLY)
+
+#include &quot;WasmPlanInlines.h&quot;
+#include &quot;WasmWorklist.h&quot;
+
+namespace JSC { namespace Wasm {
+
+CodeBlock::CodeBlock(VM&amp; vm, MemoryMode mode, ModuleInformation&amp; moduleInformation)
+    : m_calleeCount(moduleInformation.internalFunctionCount())
+    , m_mode(mode)
+{
+    m_plan = adoptRef(*new Plan(vm, makeRef(moduleInformation), Plan::FullCompile, createSharedTask&lt;Plan::CallbackType&gt;([this] (VM&amp;, Plan&amp;) {
+        // It's safe to use |this| here because our Module owns us, and a Module
+        // can't be destroyed until it has finished compiling its various Wasm bits.
+        // The JS API ensures this invariant by keeping alive the module as it has
+        // a pending promise.
+        auto locker = holdLock(m_lock);
+        if (m_plan-&gt;failed()) {
+            m_errorMessage = m_plan-&gt;errorMessage();
+            m_plan = nullptr;
+            return;
+        }
+
+        m_callees.resize(m_calleeCount * 2);
+        m_plan-&gt;initializeCallees([&amp;] (unsigned calleeIndex, Ref&lt;Wasm::Callee&gt;&amp;&amp; jsEntrypointCallee, Ref&lt;Wasm::Callee&gt;&amp;&amp; wasmEntrypointCallee) {
+            m_callees[calleeIndex] = WTFMove(jsEntrypointCallee);
+            m_callees[calleeIndex + m_calleeCount] = WTFMove(wasmEntrypointCallee);
+        });
+
+        m_wasmToWasmExitStubs = m_plan-&gt;takeWasmToWasmExitStubs();
+
+        m_plan = nullptr;
+    })));
+
+    m_plan-&gt;setMode(mode);
+    auto&amp; worklist = Wasm::ensureWorklist();
+    // Note, immediately after we enqueue the plan, there is a chance the above callback will be called.
+    worklist.enqueue(makeRef(*m_plan.get()));
+}
+
+void CodeBlock::waitUntilFinished()
+{
+    RefPtr&lt;Plan&gt; plan;
+    {
+        auto locker = holdLock(m_lock);
+        plan = m_plan;
+    }
+
+    if (plan) {
+        auto&amp; worklist = Wasm::ensureWorklist();
+        worklist.completePlanSynchronously(*plan.get());
+    }
+    // else, if we don't have a plan, we're already compiled.
+}
+
+void CodeBlock::compileAsync(VM&amp; vm, AsyncCompilationCallback&amp;&amp; task)
+{
+    RefPtr&lt;Plan&gt; plan;
+    {
+        auto locker = holdLock(m_lock);
+        plan = m_plan;
+    }
+
+    if (plan) {
+        // Our lifetime is guaranteed by the JS code by having it
+        // keep alive the JS objects that ensure our lifetime.
+        plan-&gt;addCompletionTask(vm, createSharedTask&lt;Plan::CallbackType&gt;([this, task = WTFMove(task)] (VM&amp; vm, Plan&amp;) {
+            task-&gt;run(vm, makeRef(*this));
+        }));
+    } else
+        task-&gt;run(vm, makeRef(*this));
+}
+
+bool CodeBlock::isSafeToRun(MemoryMode memoryMode)
+{
+    if (!runnable())
+        return false;
+
+    switch (m_mode) {
+    case Wasm::MemoryMode::BoundsChecking:
+        return true;
+    case Wasm::MemoryMode::Signaling:
+        // Code being in Signaling mode means that it performs no bounds checks.
+        // Its memory, even if empty, absolutely must also be in Signaling mode
+        // because the page protection detects out-of-bounds accesses.
+        return memoryMode == Wasm::MemoryMode::Signaling;
+    case Wasm::MemoryMode::NumberOfMemoryModes:
+        break;
+    }
+    RELEASE_ASSERT_NOT_REACHED();
+    return false;
+}
+
+} } // namespace JSC::Wasm
+
+#endif // ENABLE(WEBASSEMBLY)
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorewasmWasmCodeBlockh"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/wasm/WasmCodeBlock.h (0 => 215103)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/wasm/WasmCodeBlock.h                                (rev 0)
+++ trunk/Source/JavaScriptCore/wasm/WasmCodeBlock.h        2017-04-07 18:25:14 UTC (rev 215103)
</span><span class="lines">@@ -0,0 +1,98 @@
</span><ins>+/*
+ * Copyright (C) 2017 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.
+ */
+
+#pragma once
+
+#if ENABLE(WEBASSEMBLY)
+
+#include &quot;WasmCallee.h&quot;
+#include &quot;WasmModuleInformation.h&quot;
+#include &quot;WasmPlan.h&quot;
+#include &lt;wtf/Lock.h&gt;
+#include &lt;wtf/SharedTask.h&gt;
+#include &lt;wtf/ThreadSafeRefCounted.h&gt;
+
+namespace JSC { namespace Wasm {
+    
+class CodeBlock : public ThreadSafeRefCounted&lt;CodeBlock&gt; {
+public:
+    typedef void CallbackType(VM&amp;, Ref&lt;CodeBlock&gt;&amp;&amp;);
+    using AsyncCompilationCallback = RefPtr&lt;WTF::SharedTask&lt;CallbackType&gt;&gt;;
+    static Ref&lt;CodeBlock&gt; create(VM&amp; vm, MemoryMode mode, ModuleInformation&amp; moduleInformation)
+    {
+        return adoptRef(*new CodeBlock(vm, mode, moduleInformation));
+    }
+
+    void waitUntilFinished();
+    void compileAsync(VM&amp;, AsyncCompilationCallback&amp;&amp;);
+
+    bool compilationFinished()
+    {
+        auto locker = holdLock(m_lock);
+        return !m_plan;
+    }
+    bool runnable() { return compilationFinished() &amp;&amp; !m_errorMessage; }
+
+    // Note, we do this copy to ensure it's thread safe to have this
+    // called from multiple threads simultaneously.
+    String errorMessage()
+    {
+        ASSERT(!runnable());
+        CString cString = m_errorMessage.ascii();
+        return String(cString.data());
+    }
+
+    unsigned functionImportCount() const { return m_wasmToWasmExitStubs.size(); }
+
+    Wasm::Callee&amp; jsEntrypointCalleeFromFunctionIndexSpace(unsigned functionIndexSpace)
+    {
+        RELEASE_ASSERT(functionIndexSpace &gt;= functionImportCount());
+        unsigned calleeIndex = functionIndexSpace - functionImportCount();
+        RELEASE_ASSERT(calleeIndex &lt; m_calleeCount);
+        return *m_callees[calleeIndex].get();
+    }
+    Wasm::Callee&amp; wasmEntrypointCalleeFromFunctionIndexSpace(unsigned functionIndexSpace)
+    {
+        RELEASE_ASSERT(functionIndexSpace &gt;= functionImportCount());
+        unsigned calleeIndex = functionIndexSpace - functionImportCount();
+        RELEASE_ASSERT(calleeIndex &lt; m_calleeCount);
+        return *m_callees[calleeIndex + m_calleeCount].get();
+    }
+    bool isSafeToRun(MemoryMode);
+
+private:
+    CodeBlock(VM&amp;, MemoryMode, ModuleInformation&amp;);
+    unsigned m_calleeCount;
+    MemoryMode m_mode;
+    Vector&lt;RefPtr&lt;Callee&gt;&gt; m_callees;
+    Vector&lt;MacroAssemblerCodeRef&gt; m_wasmToWasmExitStubs;
+    RefPtr&lt;Plan&gt; m_plan;
+    String m_errorMessage;
+    Lock m_lock;
+};
+
+} } // namespace JSC::Wasm
+
+#endif // ENABLE(WEBASSEMBLY)
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorewasmWasmModulecpp"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/wasm/WasmModule.cpp (0 => 215103)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/wasm/WasmModule.cpp                                (rev 0)
+++ trunk/Source/JavaScriptCore/wasm/WasmModule.cpp        2017-04-07 18:25:14 UTC (rev 215103)
</span><span class="lines">@@ -0,0 +1,94 @@
</span><ins>+/*
+ * Copyright (C) 2017 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;WasmModule.h&quot;
+
+#if ENABLE(WEBASSEMBLY)
+
+#include &quot;WasmPlanInlines.h&quot;
+
+namespace JSC { namespace Wasm {
+
+Module::Module(Ref&lt;ModuleInformation&gt;&amp;&amp; moduleInformation)
+    : m_moduleInformation(WTFMove(moduleInformation))
+{
+}
+
+static Module::ValidationResult makeValidationResult(Plan&amp; plan)
+{
+    ASSERT(!plan.hasWork());
+    if (plan.failed())
+        return UnexpectedType&lt;String&gt;(plan.errorMessage());
+    return Module::ValidationResult(Module::create(plan.takeModuleInformation()));
+}
+
+Module::ValidationResult Module::validateSyncImpl(Ref&lt;Plan&gt;&amp;&amp; plan)
+{
+    plan-&gt;parseAndValidateModule();
+    return makeValidationResult(plan.get());
+}
+
+Ref&lt;CodeBlock&gt; Module::getOrCreateCodeBlock(VM&amp; vm, MemoryMode mode)
+{
+    RefPtr&lt;CodeBlock&gt; codeBlock;
+    auto locker = holdLock(m_lock);
+    codeBlock = m_codeBlocks[static_cast&lt;uint8_t&gt;(mode)];
+    // If a previous attempt at a compile errored out, let's try again.
+    // Compilations from valid modules can fail because OOM and cancellation.
+    // It's worth retrying.
+    // FIXME: We might want to back off retrying at some point:
+    // https://bugs.webkit.org/show_bug.cgi?id=170607
+    if (!codeBlock || !codeBlock-&gt;runnable()) {
+        codeBlock = CodeBlock::create(vm, mode, const_cast&lt;ModuleInformation&amp;&gt;(moduleInformation()));
+        m_codeBlocks[static_cast&lt;uint8_t&gt;(mode)] = codeBlock;
+    }
+    return codeBlock.releaseNonNull();
+}
+
+Ref&lt;CodeBlock&gt; Module::compileSync(VM&amp; vm, MemoryMode mode)
+{
+    Ref&lt;CodeBlock&gt; codeBlock = getOrCreateCodeBlock(vm, mode);
+    codeBlock-&gt;waitUntilFinished();
+    return codeBlock;
+}
+
+Plan::CompletionTask Module::makeValidationCallback(AsyncValidationCallback&amp;&amp; callback)
+{
+    return createSharedTask&lt;Plan::CallbackType&gt;([callback = WTFMove(callback)] (VM&amp; vm, Plan&amp; plan) {
+        ASSERT(!plan.hasWork());
+        callback-&gt;run(vm, makeValidationResult(plan));
+    });
+}
+
+void Module::compileAsync(VM&amp; vm, MemoryMode mode, CodeBlock::AsyncCompilationCallback&amp;&amp; task)
+{
+    Ref&lt;CodeBlock&gt; codeBlock = getOrCreateCodeBlock(vm, mode);
+    codeBlock-&gt;compileAsync(vm, WTFMove(task));
+}
+
+} } // namespace JSC::Wasm
+
+#endif // ENABLE(WEBASSEMBLY)
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorewasmWasmModuleh"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/wasm/WasmModule.h (0 => 215103)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/wasm/WasmModule.h                                (rev 0)
+++ trunk/Source/JavaScriptCore/wasm/WasmModule.h        2017-04-07 18:25:14 UTC (rev 215103)
</span><span class="lines">@@ -0,0 +1,96 @@
</span><ins>+/*
+ * Copyright (C) 2017 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.
+ */
+
+#pragma once
+
+#if ENABLE(WEBASSEMBLY)
+
+#include &quot;WasmCallee.h&quot;
+#include &quot;WasmCodeBlock.h&quot;
+#include &quot;WasmModuleInformation.h&quot;
+#include &quot;WasmPlan.h&quot;
+#include &quot;WasmWorklist.h&quot;
+#include &lt;wtf/Expected.h&gt;
+#include &lt;wtf/Lock.h&gt;
+#include &lt;wtf/SharedTask.h&gt;
+#include &lt;wtf/ThreadSafeRefCounted.h&gt;
+
+namespace JSC { namespace Wasm {
+    
+class Module : public ThreadSafeRefCounted&lt;Module&gt; {
+public:
+    using ValidationResult = WTF::Expected&lt;RefPtr&lt;Module&gt;, String&gt;;
+    typedef void CallbackType(VM&amp;, ValidationResult&amp;&amp;);
+    using AsyncValidationCallback = RefPtr&lt;SharedTask&lt;CallbackType&gt;&gt;;
+
+    static Ref&lt;Module&gt; create(Ref&lt;ModuleInformation&gt;&amp;&amp; moduleInformation)
+    {
+        return adoptRef(*new Module(WTFMove(moduleInformation)));
+    }
+
+    static ValidationResult validateSync(VM&amp; vm, Vector&lt;uint8_t&gt;&amp;&amp; source)
+    {
+        Ref&lt;Plan&gt; plan = adoptRef(*new Plan(vm, WTFMove(source), Plan::Validation, Plan::dontFinalize()));
+        return validateSyncImpl(WTFMove(plan));
+    }
+
+    static void validateAsync(VM&amp; vm, Vector&lt;uint8_t&gt;&amp;&amp; source, AsyncValidationCallback&amp;&amp; callback)
+    {
+        Ref&lt;Plan&gt; plan = adoptRef(*new Plan(vm, WTFMove(source), Plan::Validation, makeValidationCallback(WTFMove(callback))));
+        Wasm::ensureWorklist().enqueue(WTFMove(plan));
+    }
+
+    Wasm::SignatureIndex signatureIndexFromFunctionIndexSpace(unsigned functionIndexSpace) const
+    {
+        return m_moduleInformation-&gt;signatureIndexFromFunctionIndexSpace(functionIndexSpace);
+    }
+
+    const Wasm::ModuleInformation&amp; moduleInformation() const { return m_moduleInformation.get(); }
+
+    Ref&lt;CodeBlock&gt; compileSync(VM&amp;, MemoryMode);
+    void compileAsync(VM&amp;, MemoryMode, CodeBlock::AsyncCompilationCallback&amp;&amp;);
+
+    Ref&lt;CodeBlock&gt; nonNullCodeBlock(Wasm::MemoryMode mode)
+    {
+        CodeBlock* codeBlock = m_codeBlocks[static_cast&lt;uint8_t&gt;(mode)].get();
+        RELEASE_ASSERT(!!codeBlock);
+        return makeRef(*codeBlock);
+    }
+
+private:
+    Ref&lt;CodeBlock&gt; getOrCreateCodeBlock(VM&amp;, MemoryMode);
+
+    static ValidationResult validateSyncImpl(Ref&lt;Plan&gt;&amp;&amp;);
+    static Plan::CompletionTask makeValidationCallback(AsyncValidationCallback&amp;&amp;);
+
+    Module(Ref&lt;ModuleInformation&gt;&amp;&amp;);
+    Ref&lt;ModuleInformation&gt; m_moduleInformation;
+    RefPtr&lt;CodeBlock&gt; m_codeBlocks[Wasm::NumberOfMemoryModes];
+    Lock m_lock;
+};
+
+} } // namespace JSC::Wasm
+
+#endif // ENABLE(WEBASSEMBLY)
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorewasmWasmPlancpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/wasm/WasmPlan.cpp (215102 => 215103)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/wasm/WasmPlan.cpp        2017-04-07 18:15:22 UTC (rev 215102)
+++ trunk/Source/JavaScriptCore/wasm/WasmPlan.cpp        2017-04-07 18:25:14 UTC (rev 215103)
</span><span class="lines">@@ -52,13 +52,12 @@
</span><span class="cx"> 
</span><span class="cx"> Plan::Plan(VM&amp; vm, Ref&lt;ModuleInformation&gt; info, AsyncWork work, CompletionTask&amp;&amp; task)
</span><span class="cx">     : m_moduleInformation(WTFMove(info))
</span><del>-    , m_vm(vm)
</del><span class="cx">     , m_source(m_moduleInformation-&gt;source.data())
</span><span class="cx">     , m_sourceLength(m_moduleInformation-&gt;source.size())
</span><span class="cx">     , m_state(State::Validated)
</span><span class="cx">     , m_asyncWork(work)
</span><span class="cx"> {
</span><del>-    m_completionTasks.append(WTFMove(task));
</del><ins>+    m_completionTasks.append(std::make_pair(&amp;vm, WTFMove(task)));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Plan::Plan(VM&amp; vm, Vector&lt;uint8_t&gt;&amp;&amp; source, AsyncWork work, CompletionTask&amp;&amp; task)
</span><span class="lines">@@ -69,13 +68,12 @@
</span><span class="cx"> 
</span><span class="cx"> Plan::Plan(VM&amp; vm, const uint8_t* source, size_t sourceLength, AsyncWork work, CompletionTask&amp;&amp; task)
</span><span class="cx">     : m_moduleInformation(makeRef(*new ModuleInformation(Vector&lt;uint8_t&gt;())))
</span><del>-    , m_vm(vm)
</del><span class="cx">     , m_source(source)
</span><span class="cx">     , m_sourceLength(sourceLength)
</span><span class="cx">     , m_state(State::Initial)
</span><span class="cx">     , m_asyncWork(work)
</span><span class="cx"> {
</span><del>-    m_completionTasks.append(WTFMove(task));
</del><ins>+    m_completionTasks.append(std::make_pair(&amp;vm, WTFMove(task)));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> const char* Plan::stateString(State state)
</span><span class="lines">@@ -104,13 +102,13 @@
</span><span class="cx">     complete(locker);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Plan::addCompletionTask(CompletionTask&amp;&amp; task)
</del><ins>+void Plan::addCompletionTask(VM&amp; vm, CompletionTask&amp;&amp; task)
</ins><span class="cx"> {
</span><span class="cx">     LockHolder locker(m_lock);
</span><span class="cx">     if (m_state != State::Completed)
</span><del>-        m_completionTasks.append(WTFMove(task));
</del><ins>+        m_completionTasks.append(std::make_pair(&amp;vm, WTFMove(task)));
</ins><span class="cx">     else
</span><del>-        task(*this);
</del><ins>+        task-&gt;run(vm, *this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool Plan::parseAndValidateModule()
</span><span class="lines">@@ -182,7 +180,7 @@
</span><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     const auto&amp; functionLocations = m_moduleInformation-&gt;functionLocationInBinary;
</span><del>-    if (!tryReserveCapacity(m_wasmExitStubs, m_moduleInformation-&gt;importFunctionSignatureIndices.size(), &quot; WebAssembly to JavaScript stubs&quot;)
</del><ins>+    if (!tryReserveCapacity(m_wasmToWasmExitStubs, m_moduleInformation-&gt;importFunctionSignatureIndices.size(), &quot; WebAssembly to JavaScript stubs&quot;)
</ins><span class="cx">         || !tryReserveCapacity(m_unlinkedWasmToWasmCalls, functionLocations.size(), &quot; unlinked WebAssembly to WebAssembly calls&quot;)
</span><span class="cx">         || !tryReserveCapacity(m_wasmInternalFunctions, functionLocations.size(), &quot; WebAssembly functions&quot;)
</span><span class="cx">         || !tryReserveCapacity(m_compilationContexts, functionLocations.size(), &quot; compilation contexts&quot;))
</span><span class="lines">@@ -196,10 +194,9 @@
</span><span class="cx">         Import* import = &amp;m_moduleInformation-&gt;imports[importIndex];
</span><span class="cx">         if (import-&gt;kind != ExternalKind::Function)
</span><span class="cx">             continue;
</span><del>-        unsigned importFunctionIndex = m_wasmExitStubs.size();
</del><ins>+        unsigned importFunctionIndex = m_wasmToWasmExitStubs.size();
</ins><span class="cx">         dataLogLnIf(verbose, &quot;Processing import function number &quot;, importFunctionIndex, &quot;: &quot;, makeString(import-&gt;module), &quot;: &quot;, makeString(import-&gt;field));
</span><del>-        SignatureIndex signatureIndex = m_moduleInformation-&gt;importFunctionSignatureIndices.at(import-&gt;kindIndex);
-        m_wasmExitStubs.uncheckedAppend(exitStubGenerator(&amp;m_vm, m_callLinkInfos, signatureIndex, importFunctionIndex));
</del><ins>+        m_wasmToWasmExitStubs.uncheckedAppend(wasmToWasm(importFunctionIndex));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     moveToState(State::Prepared);
</span><span class="lines">@@ -260,7 +257,7 @@
</span><span class="cx">         ASSERT(functionLength &lt;= m_sourceLength);
</span><span class="cx">         SignatureIndex signatureIndex = m_moduleInformation-&gt;internalFunctionSignatureIndices[functionIndex];
</span><span class="cx">         const Signature&amp; signature = SignatureInformation::get(signatureIndex);
</span><del>-        unsigned functionIndexSpace = m_wasmExitStubs.size() + functionIndex;
</del><ins>+        unsigned functionIndexSpace = m_wasmToWasmExitStubs.size() + functionIndex;
</ins><span class="cx">         ASSERT_UNUSED(functionIndexSpace, m_moduleInformation-&gt;signatureIndexFromFunctionIndexSpace(functionIndexSpace) == signatureIndex);
</span><span class="cx">         ASSERT(validateFunction(functionStart, functionLength, signature, m_moduleInformation.get()));
</span><span class="cx"> 
</span><span class="lines">@@ -316,9 +313,9 @@
</span><span class="cx">                 void* executableAddress;
</span><span class="cx">                 if (m_moduleInformation-&gt;isImportedFunctionFromFunctionIndexSpace(call.functionIndex)) {
</span><span class="cx">                     // FIXME imports could have been linked in B3, instead of generating a patchpoint. This condition should be replaced by a RELEASE_ASSERT. https://bugs.webkit.org/show_bug.cgi?id=166462
</span><del>-                    executableAddress = m_wasmExitStubs.at(call.functionIndex).wasmToWasm.code().executableAddress();
</del><ins>+                    executableAddress = m_wasmToWasmExitStubs.at(call.functionIndex).code().executableAddress();
</ins><span class="cx">                 } else
</span><del>-                    executableAddress = m_wasmInternalFunctions.at(call.functionIndex - m_wasmExitStubs.size())-&gt;wasmEntrypoint.compilation-&gt;code().executableAddress();
</del><ins>+                    executableAddress = m_wasmInternalFunctions.at(call.functionIndex - m_wasmToWasmExitStubs.size())-&gt;wasmEntrypoint.compilation-&gt;code().executableAddress();
</ins><span class="cx">                 MacroAssembler::repatchCall(call.callLocation, CodeLocationLabel(executableAddress));
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="lines">@@ -327,7 +324,7 @@
</span><span class="cx">     if (m_state != State::Completed) {
</span><span class="cx">         moveToState(State::Completed);
</span><span class="cx">         for (auto&amp; task : m_completionTasks)
</span><del>-            task(*this);
</del><ins>+            task.second-&gt;run(*task.first, *this);
</ins><span class="cx">         m_completed.notifyAll();
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -341,13 +338,32 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Plan::cancel()
</del><ins>+bool Plan::tryRemoveVMAndCancelIfLast(VM&amp; vm)
</ins><span class="cx"> {
</span><span class="cx">     LockHolder locker(m_lock);
</span><del>-    if (m_state != State::Completed) {
</del><ins>+
+    bool removedAnyTasks = false;
+    m_completionTasks.removeAllMatching([&amp;] (const std::pair&lt;VM*, CompletionTask&gt;&amp; pair) {
+        bool shouldRemove = pair.first == &amp;vm;
+        removedAnyTasks |= shouldRemove;
+        return shouldRemove;
+    });
+
+    if (!removedAnyTasks)
+        return false;
+
+    if (m_state == State::Completed) {
+        // We trivially cancel anything that's completed.
+        return true;
+    }
+
+    if (m_completionTasks.isEmpty()) {
</ins><span class="cx">         m_currentIndex = m_moduleInformation-&gt;functionLocationInBinary.size();
</span><del>-        fail(locker, ASCIILiteral(&quot;WebAssembly Plan was canceled. If you see this error message please file a bug at bugs.webkit.org!&quot;));
</del><ins>+        fail(locker, ASCIILiteral(&quot;WebAssembly Plan was cancelled. If you see this error message please file a bug at bugs.webkit.org!&quot;));
+        return true;
</ins><span class="cx">     }
</span><ins>+
+    return false;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Plan::~Plan() { }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorewasmWasmPlanh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/wasm/WasmPlan.h (215102 => 215103)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/wasm/WasmPlan.h        2017-04-07 18:15:22 UTC (rev 215102)
+++ trunk/Source/JavaScriptCore/wasm/WasmPlan.h        2017-04-07 18:25:14 UTC (rev 215103)
</span><span class="lines">@@ -32,6 +32,7 @@
</span><span class="cx"> #include &quot;WasmB3IRGenerator.h&quot;
</span><span class="cx"> #include &quot;WasmModuleInformation.h&quot;
</span><span class="cx"> #include &lt;wtf/Bag.h&gt;
</span><ins>+#include &lt;wtf/SharedTask.h&gt;
</ins><span class="cx"> #include &lt;wtf/ThreadSafeRefCounted.h&gt;
</span><span class="cx"> #include &lt;wtf/Vector.h&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -45,8 +46,9 @@
</span><span class="cx"> 
</span><span class="cx"> class Plan : public ThreadSafeRefCounted&lt;Plan&gt; {
</span><span class="cx"> public:
</span><del>-    static void dontFinalize(Plan&amp;) { }
-    typedef std::function&lt;void(Plan&amp;)&gt; CompletionTask;
</del><ins>+    typedef void CallbackType(VM&amp;, Plan&amp;);
+    using CompletionTask = RefPtr&lt;SharedTask&lt;CallbackType&gt;&gt;;
+    static CompletionTask dontFinalize() { return createSharedTask&lt;CallbackType&gt;([](VM&amp;, Plan&amp;) { }); }
</ins><span class="cx">     enum AsyncWork : uint8_t { FullCompile, Validation };
</span><span class="cx">     // Note: CompletionTask should not hold a reference to the Plan otherwise there will be a reference cycle.
</span><span class="cx">     Plan(VM&amp;, Ref&lt;ModuleInformation&gt;, AsyncWork, CompletionTask&amp;&amp;);
</span><span class="lines">@@ -56,7 +58,9 @@
</span><span class="cx">     JS_EXPORT_PRIVATE Plan(VM&amp;, const uint8_t*, size_t, AsyncWork, CompletionTask&amp;&amp;);
</span><span class="cx">     JS_EXPORT_PRIVATE ~Plan();
</span><span class="cx"> 
</span><del>-    void addCompletionTask(CompletionTask&amp;&amp;);
</del><ins>+    // If you guarantee the ordering here, you can rely on FIFO of the
+    // completion tasks being called.
+    void addCompletionTask(VM&amp;, CompletionTask&amp;&amp;);
</ins><span class="cx"> 
</span><span class="cx">     bool parseAndValidateModule();
</span><span class="cx"> 
</span><span class="lines">@@ -91,15 +95,14 @@
</span><span class="cx">         return WTFMove(m_callLinkInfos);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    Vector&lt;WasmExitStubs&gt;&amp;&amp; takeWasmExitStubs()
</del><ins>+    Vector&lt;MacroAssemblerCodeRef&gt;&amp;&amp; takeWasmToWasmExitStubs()
</ins><span class="cx">     {
</span><span class="cx">         RELEASE_ASSERT(!failed() &amp;&amp; !hasWork());
</span><del>-        return WTFMove(m_wasmExitStubs);
</del><ins>+        return WTFMove(m_wasmToWasmExitStubs);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     void setMode(MemoryMode mode) { m_mode = mode; }
</span><span class="cx">     MemoryMode mode() const { return m_mode; }
</span><del>-    VM&amp; vm() const { return m_vm; }
</del><span class="cx"> 
</span><span class="cx">     enum class State : uint8_t {
</span><span class="cx">         Initial,
</span><span class="lines">@@ -116,7 +119,8 @@
</span><span class="cx">     bool hasBeenPrepared() const { return m_state &gt;= State::Prepared; }
</span><span class="cx"> 
</span><span class="cx">     void waitForCompletion();
</span><del>-    void cancel();
</del><ins>+    // Returns true if it cancelled the plan.
+    bool tryRemoveVMAndCancelIfLast(VM&amp;);
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     class ThreadCountHolder;
</span><span class="lines">@@ -131,12 +135,11 @@
</span><span class="cx"> 
</span><span class="cx">     Ref&lt;ModuleInformation&gt; m_moduleInformation;
</span><span class="cx">     Bag&lt;CallLinkInfo&gt; m_callLinkInfos;
</span><del>-    Vector&lt;WasmExitStubs&gt; m_wasmExitStubs;
</del><ins>+    Vector&lt;MacroAssemblerCodeRef&gt; m_wasmToWasmExitStubs;
</ins><span class="cx">     Vector&lt;std::unique_ptr&lt;WasmInternalFunction&gt;&gt; m_wasmInternalFunctions;
</span><span class="cx">     Vector&lt;CompilationContext&gt; m_compilationContexts;
</span><span class="cx"> 
</span><del>-    VM&amp; m_vm;
-    Vector&lt;CompletionTask, 1&gt; m_completionTasks;
</del><ins>+    Vector&lt;std::pair&lt;VM*, CompletionTask&gt;, 1&gt; m_completionTasks;
</ins><span class="cx"> 
</span><span class="cx">     Vector&lt;Vector&lt;UnlinkedWasmToWasmCall&gt;&gt; m_unlinkedWasmToWasmCalls;
</span><span class="cx">     const uint8_t* m_source;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorewasmWasmWorklistcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/wasm/WasmWorklist.cpp (215102 => 215103)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/wasm/WasmWorklist.cpp        2017-04-07 18:15:22 UTC (rev 215102)
+++ trunk/Source/JavaScriptCore/wasm/WasmWorklist.cpp        2017-04-07 18:25:14 UTC (rev 215103)
</span><span class="lines">@@ -217,18 +217,19 @@
</span><span class="cx"> {
</span><span class="cx">     LockHolder locker(*m_lock);
</span><span class="cx">     iterate(locker, [&amp;] (QueueElement&amp; element) {
</span><del>-        if (&amp;element.plan-&gt;vm() == &amp;vm) {
-            element.plan-&gt;cancel();
</del><ins>+        bool didCancel = element.plan-&gt;tryRemoveVMAndCancelIfLast(vm);
+        if (didCancel)
</ins><span class="cx">             return IterateResult::DropAndContinue;
</span><del>-        }
</del><span class="cx">         return IterateResult::Continue;
</span><span class="cx">     });
</span><span class="cx"> 
</span><span class="cx">     for (auto&amp; thread : m_threads) {
</span><del>-        if (thread-&gt;element.plan &amp;&amp; &amp;thread-&gt;element.plan-&gt;vm() == &amp;vm) {
-            // We don't have to worry about the deadlocking since the thread can't block without clearing the plan and must hold the lock to do so.
-            thread-&gt;element.plan-&gt;cancel();
-            thread-&gt;synchronize.wait(*m_lock);
</del><ins>+        if (thread-&gt;element.plan) {
+            bool didCancel = thread-&gt;element.plan-&gt;tryRemoveVMAndCancelIfLast(vm);
+            if (didCancel) {
+                // We don't have to worry about the deadlocking since the thread can't block without clearing the plan and must hold the lock to do so.
+                thread-&gt;synchronize.wait(*m_lock);
+            }
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorewasmjsJSWebAssemblyCodeBlockcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/wasm/js/JSWebAssemblyCodeBlock.cpp (215102 => 215103)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/wasm/js/JSWebAssemblyCodeBlock.cpp        2017-04-07 18:15:22 UTC (rev 215102)
+++ trunk/Source/JavaScriptCore/wasm/js/JSWebAssemblyCodeBlock.cpp        2017-04-07 18:25:14 UTC (rev 215103)
</span><span class="lines">@@ -32,55 +32,27 @@
</span><span class="cx"> #include &quot;JSWebAssemblyLinkError.h&quot;
</span><span class="cx"> #include &quot;JSWebAssemblyMemory.h&quot;
</span><span class="cx"> #include &quot;JSWebAssemblyModule.h&quot;
</span><ins>+#include &quot;WasmBinding.h&quot;
</ins><span class="cx"> #include &quot;WasmPlanInlines.h&quot;
</span><span class="cx"> 
</span><ins>+#include &lt;wtf/CurrentTime.h&gt;
+
</ins><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><span class="cx"> const ClassInfo JSWebAssemblyCodeBlock::s_info = { &quot;WebAssemblyCodeBlock&quot;, nullptr, 0, CREATE_METHOD_TABLE(JSWebAssemblyCodeBlock) };
</span><span class="cx"> 
</span><del>-JSWebAssemblyCodeBlock::JSWebAssemblyCodeBlock(VM&amp; vm, JSWebAssemblyModule* owner,  Wasm::MemoryMode mode, Ref&lt;Wasm::Plan&gt;&amp;&amp; plan, unsigned calleeCount)
</del><ins>+JSWebAssemblyCodeBlock::JSWebAssemblyCodeBlock(VM&amp; vm, Ref&lt;Wasm::CodeBlock&gt;&amp;&amp; codeBlock, const Wasm::ModuleInformation&amp; moduleInformation)
</ins><span class="cx">     : Base(vm, vm.webAssemblyCodeBlockStructure.get())
</span><del>-    , m_plan(WTFMove(plan))
-    , m_mode(mode)
-    , m_calleeCount(calleeCount)
</del><ins>+    , m_codeBlock(WTFMove(codeBlock))
</ins><span class="cx"> {
</span><del>-    m_module.set(vm, this, owner);
-    ASSERT(!module()-&gt;codeBlock(mode));
-    module()-&gt;setCodeBlock(vm, mode, this);
-    m_callees.resize(m_calleeCount * 2);
-}
-
-void JSWebAssemblyCodeBlock::initialize()
-{
-    if (initialized())
-        return;
-
-    VM&amp; vm = plan().vm();
-    ASSERT_UNUSED(vm, vm.currentThreadIsHoldingAPILock());
-    RELEASE_ASSERT(!plan().hasWork());
-
-    if (plan().failed()) {
-        m_errorMessage = plan().errorMessage();
-        m_plan = nullptr;
-        return;
</del><ins>+    // FIXME: We should not need to do this synchronously.
+    // https://bugs.webkit.org/show_bug.cgi?id=170567
+    m_wasmToJSExitStubs.reserveCapacity(m_codeBlock-&gt;functionImportCount());
+    for (unsigned importIndex = 0; importIndex &lt; m_codeBlock-&gt;functionImportCount(); ++importIndex) {
+        Wasm::SignatureIndex signatureIndex = moduleInformation.importFunctionSignatureIndices.at(importIndex);
+        m_wasmToJSExitStubs.uncheckedAppend(Wasm::wasmToJs(&amp;vm, m_callLinkInfos, signatureIndex, importIndex));
+        importWasmToJSStub(importIndex) = m_wasmToJSExitStubs[importIndex].code().executableAddress();
</ins><span class="cx">     }
</span><del>-
-    RELEASE_ASSERT(plan().mode() == mode());
-    ASSERT(plan().internalFunctionCount() == m_calleeCount);
-
-    m_callLinkInfos = plan().takeCallLinkInfos();
-    m_wasmExitStubs = plan().takeWasmExitStubs();
-
-    // The code a module emits to call into JS relies on us to set this up.
-    for (unsigned i = 0; i &lt; m_wasmExitStubs.size(); i++)
-        importWasmToJSStub(i) = m_wasmExitStubs[i].wasmToJs.code().executableAddress();
-
-    plan().initializeCallees([&amp;] (unsigned calleeIndex, Ref&lt;Wasm::Callee&gt;&amp;&amp; jsEntrypointCallee, Ref&lt;Wasm::Callee&gt;&amp;&amp; wasmEntrypointCallee) {
-        setJSEntrypointCallee(calleeIndex, WTFMove(jsEntrypointCallee));
-        setWasmEntrypointCallee(calleeIndex, WTFMove(wasmEntrypointCallee));
-    });
-
-    m_plan = nullptr;
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void JSWebAssemblyCodeBlock::destroy(JSCell* cell)
</span><span class="lines">@@ -90,24 +62,7 @@
</span><span class="cx"> 
</span><span class="cx"> bool JSWebAssemblyCodeBlock::isSafeToRun(JSWebAssemblyMemory* memory) const
</span><span class="cx"> {
</span><del>-    if (!runnable())
-        return false;
-
-    Wasm::MemoryMode codeMode = mode();
-    Wasm::MemoryMode memoryMode = memory-&gt;memory().mode();
-    switch (codeMode) {
-    case Wasm::MemoryMode::BoundsChecking:
-        return true;
-    case Wasm::MemoryMode::Signaling:
-        // Code being in Signaling mode means that it performs no bounds checks.
-        // Its memory, even if empty, absolutely must also be in Signaling mode
-        // because the page protection detects out-of-bounds accesses.
-        return memoryMode == Wasm::MemoryMode::Signaling;
-    case Wasm::MemoryMode::NumberOfMemoryModes:
-        break;
-    }
-    RELEASE_ASSERT_NOT_REACHED();
-    return false;
</del><ins>+    return m_codeBlock-&gt;isSafeToRun(memory-&gt;memory().mode());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void JSWebAssemblyCodeBlock::visitChildren(JSCell* cell, SlotVisitor&amp; visitor)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorewasmjsJSWebAssemblyCodeBlockh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/wasm/js/JSWebAssemblyCodeBlock.h (215102 => 215103)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/wasm/js/JSWebAssemblyCodeBlock.h        2017-04-07 18:15:22 UTC (rev 215102)
+++ trunk/Source/JavaScriptCore/wasm/js/JSWebAssemblyCodeBlock.h        2017-04-07 18:25:14 UTC (rev 215103)
</span><span class="lines">@@ -33,6 +33,7 @@
</span><span class="cx"> #include &quot;UnconditionalFinalizer.h&quot;
</span><span class="cx"> #include &quot;WasmCallee.h&quot;
</span><span class="cx"> #include &quot;WasmFormat.h&quot;
</span><ins>+#include &quot;WasmModule.h&quot;
</ins><span class="cx"> #include &lt;wtf/Bag.h&gt;
</span><span class="cx"> #include &lt;wtf/Vector.h&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -50,9 +51,9 @@
</span><span class="cx">     typedef JSCell Base;
</span><span class="cx">     static const unsigned StructureFlags = Base::StructureFlags | StructureIsImmortal;
</span><span class="cx"> 
</span><del>-    static JSWebAssemblyCodeBlock* create(VM&amp; vm, JSWebAssemblyModule* owner, Wasm::MemoryMode mode, Ref&lt;Wasm::Plan&gt;&amp;&amp; plan, unsigned calleeCount, unsigned functionImportCount)
</del><ins>+    static JSWebAssemblyCodeBlock* create(VM&amp; vm, Ref&lt;Wasm::CodeBlock&gt; codeBlock, const Wasm::ModuleInformation&amp; moduleInformation)
</ins><span class="cx">     {
</span><del>-        auto* result = new (NotNull, allocateCell&lt;JSWebAssemblyCodeBlock&gt;(vm.heap, allocationSize(functionImportCount))) JSWebAssemblyCodeBlock(vm, owner, mode, WTFMove(plan), calleeCount);
</del><ins>+        auto* result = new (NotNull, allocateCell&lt;JSWebAssemblyCodeBlock&gt;(vm.heap, allocationSize(moduleInformation.importFunctionCount()))) JSWebAssemblyCodeBlock(vm, WTFMove(codeBlock), moduleInformation);
</ins><span class="cx">         result-&gt;finishCreation(vm);
</span><span class="cx">         return result;
</span><span class="cx">     }
</span><span class="lines">@@ -62,40 +63,25 @@
</span><span class="cx">         return Structure::create(vm, globalObject, prototype, TypeInfo(CellType, StructureFlags), info());
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    unsigned functionImportCount() const { return m_wasmExitStubs.size(); }
-    Wasm::MemoryMode mode() const { return m_mode; }
</del><ins>+    unsigned functionImportCount() const { return m_codeBlock-&gt;functionImportCount(); }
</ins><span class="cx">     JSWebAssemblyModule* module() const { return m_module.get(); }
</span><span class="cx"> 
</span><del>-    // Don't call intialize directly, this should be called for you, as needed, by JSWebAssemblyInstance::finalizeCreation.
-    void initialize();
-    bool initialized() const { return !m_plan; }
-
-    Wasm::Plan&amp; plan() const { ASSERT(!initialized()); return *m_plan; }
-
-    bool runnable() const { return initialized() &amp;&amp; !m_errorMessage; }
-    String&amp; errorMessage() { ASSERT(!runnable()); return m_errorMessage; }
</del><span class="cx">     bool isSafeToRun(JSWebAssemblyMemory*) const;
</span><span class="cx"> 
</span><span class="cx">     // These two callee getters are only valid once the callees have been populated.
</span><ins>+
</ins><span class="cx">     Wasm::Callee&amp; jsEntrypointCalleeFromFunctionIndexSpace(unsigned functionIndexSpace)
</span><span class="cx">     {
</span><del>-        RELEASE_ASSERT(functionIndexSpace &gt;= functionImportCount());
-        unsigned calleeIndex = functionIndexSpace - functionImportCount();
-        RELEASE_ASSERT(calleeIndex &lt; m_calleeCount);
-        return *m_callees[calleeIndex].get();
</del><ins>+        return m_codeBlock-&gt;jsEntrypointCalleeFromFunctionIndexSpace(functionIndexSpace);
</ins><span class="cx">     }
</span><span class="cx">     Wasm::Callee&amp; wasmEntrypointCalleeFromFunctionIndexSpace(unsigned functionIndexSpace)
</span><span class="cx">     {
</span><del>-        RELEASE_ASSERT(functionIndexSpace &gt;= functionImportCount());
-        unsigned calleeIndex = functionIndexSpace - functionImportCount();
-        RELEASE_ASSERT(calleeIndex &lt; m_calleeCount);
-        return *m_callees[calleeIndex + m_calleeCount].get();
</del><ins>+        return m_codeBlock-&gt;wasmEntrypointCalleeFromFunctionIndexSpace(functionIndexSpace);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     void* wasmToJsCallStubForImport(unsigned importIndex)
</span><span class="cx">     {
</span><del>-        RELEASE_ASSERT(importIndex &lt; m_wasmExitStubs.size());
-        return m_wasmExitStubs[importIndex].wasmToJs.code().executableAddress();
</del><ins>+        return importWasmToJSStub(importIndex);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     static ptrdiff_t offsetOfImportWasmToJSStub(unsigned importIndex)
</span><span class="lines">@@ -104,18 +90,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    void setJSEntrypointCallee(unsigned calleeIndex, Ref&lt;Wasm::Callee&gt;&amp;&amp; callee)
-    {
-        RELEASE_ASSERT(calleeIndex &lt; m_calleeCount);
-        m_callees[calleeIndex] = WTFMove(callee);
-    }
-    void setWasmEntrypointCallee(unsigned calleeIndex, Ref&lt;Wasm::Callee&gt;&amp;&amp; callee)
-    {
-        RELEASE_ASSERT(calleeIndex &lt; m_calleeCount);
-        m_callees[calleeIndex + m_calleeCount] = WTFMove(callee);
-    }
-
-    JSWebAssemblyCodeBlock(VM&amp;, JSWebAssemblyModule*, Wasm::MemoryMode, Ref&lt;Wasm::Plan&gt;&amp;&amp;, unsigned calleeCount);
</del><ins>+    JSWebAssemblyCodeBlock(VM&amp;, Ref&lt;Wasm::CodeBlock&gt;&amp;&amp;, const Wasm::ModuleInformation&amp;);
</ins><span class="cx">     DECLARE_EXPORT_INFO;
</span><span class="cx">     static const bool needsDestruction = true;
</span><span class="cx">     static void destroy(JSCell*);
</span><span class="lines">@@ -141,15 +116,10 @@
</span><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     WriteBarrier&lt;JSWebAssemblyModule&gt; m_module;
</span><ins>+    Ref&lt;Wasm::CodeBlock&gt; m_codeBlock;
+    Vector&lt;MacroAssemblerCodeRef&gt; m_wasmToJSExitStubs;
</ins><span class="cx">     UnconditionalFinalizer m_unconditionalFinalizer;
</span><span class="cx">     Bag&lt;CallLinkInfo&gt; m_callLinkInfos;
</span><del>-    Vector&lt;Wasm::WasmExitStubs&gt; m_wasmExitStubs;
-    Vector&lt;RefPtr&lt;Wasm::Callee&gt;&gt; m_callees;
-    // The plan that is compiling this code block.
-    RefPtr&lt;Wasm::Plan&gt; m_plan;
-    String m_errorMessage;
-    Wasm::MemoryMode m_mode;
-    unsigned m_calleeCount;
</del><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace JSC
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorewasmjsJSWebAssemblyInstancecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/wasm/js/JSWebAssemblyInstance.cpp (215102 => 215103)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/wasm/js/JSWebAssemblyInstance.cpp        2017-04-07 18:15:22 UTC (rev 215102)
+++ trunk/Source/JavaScriptCore/wasm/js/JSWebAssemblyInstance.cpp        2017-04-07 18:25:14 UTC (rev 215103)
</span><span class="lines">@@ -94,25 +94,18 @@
</span><span class="cx">         visitor.append(thisObject-&gt;importFunctions()[i]);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void JSWebAssemblyInstance::addUnitializedCodeBlock(VM&amp; vm, Ref&lt;Wasm::Plan&gt; plan)
</del><ins>+void JSWebAssemblyInstance::finalizeCreation(VM&amp; vm, ExecState* exec, Ref&lt;Wasm::CodeBlock&gt;&amp;&amp; wasmCodeBlock)
</ins><span class="cx"> {
</span><del>-    auto* codeBlock = JSWebAssemblyCodeBlock::create(
-        vm, module(), memoryMode(), WTFMove(plan), module()-&gt;moduleInformation().internalFunctionCount(), module()-&gt;moduleInformation().importFunctionCount());
-    m_codeBlock.set(vm, this, codeBlock);
-    ASSERT(!codeBlock-&gt;initialized());
-}
-
-void JSWebAssemblyInstance::finalizeCreation(VM&amp; vm, ExecState* exec)
-{
</del><span class="cx">     auto scope = DECLARE_THROW_SCOPE(vm);
</span><del>-    codeBlock()-&gt;initialize();
-
-    if (!codeBlock()-&gt;runnable()) {
-        throwException(exec, scope, JSWebAssemblyLinkError::create(exec, vm, globalObject()-&gt;WebAssemblyLinkErrorStructure(), codeBlock()-&gt;errorMessage()));
</del><ins>+    if (!wasmCodeBlock-&gt;runnable()) {
+        throwException(exec, scope, JSWebAssemblyLinkError::create(exec, vm, globalObject()-&gt;WebAssemblyLinkErrorStructure(), wasmCodeBlock-&gt;errorMessage()));
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><del>-    RELEASE_ASSERT(codeBlock()-&gt;isSafeToRun(memory()));
</del><span class="cx"> 
</span><ins>+    RELEASE_ASSERT(wasmCodeBlock-&gt;isSafeToRun(memory()-&gt;memory().mode()));
+    m_codeBlock.set(vm, this,
+        JSWebAssemblyCodeBlock::create(vm, wasmCodeBlock.copyRef(), m_module-&gt;module().moduleInformation()));
+
</ins><span class="cx">     auto* moduleRecord = jsCast&lt;WebAssemblyModuleRecord*&gt;(m_moduleNamespaceObject-&gt;moduleRecord());
</span><span class="cx">     moduleRecord-&gt;link(exec, module(), this);
</span><span class="cx">     RETURN_IF_EXCEPTION(scope, void());
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorewasmjsJSWebAssemblyInstanceh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/wasm/js/JSWebAssemblyInstance.h (215102 => 215103)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/wasm/js/JSWebAssemblyInstance.h        2017-04-07 18:15:22 UTC (rev 215102)
+++ trunk/Source/JavaScriptCore/wasm/js/JSWebAssemblyInstance.h        2017-04-07 18:25:14 UTC (rev 215103)
</span><span class="lines">@@ -39,11 +39,6 @@
</span><span class="cx"> class JSWebAssemblyModule;
</span><span class="cx"> class WebAssemblyToJSCallee;
</span><span class="cx"> 
</span><del>-namespace Wasm {
-class Plan;
-}
-
-
</del><span class="cx"> class JSWebAssemblyInstance : public JSDestructibleObject {
</span><span class="cx"> public:
</span><span class="cx">     typedef JSDestructibleObject Base;
</span><span class="lines">@@ -54,9 +49,7 @@
</span><span class="cx">     DECLARE_EXPORT_INFO;
</span><span class="cx"> 
</span><span class="cx">     JSWebAssemblyCodeBlock* codeBlock() const { return m_codeBlock.get(); }
</span><del>-    bool initialized() const { return codeBlock() &amp;&amp; codeBlock()-&gt;initialized(); }
-    void addUnitializedCodeBlock(VM&amp;, Ref&lt;Wasm::Plan&gt;);
-    void finalizeCreation(VM&amp;, ExecState*);
</del><ins>+    void finalizeCreation(VM&amp;, ExecState*, Ref&lt;Wasm::CodeBlock&gt;&amp;&amp;);
</ins><span class="cx"> 
</span><span class="cx">     JSWebAssemblyModule* module() const { return m_module.get(); }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorewasmjsJSWebAssemblyModulecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/wasm/js/JSWebAssemblyModule.cpp (215102 => 215103)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/wasm/js/JSWebAssemblyModule.cpp        2017-04-07 18:15:22 UTC (rev 215102)
+++ trunk/Source/JavaScriptCore/wasm/js/JSWebAssemblyModule.cpp        2017-04-07 18:25:14 UTC (rev 215103)
</span><span class="lines">@@ -43,16 +43,15 @@
</span><span class="cx"> 
</span><span class="cx"> const ClassInfo JSWebAssemblyModule::s_info = { &quot;WebAssembly.Module&quot;, &amp;Base::s_info, nullptr, CREATE_METHOD_TABLE(JSWebAssemblyModule) };
</span><span class="cx"> 
</span><del>-JSWebAssemblyModule* JSWebAssemblyModule::createStub(VM&amp; vm, ExecState* exec, Structure* structure, RefPtr&lt;Wasm::Plan&gt;&amp;&amp; plan)
</del><ins>+JSWebAssemblyModule* JSWebAssemblyModule::createStub(VM&amp; vm, ExecState* exec, Structure* structure, Wasm::Module::ValidationResult&amp;&amp; result)
</ins><span class="cx"> {
</span><del>-    ASSERT(!plan-&gt;hasWork());
</del><span class="cx">     auto scope = DECLARE_THROW_SCOPE(vm);
</span><del>-    if (plan-&gt;failed()) {
-        throwException(exec, scope, JSWebAssemblyCompileError::create(exec, vm, structure-&gt;globalObject()-&gt;WebAssemblyCompileErrorStructure(), plan-&gt;errorMessage()));
</del><ins>+    if (!result.hasValue()) {
+        throwException(exec, scope, JSWebAssemblyCompileError::create(exec, vm, structure-&gt;globalObject()-&gt;WebAssemblyCompileErrorStructure(), result.error()));
</ins><span class="cx">         return nullptr;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    auto* module = new (NotNull, allocateCell&lt;JSWebAssemblyModule&gt;(vm.heap)) JSWebAssemblyModule(vm, structure, *plan.get());
</del><ins>+    auto* module = new (NotNull, allocateCell&lt;JSWebAssemblyModule&gt;(vm.heap)) JSWebAssemblyModule(vm, structure, result.value().releaseNonNull());
</ins><span class="cx">     module-&gt;finishCreation(vm);
</span><span class="cx">     return module;
</span><span class="cx"> }
</span><span class="lines">@@ -62,9 +61,9 @@
</span><span class="cx">     return Structure::create(vm, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), info());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-JSWebAssemblyModule::JSWebAssemblyModule(VM&amp; vm, Structure* structure, Wasm::Plan&amp; plan)
</del><ins>+JSWebAssemblyModule::JSWebAssemblyModule(VM&amp; vm, Structure* structure, Ref&lt;Wasm::Module&gt;&amp;&amp; module)
</ins><span class="cx">     : Base(vm, structure)
</span><del>-    , m_moduleInformation(plan.takeModuleInformation())
</del><ins>+    , m_module(WTFMove(module))
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -75,7 +74,8 @@
</span><span class="cx"> 
</span><span class="cx">     // On success, a new WebAssembly.Module object is returned with [[Module]] set to the validated Ast.module.
</span><span class="cx">     SymbolTable* exportSymbolTable = SymbolTable::create(vm);
</span><del>-    for (auto&amp; exp : m_moduleInformation-&gt;exports) {
</del><ins>+    const Wasm::ModuleInformation&amp; moduleInformation = m_module-&gt;moduleInformation();
+    for (auto&amp; exp : moduleInformation.exports) {
</ins><span class="cx">         auto offset = exportSymbolTable-&gt;takeNextScopeOffset(NoLockingNecessary);
</span><span class="cx">         String field = String::fromUTF8(exp.field);
</span><span class="cx">         exportSymbolTable-&gt;set(NoLockingNecessary, AtomicString(field).impl(), SymbolTableEntry(VarOffset(offset)));
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorewasmjsJSWebAssemblyModuleh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/wasm/js/JSWebAssemblyModule.h (215102 => 215103)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/wasm/js/JSWebAssemblyModule.h        2017-04-07 18:15:22 UTC (rev 215102)
+++ trunk/Source/JavaScriptCore/wasm/js/JSWebAssemblyModule.h        2017-04-07 18:25:14 UTC (rev 215103)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> #include &quot;JSObject.h&quot;
</span><span class="cx"> #include &quot;JSWebAssemblyCodeBlock.h&quot;
</span><span class="cx"> #include &quot;UnconditionalFinalizer.h&quot;
</span><ins>+#include &quot;WasmModule.h&quot;
</ins><span class="cx"> #include &quot;WasmModuleInformation.h&quot;
</span><span class="cx"> #include &lt;wtf/Bag.h&gt;
</span><span class="cx"> #include &lt;wtf/Vector.h&gt;
</span><span class="lines">@@ -49,16 +50,16 @@
</span><span class="cx"> public:
</span><span class="cx">     typedef JSDestructibleObject Base;
</span><span class="cx"> 
</span><del>-    static JSWebAssemblyModule* createStub(VM&amp;, ExecState*, Structure*, RefPtr&lt;Wasm::Plan&gt;&amp;&amp;);
</del><ins>+    DECLARE_INFO;
+
+    static JSWebAssemblyModule* createStub(VM&amp;, ExecState*, Structure*, Wasm::Module::ValidationResult&amp;&amp;);
</ins><span class="cx">     static Structure* createStructure(VM&amp;, JSGlobalObject*, JSValue);
</span><span class="cx"> 
</span><del>-    DECLARE_INFO;
-
-    const Wasm::ModuleInformation&amp; moduleInformation() const { return m_moduleInformation.get(); }
</del><ins>+    const Wasm::ModuleInformation&amp; moduleInformation() const { return m_module-&gt;moduleInformation(); }
</ins><span class="cx">     SymbolTable* exportSymbolTable() const { return m_exportSymbolTable.get(); }
</span><span class="cx">     Wasm::SignatureIndex signatureIndexFromFunctionIndexSpace(unsigned functionIndexSpace) const
</span><span class="cx">     {
</span><del>-        return m_moduleInformation-&gt;signatureIndexFromFunctionIndexSpace(functionIndexSpace);
</del><ins>+        return m_module-&gt;signatureIndexFromFunctionIndexSpace(functionIndexSpace);
</ins><span class="cx">     }
</span><span class="cx">     WebAssemblyToJSCallee* callee() const { return m_callee.get(); }
</span><span class="cx"> 
</span><span class="lines">@@ -66,17 +67,19 @@
</span><span class="cx"> 
</span><span class="cx">     const Vector&lt;uint8_t&gt;&amp; source() const { return moduleInformation().source; }
</span><span class="cx"> 
</span><ins>+    Wasm::Module&amp; module() { return m_module.get(); }
+
</ins><span class="cx"> private:
</span><span class="cx">     friend class JSWebAssemblyCodeBlock;
</span><span class="cx"> 
</span><span class="cx">     void setCodeBlock(VM&amp;, Wasm::MemoryMode, JSWebAssemblyCodeBlock*);
</span><span class="cx"> 
</span><del>-    JSWebAssemblyModule(VM&amp;, Structure*, Wasm::Plan&amp;);
</del><ins>+    JSWebAssemblyModule(VM&amp;, Structure*, Ref&lt;Wasm::Module&gt;&amp;&amp;);
</ins><span class="cx">     void finishCreation(VM&amp;);
</span><span class="cx">     static void destroy(JSCell*);
</span><span class="cx">     static void visitChildren(JSCell*, SlotVisitor&amp;);
</span><span class="cx"> 
</span><del>-    Ref&lt;Wasm::ModuleInformation&gt; m_moduleInformation;
</del><ins>+    Ref&lt;Wasm::Module&gt; m_module;
</ins><span class="cx">     WriteBarrier&lt;SymbolTable&gt; m_exportSymbolTable;
</span><span class="cx">     WriteBarrier&lt;JSWebAssemblyCodeBlock&gt; m_codeBlocks[Wasm::NumberOfMemoryModes];
</span><span class="cx">     WriteBarrier&lt;WebAssemblyToJSCallee&gt; m_callee;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorewasmjsWebAssemblyFunctioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/wasm/js/WebAssemblyFunction.cpp (215102 => 215103)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/wasm/js/WebAssemblyFunction.cpp        2017-04-07 18:15:22 UTC (rev 215102)
+++ trunk/Source/JavaScriptCore/wasm/js/WebAssemblyFunction.cpp        2017-04-07 18:25:14 UTC (rev 215103)
</span><span class="lines">@@ -159,6 +159,8 @@
</span><span class="cx"> 
</span><span class="cx"> WebAssemblyFunction* WebAssemblyFunction::create(VM&amp; vm, JSGlobalObject* globalObject, unsigned length, const String&amp; name, JSWebAssemblyInstance* instance, Wasm::Callee&amp; jsEntrypoint, Wasm::Callee&amp; wasmEntrypoint, Wasm::SignatureIndex signatureIndex)
</span><span class="cx"> {
</span><ins>+    ASSERT(&amp;jsEntrypoint != &amp;wasmEntrypoint);
+
</ins><span class="cx">     NativeExecutable* executable = vm.getHostFunction(callWebAssemblyFunction, NoIntrinsic, callHostFunctionAsConstructor, nullptr, name);
</span><span class="cx">     Structure* structure = globalObject-&gt;webAssemblyFunctionStructure();
</span><span class="cx">     WebAssemblyFunction* function = new (NotNull, allocateCell&lt;WebAssemblyFunction&gt;(vm.heap)) WebAssemblyFunction(vm, globalObject, structure, jsEntrypoint, wasmEntrypoint, signatureIndex);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorewasmjsWebAssemblyInstanceConstructorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/wasm/js/WebAssemblyInstanceConstructor.cpp (215102 => 215103)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/wasm/js/WebAssemblyInstanceConstructor.cpp        2017-04-07 18:15:22 UTC (rev 215102)
+++ trunk/Source/JavaScriptCore/wasm/js/WebAssemblyInstanceConstructor.cpp        2017-04-07 18:25:14 UTC (rev 215103)
</span><span class="lines">@@ -58,7 +58,7 @@
</span><span class="cx"> 
</span><span class="cx"> static EncodedJSValue JSC_HOST_CALL constructJSWebAssemblyInstance(ExecState* exec)
</span><span class="cx"> {
</span><del>-    auto&amp; vm = exec-&gt;vm();
</del><ins>+    VM&amp; vm = exec-&gt;vm();
</ins><span class="cx">     auto scope = DECLARE_THROW_SCOPE(vm);
</span><span class="cx"> 
</span><span class="cx">     // If moduleObject is not a WebAssembly.Module instance, a TypeError is thrown.
</span><span class="lines">@@ -78,26 +78,7 @@
</span><span class="cx">     JSWebAssemblyInstance* instance = JSWebAssemblyInstance::create(vm, exec, module, importObject, instanceStructure);
</span><span class="cx">     RETURN_IF_EXCEPTION(scope, { });
</span><span class="cx"> 
</span><del>-    // There are three possible cases:
-    // 1) The instance already has an initialized CodeBlock (runnable), so we just need to finalizeCreation.
-    // 2) The instance has no CodeBlock, so we need to make one and compile the code for it.
-    // 3) The instance already has an uninitialized CodeBlock, so we need to wait for the compilation to finish.
-
-    if (!instance-&gt;initialized()) {
-        if (instance-&gt;codeBlock())
-            Wasm::ensureWorklist().completePlanSynchronously(instance-&gt;codeBlock()-&gt;plan());
-        else {
-            Ref&lt;Wasm::Plan&gt; plan = adoptRef(*new Plan(vm, makeRef(const_cast&lt;Wasm::ModuleInformation&amp;&gt;(module-&gt;moduleInformation())), Plan::FullCompile, Plan::dontFinalize));
-            plan-&gt;setMode(instance-&gt;memoryMode());
-            instance-&gt;addUnitializedCodeBlock(vm, plan.copyRef());
-
-            auto&amp; worklist = Wasm::ensureWorklist();
-            worklist.enqueue(plan.copyRef());
-            worklist.completePlanSynchronously(plan.get());
-        }
-    }
-
-    instance-&gt;finalizeCreation(vm, exec);
</del><ins>+    instance-&gt;finalizeCreation(vm, exec, module-&gt;module().compileSync(vm, instance-&gt;memoryMode()));
</ins><span class="cx">     RETURN_IF_EXCEPTION(scope, { });
</span><span class="cx">     return JSValue::encode(instance);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorewasmjsWebAssemblyModuleConstructorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/wasm/js/WebAssemblyModuleConstructor.cpp (215102 => 215103)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/wasm/js/WebAssemblyModuleConstructor.cpp        2017-04-07 18:15:22 UTC (rev 215102)
+++ trunk/Source/JavaScriptCore/wasm/js/WebAssemblyModuleConstructor.cpp        2017-04-07 18:25:14 UTC (rev 215103)
</span><span class="lines">@@ -78,10 +78,7 @@
</span><span class="cx">     Vector&lt;uint8_t&gt; source = createSourceBufferFromValue(vm, exec, buffer);
</span><span class="cx">     RETURN_IF_EXCEPTION(scope, { });
</span><span class="cx"> 
</span><del>-    RefPtr&lt;Wasm::Plan&gt; plan = adoptRef(new Wasm::Plan(vm, WTFMove(source), Wasm::Plan::Validation, Wasm::Plan::dontFinalize));
-    if (!plan-&gt;parseAndValidateModule())
-        return throwException(exec, scope, JSWebAssemblyCompileError::create(exec, vm, exec-&gt;lexicalGlobalObject()-&gt;WebAssemblyCompileErrorStructure(), plan-&gt;errorMessage()));
-    return JSWebAssemblyModule::createStub(vm, exec, structure, WTFMove(plan));
</del><ins>+    return JSWebAssemblyModule::createStub(vm, exec, structure, Wasm::Module::validateSync(vm, WTFMove(source)));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> WebAssemblyModuleConstructor* WebAssemblyModuleConstructor::create(VM&amp; vm, Structure* structure, WebAssemblyModulePrototype* thisPrototype)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorewasmjsWebAssemblyPrototypecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/wasm/js/WebAssemblyPrototype.cpp (215102 => 215103)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/wasm/js/WebAssemblyPrototype.cpp        2017-04-07 18:15:22 UTC (rev 215102)
+++ trunk/Source/JavaScriptCore/wasm/js/WebAssemblyPrototype.cpp        2017-04-07 18:25:14 UTC (rev 215103)
</span><span class="lines">@@ -65,13 +65,12 @@
</span><span class="cx">  @end
</span><span class="cx">  */
</span><span class="cx"> 
</span><del>-static EncodedJSValue reject(ExecState* exec, CatchScope&amp; catchScope, JSPromiseDeferred* promise)
</del><ins>+static void reject(ExecState* exec, CatchScope&amp; catchScope, JSPromiseDeferred* promise)
</ins><span class="cx"> {
</span><span class="cx">     Exception* exception = catchScope.exception();
</span><span class="cx">     ASSERT(exception);
</span><span class="cx">     catchScope.clearException();
</span><span class="cx">     promise-&gt;reject(exec, exception-&gt;value());
</span><del>-    return JSValue::encode(promise-&gt;promise());
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static EncodedJSValue JSC_HOST_CALL webAssemblyCompileFunc(ExecState* exec)
</span><span class="lines">@@ -90,13 +89,11 @@
</span><span class="cx">     dependencies.append(Strong&lt;JSCell&gt;(vm, globalObject));
</span><span class="cx">     vm.promiseDeferredTimer-&gt;addPendingPromise(promise, WTFMove(dependencies));
</span><span class="cx"> 
</span><del>-    Ref&lt;Plan&gt; plan = adoptRef(*new Plan(vm, WTFMove(source), Plan::Validation, [promise, globalObject] (Plan&amp; p) mutable {
-        RefPtr&lt;Plan&gt; plan = makeRef(p);
-        p.vm().promiseDeferredTimer-&gt;scheduleWorkSoon(promise, [promise, globalObject, plan = WTFMove(plan)] () mutable {
-            VM&amp; vm = plan-&gt;vm();
</del><ins>+    Wasm::Module::validateAsync(vm, WTFMove(source), createSharedTask&lt;Wasm::Module::CallbackType&gt;([promise, globalObject] (VM&amp; vm, Wasm::Module::ValidationResult&amp;&amp; result) mutable {
+        vm.promiseDeferredTimer-&gt;scheduleWorkSoon(promise, [promise, globalObject, result = WTFMove(result), &amp;vm] () mutable {
</ins><span class="cx">             auto scope = DECLARE_CATCH_SCOPE(vm);
</span><span class="cx">             ExecState* exec = globalObject-&gt;globalExec();
</span><del>-            JSValue module = JSWebAssemblyModule::createStub(vm, exec, globalObject-&gt;WebAssemblyModuleStructure(), WTFMove(plan));
</del><ins>+            JSValue module = JSWebAssemblyModule::createStub(vm, exec, globalObject-&gt;WebAssemblyModuleStructure(), WTFMove(result));
</ins><span class="cx">             if (scope.exception()) {
</span><span class="cx">                 reject(exec, scope, promise);
</span><span class="cx">                 return;
</span><span class="lines">@@ -106,21 +103,20 @@
</span><span class="cx">         });
</span><span class="cx">     }));
</span><span class="cx"> 
</span><del>-    Wasm::ensureWorklist().enqueue(WTFMove(plan));
</del><span class="cx">     return JSValue::encode(promise-&gt;promise());
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> enum class Resolve { WithInstance, WithModuleAndInstance };
</span><del>-static void resolve(VM&amp; vm, ExecState* exec, JSPromiseDeferred* promise, JSWebAssemblyInstance* instance, JSWebAssemblyModule* module, Resolve entries)
</del><ins>+static void resolve(VM&amp; vm, ExecState* exec, JSPromiseDeferred* promise, JSWebAssemblyInstance* instance, JSWebAssemblyModule* module, Ref&lt;Wasm::CodeBlock&gt;&amp;&amp; codeBlock, Resolve resolveKind)
</ins><span class="cx"> {
</span><span class="cx">     auto scope = DECLARE_CATCH_SCOPE(vm);
</span><del>-    instance-&gt;finalizeCreation(vm, exec);
</del><ins>+    instance-&gt;finalizeCreation(vm, exec, WTFMove(codeBlock));
</ins><span class="cx">     if (scope.exception()) {
</span><span class="cx">         reject(exec, scope, promise);
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (entries == Resolve::WithInstance)
</del><ins>+    if (resolveKind == Resolve::WithInstance)
</ins><span class="cx">         promise-&gt;resolve(exec, instance);
</span><span class="cx">     else {
</span><span class="cx">         JSObject* result = constructEmptyObject(exec);
</span><span class="lines">@@ -130,7 +126,7 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static void instantiate(VM&amp; vm, ExecState* exec, JSPromiseDeferred* promise, JSWebAssemblyModule* module, JSObject* importObject, Resolve entries)
</del><ins>+static void instantiate(VM&amp; vm, ExecState* exec, JSPromiseDeferred* promise, JSWebAssemblyModule* module, JSObject* importObject, Resolve resolveKind)
</ins><span class="cx"> {
</span><span class="cx">     auto scope = DECLARE_CATCH_SCOPE(vm);
</span><span class="cx">     // In order to avoid potentially recompiling a module. We first gather all the import/memory information prior to compiling code.
</span><span class="lines">@@ -140,47 +136,18 @@
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // There are three possible cases:
-    // 1) The instance already has an initialized CodeBlock, so we have no more work to do.
-    // 2) The instance has no CodeBlock, so we need to make one and compile the code for it.
-    // 3) The instance already has an uninitialized CodeBlock, so someone else is compiling code and we just need to wait for them.
-
-    if (instance-&gt;initialized()) {
-        resolve(vm, exec, promise, instance, module, entries);
-        return;
-    }
-
</del><span class="cx">     Vector&lt;Strong&lt;JSCell&gt;&gt; dependencies;
</span><span class="cx">     // The instance keeps the module alive.
</span><span class="cx">     dependencies.append(Strong&lt;JSCell&gt;(vm, instance));
</span><span class="cx">     vm.promiseDeferredTimer-&gt;addPendingPromise(promise, WTFMove(dependencies));
</span><del>-
-    if (instance-&gt;codeBlock()) {
-        instance-&gt;codeBlock()-&gt;plan().addCompletionTask([promise, instance, module, entries] (Plan&amp; p) {
-            RefPtr&lt;Plan&gt; plan = makeRef(p);
-            p.vm().promiseDeferredTimer-&gt;scheduleWorkSoon(promise, [promise, instance, module, entries, plan = WTFMove(plan)] () {
-                ExecState* exec = instance-&gt;globalObject()-&gt;globalExec();
-                resolve(plan-&gt;vm(), exec, promise, instance, module, entries);
-            });
-        });
-        return;
-    }
-    ASSERT(!instance-&gt;codeBlock());
-
-    // FIXME: This re-parses the module header, which shouldn't be necessary.
-    // https://bugs.webkit.org/show_bug.cgi?id=170205
-    Ref&lt;Plan&gt; plan = adoptRef(*new Plan(vm, makeRef(const_cast&lt;Wasm::ModuleInformation&amp;&gt;(module-&gt;moduleInformation())), Plan::FullCompile, [promise, instance, module, entries] (Plan&amp; p) {
-        RefPtr&lt;Plan&gt; plan = makeRef(p);
-        p.vm().promiseDeferredTimer-&gt;scheduleWorkSoon(promise, [promise, instance, module, entries, plan = WTFMove(plan)] () {
-            VM&amp; vm = plan-&gt;vm();
</del><ins>+    // Note: This completion task may or may not get called immediately.
+    module-&gt;module().compileAsync(vm, instance-&gt;memoryMode(), createSharedTask&lt;Wasm::CodeBlock::CallbackType&gt;([promise, instance, module, resolveKind] (VM&amp; vm, Ref&lt;Wasm::CodeBlock&gt;&amp;&amp; refCodeBlock) mutable {
+        RefPtr&lt;Wasm::CodeBlock&gt; codeBlock = WTFMove(refCodeBlock);
+        vm.promiseDeferredTimer-&gt;scheduleWorkSoon(promise, [promise, instance, module, resolveKind, &amp;vm, codeBlock = WTFMove(codeBlock)] () mutable {
</ins><span class="cx">             ExecState* exec = instance-&gt;globalObject()-&gt;globalExec();
</span><del>-            resolve(vm, exec, promise, instance, module, entries);
</del><ins>+            resolve(vm, exec, promise, instance, module, codeBlock.releaseNonNull(), resolveKind);
</ins><span class="cx">         });
</span><span class="cx">     }));
</span><del>-
-    instance-&gt;addUnitializedCodeBlock(vm, plan.copyRef());
-    plan-&gt;setMode(instance-&gt;memoryMode());
-    Wasm::ensureWorklist().enqueue(WTFMove(plan));
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static void compileAndInstantiate(VM&amp; vm, ExecState* exec, JSPromiseDeferred* promise, JSValue buffer, JSObject* importObject)
</span><span class="lines">@@ -195,13 +162,11 @@
</span><span class="cx">     dependencies.append(Strong&lt;JSCell&gt;(vm, importObject));
</span><span class="cx">     vm.promiseDeferredTimer-&gt;addPendingPromise(promise, WTFMove(dependencies));
</span><span class="cx"> 
</span><del>-    Ref&lt;Plan&gt; plan = adoptRef(*new Plan(vm, WTFMove(source), Plan::Validation, [promise, importObject, globalObject] (Plan&amp; p) mutable {
-        RefPtr&lt;Plan&gt; plan = makeRef(p);
-        p.vm().promiseDeferredTimer-&gt;scheduleWorkSoon(promise, [promise, importObject, globalObject, plan = WTFMove(plan)] () mutable {
-            VM&amp; vm = plan-&gt;vm();
</del><ins>+    Wasm::Module::validateAsync(vm, WTFMove(source), createSharedTask&lt;Wasm::Module::CallbackType&gt;([promise, importObject, globalObject] (VM&amp; vm, Wasm::Module::ValidationResult&amp;&amp; result) mutable {
+        vm.promiseDeferredTimer-&gt;scheduleWorkSoon(promise, [promise, importObject, globalObject, result = WTFMove(result), &amp;vm] () mutable {
</ins><span class="cx">             auto scope = DECLARE_CATCH_SCOPE(vm);
</span><span class="cx">             ExecState* exec = globalObject-&gt;globalExec();
</span><del>-            JSWebAssemblyModule* module = JSWebAssemblyModule::createStub(vm, exec, globalObject-&gt;WebAssemblyModuleStructure(), plan.copyRef());
</del><ins>+            JSWebAssemblyModule* module = JSWebAssemblyModule::createStub(vm, exec, globalObject-&gt;WebAssemblyModuleStructure(), WTFMove(result));
</ins><span class="cx">             if (scope.exception()) {
</span><span class="cx">                 reject(exec, scope, promise);
</span><span class="cx">                 return;
</span><span class="lines">@@ -210,8 +175,6 @@
</span><span class="cx">             instantiate(vm, exec, promise, module, importObject, Resolve::WithModuleAndInstance);
</span><span class="cx">         });
</span><span class="cx">     }));
</span><del>-
-    Wasm::ensureWorklist().enqueue(WTFMove(plan));
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static EncodedJSValue JSC_HOST_CALL webAssemblyInstantiateFunc(ExecState* exec)
</span><span class="lines">@@ -248,7 +211,7 @@
</span><span class="cx">     size_t byteSize;
</span><span class="cx">     uint8_t* base = getWasmBufferFromValue(exec, exec-&gt;argument(0), byteOffset, byteSize);
</span><span class="cx">     RETURN_IF_EXCEPTION(scope, encodedJSValue());
</span><del>-    Wasm::Plan plan(vm, base + byteOffset, byteSize, Plan::Validation, Plan::dontFinalize);
</del><ins>+    Wasm::Plan plan(vm, base + byteOffset, byteSize, Plan::Validation, Plan::dontFinalize());
</ins><span class="cx">     // FIXME: We might want to throw an OOM exception here if we detect that something will OOM.
</span><span class="cx">     // https://bugs.webkit.org/show_bug.cgi?id=166015
</span><span class="cx">     return JSValue::encode(jsBoolean(plan.parseAndValidateModule()));
</span></span></pre></div>
<a id="trunkSourceWTFChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/ChangeLog (215102 => 215103)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/ChangeLog        2017-04-07 18:15:22 UTC (rev 215102)
+++ trunk/Source/WTF/ChangeLog        2017-04-07 18:25:14 UTC (rev 215103)
</span><span class="lines">@@ -1,3 +1,12 @@
</span><ins>+2017-04-07  Saam Barati  &lt;sbarati@apple.com&gt;
+
+        WebAssembly: Make to a compilation API that allows for multi-VM concurrent compilations of Wasm Modules
+        https://bugs.webkit.org/show_bug.cgi?id=170488
+
+        Reviewed by JF Bastien.
+
+        * wtf/SharedTask.h: Make SharedTaskFunctor forward its arguments.
+
</ins><span class="cx"> 2017-04-07  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [GTK] Update the priorities used in glib main loop sources
</span></span></pre></div>
<a id="trunkSourceWTFwtfSharedTaskh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/SharedTask.h (215102 => 215103)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/SharedTask.h        2017-04-07 18:15:22 UTC (rev 215102)
+++ trunk/Source/WTF/wtf/SharedTask.h        2017-04-07 18:25:14 UTC (rev 215103)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2017 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -87,7 +87,7 @@
</span><span class="cx"> private:
</span><span class="cx">     ResultType run(ArgumentTypes... arguments) override
</span><span class="cx">     {
</span><del>-        return m_functor(arguments...);
</del><ins>+        return m_functor(std::forward&lt;ArgumentTypes&gt;(arguments)...);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     Functor m_functor;
</span></span></pre>
</div>
</div>

</body>
</html>