| Index: test/mjsunit/wasm/trap-location-with-trap-if.js | 
| diff --git a/test/mjsunit/wasm/trap-location-with-trap-if.js b/test/mjsunit/wasm/trap-location-with-trap-if.js | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..66c4550cb4ba19e89318b2d0b4db525392c37344 | 
| --- /dev/null | 
| +++ b/test/mjsunit/wasm/trap-location-with-trap-if.js | 
| @@ -0,0 +1,79 @@ | 
| +// 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 --trap-if | 
| + | 
| +load("test/mjsunit/wasm/wasm-constants.js"); | 
| +load("test/mjsunit/wasm/wasm-module-builder.js"); | 
| + | 
| +// Collect the Callsite objects instead of just a string: | 
| +Error.prepareStackTrace = function(error, frames) { | 
| +  return frames; | 
| +}; | 
| + | 
| +var builder = new WasmModuleBuilder(); | 
| + | 
| +var sig_index = builder.addType(kSig_i_v) | 
| + | 
| +// Build a function to resemble this code: | 
| +//   if (idx < 2) { | 
| +//     return load(-2 / idx); | 
| +//   } else if (idx == 2) { | 
| +//     unreachable; | 
| +//   } else { | 
| +//     return call_indirect(idx); | 
| +//   } | 
| +// There are four different traps which are triggered by different input values: | 
| +// (0) division by zero; (1) mem oob; (2) unreachable; (3) invalid call target | 
| +// Each of them also has a different location where it traps. | 
| +builder.addFunction("main", kSig_i_i) | 
| +  .addBody([ | 
| +      // offset 1 | 
| +        kExprBlock, kAstI32, | 
| +            kExprGetLocal, 0, | 
| +            kExprI32Const, 2, | 
| +          kExprI32LtU, | 
| +        kExprIf, kAstStmt, | 
| +        // offset 9 | 
| +              kExprI32Const, 0x7e /* -2 */, | 
| +              kExprGetLocal, 0, | 
| +            kExprI32DivU, | 
| +          // offset 15 | 
| +          kExprI32LoadMem, 0, 0, | 
| +          kExprBr, 1, | 
| +        kExprEnd, | 
| +        // offset 21 | 
| +            kExprGetLocal, 0, | 
| +            kExprI32Const, 2, | 
| +          kExprI32Eq, | 
| +        kExprIf, kAstStmt, | 
| +          kExprUnreachable, | 
| +        kExprEnd, | 
| +        // offset 30 | 
| +        kExprGetLocal, 0, | 
| +        kExprCallIndirect, sig_index, kTableZero, | 
| +      kExprEnd, | 
| +  ]) | 
| +  .exportAs("main"); | 
| +builder.appendToTable([0]); | 
| + | 
| +var module = builder.instantiate(); | 
| + | 
| +function testWasmTrap(value, reason, position) { | 
| +  try { | 
| +    module.exports.main(value); | 
| +    fail("expected wasm exception"); | 
| +  } catch (e) { | 
| +    assertEquals(kTrapMsgs[reason], e.message, "trap reason"); | 
| +    assertEquals(3, e.stack.length, "number of frames"); | 
| +    assertEquals(0, e.stack[0].getLineNumber(), "wasmFunctionIndex"); | 
| +    assertEquals(position, e.stack[0].getPosition(), "position"); | 
| +  } | 
| +} | 
| + | 
| +// The actual tests: | 
| +testWasmTrap(0, kTrapDivByZero,      14); | 
| +testWasmTrap(1, kTrapMemOutOfBounds, 15); | 
| +testWasmTrap(2, kTrapUnreachable,    28); | 
| +testWasmTrap(3, kTrapFuncInvalid,    32); | 
|  |