Bug 1416766: Int64 wasm globals should cause a link failure at instanciation time, not compile time; r=luke

MozReview-Commit-ID: 5Ryl47naf9R

--HG--
extra : rebase_source : 742df9347c1a3492f638592436e113922ce46784
This commit is contained in:
Benjamin Bouvier 2017-11-09 16:30:42 +01:00
parent 5ced9d1b55
commit d380ec393f
6 changed files with 21 additions and 12 deletions

View File

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

View File

@ -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}")

View File

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

View File

@ -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;

View File

@ -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;

View File

@ -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");