Chromium Code Reviews| Index: test/mjsunit/asm/asm-validation.js |
| diff --git a/test/mjsunit/asm/asm-validation.js b/test/mjsunit/asm/asm-validation.js |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..8849b28a03fd66e02927f37b4de02eb74b3f9e5a |
| --- /dev/null |
| +++ b/test/mjsunit/asm/asm-validation.js |
| @@ -0,0 +1,177 @@ |
| +// Copyright 2016 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. |
| + |
| +// Flags: --validate-asm --allow-natives-syntax |
| + |
| +(function TestModuleArgs() { |
| + function Module1(stdlib) { |
| + "use asm"; |
| + function foo() { } |
| + return { foo: foo }; |
| + } |
| + function Module2(stdlib, ffi) { |
| + "use asm"; |
| + function foo() { } |
| + return { foo: foo }; |
| + } |
| + function Module3(stdlib, ffi, heap) { |
| + "use asm"; |
| + function foo() { } |
| + return { foo: foo }; |
| + } |
| + var modules = [Module1, Module2, Module3]; |
| + var heap = new ArrayBuffer(1024 * 1024); |
| + for (var i = 0; i < modules.length; ++i) { |
| + print('Module' + (i + 1)); |
| + var module = modules[i]; |
| + // TODO(bradnelson): Support modules without the stdlib. |
| + var m = module({}); |
| + assertTrue(%IsAsmWasmCode(module)); |
| + var m = module({}, {}); |
| + assertTrue(%IsAsmWasmCode(module)); |
| + var m = module({}, {}, heap); |
| + assertTrue(%IsAsmWasmCode(module)); |
| + var m = module({}, {}, heap, {}); |
| + assertTrue(%IsAsmWasmCode(module)); |
| + } |
| +})(); |
| + |
| +(function TestBadModule() { |
| + function Module(stdlib, ffi, heap) { |
| + "use asm"; |
| + function foo() { var y = 3; var x = 1 + y; return 123; } |
| + return { foo: foo }; |
| + } |
| + var m = Module({}); |
| + assertFalse(%IsAsmWasmCode(Module)); |
| + assertEquals(123, m.foo()); |
| +})(); |
| + |
| +(function TestBadArgTypes() { |
| + function Module(a, b, c) { |
| + "use asm"; |
| + return {}; |
| + } |
| + var m = Module(1, 2, 3); |
| + assertFalse(%IsAsmWasmCode(Module)); |
| + assertEquals({}, m); |
| +})(); |
| + |
| +(function TestBadArgTypesMismatch() { |
| + function Module(a, b, c) { |
| + "use asm"; |
| + return {}; |
| + } |
| + var m = Module(1, 2); |
| + assertFalse(%IsAsmWasmCode(Module)); |
| + assertEquals({}, m); |
| +})(); |
| + |
| +(function TestModuleNoStdlib() { |
| + // TODO(bradnelson): |
| + // Support modules like this if they don't use the whole stdlib. |
| + function Module() { |
| + "use asm"; |
| + function foo() { return 123; } |
| + return { foo: foo }; |
| + } |
| + var m = Module({}); |
| + assertFalse(%IsAsmWasmCode(Module)); |
| + assertEquals(123, m.foo()); |
| +})(); |
| + |
| +(function TestModuleWith5() { |
| + function Module(a, b, c, d, e) { |
| + "use asm"; |
| + function foo() { return 123; } |
| + return { foo: foo }; |
| + } |
| + var heap = new ArrayBuffer(1024 * 1024); |
| + var m = Module({}, {}, heap); |
| + assertFalse(%IsAsmWasmCode(Module)); |
| + assertEquals(123, m.foo()); |
| +})(); |
| + |
| +(function TestModuleNoStdlibCall() { |
| + function Module(stdlib, ffi, heap) { |
| + "use asm"; |
| + function foo() { return 123; } |
| + return { foo: foo }; |
| + } |
| + // TODO(bradnelson): Support instantiation like this if stdlib is unused. |
| + var m = Module(); |
| + assertFalse(%IsAsmWasmCode(Module)); |
| + assertEquals(123, m.foo()); |
| +})(); |
| + |
| +(function TestModuleNew() { |
| + function Module(stdlib, ffi, heap) { |
| + "use asm"; |
| + function foo() { return 123; } |
| + return { foo: foo }; |
| + } |
| + var m = new Module({}, {}); |
| + assertTrue(%IsAsmWasmCode(Module)); |
| + assertEquals(123, m.foo()); |
| +})(); |
| + |
| +(function TestMultipleFailures() { |
| + function Module(stdlib) { |
| + "use asm"; |
| + function foo() { return 123; } |
| + return { foo: foo }; |
| + } |
| + var m1 = Module(1, 2, 3); |
| + assertFalse(%IsAsmWasmCode(Module)); |
| + var m2 = Module(1, 2, 3); |
| + assertFalse(%IsAsmWasmCode(Module)); |
| + assertEquals(123, m1.foo()); |
| + assertEquals(123, m2.foo()); |
| +})(); |
| + |
| +(function TestFailureThenSuccess() { |
| + function Module(stdlib, ffi, heap) { |
|
Michael Starzinger
2016/08/12 09:21:56
This is not exactly what I had in mind. This will
bradn
2016/08/12 18:50:02
Done.
|
| + "use asm"; |
| + function foo() { return 123; } |
| + return { foo: foo }; |
| + } |
| + var heap = new ArrayBuffer(1024 * 1024); |
| + var m1 = Module(1, 2, 3); |
| + assertFalse(%IsAsmWasmCode(Module)); |
| + var m2 = Module({}, {}, heap); |
| + // TODO(bradnelson): Worth making this succeed? |
| + // This would require creating a new SharedFunctionInfo |
| + // on failure at instantiation time. |
| + assertFalse(%IsAsmWasmCode(Module)); |
| + assertEquals(123, m1.foo()); |
| + assertEquals(123, m2.foo()); |
| +})(); |
| + |
| +(function TestSuccessThenFailure() { |
| + function Module(stdlib, ffi, heap) { |
| + "use asm"; |
| + function foo() { return 123; } |
| + return { foo: foo }; |
| + } |
| + var heap = new ArrayBuffer(1024 * 1024); |
| + var m1 = Module({}, {}, heap); |
| + assertTrue(%IsAsmWasmCode(Module)); |
| + var m2 = Module(1, 2, 3); |
| + assertFalse(%IsAsmWasmCode(Module)); |
| + assertEquals(123, m1.foo()); |
| + assertEquals(123, m2.foo()); |
| +})(); |
| + |
| +(function TestBoundFunction() { |
| + function Module(stdlib, ffi, heap) { |
| + "use asm"; |
| + function foo() { return 123; } |
| + return { foo: foo }; |
| + } |
| + var heap = new ArrayBuffer(1024 * 1024); |
| + var ModuleBound = Module.bind(this, {}, {}, heap); |
| + var m = ModuleBound(); |
| + assertTrue(%IsAsmWasmCode(Module)); |
| + assertEquals(123, m.foo()); |
| +})(); |