| Index: test/mjsunit/wasm/errors.js | 
| diff --git a/test/mjsunit/wasm/errors.js b/test/mjsunit/wasm/errors.js | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..97ce89998b2eec60a6dbe64c1cec748684b46265 | 
| --- /dev/null | 
| +++ b/test/mjsunit/wasm/errors.js | 
| @@ -0,0 +1,134 @@ | 
| +// 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: --expose-wasm | 
| + | 
| +'use strict'; | 
| + | 
| +load("test/mjsunit/wasm/wasm-constants.js"); | 
| +load("test/mjsunit/wasm/wasm-module-builder.js"); | 
| + | 
| +function module(bytes) { | 
| +  let buffer = bytes; | 
| +  if (typeof buffer === 'string') { | 
| +    buffer = new ArrayBuffer(bytes.length); | 
| +    let view = new Uint8Array(buffer); | 
| +    for (let i = 0; i < bytes.length; ++i) { | 
| +      view[i] = bytes.charCodeAt(i); | 
| +    } | 
| +  } | 
| +  return new WebAssembly.Module(buffer); | 
| +} | 
| + | 
| +function instance(bytes, imports = {}) { | 
| +  return new WebAssembly.Instance(module(bytes), imports); | 
| +} | 
| + | 
| +function builder() { | 
| +  return new WasmModuleBuilder; | 
| +} | 
| + | 
| +function assertCompileError(bytes) { | 
| +  assertThrows(() => module(bytes), WebAssembly.CompileError); | 
| +} | 
| + | 
| +function assertLinkError(bytes, imports = {}) { | 
| +  assertThrows(() => instance(bytes, imports), TypeError); | 
| +} | 
| + | 
| +function assertRuntimeError(bytes, imports = {}) { | 
| +  assertThrows(() => instance(bytes, imports).exports.run(), | 
| +    WebAssembly.RuntimeError); | 
| +} | 
| + | 
| +function assertConversionError(bytes, imports = {}) { | 
| +  assertThrows(() => instance(bytes, imports).exports.run(), TypeError); | 
| +} | 
| + | 
| +(function TestDecodingError() { | 
| +  assertCompileError(""); | 
| +  assertCompileError("X"); | 
| +  assertCompileError("\0x00asm"); | 
| +})(); | 
| + | 
| +(function TestValidationError() { | 
| +  assertCompileError(builder().addFunction("f", kSig_i_v).end().toBuffer()); | 
| +  assertCompileError(builder().addFunction("f", kSig_i_v).addBody([ | 
| +    kExprReturn | 
| +  ]).end().toBuffer()); | 
| +  assertCompileError(builder().addFunction("f", kSig_v_v).addBody([ | 
| +    kExprGetLocal, 0 | 
| +  ]).end().toBuffer()); | 
| +  assertCompileError(builder().addStart(0).toBuffer()); | 
| +})(); | 
| + | 
| +(function TestLinkingError() { | 
| +  let b; | 
| + | 
| +  b = builder(); | 
| +  b.addImportWithModule("foo", "bar", kSig_v_v); | 
| +  assertLinkError(b.toBuffer(), {}); | 
| +  b = builder(); | 
| +  b.addImportWithModule("foo", "bar", kSig_v_v); | 
| +  assertLinkError(b.toBuffer(), {foo: {}}); | 
| +  b = builder(); | 
| +  b.addImportWithModule("foo", "bar", kSig_v_v); | 
| +  assertLinkError(b.toBuffer(), {foo: {bar: 9}}); | 
| + | 
| +  b = builder(); | 
| +  b.addImportedGlobal("foo", "bar", kAstI32); | 
| +  assertLinkError(b.toBuffer(), {}); | 
| +  // TODO(titzer): implement stricter import checks for globals. | 
| +  // b = builder(); | 
| +  // b.addImportedGlobal("foo", "bar", kAstI32); | 
| +  // assertLinkError(b.toBuffer(), {foo: {}}); | 
| +  // b = builder(); | 
| +  // b.addImportedGlobal("foo", "bar", kAstI32); | 
| +  // assertLinkError(b.toBuffer(), {foo: {bar: ""}}); | 
| +  // b = builder(); | 
| +  // b.addImportedGlobal("foo", "bar", kAstI32); | 
| +  // assertLinkError(b.toBuffer(), {foo: {bar: () => 9}}); | 
| + | 
| +  b = builder(); | 
| +  b.addImportedMemory("foo", "bar"); | 
| +  assertLinkError(b.toBuffer(), {}); | 
| +  b = builder(); | 
| +  b.addImportedMemory("foo", "bar"); | 
| +  assertLinkError(b.toBuffer(), {foo: {}}); | 
| +  // TODO(titzer): implement stricter import checks for globals. | 
| +  // b = builder(); | 
| +  // b.addImportedMemory("foo", "bar", 1); | 
| +  // assertLinkError(b.toBuffer(), | 
| +  //     {foo: {bar: new WebAssembly.Memory({initial: 0})}}); | 
| +})(); | 
| + | 
| +(function TestTrapError() { | 
| +  assertRuntimeError(builder().addFunction("run", kSig_v_v).addBody([ | 
| +    kExprUnreachable | 
| +  ]).exportFunc().end().toBuffer()); | 
| + | 
| +  assertRuntimeError(builder().addFunction("run", kSig_v_v).addBody([ | 
| +    kExprI32Const, 1, | 
| +    kExprI32Const, 0, | 
| +    kExprI32DivS, | 
| +    kExprDrop | 
| +  ]).exportFunc().end().toBuffer()); | 
| + | 
| +  assertRuntimeError(builder().addFunction("run", kSig_v_v).addBody([ | 
| +  ]).exportFunc().end(). | 
| +  addFunction("start", kSig_v_v).addBody([ | 
| +    kExprUnreachable | 
| +  ]).end().addStart(1).toBuffer()); | 
| +})(); | 
| + | 
| +(function TestConversionError() { | 
| +  let b = builder(); | 
| +  b.addImportWithModule("foo", "bar", kSig_v_l); | 
| +  assertConversionError(b.addFunction("run", kSig_v_v).addBody([ | 
| +    kExprI64Const, 0, kExprCallFunction, 0 | 
| +  ]).exportFunc().end().toBuffer()); | 
| +  assertConversionError(builder().addFunction("run", kSig_l_v).addBody([ | 
| +    kExprI64Const, 0 | 
| +  ]).exportFunc().end().toBuffer()); | 
| +})(); | 
|  |