v8/test/mjsunit/wasm/unicode.js
Clemens Hammacher eb1d2d7098 [wasm] Make error messages deterministic
Compilation only stores whether an error has been found, but not the
exact error or it's location. This is generated by running a validation
pass once all wire bytes have been received.
This unifies error messages by removing one more location where we
generate compilation error messages, and makes it deterministic because
a) we always report the error in the first failing function, and
b) if names are present, the error message will always contain the
   function name.

R=titzer@chromium.org

Bug: chromium:926311, v8:8814
Change-Id: I79551b8bb73dcee503484de343a3ada60a6add4f
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1521112
Commit-Queue: Clemens Hammacher <clemensh@chromium.org>
Reviewed-by: Ben Titzer <titzer@chromium.org>
Cr-Commit-Position: refs/heads/master@{#60242}
2019-03-14 15:05:18 +00:00

85 lines
3.4 KiB
JavaScript

// Copyright 2017 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
load("test/mjsunit/wasm/wasm-module-builder.js");
function checkImport(
imported_module_name, imported_function_name) {
var builder = new WasmModuleBuilder();
builder.addImport(imported_module_name, imported_function_name, kSig_i_i);
builder.addFunction('call_imp', kSig_i_i)
.addBody([kExprGetLocal, 0, kExprCallFunction, 0])
.exportFunc();
let imp = i => i + 3;
let instance = builder.instantiate(
{[imported_module_name]: {[imported_function_name]: imp}});
assertEquals(imp(0), instance.exports.call_imp(0));
assertEquals(imp(4), instance.exports.call_imp(4));
}
checkImport('mod', 'foo'); // sanity check
checkImport('mod', '☺☺happy☺☺');
checkImport('☺☺happy☺☺', 'foo');
checkImport('☺☺happy☺☺', '☼+☃=☹');
function checkExports(
internal_name_mul, exported_name_mul, internal_name_add,
exported_name_add) {
var builder = new WasmModuleBuilder();
builder.addFunction(internal_name_mul, kSig_i_ii)
.addBody([kExprGetLocal, 0, kExprGetLocal, 1, kExprI32Mul])
.exportAs(exported_name_mul);
builder.addFunction(internal_name_add, kSig_i_ii)
.addBody([kExprGetLocal, 0, kExprGetLocal, 1, kExprI32Add])
.exportAs(exported_name_add);
let instance = builder.instantiate();
assertEquals(14, instance.exports[exported_name_add](3, 11));
assertEquals(-7, instance.exports[exported_name_add](5, -12));
assertEquals(28, instance.exports[exported_name_mul](4, 7));
assertEquals(-6, instance.exports[exported_name_mul](-3, 2));
}
checkExports('mul', 'mul', 'add', 'add'); // sanity check
checkExports('☺☺mul☺☺', 'mul', '☺☺add☺☺', 'add');
checkExports('☺☺mul☺☺', '☺☺mul☺☺', '☺☺add☺☺', '☺☺add☺☺');
(function errorMessageUnicodeInFuncName() {
var builder = new WasmModuleBuilder();
builder.addFunction('three snowmen: ☃☃☃', kSig_i_v).addBody([]).exportFunc();
assertThrows(
() => builder.instantiate(), WebAssembly.CompileError,
/Compiling function #0:"three snowmen: ☃☃☃" failed: /);
})();
(function errorMessageUnicodeInImportModuleName() {
var builder = new WasmModuleBuilder();
builder.addImport('three snowmen: ☃☃☃', 'foo', kSig_i_v);
assertThrows(
() => builder.instantiate({}), TypeError,
/WebAssembly.Instance\(\): Import #0 module="three snowmen: ☃☃☃" error: /);
})();
(function errorMessageUnicodeInImportElemName() {
var builder = new WasmModuleBuilder();
builder.addImport('mod', 'three snowmen: ☃☃☃', kSig_i_v);
assertThrows(
() => builder.instantiate({mod: {}}), WebAssembly.LinkError,
'WebAssembly.Instance\(\): Import #0 module="mod" function="three ' +
'snowmen: ☃☃☃" error: function import requires a callable');
})();
(function errorMessageUnicodeInImportModAndElemName() {
var builder = new WasmModuleBuilder();
let mod_name = '☮▁▂▃▄☾ ♛ ◡ ♛ ☽▄▃▂▁☮';
let func_name = '☾˙❀‿❀˙☽';
builder.addImport(mod_name, func_name, kSig_i_v);
assertThrows(
() => builder.instantiate({[mod_name]: {}}), WebAssembly.LinkError,
'WebAssembly.Instance(): Import #0 module="' + mod_name +
'" function="' + func_name +
'" error: function import requires a callable');
})();