<!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<Wasm::Module>. 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 <sbarati@apple.com>
+
+ 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<Wasm::Module>. 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 <cgarcia@igalia.com>
</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 = "<group>"; };
</span><span class="cx">                 52678F8D1A031009006A306D /* BasicBlockLocation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BasicBlockLocation.h; sourceTree = "<group>"; };
</span><span class="cx">                 52678F901A04177C006A306D /* ControlFlowProfiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ControlFlowProfiler.h; sourceTree = "<group>"; };
</span><ins>+                526AC4B41E977C5D003500E1 /* WasmCodeBlock.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WasmCodeBlock.cpp; sourceTree = "<group>"; };
+                526AC4B51E977C5D003500E1 /* WasmCodeBlock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WasmCodeBlock.h; sourceTree = "<group>"; };
</ins><span class="cx">                 527773DD1AAF83AC00BDE7E8 /* RuntimeType.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RuntimeType.cpp; sourceTree = "<group>"; };
</span><span class="cx">                 52B310FA1974AE610080857C /* FunctionHasExecutedCache.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FunctionHasExecutedCache.h; sourceTree = "<group>"; };
</span><span class="cx">                 52B310FC1974AE870080857C /* FunctionHasExecutedCache.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = FunctionHasExecutedCache.cpp; sourceTree = "<group>"; };
</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 = "<group>"; };
</span><span class="cx">                 72AAF7CC1D0D318B005E60BE /* JSCustomGetterSetterFunction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSCustomGetterSetterFunction.h; sourceTree = "<group>"; };
</span><span class="cx">                 77B25CB2C3094A92A38E1DB3 /* JSModuleLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSModuleLoader.h; sourceTree = "<group>"; };
</span><ins>+                790081361E95A8EC0052D7CD /* WasmModule.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WasmModule.cpp; sourceTree = "<group>"; };
+                790081371E95A8EC0052D7CD /* WasmModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WasmModule.h; sourceTree = "<group>"; };
</ins><span class="cx">                 7905BB661D12050E0019FE57 /* InlineAccess.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InlineAccess.cpp; sourceTree = "<group>"; };
</span><span class="cx">                 7905BB671D12050E0019FE57 /* InlineAccess.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InlineAccess.h; sourceTree = "<group>"; };
</span><span class="cx">                 79160DBB1C8E3EC8008C085A /* ProxyRevoke.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ProxyRevoke.cpp; sourceTree = "<group>"; };
</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->argumentCount() != functionCount + 2)
</span><span class="cx"> CRASH();
</span><span class="cx">
</span><del>- Ref<Wasm::Plan> plan = adoptRef(*new Wasm::Plan(vm, static_cast<uint8_t*>(source->vector()), source->length(), Wasm::Plan::FullCompile, Wasm::Plan::dontFinalize));
</del><ins>+ Ref<Wasm::Plan> plan = adoptRef(*new Wasm::Plan(vm, static_cast<uint8_t*>(source->vector()), source->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->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->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->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() && m_shouldStopRunLoopWhenAllPromisesFinish)
</del><ins>+ if (m_pendingPromises.isEmpty() && 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() && !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<std::tuple<JSPromiseDeferred*, Task>> 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->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->clobberLate(PinnedRegisterInfo::get().toSave());
</span><del>- patchpoint->setGenerator([unlinkedWasmToWasmCalls, functionIndex, returnType] (CCallHelpers& jit, const B3::StackmapGenerationParams& params) {
</del><ins>+ patchpoint->setGenerator([functionIndex, returnType] (CCallHelpers& jit, const B3::StackmapGenerationParams& 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<CallLinkInfo>& callLinkInfos, SignatureIndex signatureIndex, unsigned importIndex)
</del><ins>+MacroAssemblerCodeRef wasmToJs(VM* vm, Bag<CallLinkInfo>& 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, ("WebAssembly->JavaScript import[%i] %s", 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& 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, ("WebAssembly->WebAssembly import[%i]", importIndex));
</span><span class="cx"> }
</span><span class="cx">
</span><del>-WasmExitStubs exitStubGenerator(VM* vm, Bag<CallLinkInfo>& 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<CallLinkInfo>&, SignatureIndex, unsigned);
</del><ins>+MacroAssemblerCodeRef wasmToWasm(unsigned importIndex);
+MacroAssemblerCodeRef wasmToJs(VM*, Bag<CallLinkInfo>& 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 "config.h"
+#include "WasmCodeBlock.h"
+
+#if ENABLE(WEBASSEMBLY)
+
+#include "WasmPlanInlines.h"
+#include "WasmWorklist.h"
+
+namespace JSC { namespace Wasm {
+
+CodeBlock::CodeBlock(VM& vm, MemoryMode mode, ModuleInformation& moduleInformation)
+ : m_calleeCount(moduleInformation.internalFunctionCount())
+ , m_mode(mode)
+{
+ m_plan = adoptRef(*new Plan(vm, makeRef(moduleInformation), Plan::FullCompile, createSharedTask<Plan::CallbackType>([this] (VM&, Plan&) {
+ // 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->failed()) {
+ m_errorMessage = m_plan->errorMessage();
+ m_plan = nullptr;
+ return;
+ }
+
+ m_callees.resize(m_calleeCount * 2);
+ m_plan->initializeCallees([&] (unsigned calleeIndex, Ref<Wasm::Callee>&& jsEntrypointCallee, Ref<Wasm::Callee>&& wasmEntrypointCallee) {
+ m_callees[calleeIndex] = WTFMove(jsEntrypointCallee);
+ m_callees[calleeIndex + m_calleeCount] = WTFMove(wasmEntrypointCallee);
+ });
+
+ m_wasmToWasmExitStubs = m_plan->takeWasmToWasmExitStubs();
+
+ m_plan = nullptr;
+ })));
+
+ m_plan->setMode(mode);
+ auto& 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<Plan> plan;
+ {
+ auto locker = holdLock(m_lock);
+ plan = m_plan;
+ }
+
+ if (plan) {
+ auto& worklist = Wasm::ensureWorklist();
+ worklist.completePlanSynchronously(*plan.get());
+ }
+ // else, if we don't have a plan, we're already compiled.
+}
+
+void CodeBlock::compileAsync(VM& vm, AsyncCompilationCallback&& task)
+{
+ RefPtr<Plan> 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->addCompletionTask(vm, createSharedTask<Plan::CallbackType>([this, task = WTFMove(task)] (VM& vm, Plan&) {
+ task->run(vm, makeRef(*this));
+ }));
+ } else
+ task->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 "WasmCallee.h"
+#include "WasmModuleInformation.h"
+#include "WasmPlan.h"
+#include <wtf/Lock.h>
+#include <wtf/SharedTask.h>
+#include <wtf/ThreadSafeRefCounted.h>
+
+namespace JSC { namespace Wasm {
+
+class CodeBlock : public ThreadSafeRefCounted<CodeBlock> {
+public:
+ typedef void CallbackType(VM&, Ref<CodeBlock>&&);
+ using AsyncCompilationCallback = RefPtr<WTF::SharedTask<CallbackType>>;
+ static Ref<CodeBlock> create(VM& vm, MemoryMode mode, ModuleInformation& moduleInformation)
+ {
+ return adoptRef(*new CodeBlock(vm, mode, moduleInformation));
+ }
+
+ void waitUntilFinished();
+ void compileAsync(VM&, AsyncCompilationCallback&&);
+
+ bool compilationFinished()
+ {
+ auto locker = holdLock(m_lock);
+ return !m_plan;
+ }
+ bool runnable() { return compilationFinished() && !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& jsEntrypointCalleeFromFunctionIndexSpace(unsigned functionIndexSpace)
+ {
+ RELEASE_ASSERT(functionIndexSpace >= functionImportCount());
+ unsigned calleeIndex = functionIndexSpace - functionImportCount();
+ RELEASE_ASSERT(calleeIndex < m_calleeCount);
+ return *m_callees[calleeIndex].get();
+ }
+ Wasm::Callee& wasmEntrypointCalleeFromFunctionIndexSpace(unsigned functionIndexSpace)
+ {
+ RELEASE_ASSERT(functionIndexSpace >= functionImportCount());
+ unsigned calleeIndex = functionIndexSpace - functionImportCount();
+ RELEASE_ASSERT(calleeIndex < m_calleeCount);
+ return *m_callees[calleeIndex + m_calleeCount].get();
+ }
+ bool isSafeToRun(MemoryMode);
+
+private:
+ CodeBlock(VM&, MemoryMode, ModuleInformation&);
+ unsigned m_calleeCount;
+ MemoryMode m_mode;
+ Vector<RefPtr<Callee>> m_callees;
+ Vector<MacroAssemblerCodeRef> m_wasmToWasmExitStubs;
+ RefPtr<Plan> 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 "config.h"
+#include "WasmModule.h"
+
+#if ENABLE(WEBASSEMBLY)
+
+#include "WasmPlanInlines.h"
+
+namespace JSC { namespace Wasm {
+
+Module::Module(Ref<ModuleInformation>&& moduleInformation)
+ : m_moduleInformation(WTFMove(moduleInformation))
+{
+}
+
+static Module::ValidationResult makeValidationResult(Plan& plan)
+{
+ ASSERT(!plan.hasWork());
+ if (plan.failed())
+ return UnexpectedType<String>(plan.errorMessage());
+ return Module::ValidationResult(Module::create(plan.takeModuleInformation()));
+}
+
+Module::ValidationResult Module::validateSyncImpl(Ref<Plan>&& plan)
+{
+ plan->parseAndValidateModule();
+ return makeValidationResult(plan.get());
+}
+
+Ref<CodeBlock> Module::getOrCreateCodeBlock(VM& vm, MemoryMode mode)
+{
+ RefPtr<CodeBlock> codeBlock;
+ auto locker = holdLock(m_lock);
+ codeBlock = m_codeBlocks[static_cast<uint8_t>(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->runnable()) {
+ codeBlock = CodeBlock::create(vm, mode, const_cast<ModuleInformation&>(moduleInformation()));
+ m_codeBlocks[static_cast<uint8_t>(mode)] = codeBlock;
+ }
+ return codeBlock.releaseNonNull();
+}
+
+Ref<CodeBlock> Module::compileSync(VM& vm, MemoryMode mode)
+{
+ Ref<CodeBlock> codeBlock = getOrCreateCodeBlock(vm, mode);
+ codeBlock->waitUntilFinished();
+ return codeBlock;
+}
+
+Plan::CompletionTask Module::makeValidationCallback(AsyncValidationCallback&& callback)
+{
+ return createSharedTask<Plan::CallbackType>([callback = WTFMove(callback)] (VM& vm, Plan& plan) {
+ ASSERT(!plan.hasWork());
+ callback->run(vm, makeValidationResult(plan));
+ });
+}
+
+void Module::compileAsync(VM& vm, MemoryMode mode, CodeBlock::AsyncCompilationCallback&& task)
+{
+ Ref<CodeBlock> codeBlock = getOrCreateCodeBlock(vm, mode);
+ codeBlock->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 "WasmCallee.h"
+#include "WasmCodeBlock.h"
+#include "WasmModuleInformation.h"
+#include "WasmPlan.h"
+#include "WasmWorklist.h"
+#include <wtf/Expected.h>
+#include <wtf/Lock.h>
+#include <wtf/SharedTask.h>
+#include <wtf/ThreadSafeRefCounted.h>
+
+namespace JSC { namespace Wasm {
+
+class Module : public ThreadSafeRefCounted<Module> {
+public:
+ using ValidationResult = WTF::Expected<RefPtr<Module>, String>;
+ typedef void CallbackType(VM&, ValidationResult&&);
+ using AsyncValidationCallback = RefPtr<SharedTask<CallbackType>>;
+
+ static Ref<Module> create(Ref<ModuleInformation>&& moduleInformation)
+ {
+ return adoptRef(*new Module(WTFMove(moduleInformation)));
+ }
+
+ static ValidationResult validateSync(VM& vm, Vector<uint8_t>&& source)
+ {
+ Ref<Plan> plan = adoptRef(*new Plan(vm, WTFMove(source), Plan::Validation, Plan::dontFinalize()));
+ return validateSyncImpl(WTFMove(plan));
+ }
+
+ static void validateAsync(VM& vm, Vector<uint8_t>&& source, AsyncValidationCallback&& callback)
+ {
+ Ref<Plan> 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->signatureIndexFromFunctionIndexSpace(functionIndexSpace);
+ }
+
+ const Wasm::ModuleInformation& moduleInformation() const { return m_moduleInformation.get(); }
+
+ Ref<CodeBlock> compileSync(VM&, MemoryMode);
+ void compileAsync(VM&, MemoryMode, CodeBlock::AsyncCompilationCallback&&);
+
+ Ref<CodeBlock> nonNullCodeBlock(Wasm::MemoryMode mode)
+ {
+ CodeBlock* codeBlock = m_codeBlocks[static_cast<uint8_t>(mode)].get();
+ RELEASE_ASSERT(!!codeBlock);
+ return makeRef(*codeBlock);
+ }
+
+private:
+ Ref<CodeBlock> getOrCreateCodeBlock(VM&, MemoryMode);
+
+ static ValidationResult validateSyncImpl(Ref<Plan>&&);
+ static Plan::CompletionTask makeValidationCallback(AsyncValidationCallback&&);
+
+ Module(Ref<ModuleInformation>&&);
+ Ref<ModuleInformation> m_moduleInformation;
+ RefPtr<CodeBlock> 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& vm, Ref<ModuleInformation> info, AsyncWork work, CompletionTask&& task)
</span><span class="cx"> : m_moduleInformation(WTFMove(info))
</span><del>- , m_vm(vm)
</del><span class="cx"> , m_source(m_moduleInformation->source.data())
</span><span class="cx"> , m_sourceLength(m_moduleInformation->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(&vm, WTFMove(task)));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> Plan::Plan(VM& vm, Vector<uint8_t>&& source, AsyncWork work, CompletionTask&& task)
</span><span class="lines">@@ -69,13 +68,12 @@
</span><span class="cx">
</span><span class="cx"> Plan::Plan(VM& vm, const uint8_t* source, size_t sourceLength, AsyncWork work, CompletionTask&& task)
</span><span class="cx"> : m_moduleInformation(makeRef(*new ModuleInformation(Vector<uint8_t>())))
</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(&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&& task)
</del><ins>+void Plan::addCompletionTask(VM& vm, CompletionTask&& 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(&vm, WTFMove(task)));
</ins><span class="cx"> else
</span><del>- task(*this);
</del><ins>+ task->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& functionLocations = m_moduleInformation->functionLocationInBinary;
</span><del>- if (!tryReserveCapacity(m_wasmExitStubs, m_moduleInformation->importFunctionSignatureIndices.size(), " WebAssembly to JavaScript stubs")
</del><ins>+ if (!tryReserveCapacity(m_wasmToWasmExitStubs, m_moduleInformation->importFunctionSignatureIndices.size(), " WebAssembly to JavaScript stubs")
</ins><span class="cx"> || !tryReserveCapacity(m_unlinkedWasmToWasmCalls, functionLocations.size(), " unlinked WebAssembly to WebAssembly calls")
</span><span class="cx"> || !tryReserveCapacity(m_wasmInternalFunctions, functionLocations.size(), " WebAssembly functions")
</span><span class="cx"> || !tryReserveCapacity(m_compilationContexts, functionLocations.size(), " compilation contexts"))
</span><span class="lines">@@ -196,10 +194,9 @@
</span><span class="cx"> Import* import = &m_moduleInformation->imports[importIndex];
</span><span class="cx"> if (import->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, "Processing import function number ", importFunctionIndex, ": ", makeString(import->module), ": ", makeString(import->field));
</span><del>- SignatureIndex signatureIndex = m_moduleInformation->importFunctionSignatureIndices.at(import->kindIndex);
- m_wasmExitStubs.uncheckedAppend(exitStubGenerator(&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 <= m_sourceLength);
</span><span class="cx"> SignatureIndex signatureIndex = m_moduleInformation->internalFunctionSignatureIndices[functionIndex];
</span><span class="cx"> const Signature& 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->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->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())->wasmEntrypoint.compilation->code().executableAddress();
</del><ins>+ executableAddress = m_wasmInternalFunctions.at(call.functionIndex - m_wasmToWasmExitStubs.size())->wasmEntrypoint.compilation->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& task : m_completionTasks)
</span><del>- task(*this);
</del><ins>+ task.second->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& 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([&] (const std::pair<VM*, CompletionTask>& pair) {
+ bool shouldRemove = pair.first == &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->functionLocationInBinary.size();
</span><del>- fail(locker, ASCIILiteral("WebAssembly Plan was canceled. If you see this error message please file a bug at bugs.webkit.org!"));
</del><ins>+ fail(locker, ASCIILiteral("WebAssembly Plan was cancelled. If you see this error message please file a bug at bugs.webkit.org!"));
+ 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 "WasmB3IRGenerator.h"
</span><span class="cx"> #include "WasmModuleInformation.h"
</span><span class="cx"> #include <wtf/Bag.h>
</span><ins>+#include <wtf/SharedTask.h>
</ins><span class="cx"> #include <wtf/ThreadSafeRefCounted.h>
</span><span class="cx"> #include <wtf/Vector.h>
</span><span class="cx">
</span><span class="lines">@@ -45,8 +46,9 @@
</span><span class="cx">
</span><span class="cx"> class Plan : public ThreadSafeRefCounted<Plan> {
</span><span class="cx"> public:
</span><del>- static void dontFinalize(Plan&) { }
- typedef std::function<void(Plan&)> CompletionTask;
</del><ins>+ typedef void CallbackType(VM&, Plan&);
+ using CompletionTask = RefPtr<SharedTask<CallbackType>>;
+ static CompletionTask dontFinalize() { return createSharedTask<CallbackType>([](VM&, Plan&) { }); }
</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&, Ref<ModuleInformation>, AsyncWork, CompletionTask&&);
</span><span class="lines">@@ -56,7 +58,9 @@
</span><span class="cx"> JS_EXPORT_PRIVATE Plan(VM&, const uint8_t*, size_t, AsyncWork, CompletionTask&&);
</span><span class="cx"> JS_EXPORT_PRIVATE ~Plan();
</span><span class="cx">
</span><del>- void addCompletionTask(CompletionTask&&);
</del><ins>+ // If you guarantee the ordering here, you can rely on FIFO of the
+ // completion tasks being called.
+ void addCompletionTask(VM&, CompletionTask&&);
</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<WasmExitStubs>&& takeWasmExitStubs()
</del><ins>+ Vector<MacroAssemblerCodeRef>&& takeWasmToWasmExitStubs()
</ins><span class="cx"> {
</span><span class="cx"> RELEASE_ASSERT(!failed() && !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& 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 >= 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&);
</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<ModuleInformation> m_moduleInformation;
</span><span class="cx"> Bag<CallLinkInfo> m_callLinkInfos;
</span><del>- Vector<WasmExitStubs> m_wasmExitStubs;
</del><ins>+ Vector<MacroAssemblerCodeRef> m_wasmToWasmExitStubs;
</ins><span class="cx"> Vector<std::unique_ptr<WasmInternalFunction>> m_wasmInternalFunctions;
</span><span class="cx"> Vector<CompilationContext> m_compilationContexts;
</span><span class="cx">
</span><del>- VM& m_vm;
- Vector<CompletionTask, 1> m_completionTasks;
</del><ins>+ Vector<std::pair<VM*, CompletionTask>, 1> m_completionTasks;
</ins><span class="cx">
</span><span class="cx"> Vector<Vector<UnlinkedWasmToWasmCall>> 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, [&] (QueueElement& element) {
</span><del>- if (&element.plan->vm() == &vm) {
- element.plan->cancel();
</del><ins>+ bool didCancel = element.plan->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& thread : m_threads) {
</span><del>- if (thread->element.plan && &thread->element.plan->vm() == &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->element.plan->cancel();
- thread->synchronize.wait(*m_lock);
</del><ins>+ if (thread->element.plan) {
+ bool didCancel = thread->element.plan->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->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 "JSWebAssemblyLinkError.h"
</span><span class="cx"> #include "JSWebAssemblyMemory.h"
</span><span class="cx"> #include "JSWebAssemblyModule.h"
</span><ins>+#include "WasmBinding.h"
</ins><span class="cx"> #include "WasmPlanInlines.h"
</span><span class="cx">
</span><ins>+#include <wtf/CurrentTime.h>
+
</ins><span class="cx"> namespace JSC {
</span><span class="cx">
</span><span class="cx"> const ClassInfo JSWebAssemblyCodeBlock::s_info = { "WebAssemblyCodeBlock", nullptr, 0, CREATE_METHOD_TABLE(JSWebAssemblyCodeBlock) };
</span><span class="cx">
</span><del>-JSWebAssemblyCodeBlock::JSWebAssemblyCodeBlock(VM& vm, JSWebAssemblyModule* owner, Wasm::MemoryMode mode, Ref<Wasm::Plan>&& plan, unsigned calleeCount)
</del><ins>+JSWebAssemblyCodeBlock::JSWebAssemblyCodeBlock(VM& vm, Ref<Wasm::CodeBlock>&& codeBlock, const Wasm::ModuleInformation& 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()->codeBlock(mode));
- module()->setCodeBlock(vm, mode, this);
- m_callees.resize(m_calleeCount * 2);
-}
-
-void JSWebAssemblyCodeBlock::initialize()
-{
- if (initialized())
- return;
-
- VM& 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->functionImportCount());
+ for (unsigned importIndex = 0; importIndex < m_codeBlock->functionImportCount(); ++importIndex) {
+ Wasm::SignatureIndex signatureIndex = moduleInformation.importFunctionSignatureIndices.at(importIndex);
+ m_wasmToJSExitStubs.uncheckedAppend(Wasm::wasmToJs(&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 < m_wasmExitStubs.size(); i++)
- importWasmToJSStub(i) = m_wasmExitStubs[i].wasmToJs.code().executableAddress();
-
- plan().initializeCallees([&] (unsigned calleeIndex, Ref<Wasm::Callee>&& jsEntrypointCallee, Ref<Wasm::Callee>&& 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->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->isSafeToRun(memory->memory().mode());
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void JSWebAssemblyCodeBlock::visitChildren(JSCell* cell, SlotVisitor& 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 "UnconditionalFinalizer.h"
</span><span class="cx"> #include "WasmCallee.h"
</span><span class="cx"> #include "WasmFormat.h"
</span><ins>+#include "WasmModule.h"
</ins><span class="cx"> #include <wtf/Bag.h>
</span><span class="cx"> #include <wtf/Vector.h>
</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& vm, JSWebAssemblyModule* owner, Wasm::MemoryMode mode, Ref<Wasm::Plan>&& plan, unsigned calleeCount, unsigned functionImportCount)
</del><ins>+ static JSWebAssemblyCodeBlock* create(VM& vm, Ref<Wasm::CodeBlock> codeBlock, const Wasm::ModuleInformation& moduleInformation)
</ins><span class="cx"> {
</span><del>- auto* result = new (NotNull, allocateCell<JSWebAssemblyCodeBlock>(vm.heap, allocationSize(functionImportCount))) JSWebAssemblyCodeBlock(vm, owner, mode, WTFMove(plan), calleeCount);
</del><ins>+ auto* result = new (NotNull, allocateCell<JSWebAssemblyCodeBlock>(vm.heap, allocationSize(moduleInformation.importFunctionCount()))) JSWebAssemblyCodeBlock(vm, WTFMove(codeBlock), moduleInformation);
</ins><span class="cx"> result->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->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& plan() const { ASSERT(!initialized()); return *m_plan; }
-
- bool runnable() const { return initialized() && !m_errorMessage; }
- String& 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& jsEntrypointCalleeFromFunctionIndexSpace(unsigned functionIndexSpace)
</span><span class="cx"> {
</span><del>- RELEASE_ASSERT(functionIndexSpace >= functionImportCount());
- unsigned calleeIndex = functionIndexSpace - functionImportCount();
- RELEASE_ASSERT(calleeIndex < m_calleeCount);
- return *m_callees[calleeIndex].get();
</del><ins>+ return m_codeBlock->jsEntrypointCalleeFromFunctionIndexSpace(functionIndexSpace);
</ins><span class="cx"> }
</span><span class="cx"> Wasm::Callee& wasmEntrypointCalleeFromFunctionIndexSpace(unsigned functionIndexSpace)
</span><span class="cx"> {
</span><del>- RELEASE_ASSERT(functionIndexSpace >= functionImportCount());
- unsigned calleeIndex = functionIndexSpace - functionImportCount();
- RELEASE_ASSERT(calleeIndex < m_calleeCount);
- return *m_callees[calleeIndex + m_calleeCount].get();
</del><ins>+ return m_codeBlock->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 < 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<Wasm::Callee>&& callee)
- {
- RELEASE_ASSERT(calleeIndex < m_calleeCount);
- m_callees[calleeIndex] = WTFMove(callee);
- }
- void setWasmEntrypointCallee(unsigned calleeIndex, Ref<Wasm::Callee>&& callee)
- {
- RELEASE_ASSERT(calleeIndex < m_calleeCount);
- m_callees[calleeIndex + m_calleeCount] = WTFMove(callee);
- }
-
- JSWebAssemblyCodeBlock(VM&, JSWebAssemblyModule*, Wasm::MemoryMode, Ref<Wasm::Plan>&&, unsigned calleeCount);
</del><ins>+ JSWebAssemblyCodeBlock(VM&, Ref<Wasm::CodeBlock>&&, const Wasm::ModuleInformation&);
</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<JSWebAssemblyModule> m_module;
</span><ins>+ Ref<Wasm::CodeBlock> m_codeBlock;
+ Vector<MacroAssemblerCodeRef> m_wasmToJSExitStubs;
</ins><span class="cx"> UnconditionalFinalizer m_unconditionalFinalizer;
</span><span class="cx"> Bag<CallLinkInfo> m_callLinkInfos;
</span><del>- Vector<Wasm::WasmExitStubs> m_wasmExitStubs;
- Vector<RefPtr<Wasm::Callee>> m_callees;
- // The plan that is compiling this code block.
- RefPtr<Wasm::Plan> 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->importFunctions()[i]);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void JSWebAssemblyInstance::addUnitializedCodeBlock(VM& vm, Ref<Wasm::Plan> plan)
</del><ins>+void JSWebAssemblyInstance::finalizeCreation(VM& vm, ExecState* exec, Ref<Wasm::CodeBlock>&& wasmCodeBlock)
</ins><span class="cx"> {
</span><del>- auto* codeBlock = JSWebAssemblyCodeBlock::create(
- vm, module(), memoryMode(), WTFMove(plan), module()->moduleInformation().internalFunctionCount(), module()->moduleInformation().importFunctionCount());
- m_codeBlock.set(vm, this, codeBlock);
- ASSERT(!codeBlock->initialized());
-}
-
-void JSWebAssemblyInstance::finalizeCreation(VM& vm, ExecState* exec)
-{
</del><span class="cx"> auto scope = DECLARE_THROW_SCOPE(vm);
</span><del>- codeBlock()->initialize();
-
- if (!codeBlock()->runnable()) {
- throwException(exec, scope, JSWebAssemblyLinkError::create(exec, vm, globalObject()->WebAssemblyLinkErrorStructure(), codeBlock()->errorMessage()));
</del><ins>+ if (!wasmCodeBlock->runnable()) {
+ throwException(exec, scope, JSWebAssemblyLinkError::create(exec, vm, globalObject()->WebAssemblyLinkErrorStructure(), wasmCodeBlock->errorMessage()));
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><del>- RELEASE_ASSERT(codeBlock()->isSafeToRun(memory()));
</del><span class="cx">
</span><ins>+ RELEASE_ASSERT(wasmCodeBlock->isSafeToRun(memory()->memory().mode()));
+ m_codeBlock.set(vm, this,
+ JSWebAssemblyCodeBlock::create(vm, wasmCodeBlock.copyRef(), m_module->module().moduleInformation()));
+
</ins><span class="cx"> auto* moduleRecord = jsCast<WebAssemblyModuleRecord*>(m_moduleNamespaceObject->moduleRecord());
</span><span class="cx"> moduleRecord->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() && codeBlock()->initialized(); }
- void addUnitializedCodeBlock(VM&, Ref<Wasm::Plan>);
- void finalizeCreation(VM&, ExecState*);
</del><ins>+ void finalizeCreation(VM&, ExecState*, Ref<Wasm::CodeBlock>&&);
</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 = { "WebAssembly.Module", &Base::s_info, nullptr, CREATE_METHOD_TABLE(JSWebAssemblyModule) };
</span><span class="cx">
</span><del>-JSWebAssemblyModule* JSWebAssemblyModule::createStub(VM& vm, ExecState* exec, Structure* structure, RefPtr<Wasm::Plan>&& plan)
</del><ins>+JSWebAssemblyModule* JSWebAssemblyModule::createStub(VM& vm, ExecState* exec, Structure* structure, Wasm::Module::ValidationResult&& result)
</ins><span class="cx"> {
</span><del>- ASSERT(!plan->hasWork());
</del><span class="cx"> auto scope = DECLARE_THROW_SCOPE(vm);
</span><del>- if (plan->failed()) {
- throwException(exec, scope, JSWebAssemblyCompileError::create(exec, vm, structure->globalObject()->WebAssemblyCompileErrorStructure(), plan->errorMessage()));
</del><ins>+ if (!result.hasValue()) {
+ throwException(exec, scope, JSWebAssemblyCompileError::create(exec, vm, structure->globalObject()->WebAssemblyCompileErrorStructure(), result.error()));
</ins><span class="cx"> return nullptr;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- auto* module = new (NotNull, allocateCell<JSWebAssemblyModule>(vm.heap)) JSWebAssemblyModule(vm, structure, *plan.get());
</del><ins>+ auto* module = new (NotNull, allocateCell<JSWebAssemblyModule>(vm.heap)) JSWebAssemblyModule(vm, structure, result.value().releaseNonNull());
</ins><span class="cx"> module->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& vm, Structure* structure, Wasm::Plan& plan)
</del><ins>+JSWebAssemblyModule::JSWebAssemblyModule(VM& vm, Structure* structure, Ref<Wasm::Module>&& 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& exp : m_moduleInformation->exports) {
</del><ins>+ const Wasm::ModuleInformation& moduleInformation = m_module->moduleInformation();
+ for (auto& exp : moduleInformation.exports) {
</ins><span class="cx"> auto offset = exportSymbolTable->takeNextScopeOffset(NoLockingNecessary);
</span><span class="cx"> String field = String::fromUTF8(exp.field);
</span><span class="cx"> exportSymbolTable->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 "JSObject.h"
</span><span class="cx"> #include "JSWebAssemblyCodeBlock.h"
</span><span class="cx"> #include "UnconditionalFinalizer.h"
</span><ins>+#include "WasmModule.h"
</ins><span class="cx"> #include "WasmModuleInformation.h"
</span><span class="cx"> #include <wtf/Bag.h>
</span><span class="cx"> #include <wtf/Vector.h>
</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&, ExecState*, Structure*, RefPtr<Wasm::Plan>&&);
</del><ins>+ DECLARE_INFO;
+
+ static JSWebAssemblyModule* createStub(VM&, ExecState*, Structure*, Wasm::Module::ValidationResult&&);
</ins><span class="cx"> static Structure* createStructure(VM&, JSGlobalObject*, JSValue);
</span><span class="cx">
</span><del>- DECLARE_INFO;
-
- const Wasm::ModuleInformation& moduleInformation() const { return m_moduleInformation.get(); }
</del><ins>+ const Wasm::ModuleInformation& moduleInformation() const { return m_module->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->signatureIndexFromFunctionIndexSpace(functionIndexSpace);
</del><ins>+ return m_module->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<uint8_t>& source() const { return moduleInformation().source; }
</span><span class="cx">
</span><ins>+ Wasm::Module& 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&, Wasm::MemoryMode, JSWebAssemblyCodeBlock*);
</span><span class="cx">
</span><del>- JSWebAssemblyModule(VM&, Structure*, Wasm::Plan&);
</del><ins>+ JSWebAssemblyModule(VM&, Structure*, Ref<Wasm::Module>&&);
</ins><span class="cx"> void finishCreation(VM&);
</span><span class="cx"> static void destroy(JSCell*);
</span><span class="cx"> static void visitChildren(JSCell*, SlotVisitor&);
</span><span class="cx">
</span><del>- Ref<Wasm::ModuleInformation> m_moduleInformation;
</del><ins>+ Ref<Wasm::Module> m_module;
</ins><span class="cx"> WriteBarrier<SymbolTable> m_exportSymbolTable;
</span><span class="cx"> WriteBarrier<JSWebAssemblyCodeBlock> m_codeBlocks[Wasm::NumberOfMemoryModes];
</span><span class="cx"> WriteBarrier<WebAssemblyToJSCallee> 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& vm, JSGlobalObject* globalObject, unsigned length, const String& name, JSWebAssemblyInstance* instance, Wasm::Callee& jsEntrypoint, Wasm::Callee& wasmEntrypoint, Wasm::SignatureIndex signatureIndex)
</span><span class="cx"> {
</span><ins>+ ASSERT(&jsEntrypoint != &wasmEntrypoint);
+
</ins><span class="cx"> NativeExecutable* executable = vm.getHostFunction(callWebAssemblyFunction, NoIntrinsic, callHostFunctionAsConstructor, nullptr, name);
</span><span class="cx"> Structure* structure = globalObject->webAssemblyFunctionStructure();
</span><span class="cx"> WebAssemblyFunction* function = new (NotNull, allocateCell<WebAssemblyFunction>(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& vm = exec->vm();
</del><ins>+ VM& vm = exec->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->initialized()) {
- if (instance->codeBlock())
- Wasm::ensureWorklist().completePlanSynchronously(instance->codeBlock()->plan());
- else {
- Ref<Wasm::Plan> plan = adoptRef(*new Plan(vm, makeRef(const_cast<Wasm::ModuleInformation&>(module->moduleInformation())), Plan::FullCompile, Plan::dontFinalize));
- plan->setMode(instance->memoryMode());
- instance->addUnitializedCodeBlock(vm, plan.copyRef());
-
- auto& worklist = Wasm::ensureWorklist();
- worklist.enqueue(plan.copyRef());
- worklist.completePlanSynchronously(plan.get());
- }
- }
-
- instance->finalizeCreation(vm, exec);
</del><ins>+ instance->finalizeCreation(vm, exec, module->module().compileSync(vm, instance->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<uint8_t> source = createSourceBufferFromValue(vm, exec, buffer);
</span><span class="cx"> RETURN_IF_EXCEPTION(scope, { });
</span><span class="cx">
</span><del>- RefPtr<Wasm::Plan> plan = adoptRef(new Wasm::Plan(vm, WTFMove(source), Wasm::Plan::Validation, Wasm::Plan::dontFinalize));
- if (!plan->parseAndValidateModule())
- return throwException(exec, scope, JSWebAssemblyCompileError::create(exec, vm, exec->lexicalGlobalObject()->WebAssemblyCompileErrorStructure(), plan->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& 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& catchScope, JSPromiseDeferred* promise)
</del><ins>+static void reject(ExecState* exec, CatchScope& 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->reject(exec, exception->value());
</span><del>- return JSValue::encode(promise->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<JSCell>(vm, globalObject));
</span><span class="cx"> vm.promiseDeferredTimer->addPendingPromise(promise, WTFMove(dependencies));
</span><span class="cx">
</span><del>- Ref<Plan> plan = adoptRef(*new Plan(vm, WTFMove(source), Plan::Validation, [promise, globalObject] (Plan& p) mutable {
- RefPtr<Plan> plan = makeRef(p);
- p.vm().promiseDeferredTimer->scheduleWorkSoon(promise, [promise, globalObject, plan = WTFMove(plan)] () mutable {
- VM& vm = plan->vm();
</del><ins>+ Wasm::Module::validateAsync(vm, WTFMove(source), createSharedTask<Wasm::Module::CallbackType>([promise, globalObject] (VM& vm, Wasm::Module::ValidationResult&& result) mutable {
+ vm.promiseDeferredTimer->scheduleWorkSoon(promise, [promise, globalObject, result = WTFMove(result), &vm] () mutable {
</ins><span class="cx"> auto scope = DECLARE_CATCH_SCOPE(vm);
</span><span class="cx"> ExecState* exec = globalObject->globalExec();
</span><del>- JSValue module = JSWebAssemblyModule::createStub(vm, exec, globalObject->WebAssemblyModuleStructure(), WTFMove(plan));
</del><ins>+ JSValue module = JSWebAssemblyModule::createStub(vm, exec, globalObject->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->promise());
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> enum class Resolve { WithInstance, WithModuleAndInstance };
</span><del>-static void resolve(VM& vm, ExecState* exec, JSPromiseDeferred* promise, JSWebAssemblyInstance* instance, JSWebAssemblyModule* module, Resolve entries)
</del><ins>+static void resolve(VM& vm, ExecState* exec, JSPromiseDeferred* promise, JSWebAssemblyInstance* instance, JSWebAssemblyModule* module, Ref<Wasm::CodeBlock>&& codeBlock, Resolve resolveKind)
</ins><span class="cx"> {
</span><span class="cx"> auto scope = DECLARE_CATCH_SCOPE(vm);
</span><del>- instance->finalizeCreation(vm, exec);
</del><ins>+ instance->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->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& vm, ExecState* exec, JSPromiseDeferred* promise, JSWebAssemblyModule* module, JSObject* importObject, Resolve entries)
</del><ins>+static void instantiate(VM& 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->initialized()) {
- resolve(vm, exec, promise, instance, module, entries);
- return;
- }
-
</del><span class="cx"> Vector<Strong<JSCell>> dependencies;
</span><span class="cx"> // The instance keeps the module alive.
</span><span class="cx"> dependencies.append(Strong<JSCell>(vm, instance));
</span><span class="cx"> vm.promiseDeferredTimer->addPendingPromise(promise, WTFMove(dependencies));
</span><del>-
- if (instance->codeBlock()) {
- instance->codeBlock()->plan().addCompletionTask([promise, instance, module, entries] (Plan& p) {
- RefPtr<Plan> plan = makeRef(p);
- p.vm().promiseDeferredTimer->scheduleWorkSoon(promise, [promise, instance, module, entries, plan = WTFMove(plan)] () {
- ExecState* exec = instance->globalObject()->globalExec();
- resolve(plan->vm(), exec, promise, instance, module, entries);
- });
- });
- return;
- }
- ASSERT(!instance->codeBlock());
-
- // FIXME: This re-parses the module header, which shouldn't be necessary.
- // https://bugs.webkit.org/show_bug.cgi?id=170205
- Ref<Plan> plan = adoptRef(*new Plan(vm, makeRef(const_cast<Wasm::ModuleInformation&>(module->moduleInformation())), Plan::FullCompile, [promise, instance, module, entries] (Plan& p) {
- RefPtr<Plan> plan = makeRef(p);
- p.vm().promiseDeferredTimer->scheduleWorkSoon(promise, [promise, instance, module, entries, plan = WTFMove(plan)] () {
- VM& vm = plan->vm();
</del><ins>+ // Note: This completion task may or may not get called immediately.
+ module->module().compileAsync(vm, instance->memoryMode(), createSharedTask<Wasm::CodeBlock::CallbackType>([promise, instance, module, resolveKind] (VM& vm, Ref<Wasm::CodeBlock>&& refCodeBlock) mutable {
+ RefPtr<Wasm::CodeBlock> codeBlock = WTFMove(refCodeBlock);
+ vm.promiseDeferredTimer->scheduleWorkSoon(promise, [promise, instance, module, resolveKind, &vm, codeBlock = WTFMove(codeBlock)] () mutable {
</ins><span class="cx"> ExecState* exec = instance->globalObject()->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->addUnitializedCodeBlock(vm, plan.copyRef());
- plan->setMode(instance->memoryMode());
- Wasm::ensureWorklist().enqueue(WTFMove(plan));
</del><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> static void compileAndInstantiate(VM& vm, ExecState* exec, JSPromiseDeferred* promise, JSValue buffer, JSObject* importObject)
</span><span class="lines">@@ -195,13 +162,11 @@
</span><span class="cx"> dependencies.append(Strong<JSCell>(vm, importObject));
</span><span class="cx"> vm.promiseDeferredTimer->addPendingPromise(promise, WTFMove(dependencies));
</span><span class="cx">
</span><del>- Ref<Plan> plan = adoptRef(*new Plan(vm, WTFMove(source), Plan::Validation, [promise, importObject, globalObject] (Plan& p) mutable {
- RefPtr<Plan> plan = makeRef(p);
- p.vm().promiseDeferredTimer->scheduleWorkSoon(promise, [promise, importObject, globalObject, plan = WTFMove(plan)] () mutable {
- VM& vm = plan->vm();
</del><ins>+ Wasm::Module::validateAsync(vm, WTFMove(source), createSharedTask<Wasm::Module::CallbackType>([promise, importObject, globalObject] (VM& vm, Wasm::Module::ValidationResult&& result) mutable {
+ vm.promiseDeferredTimer->scheduleWorkSoon(promise, [promise, importObject, globalObject, result = WTFMove(result), &vm] () mutable {
</ins><span class="cx"> auto scope = DECLARE_CATCH_SCOPE(vm);
</span><span class="cx"> ExecState* exec = globalObject->globalExec();
</span><del>- JSWebAssemblyModule* module = JSWebAssemblyModule::createStub(vm, exec, globalObject->WebAssemblyModuleStructure(), plan.copyRef());
</del><ins>+ JSWebAssemblyModule* module = JSWebAssemblyModule::createStub(vm, exec, globalObject->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->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 <sbarati@apple.com>
+
+ 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 <cgarcia@igalia.com>
</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<ArgumentTypes>(arguments)...);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> Functor m_functor;
</span></span></pre>
</div>
</div>
</body>
</html>