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

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

<h3>Log Message</h3>
<pre>Implement imported global variables in WebAssembly
https://bugs.webkit.org/show_bug.cgi?id=149206

Patch by Sukolsak Sakshuwong &lt;sukolsak@gmail.com&gt; on 2015-09-15
Reviewed by Filip Pizlo.

Values can now be imported to a WebAssembly module through properties of
the imports object that is passed to loadWebAssembly(). In order to
avoid any side effect when accessing the imports object, we check that
the properties are data properties. We also check that each value is a
primitive and is not a Symbol. According to the ECMA262 6.0 spec,
calling ToNumber() on a primitive that is not a Symbol should not cause
any side effect.[1]

[1]: http://www.ecma-international.org/ecma-262/6.0/#sec-tonumber

* tests/stress/wasm-globals.js:
* tests/stress/wasm/globals.wasm:
* wasm/WASMModuleParser.cpp:
(JSC::WASMModuleParser::parseModule):
(JSC::WASMModuleParser::parseGlobalSection):
* wasm/WASMModuleParser.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoretestsstresswasmglobalswasm">trunk/Source/JavaScriptCore/tests/stress/wasm/globals.wasm</a></li>
<li><a href="#trunkSourceJavaScriptCoretestsstresswasmglobalsjs">trunk/Source/JavaScriptCore/tests/stress/wasm-globals.js</a></li>
<li><a href="#trunkSourceJavaScriptCorewasmWASMModuleParsercpp">trunk/Source/JavaScriptCore/wasm/WASMModuleParser.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorewasmWASMModuleParserh">trunk/Source/JavaScriptCore/wasm/WASMModuleParser.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (189845 => 189846)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2015-09-16 04:22:21 UTC (rev 189845)
+++ trunk/Source/JavaScriptCore/ChangeLog        2015-09-16 05:49:11 UTC (rev 189846)
</span><span class="lines">@@ -1,5 +1,29 @@
</span><span class="cx"> 2015-09-15  Sukolsak Sakshuwong  &lt;sukolsak@gmail.com&gt;
</span><span class="cx"> 
</span><ins>+        Implement imported global variables in WebAssembly
+        https://bugs.webkit.org/show_bug.cgi?id=149206
+
+        Reviewed by Filip Pizlo.
+
+        Values can now be imported to a WebAssembly module through properties of
+        the imports object that is passed to loadWebAssembly(). In order to
+        avoid any side effect when accessing the imports object, we check that
+        the properties are data properties. We also check that each value is a
+        primitive and is not a Symbol. According to the ECMA262 6.0 spec,
+        calling ToNumber() on a primitive that is not a Symbol should not cause
+        any side effect.[1]
+
+        [1]: http://www.ecma-international.org/ecma-262/6.0/#sec-tonumber
+
+        * tests/stress/wasm-globals.js:
+        * tests/stress/wasm/globals.wasm:
+        * wasm/WASMModuleParser.cpp:
+        (JSC::WASMModuleParser::parseModule):
+        (JSC::WASMModuleParser::parseGlobalSection):
+        * wasm/WASMModuleParser.h:
+
+2015-09-15  Sukolsak Sakshuwong  &lt;sukolsak@gmail.com&gt;
+
</ins><span class="cx">         Fix asm.js errors in WebAssembly tests
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=149203
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoretestsstresswasmglobalswasm"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/tests/stress/wasm/globals.wasm (189845 => 189846)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/tests/stress/wasm/globals.wasm        2015-09-16 04:22:21 UTC (rev 189845)
+++ trunk/Source/JavaScriptCore/tests/stress/wasm/globals.wasm        2015-09-16 05:49:11 UTC (rev 189846)
</span><span class="lines">@@ -1 +1 @@
</span><del>-wasm\xD2\x80\x80\x80\x80\xA0\xC0\x80\xA1\xA0\x80\xA2\xA0getXgetYgetZsetXsetYsetZ
</del><span class="cx">\ No newline at end of file
</span><ins>+wasmmabc        \x80\x80\x80\x80\x80\x80\x80\xA0\xC0\x80\xA1\xA0\x80\xA2\xA0        getAgetBgetCgetXgetYgetZsetXsetYsetZ
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoretestsstresswasmglobalsjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/tests/stress/wasm-globals.js (189845 => 189846)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/tests/stress/wasm-globals.js        2015-09-16 04:22:21 UTC (rev 189845)
+++ trunk/Source/JavaScriptCore/tests/stress/wasm-globals.js        2015-09-16 05:49:11 UTC (rev 189846)
</span><span class="lines">@@ -8,14 +8,29 @@
</span><span class="cx"> /*
</span><span class="cx"> wasm/globals.wasm is generated by pack-asmjs &lt;https://github.com/WebAssembly/polyfill-prototype-1&gt; from the following script:
</span><span class="cx"> 
</span><del>-function asmModule(global, env, buffer) {
</del><ins>+function asmModule(global, imports, buffer) {
</ins><span class="cx">     &quot;use asm&quot;;
</span><span class="cx"> 
</span><span class="cx">     var fround = global.Math.fround;
</span><ins>+    var a = imports.a | 0;
+    var b = fround(imports.b);
+    var c = +imports.c;
</ins><span class="cx">     var x = 0;
</span><span class="cx">     var y = fround(0);
</span><span class="cx">     var z = 0.0;
</span><span class="cx"> 
</span><ins>+    function getA() {
+        return a | 0;
+    }
+
+    function getB() {
+        return b;
+    }
+
+    function getC() {
+        return c;
+    }
+
</ins><span class="cx">     function getX() {
</span><span class="cx">         return x | 0;
</span><span class="cx">     }
</span><span class="lines">@@ -44,6 +59,9 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return {
</span><ins>+        getA: getA,
+        getB: getB,
+        getC: getC,
</ins><span class="cx">         getX: getX,
</span><span class="cx">         getY: getY,
</span><span class="cx">         getZ: getZ,
</span><span class="lines">@@ -54,8 +72,17 @@
</span><span class="cx"> }
</span><span class="cx"> */
</span><span class="cx"> 
</span><del>-var module = loadWebAssembly(&quot;wasm/globals.wasm&quot;);
</del><ins>+var imports = {
+    a: 42,
+    b: 4.2,
+    c: 4.2,
+};
+var module = loadWebAssembly(&quot;wasm/globals.wasm&quot;, imports);
</ins><span class="cx"> 
</span><ins>+shouldBe(module.getA(), 42);
+shouldBe(module.getB(), 4.199999809265137);
+shouldBe(module.getC(), 4.2);
+
</ins><span class="cx"> shouldBe(module.getX(), 0);
</span><span class="cx"> shouldBe(module.getY(), 0);
</span><span class="cx"> shouldBe(module.getZ(), 0);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorewasmWASMModuleParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/wasm/WASMModuleParser.cpp (189845 => 189846)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/wasm/WASMModuleParser.cpp        2015-09-16 04:22:21 UTC (rev 189845)
+++ trunk/Source/JavaScriptCore/wasm/WASMModuleParser.cpp        2015-09-16 05:49:11 UTC (rev 189846)
</span><span class="lines">@@ -84,7 +84,7 @@
</span><span class="cx">     PROPAGATE_ERROR();
</span><span class="cx">     parseFunctionImportSection(exec);
</span><span class="cx">     PROPAGATE_ERROR();
</span><del>-    parseGlobalSection();
</del><ins>+    parseGlobalSection(exec);
</ins><span class="cx">     PROPAGATE_ERROR();
</span><span class="cx">     parseFunctionDeclarationSection();
</span><span class="cx">     PROPAGATE_ERROR();
</span><span class="lines">@@ -181,7 +181,7 @@
</span><span class="cx">     FAIL_IF_FALSE(m_module-&gt;functionImportSignatures().size() == numberOfFunctionImportSignatures, &quot;The number of function import signatures is incorrect.&quot;);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WASMModuleParser::parseGlobalSection()
</del><ins>+void WASMModuleParser::parseGlobalSection(ExecState* exec)
</ins><span class="cx"> {
</span><span class="cx">     uint32_t numberOfInternalI32GlobalVariables;
</span><span class="cx">     uint32_t numberOfInternalF32GlobalVariables;
</span><span class="lines">@@ -218,19 +218,31 @@
</span><span class="cx">         String importName;
</span><span class="cx">         READ_STRING_OR_FAIL(importName, &quot;Cannot read the import name of an int32 global variable.&quot;);
</span><span class="cx">         globalVariableTypes.uncheckedAppend(WASMType::I32);
</span><del>-        globalVariables.uncheckedAppend(JSWASMModule::GlobalVariable(0)); // FIXME: Import the value.
</del><ins>+        JSValue value;
+        getImportedValue(exec, importName, value);
+        PROPAGATE_ERROR();
+        FAIL_IF_FALSE(value.isPrimitive() &amp;&amp; !value.isSymbol(), &quot;\&quot;&quot; + importName + &quot;\&quot; is not a primitive or is a Symbol.&quot;);
+        globalVariables.uncheckedAppend(JSWASMModule::GlobalVariable(value.toInt32(exec)));
</ins><span class="cx">     }
</span><span class="cx">     for (uint32_t i = 0; i &lt; numberOfImportedF32GlobalVariables; ++i) {
</span><span class="cx">         String importName;
</span><span class="cx">         READ_STRING_OR_FAIL(importName, &quot;Cannot read the import name of a float32 global variable.&quot;);
</span><span class="cx">         globalVariableTypes.uncheckedAppend(WASMType::F32);
</span><del>-        globalVariables.uncheckedAppend(JSWASMModule::GlobalVariable(0.0f)); // FIXME: Import the value.
</del><ins>+        JSValue value;
+        getImportedValue(exec, importName, value);
+        PROPAGATE_ERROR();
+        FAIL_IF_FALSE(value.isPrimitive() &amp;&amp; !value.isSymbol(), &quot;\&quot;&quot; + importName + &quot;\&quot; is not a primitive or is a Symbol.&quot;);
+        globalVariables.uncheckedAppend(JSWASMModule::GlobalVariable(static_cast&lt;float&gt;(value.toNumber(exec))));
</ins><span class="cx">     }
</span><span class="cx">     for (uint32_t i = 0; i &lt; numberOfImportedF64GlobalVariables; ++i) {
</span><span class="cx">         String importName;
</span><span class="cx">         READ_STRING_OR_FAIL(importName, &quot;Cannot read the import name of a float64 global variable.&quot;);
</span><span class="cx">         globalVariableTypes.uncheckedAppend(WASMType::F64);
</span><del>-        globalVariables.uncheckedAppend(JSWASMModule::GlobalVariable(0.0)); // FIXME: Import the value.
</del><ins>+        JSValue value;
+        getImportedValue(exec, importName, value);
+        PROPAGATE_ERROR();
+        FAIL_IF_FALSE(value.isPrimitive() &amp;&amp; !value.isSymbol(), &quot;\&quot;&quot; + importName + &quot;\&quot; is not a primitive or is a Symbol.&quot;);
+        globalVariables.uncheckedAppend(JSWASMModule::GlobalVariable(value.toNumber(exec)));
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorewasmWASMModuleParserh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/wasm/WASMModuleParser.h (189845 => 189846)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/wasm/WASMModuleParser.h        2015-09-16 04:22:21 UTC (rev 189845)
+++ trunk/Source/JavaScriptCore/wasm/WASMModuleParser.h        2015-09-16 05:49:11 UTC (rev 189846)
</span><span class="lines">@@ -50,7 +50,7 @@
</span><span class="cx">     void parseConstantPoolSection();
</span><span class="cx">     void parseSignatureSection();
</span><span class="cx">     void parseFunctionImportSection(ExecState*);
</span><del>-    void parseGlobalSection();
</del><ins>+    void parseGlobalSection(ExecState*);
</ins><span class="cx">     void parseFunctionDeclarationSection();
</span><span class="cx">     void parseFunctionPointerTableSection();
</span><span class="cx">     void parseFunctionDefinitionSection();
</span></span></pre>
</div>
</div>

</body>
</html>