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();