Title: [230763] trunk
Revision
230763
Author
utatane....@gmail.com
Date
2018-04-18 09:33:33 -0700 (Wed, 18 Apr 2018)

Log Message

[WebAssembly][Modules] Import globals from wasm modules
https://bugs.webkit.org/show_bug.cgi?id=184736

Reviewed by JF Bastien.

JSTests:

* wasm.yaml:
* wasm/modules/wasm-imports-js-re-exports-wasm-exports.js:
* wasm/modules/wasm-imports-js-re-exports-wasm-exports/imports.wasm:
* wasm/modules/wasm-imports-js-re-exports-wasm-exports/imports.wat:
* wasm/modules/wasm-imports-js-re-exports-wasm-exports/re-export.js:
* wasm/modules/wasm-imports-js-re-exports-wasm-exports/sum.wasm:
* wasm/modules/wasm-imports-js-re-exports-wasm-exports/sum.wat:
* wasm/modules/wasm-imports-wasm-exports.js:
* wasm/modules/wasm-imports-wasm-exports/imports.wasm:
* wasm/modules/wasm-imports-wasm-exports/imports.wat:
* wasm/modules/wasm-imports-wasm-exports/sum.wasm:
* wasm/modules/wasm-imports-wasm-exports/sum.wat:

Source/_javascript_Core:

This patch implements a feature importing globals to/from wasm modules.
Since we are not supporting mutable globals now, we can just copy the
global data when importing. Currently we do not support importing/exporting
i64 globals. This will be supported once (1) mutable global bindings are
specified and (2) BigInt based i64 importing/exporting is specified.

* wasm/js/JSWebAssemblyInstance.cpp:
(JSC::JSWebAssemblyInstance::create):
* wasm/js/WebAssemblyModuleRecord.cpp:
(JSC::WebAssemblyModuleRecord::link):

Modified Paths

Added Paths

Diff

Modified: trunk/JSTests/ChangeLog (230762 => 230763)


--- trunk/JSTests/ChangeLog	2018-04-18 13:01:51 UTC (rev 230762)
+++ trunk/JSTests/ChangeLog	2018-04-18 16:33:33 UTC (rev 230763)
@@ -1,5 +1,25 @@
 2018-04-18  Yusuke Suzuki  <utatane....@gmail.com>
 
+        [WebAssembly][Modules] Import globals from wasm modules
+        https://bugs.webkit.org/show_bug.cgi?id=184736
+
+        Reviewed by JF Bastien.
+
+        * wasm.yaml:
+        * wasm/modules/wasm-imports-js-re-exports-wasm-exports.js:
+        * wasm/modules/wasm-imports-js-re-exports-wasm-exports/imports.wasm:
+        * wasm/modules/wasm-imports-js-re-exports-wasm-exports/imports.wat:
+        * wasm/modules/wasm-imports-js-re-exports-wasm-exports/re-export.js:
+        * wasm/modules/wasm-imports-js-re-exports-wasm-exports/sum.wasm:
+        * wasm/modules/wasm-imports-js-re-exports-wasm-exports/sum.wat:
+        * wasm/modules/wasm-imports-wasm-exports.js:
+        * wasm/modules/wasm-imports-wasm-exports/imports.wasm:
+        * wasm/modules/wasm-imports-wasm-exports/imports.wat:
+        * wasm/modules/wasm-imports-wasm-exports/sum.wasm:
+        * wasm/modules/wasm-imports-wasm-exports/sum.wat:
+
+2018-04-18  Yusuke Suzuki  <utatane....@gmail.com>
+
         Unreviewed, reland r230697, r230720, and r230724.
         https://bugs.webkit.org/show_bug.cgi?id=184600
 

Added: trunk/JSTests/wasm/modules/wasm-import-wasm-export-i64-error.js (0 => 230763)


--- trunk/JSTests/wasm/modules/wasm-import-wasm-export-i64-error.js	                        (rev 0)
+++ trunk/JSTests/wasm/modules/wasm-import-wasm-export-i64-error.js	2018-04-18 16:33:33 UTC (rev 230763)
@@ -0,0 +1,4 @@
+import * as assert from '../assert.js';
+import("./wasm-imports-wasm-exports-i64-error/imports.wasm").then($vm.abort, function (error) {
+    assert.eq(String(error), `Error: exported global cannot be an i64`);
+}).catch($vm.abort);

Modified: trunk/JSTests/wasm/modules/wasm-imports-js-re-exports-wasm-exports/imports.wasm (230762 => 230763)


--- trunk/JSTests/wasm/modules/wasm-imports-js-re-exports-wasm-exports/imports.wasm	2018-04-18 13:01:51 UTC (rev 230762)
+++ trunk/JSTests/wasm/modules/wasm-imports-js-re-exports-wasm-exports/imports.wasm	2018-04-18 16:33:33 UTC (rev 230763)
@@ -1,4 +1,2 @@
-asm``./re-export.jssum
-addOne
-
-A 
\ No newline at end of file
+asm```/./re-export.jssum./re-export.jsansweraddOne	getAnswer
+A #
\ No newline at end of file

Modified: trunk/JSTests/wasm/modules/wasm-imports-js-re-exports-wasm-exports/imports.wat (230762 => 230763)


--- trunk/JSTests/wasm/modules/wasm-imports-js-re-exports-wasm-exports/imports.wat	2018-04-18 13:01:51 UTC (rev 230762)
+++ trunk/JSTests/wasm/modules/wasm-imports-js-re-exports-wasm-exports/imports.wat	2018-04-18 16:33:33 UTC (rev 230763)
@@ -1,7 +1,11 @@
 (module
     (import "./re-export.js" "sum" (func $sum (param i32 i32) (result i32)))
+    (import "./re-export.js" "answer" (global i32))
     (type $t0 (func (param i32) (result i32)))
     (func $addOne (export "addOne") (type $t0) (param $p0 i32) (result i32)
         i32.const 1
         get_local $p0
-        call $sum))
+        call $sum)
+    (type $t1 (func (result i32)))
+    (func $getAnswer (export "getAnswer") (type $t1) (result i32)
+        get_global 0))

Modified: trunk/JSTests/wasm/modules/wasm-imports-js-re-exports-wasm-exports/re-export.js (230762 => 230763)


--- trunk/JSTests/wasm/modules/wasm-imports-js-re-exports-wasm-exports/re-export.js	2018-04-18 13:01:51 UTC (rev 230762)
+++ trunk/JSTests/wasm/modules/wasm-imports-js-re-exports-wasm-exports/re-export.js	2018-04-18 16:33:33 UTC (rev 230763)
@@ -1 +1 @@
-export { sum } from "./sum.wasm"
+export { sum, answer } from "./sum.wasm"

Modified: trunk/JSTests/wasm/modules/wasm-imports-js-re-exports-wasm-exports/sum.wasm (230762 => 230763)


--- trunk/JSTests/wasm/modules/wasm-imports-js-re-exports-wasm-exports/sum.wasm	2018-04-18 13:01:51 UTC (rev 230762)
+++ trunk/JSTests/wasm/modules/wasm-imports-js-re-exports-wasm-exports/sum.wasm	2018-04-18 16:33:33 UTC (rev 230763)
@@ -1,2 +1,2 @@
-asm`sum
+asm`A*sumanswer
 	  j
\ No newline at end of file

Modified: trunk/JSTests/wasm/modules/wasm-imports-js-re-exports-wasm-exports/sum.wat (230762 => 230763)


--- trunk/JSTests/wasm/modules/wasm-imports-js-re-exports-wasm-exports/sum.wat	2018-04-18 13:01:51 UTC (rev 230762)
+++ trunk/JSTests/wasm/modules/wasm-imports-js-re-exports-wasm-exports/sum.wat	2018-04-18 16:33:33 UTC (rev 230763)
@@ -3,4 +3,5 @@
     (func $sum (export "sum") (type $t0) (param $p0 i32) (param $p1 i32) (result i32)
         get_local $p1
         get_local $p0
-        i32.add))
+        i32.add)
+    (global (export "answer") i32 i32.const 42))

Modified: trunk/JSTests/wasm/modules/wasm-imports-js-re-exports-wasm-exports.js (230762 => 230763)


--- trunk/JSTests/wasm/modules/wasm-imports-js-re-exports-wasm-exports.js	2018-04-18 13:01:51 UTC (rev 230762)
+++ trunk/JSTests/wasm/modules/wasm-imports-js-re-exports-wasm-exports.js	2018-04-18 16:33:33 UTC (rev 230763)
@@ -1,4 +1,4 @@
-import { addOne } from "./wasm-imports-js-re-exports-wasm-exports/imports.wasm"
+import { addOne, getAnswer } from "./wasm-imports-js-re-exports-wasm-exports/imports.wasm"
 import * as assert from '../assert.js';
 
 assert.isFunction(addOne);
@@ -5,3 +5,5 @@
 assert.eq(addOne(32), 33);
 assert.eq(addOne(-2), -1);
 assert.eq(addOne(0x7fffffff), -2147483648);
+
+assert.eq(getAnswer(), 42);

Modified: trunk/JSTests/wasm/modules/wasm-imports-wasm-exports/imports.wasm (230762 => 230763)


--- trunk/JSTests/wasm/modules/wasm-imports-wasm-exports/imports.wasm	2018-04-18 13:01:51 UTC (rev 230762)
+++ trunk/JSTests/wasm/modules/wasm-imports-wasm-exports/imports.wasm	2018-04-18 16:33:33 UTC (rev 230763)
@@ -1,5 +1,12 @@
-asm``
-./sum.wasmsum
-addOne
-
-A 
\ No newline at end of file
+asm```}`|`
+./sum.wasmsum
+./sum.wasmanswer
+./sum.wasmanswer1}À€
+./sum.wasmanswer2|À€
+./sum.wasmanswer3}À€
+./sum.wasmanswer4|JaddOne	getAnswer
+getAnswer1À€
+getAnswer2À€
+getAnswer3À€
+getAnswer4À€
+#A #####
\ No newline at end of file

Modified: trunk/JSTests/wasm/modules/wasm-imports-wasm-exports/imports.wat (230762 => 230763)


--- trunk/JSTests/wasm/modules/wasm-imports-wasm-exports/imports.wat	2018-04-18 13:01:51 UTC (rev 230762)
+++ trunk/JSTests/wasm/modules/wasm-imports-wasm-exports/imports.wat	2018-04-18 16:33:33 UTC (rev 230763)
@@ -1,7 +1,26 @@
 (module
     (import "./sum.wasm" "sum" (func $sum (param i32 i32) (result i32)))
+    (import "./sum.wasm" "answer" (global i32))
+    (import "./sum.wasm" "answer1" (global f32))
+    (import "./sum.wasm" "answer2" (global f64))
+    (import "./sum.wasm" "answer3" (global f32))
+    (import "./sum.wasm" "answer4" (global f64))
     (type $t0 (func (param i32) (result i32)))
     (func $addOne (export "addOne") (type $t0) (param $p0 i32) (result i32)
         i32.const 1
         get_local $p0
-        call $sum))
+        call $sum)
+    (type $t1 (func (result i32)))
+    (func $getAnswer (export "getAnswer") (type $t1) (result i32)
+        get_global 0)
+    (type $t2 (func (result f32)))
+    (func $getAnswer1 (export "getAnswer1") (type $t2) (result f32)
+        get_global 1)
+    (type $t3 (func (result f64)))
+    (func $getAnswer2 (export "getAnswer2") (type $t3) (result f64)
+        get_global 2)
+    (func $getAnswer3 (export "getAnswer3") (type $t2) (result f32)
+        get_global 3)
+    (func $getAnswer4 (export "getAnswer4") (type $t3) (result f64)
+        get_global 4)
+    )

Modified: trunk/JSTests/wasm/modules/wasm-imports-wasm-exports/sum.wasm (230762 => 230763)


--- trunk/JSTests/wasm/modules/wasm-imports-wasm-exports/sum.wasm	2018-04-18 13:01:51 UTC (rev 230762)
+++ trunk/JSTests/wasm/modules/wasm-imports-wasm-exports/sum.wasm	2018-04-18 16:33:33 UTC (rev 230763)
@@ -1,2 +1,2 @@
-asm`sum
+asm`.A*}C?|D\xE0?}C\xC0|D\xF88sumansweranswer1answer2answer3answer4
 	  j
\ No newline at end of file

Modified: trunk/JSTests/wasm/modules/wasm-imports-wasm-exports/sum.wat (230762 => 230763)


--- trunk/JSTests/wasm/modules/wasm-imports-wasm-exports/sum.wat	2018-04-18 13:01:51 UTC (rev 230762)
+++ trunk/JSTests/wasm/modules/wasm-imports-wasm-exports/sum.wat	2018-04-18 16:33:33 UTC (rev 230763)
@@ -3,4 +3,9 @@
     (func $sum (export "sum") (type $t0) (param $p0 i32) (param $p1 i32) (result i32)
         get_local $p1
         get_local $p0
-        i32.add))
+        i32.add)
+    (global (export "answer") i32 i32.const 42)
+    (global (export "answer1") f32 f32.const 0.5)
+    (global (export "answer2") f64 f64.const 0.5)
+    (global (export "answer3") f32 f32.const nan)
+    (global (export "answer4") f64 f64.const nan))

Added: trunk/JSTests/wasm/modules/wasm-imports-wasm-exports-i64-error/answer.wasm (0 => 230763)


--- trunk/JSTests/wasm/modules/wasm-imports-wasm-exports-i64-error/answer.wasm	                        (rev 0)
+++ trunk/JSTests/wasm/modules/wasm-imports-wasm-exports-i64-error/answer.wasm	2018-04-18 16:33:33 UTC (rev 230763)
@@ -0,0 +1,2 @@
+asm~B*
+answer
\ No newline at end of file

Added: trunk/JSTests/wasm/modules/wasm-imports-wasm-exports-i64-error/answer.wat (0 => 230763)


--- trunk/JSTests/wasm/modules/wasm-imports-wasm-exports-i64-error/answer.wat	                        (rev 0)
+++ trunk/JSTests/wasm/modules/wasm-imports-wasm-exports-i64-error/answer.wat	2018-04-18 16:33:33 UTC (rev 230763)
@@ -0,0 +1,2 @@
+(module
+    (global (export "answer") i64 i64.const 42))

Added: trunk/JSTests/wasm/modules/wasm-imports-wasm-exports-i64-error/imports.wasm (0 => 230763)


--- trunk/JSTests/wasm/modules/wasm-imports-wasm-exports-i64-error/imports.wasm	                        (rev 0)
+++ trunk/JSTests/wasm/modules/wasm-imports-wasm-exports-i64-error/imports.wasm	2018-04-18 16:33:33 UTC (rev 230763)
@@ -0,0 +1,2 @@
+asm+./answer.wasmanswer~
\ No newline at end of file

Added: trunk/JSTests/wasm/modules/wasm-imports-wasm-exports-i64-error/imports.wat (0 => 230763)


--- trunk/JSTests/wasm/modules/wasm-imports-wasm-exports-i64-error/imports.wat	                        (rev 0)
+++ trunk/JSTests/wasm/modules/wasm-imports-wasm-exports-i64-error/imports.wat	2018-04-18 16:33:33 UTC (rev 230763)
@@ -0,0 +1,2 @@
+(module
+    (import "./answer.wasm" "answer" (global i64)))

Modified: trunk/JSTests/wasm/modules/wasm-imports-wasm-exports.js (230762 => 230763)


--- trunk/JSTests/wasm/modules/wasm-imports-wasm-exports.js	2018-04-18 13:01:51 UTC (rev 230762)
+++ trunk/JSTests/wasm/modules/wasm-imports-wasm-exports.js	2018-04-18 16:33:33 UTC (rev 230763)
@@ -1,4 +1,4 @@
-import { addOne } from "./wasm-imports-js-exports/imports.wasm"
+import { addOne, getAnswer, getAnswer1, getAnswer2, getAnswer3, getAnswer4 } from "./wasm-imports-wasm-exports/imports.wasm"
 import * as assert from '../assert.js';
 
 assert.isFunction(addOne);
@@ -5,3 +5,10 @@
 assert.eq(addOne(32), 33);
 assert.eq(addOne(-2), -1);
 assert.eq(addOne(0x7fffffff), -2147483648);
+
+assert.eq(getAnswer(), 42);
+assert.eq(getAnswer1(), 0.5);
+assert.eq(getAnswer2(), 0.5);
+
+assert.truthy(isPureNaN(getAnswer3()));
+assert.truthy(isPureNaN(getAnswer4()));

Modified: trunk/JSTests/wasm.yaml (230762 => 230763)


--- trunk/JSTests/wasm.yaml	2018-04-18 13:01:51 UTC (rev 230762)
+++ trunk/JSTests/wasm.yaml	2018-04-18 16:33:33 UTC (rev 230763)
@@ -38,7 +38,7 @@
 - path: wasm/regress/
   cmd: runWebAssemblySuite unless parseRunCommands
 - path: wasm/modules/
-  cmd: runWebAssemblySuite unless parseRunCommands
+  cmd: runWebAssembly unless parseRunCommands
 
 - path: wasm/spec-tests/address.wast.js
   cmd: runWebAssemblySpecTest :normal

Modified: trunk/Source/_javascript_Core/ChangeLog (230762 => 230763)


--- trunk/Source/_javascript_Core/ChangeLog	2018-04-18 13:01:51 UTC (rev 230762)
+++ trunk/Source/_javascript_Core/ChangeLog	2018-04-18 16:33:33 UTC (rev 230763)
@@ -1,3 +1,21 @@
+2018-04-18  Yusuke Suzuki  <utatane....@gmail.com>
+
+        [WebAssembly][Modules] Import globals from wasm modules
+        https://bugs.webkit.org/show_bug.cgi?id=184736
+
+        Reviewed by JF Bastien.
+
+        This patch implements a feature importing globals to/from wasm modules.
+        Since we are not supporting mutable globals now, we can just copy the
+        global data when importing. Currently we do not support importing/exporting
+        i64 globals. This will be supported once (1) mutable global bindings are
+        specified and (2) BigInt based i64 importing/exporting is specified.
+
+        * wasm/js/JSWebAssemblyInstance.cpp:
+        (JSC::JSWebAssemblyInstance::create):
+        * wasm/js/WebAssemblyModuleRecord.cpp:
+        (JSC::WebAssemblyModuleRecord::link):
+
 2018-04-18  Tomas Popela  <tpop...@redhat.com>
 
         Unreviewed, fix build on ARM

Modified: trunk/Source/_javascript_Core/jsc.cpp (230762 => 230763)


--- trunk/Source/_javascript_Core/jsc.cpp	2018-04-18 13:01:51 UTC (rev 230762)
+++ trunk/Source/_javascript_Core/jsc.cpp	2018-04-18 16:33:33 UTC (rev 230763)
@@ -294,6 +294,7 @@
 static EncodedJSValue JSC_HOST_CALL functionUndefined1(ExecState*);
 static EncodedJSValue JSC_HOST_CALL functionUndefined2(ExecState*);
 static EncodedJSValue JSC_HOST_CALL functionIsInt32(ExecState*);
+static EncodedJSValue JSC_HOST_CALL functionIsPureNaN(ExecState*);
 static EncodedJSValue JSC_HOST_CALL functionEffectful42(ExecState*);
 static EncodedJSValue JSC_HOST_CALL functionIdentity(ExecState*);
 static EncodedJSValue JSC_HOST_CALL functionMakeMasquerader(ExecState*);
@@ -520,6 +521,7 @@
         putDirectNativeFunction(vm, this, Identifier::fromString(&vm, "isFinalTier"), 0, functionFalse, IsFinalTierIntrinsic, static_cast<unsigned>(PropertyAttribute::DontEnum));
         putDirectNativeFunction(vm, this, Identifier::fromString(&vm, "predictInt32"), 0, functionUndefined2, SetInt32HeapPredictionIntrinsic, static_cast<unsigned>(PropertyAttribute::DontEnum));
         putDirectNativeFunction(vm, this, Identifier::fromString(&vm, "isInt32"), 0, functionIsInt32, CheckInt32Intrinsic, static_cast<unsigned>(PropertyAttribute::DontEnum));
+        putDirectNativeFunction(vm, this, Identifier::fromString(&vm, "isPureNaN"), 0, functionIsPureNaN, CheckInt32Intrinsic, static_cast<unsigned>(PropertyAttribute::DontEnum));
         putDirectNativeFunction(vm, this, Identifier::fromString(&vm, "fiatInt52"), 0, functionIdentity, FiatInt52Intrinsic, static_cast<unsigned>(PropertyAttribute::DontEnum));
         
         addFunction(vm, "effectful42", functionEffectful42, 0);
@@ -1879,6 +1881,21 @@
     return JSValue::encode(jsBoolean(true));
 }
 
+EncodedJSValue JSC_HOST_CALL functionIsPureNaN(ExecState* exec)
+{
+    for (size_t i = 0; i < exec->argumentCount(); ++i) {
+        JSValue value = exec->argument(i);
+        if (!value.isNumber())
+            return JSValue::encode(jsBoolean(false));
+        double number = value.asNumber();
+        if (!std::isnan(number))
+            return JSValue::encode(jsBoolean(false));
+        if (isImpureNaN(number))
+            return JSValue::encode(jsBoolean(false));
+    }
+    return JSValue::encode(jsBoolean(true));
+}
+
 EncodedJSValue JSC_HOST_CALL functionIdentity(ExecState* exec) { return JSValue::encode(exec->argument(0)); }
 
 EncodedJSValue JSC_HOST_CALL functionEffectful42(ExecState*)

Modified: trunk/Source/_javascript_Core/wasm/js/JSWebAssemblyInstance.cpp (230762 => 230763)


--- trunk/Source/_javascript_Core/wasm/js/JSWebAssemblyInstance.cpp	2018-04-18 13:01:51 UTC (rev 230762)
+++ trunk/Source/_javascript_Core/wasm/js/JSWebAssemblyInstance.cpp	2018-04-18 16:33:33 UTC (rev 230763)
@@ -180,8 +180,6 @@
 
     // Let funcs, memories and tables be initially-empty lists of callable _javascript_ objects, WebAssembly.Memory objects and WebAssembly.Table objects, respectively.
     // Let imports be an initially-empty list of external values.
-    unsigned numImportGlobals = 0;
-
     bool hasMemoryImport = false;
     bool hasTableImport = false;
 
@@ -207,10 +205,10 @@
         // Eventually we will move all the linking code here to WebAssemblyModuleRecord::link.
         switch (import.kind) {
         case Wasm::ExternalKind::Function:
+        case Wasm::ExternalKind::Global:
             continue;
         case Wasm::ExternalKind::Table:
         case Wasm::ExternalKind::Memory:
-        case Wasm::ExternalKind::Global:
             break;
         }
 
@@ -232,9 +230,10 @@
             value = jsUndefined();
 
         switch (import.kind) {
-        case Wasm::ExternalKind::Function: {
+        case Wasm::ExternalKind::Function:
+        case Wasm::ExternalKind::Global:
             break;
-        }
+
         case Wasm::ExternalKind::Table: {
             RELEASE_ASSERT(!hasTableImport); // This should be guaranteed by a validation failure.
             // 7. Otherwise (i is a table import):
@@ -294,34 +293,7 @@
             RETURN_IF_EXCEPTION(throwScope, nullptr);
             break;
         }
-        case Wasm::ExternalKind::Global: {
-            // 5. If i is a global import:
-            // i. If i is not an immutable global, throw a TypeError.
-            ASSERT(moduleInformation.globals[import.kindIndex].mutability == Wasm::Global::Immutable);
-            // ii. If the global_type of i is i64 or Type(v) is not Number, throw a WebAssembly.LinkError.
-            if (moduleInformation.globals[import.kindIndex].type == Wasm::I64)
-                return exception(createJSWebAssemblyLinkError(exec, vm, importFailMessage(import, "imported global", "cannot be an i64")));
-            if (!value.isNumber())
-                return exception(createJSWebAssemblyLinkError(exec, vm, importFailMessage(import, "imported global", "must be a number")));
-            // iii. Append ToWebAssemblyValue(v) to imports.
-            ASSERT(numImportGlobals == import.kindIndex);
-            switch (moduleInformation.globals[import.kindIndex].type) {
-            case Wasm::I32:
-                jsInstance->instance().setGlobal(numImportGlobals++, value.toInt32(exec));
-                break;
-            case Wasm::F32:
-                jsInstance->instance().setGlobal(numImportGlobals++, bitwise_cast<uint32_t>(value.toFloat(exec)));
-                break;
-            case Wasm::F64:
-                jsInstance->instance().setGlobal(numImportGlobals++, bitwise_cast<uint64_t>(value.asNumber()));
-                break;
-            default:
-                RELEASE_ASSERT_NOT_REACHED();
-            }
-            throwScope.assertNoException();
-            break;
         }
-        }
     }
     ASSERT(moduleRecord->importEntries().size() == moduleInformation.imports.size());
 
@@ -335,7 +307,7 @@
             // We create a memory when it's a memory definition.
             RELEASE_ASSERT(!moduleInformation.memory.isImport());
 
-            auto* jsMemory = JSWebAssemblyMemory::create(exec, vm, exec->lexicalGlobalObject()->WebAssemblyMemoryStructure());
+            auto* jsMemory = JSWebAssemblyMemory::create(exec, vm, globalObject->WebAssemblyMemoryStructure());
             RETURN_IF_EXCEPTION(throwScope, nullptr);
 
             RefPtr<Wasm::Memory> memory = Wasm::Memory::create(moduleInformation.memory.initial(), moduleInformation.memory.maximum(),
@@ -363,7 +335,7 @@
             RefPtr<Wasm::Table> wasmTable = Wasm::Table::create(moduleInformation.tableInformation.initial(), moduleInformation.tableInformation.maximum());
             if (!wasmTable)
                 return exception(createJSWebAssemblyLinkError(exec, vm, "couldn't create Table"));
-            JSWebAssemblyTable* table = JSWebAssemblyTable::create(exec, vm, exec->lexicalGlobalObject()->WebAssemblyTableStructure(), wasmTable.releaseNonNull());
+            JSWebAssemblyTable* table = JSWebAssemblyTable::create(exec, vm, globalObject->WebAssemblyTableStructure(), wasmTable.releaseNonNull());
             // We should always be able to allocate a JSWebAssemblyTable we've defined.
             // If it's defined to be too large, we should have thrown a validation error.
             throwScope.assertNoException();
@@ -375,26 +347,12 @@
     
     if (!jsInstance->memory()) {
         // Make sure we have a dummy memory, so that wasm -> wasm thunks avoid checking for a nullptr Memory when trying to set pinned registers.
-        auto* jsMemory = JSWebAssemblyMemory::create(exec, vm, exec->lexicalGlobalObject()->WebAssemblyMemoryStructure());
+        auto* jsMemory = JSWebAssemblyMemory::create(exec, vm, globalObject->WebAssemblyMemoryStructure());
         jsMemory->adopt(Wasm::Memory::create().releaseNonNull());
         jsInstance->setMemory(vm, jsMemory);
         RETURN_IF_EXCEPTION(throwScope, nullptr);
     }
     
-    // Globals
-    {
-        ASSERT(numImportGlobals == moduleInformation.firstInternalGlobal);
-        for (size_t globalIndex = numImportGlobals; globalIndex < moduleInformation.globals.size(); ++globalIndex) {
-            const auto& global = moduleInformation.globals[globalIndex];
-            ASSERT(global.initializationType != Wasm::Global::IsImport);
-            if (global.initializationType == Wasm::Global::FromGlobalImport) {
-                ASSERT(global.initialBitsOrImportNumber < numImportGlobals);
-                jsInstance->instance().setGlobal(globalIndex, jsInstance->instance().loadI64Global(global.initialBitsOrImportNumber));
-            } else
-                jsInstance->instance().setGlobal(globalIndex, global.initialBitsOrImportNumber);
-        }
-    }
-
     return jsInstance;
 }
 

Modified: trunk/Source/_javascript_Core/wasm/js/WebAssemblyModuleRecord.cpp (230762 => 230763)


--- trunk/Source/_javascript_Core/wasm/js/WebAssemblyModuleRecord.cpp	2018-04-18 13:01:51 UTC (rev 230762)
+++ trunk/Source/_javascript_Core/wasm/js/WebAssemblyModuleRecord.cpp	2018-04-18 16:33:33 UTC (rev 230763)
@@ -118,10 +118,10 @@
         // Eventually we will move all the linking code in JSWebAssemblyInstance here and remove this switch statement.
         switch (import.kind) {
         case Wasm::ExternalKind::Function:
+        case Wasm::ExternalKind::Global:
             break;
         case Wasm::ExternalKind::Table:
         case Wasm::ExternalKind::Memory:
-        case Wasm::ExternalKind::Global:
             continue;
         }
 
@@ -225,13 +225,53 @@
             m_instance->instance().importFunction<JSWebAssemblyInstance::PoisonedBarrier<JSObject>>(import.kindIndex)->set(vm, m_instance.get(), function);
             break;
         }
+
+        case Wasm::ExternalKind::Global: {
+            // 5. If i is a global import:
+            // i. If i is not an immutable global, throw a TypeError.
+            ASSERT(moduleInformation.globals[import.kindIndex].mutability == Wasm::Global::Immutable);
+            // ii. If the global_type of i is i64 or Type(v) is not Number, throw a WebAssembly.LinkError.
+            if (moduleInformation.globals[import.kindIndex].type == Wasm::I64)
+                return exception(createJSWebAssemblyLinkError(exec, vm, importFailMessage(import, "imported global", "cannot be an i64")));
+            if (!value.isNumber())
+                return exception(createJSWebAssemblyLinkError(exec, vm, importFailMessage(import, "imported global", "must be a number")));
+            // iii. Append ToWebAssemblyValue(v) to imports.
+            switch (moduleInformation.globals[import.kindIndex].type) {
+            case Wasm::I32:
+                m_instance->instance().setGlobal(import.kindIndex, value.toInt32(exec));
+                break;
+            case Wasm::F32:
+                m_instance->instance().setGlobal(import.kindIndex, bitwise_cast<uint32_t>(value.toFloat(exec)));
+                break;
+            case Wasm::F64:
+                m_instance->instance().setGlobal(import.kindIndex, bitwise_cast<uint64_t>(value.asNumber()));
+                break;
+            default:
+                RELEASE_ASSERT_NOT_REACHED();
+            }
+            scope.assertNoException();
+            break;
+        }
+
         case Wasm::ExternalKind::Table:
         case Wasm::ExternalKind::Memory:
-        case Wasm::ExternalKind::Global:
             break;
         }
     }
 
+    // Globals
+    {
+        for (size_t globalIndex = moduleInformation.firstInternalGlobal; globalIndex < moduleInformation.globals.size(); ++globalIndex) {
+            const auto& global = moduleInformation.globals[globalIndex];
+            ASSERT(global.initializationType != Wasm::Global::IsImport);
+            if (global.initializationType == Wasm::Global::FromGlobalImport) {
+                ASSERT(global.initialBitsOrImportNumber < moduleInformation.firstInternalGlobal);
+                m_instance->instance().setGlobal(globalIndex, m_instance->instance().loadI64Global(global.initialBitsOrImportNumber));
+            } else
+                m_instance->instance().setGlobal(globalIndex, global.initialBitsOrImportNumber);
+        }
+    }
+
     SymbolTable* exportSymbolTable = module->exportSymbolTable();
     unsigned functionImportCount = codeBlock->functionImportCount();
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to