diff --git a/js/src/jit-test/tests/wasm/globals.js b/js/src/jit-test/tests/wasm/globals.js index b666922adf30..fd896594a819 100644 --- a/js/src/jit-test/tests/wasm/globals.js +++ b/js/src/jit-test/tests/wasm/globals.js @@ -228,8 +228,13 @@ testInitExpr('f64', 13.37, 0.1989, x => +x); // Int64. { - wasmFailValidateText(`(module (import "globals" "x" (global i64)))`, /can't import.* an Int64 global/); - wasmFailValidateText(`(module (global i64 (i64.const 42)) (export "" global 0))`, /can't .*export an Int64 global/); + let module = new WebAssembly.Module(wasmTextToBinary(`(module (import "globals" "x" (global i64)))`)); + assertErrorMessage(() => new WebAssembly.Instance(module, {globals: {x:42}}), + WebAssembly.LinkError, + /cannot pass i64 to or from JS/); + + module = new WebAssembly.Module(wasmTextToBinary(`(module (global i64 (i64.const 42)) (export "" global 0))`)); + assertErrorMessage(() => new WebAssembly.Instance(module), WebAssembly.LinkError, /cannot pass i64 to or from JS/); setJitCompilerOption('wasm.test-mode', 1); testInner('i64', '0x531642753864975F', '0x123456789abcdef0', createI64, assertEqI64); diff --git a/js/src/js.msg b/js/src/js.msg index f5b4807bcea4..267243a77797 100644 --- a/js/src/js.msg +++ b/js/src/js.msg @@ -366,6 +366,7 @@ MSG_DEF(JSMSG_WASM_BAD_IMPORT_SIG, 2, JSEXN_WASMLINKERROR, "imported functio MSG_DEF(JSMSG_WASM_BAD_IMP_SIZE, 1, JSEXN_WASMLINKERROR, "imported {0} with incompatible size") MSG_DEF(JSMSG_WASM_BAD_IMP_MAX, 1, JSEXN_WASMLINKERROR, "imported {0} with incompatible maximum size") MSG_DEF(JSMSG_WASM_BAD_FIT, 2, JSEXN_WASMLINKERROR, "{0} segment does not fit in {1}") +MSG_DEF(JSMSG_WASM_BAD_I64_LINK, 0, JSEXN_WASMLINKERROR, "cannot pass i64 to or from JS") MSG_DEF(JSMSG_WASM_IND_CALL_TO_NULL, 0, JSEXN_WASMRUNTIMEERROR, "indirect call to null") MSG_DEF(JSMSG_WASM_IND_CALL_BAD_SIG, 0, JSEXN_WASMRUNTIMEERROR, "indirect call signature mismatch") MSG_DEF(JSMSG_WASM_UNREACHABLE, 0, JSEXN_WASMRUNTIMEERROR, "unreachable executed") @@ -384,7 +385,7 @@ MSG_DEF(JSMSG_WASM_BAD_ELEMENT, 0, JSEXN_TYPEERR, "\"element\" proper MSG_DEF(JSMSG_WASM_BAD_IMPORT_ARG, 0, JSEXN_TYPEERR, "second argument must be an object") MSG_DEF(JSMSG_WASM_BAD_IMPORT_FIELD, 1, JSEXN_TYPEERR, "import object field '{0}' is not an Object") MSG_DEF(JSMSG_WASM_BAD_TABLE_VALUE, 0, JSEXN_TYPEERR, "can only assign WebAssembly exported functions to Table") -MSG_DEF(JSMSG_WASM_BAD_I64, 0, JSEXN_TYPEERR, "cannot pass i64 to or from JS") +MSG_DEF(JSMSG_WASM_BAD_I64_TYPE, 0, JSEXN_TYPEERR, "cannot pass i64 to or from JS") MSG_DEF(JSMSG_WASM_NO_TRANSFER, 0, JSEXN_TYPEERR, "cannot transfer WebAssembly/asm.js ArrayBuffer") MSG_DEF(JSMSG_WASM_STREAM_ERROR, 0, JSEXN_TYPEERR, "stream error during WebAssembly compilation") MSG_DEF(JSMSG_WASM_TEXT_FAIL, 1, JSEXN_SYNTAXERR, "wasm text error: {0}") diff --git a/js/src/wasm/WasmInstance.cpp b/js/src/wasm/WasmInstance.cpp index 8412ba0f3c94..c3a3c099c0d4 100644 --- a/js/src/wasm/WasmInstance.cpp +++ b/js/src/wasm/WasmInstance.cpp @@ -150,7 +150,7 @@ Instance::callImport(JSContext* cx, uint32_t funcImportIndex, unsigned argc, con break; case ValType::I64: { if (!JitOptions.wasmTestMode) { - JS_ReportErrorNumberUTF8(cx, GetErrorMessage, nullptr, JSMSG_WASM_BAD_I64); + JS_ReportErrorNumberUTF8(cx, GetErrorMessage, nullptr, JSMSG_WASM_BAD_I64_TYPE); return false; } RootedObject obj(cx, CreateI64Object(cx, *(int64_t*)&argv[i])); @@ -180,7 +180,7 @@ Instance::callImport(JSContext* cx, uint32_t funcImportIndex, unsigned argc, con // Throw an error if returning i64 and not in test mode. if (!JitOptions.wasmTestMode && fi.sig().ret() == ExprType::I64) { - JS_ReportErrorNumberUTF8(cx, GetErrorMessage, nullptr, JSMSG_WASM_BAD_I64); + JS_ReportErrorNumberUTF8(cx, GetErrorMessage, nullptr, JSMSG_WASM_BAD_I64_TYPE); return false; } @@ -611,7 +611,7 @@ Instance::callExport(JSContext* cx, uint32_t funcIndex, CallArgs args) break; case ValType::I64: if (!JitOptions.wasmTestMode) { - JS_ReportErrorNumberUTF8(cx, GetErrorMessage, nullptr, JSMSG_WASM_BAD_I64); + JS_ReportErrorNumberUTF8(cx, GetErrorMessage, nullptr, JSMSG_WASM_BAD_I64_TYPE); return false; } if (!ReadI64Object(cx, v, (int64_t*)&exportArgs[i])) @@ -722,7 +722,7 @@ Instance::callExport(JSContext* cx, uint32_t funcIndex, CallArgs args) break; case ExprType::I64: if (!JitOptions.wasmTestMode) { - JS_ReportErrorNumberUTF8(cx, GetErrorMessage, nullptr, JSMSG_WASM_BAD_I64); + JS_ReportErrorNumberUTF8(cx, GetErrorMessage, nullptr, JSMSG_WASM_BAD_I64_TYPE); return false; } retObj = CreateI64Object(cx, *(int64_t*)retAddr); diff --git a/js/src/wasm/WasmJS.cpp b/js/src/wasm/WasmJS.cpp index 9cfd808ac6fb..5862bb4e508b 100644 --- a/js/src/wasm/WasmJS.cpp +++ b/js/src/wasm/WasmJS.cpp @@ -288,7 +288,10 @@ GetImports(JSContext* cx, break; } case ValType::I64: { - MOZ_ASSERT(JitOptions.wasmTestMode, "no int64 in JS"); + if (!JitOptions.wasmTestMode) { + JS_ReportErrorNumberUTF8(cx, GetErrorMessage, nullptr, JSMSG_WASM_BAD_I64_LINK); + return false; + } int64_t i64; if (!ReadI64Object(cx, v, &i64)) return false; diff --git a/js/src/wasm/WasmModule.cpp b/js/src/wasm/WasmModule.cpp index e16c08b6dd13..81e150cdb745 100644 --- a/js/src/wasm/WasmModule.cpp +++ b/js/src/wasm/WasmModule.cpp @@ -1019,7 +1019,10 @@ GetGlobalExport(JSContext* cx, const GlobalDescVector& globals, uint32_t globalI return true; } case ValType::I64: { - MOZ_ASSERT(JitOptions.wasmTestMode, "no int64 in asm.js/wasm"); + if (!JitOptions.wasmTestMode) { + JS_ReportErrorNumberUTF8(cx, GetErrorMessage, nullptr, JSMSG_WASM_BAD_I64_LINK); + return false; + } RootedObject obj(cx, CreateI64Object(cx, val.i64())); if (!obj) return false; diff --git a/js/src/wasm/WasmValidate.cpp b/js/src/wasm/WasmValidate.cpp index eb0e1bb699cb..c580fc45b7e5 100644 --- a/js/src/wasm/WasmValidate.cpp +++ b/js/src/wasm/WasmValidate.cpp @@ -928,10 +928,7 @@ GlobalIsJSCompatible(Decoder& d, ValType type, bool isMutable) case ValType::I32: case ValType::F32: case ValType::F64: - break; case ValType::I64: - if (!jit::JitOptions.wasmTestMode) - return d.fail("can't import/export an Int64 global to JS"); break; default: return d.fail("unexpected variable type in global import/export");