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); |