|
|
@@ -3,49 +3,123 @@
|
|
|
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
|
|
|
//-------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
-const toValidate = {
|
|
|
- "stack-polymorphic-yield": `
|
|
|
-(module
|
|
|
- (func (result i32)
|
|
|
- (block (result i32)
|
|
|
- (loop (br 0))
|
|
|
- unreachable
|
|
|
- drop
|
|
|
- )
|
|
|
- )
|
|
|
-)`,
|
|
|
- "stack-polymorphic-br_table": `
|
|
|
-(module
|
|
|
- (func (result i32)
|
|
|
- (block (result i32)
|
|
|
- unreachable
|
|
|
- drop
|
|
|
- (br_table 0 0)
|
|
|
- )
|
|
|
- )
|
|
|
-)`,
|
|
|
- "stack-polymorphic-br": `
|
|
|
-(module
|
|
|
- (func (result i32)
|
|
|
- unreachable
|
|
|
- drop
|
|
|
- br 0
|
|
|
- )
|
|
|
-)`,
|
|
|
- "stack-polymorphic-return": `
|
|
|
-(module
|
|
|
- (func (result i32)
|
|
|
- unreachable
|
|
|
- drop
|
|
|
- return
|
|
|
- )
|
|
|
-)`,
|
|
|
-};
|
|
|
+WScript.LoadScriptFile("../UnitTestFramework/UnitTestFramework.js");
|
|
|
+WScript.LoadScriptFile("../WasmSpec/testsuite/harness/wasm-constants.js");
|
|
|
+WScript.LoadScriptFile("../WasmSpec/testsuite/harness/wasm-module-builder.js");
|
|
|
|
|
|
-for (const key in toValidate) {
|
|
|
- if (!WebAssembly.validate(WebAssembly.wabt.convertWast2Wasm(toValidate[key]))) {
|
|
|
- print(`Module ${key} should be valid`);
|
|
|
+const tests = [{
|
|
|
+ name: "polymorphic operators regression",
|
|
|
+ usesWabt: true,
|
|
|
+ body() {
|
|
|
+ const toValidate = {
|
|
|
+ "stack-polymorphic-yield": `
|
|
|
+ (module
|
|
|
+ (func (result i32)
|
|
|
+ (block (result i32)
|
|
|
+ (loop (br 0))
|
|
|
+ unreachable
|
|
|
+ drop
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )`,
|
|
|
+ "stack-polymorphic-br_table": `
|
|
|
+ (module
|
|
|
+ (func (result i32)
|
|
|
+ (block (result i32)
|
|
|
+ unreachable
|
|
|
+ drop
|
|
|
+ (br_table 0 0)
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )`,
|
|
|
+ "stack-polymorphic-br": `
|
|
|
+ (module
|
|
|
+ (func (result i32)
|
|
|
+ unreachable
|
|
|
+ drop
|
|
|
+ br 0
|
|
|
+ )
|
|
|
+ )`,
|
|
|
+ "stack-polymorphic-return": `
|
|
|
+ (module
|
|
|
+ (func (result i32)
|
|
|
+ unreachable
|
|
|
+ drop
|
|
|
+ return
|
|
|
+ )
|
|
|
+ )`,
|
|
|
+ };
|
|
|
+ for (const key in toValidate) {
|
|
|
+ assert.isTrue(WebAssembly.validate(WebAssembly.wabt.convertWast2Wasm(toValidate[key])), `Module ${key} should be valid`);
|
|
|
+ }
|
|
|
}
|
|
|
+}, {
|
|
|
+ name: "tracing regression test",
|
|
|
+ usesWabt: false,
|
|
|
+ body() {
|
|
|
+ const tracingPrefix = 0xf0;
|
|
|
+ const builder = new WasmModuleBuilder();
|
|
|
+ const typeIndex = builder.addType(kSig_v_v);
|
|
|
+ builder.addFunction("foo", typeIndex).addBody([
|
|
|
+ tracingPrefix, 0x0,
|
|
|
+ ]).exportFunc();
|
|
|
+
|
|
|
+ try {
|
|
|
+ const {exports: {foo}} = new WebAssembly.Instance(new WebAssembly.Module(builder.toBuffer()));
|
|
|
+ foo();
|
|
|
+ assert.fail("Failed: Tracing prefix should not be accepted");
|
|
|
+ } catch (e) {
|
|
|
+ if (!e.message.includes("Tracing opcodes not allowed")) {
|
|
|
+ assert.fail("Wrong error: " + e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}, {
|
|
|
+ name: "Error message truncation test",
|
|
|
+ usesWabt: false,
|
|
|
+ body() {
|
|
|
+ const tracingPrefix = 0xf0;
|
|
|
+ const builder = new WasmModuleBuilder();
|
|
|
+ const typeIndex = builder.addType(kSig_v_v);
|
|
|
+ const exportedName = Array(5000).fill("").map((_, i) => i.toString()).join("");
|
|
|
+ builder.addFunction(exportedName, typeIndex).addBody([
|
|
|
+ // Use the same body as the test above to trigger an exception
|
|
|
+ tracingPrefix, 0x0,
|
|
|
+ ]).exportFunc();
|
|
|
+ try {
|
|
|
+ const {exports} = new WebAssembly.Instance(new WebAssembly.Module(builder.toBuffer()));
|
|
|
+ exports[exportedName]();
|
|
|
+ assert.fail("Failed: Compilation error expected");
|
|
|
+ } catch (e) {
|
|
|
+ // Make sure all platforms correctly truncate the error message to the expected length
|
|
|
+ const marker = "function ";
|
|
|
+ const index = e.message.indexOf(marker);
|
|
|
+ assert.isTrue(index !== -1);
|
|
|
+ assert.isTrue(e.message.length - index === 2047);
|
|
|
+ const sub = e.message.substring(index + marker.length, e.message.length);
|
|
|
+ const funcNameLengthUsed = 2047 - marker.length;
|
|
|
+ const funcNameUsed = exportedName.substring(0, funcNameLengthUsed);
|
|
|
+ assert.areEqual(funcNameUsed, sub, "Error message truncation unexpected result");
|
|
|
+ }
|
|
|
+ }
|
|
|
+}];
|
|
|
+
|
|
|
+WScript.LoadScriptFile("../UnitTestFramework/yargs.js");
|
|
|
+const argv = yargsParse(WScript.Arguments, {
|
|
|
+ boolean: ["verbose", "wabt"],
|
|
|
+ number: ["start", "end"],
|
|
|
+ default: {
|
|
|
+ verbose: true,
|
|
|
+ wabt: true,
|
|
|
+ start: 0,
|
|
|
+ end: tests.length
|
|
|
+ }
|
|
|
+}).argv;
|
|
|
+
|
|
|
+let todoTests = tests
|
|
|
+ .slice(argv.start, argv.end);
|
|
|
+if (!argv.wabt) {
|
|
|
+ todoTests = todoTests.filter(t => !t.usesWabt);
|
|
|
}
|
|
|
|
|
|
-print("pass");
|
|
|
+testRunner.run(todoTests, {verbose: argv.verbose});
|