1// Copyright 2016 the V8 project authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5// Flags: --expose-wasm 6 7load("test/mjsunit/wasm/wasm-constants.js"); 8load("test/mjsunit/wasm/wasm-module-builder.js"); 9 10// Collect the Callsite objects instead of just a string: 11Error.prepareStackTrace = function(error, frames) { 12 return frames; 13}; 14 15var builder = new WasmModuleBuilder(); 16 17var sig_index = builder.addType(kSig_i_v) 18 19// Build a function to resemble this code: 20// if (idx < 2) { 21// return load(-2 / idx); 22// } else if (idx == 2) { 23// unreachable; 24// } else { 25// return call_indirect(idx); 26// } 27// There are four different traps which are triggered by different input values: 28// (0) division by zero; (1) mem oob; (2) unreachable; (3) invalid call target 29// Each of them also has a different location where it traps. 30builder.addFunction("main", kSig_i_i) 31 .addBody([ 32 // offset 1 33 kExprBlock, 34 kExprGetLocal, 0, 35 kExprI32Const, 2, 36 kExprI32LtU, 37 kExprIf, 38 // offset 8 39 kExprI32Const, 0x7e /* -2 */, 40 kExprGetLocal, 0, 41 kExprI32DivU, 42 // offset 13 43 kExprI32LoadMem, 0, 0, 44 kExprBr, 1, 1, 45 kExprEnd, 46 // offset 20 47 kExprGetLocal, 0, 48 kExprI32Const, 2, 49 kExprI32Eq, 50 kExprIf, 51 kExprUnreachable, 52 kExprEnd, 53 // offset 28 54 kExprGetLocal, 0, 55 kExprCallIndirect, kArity0, sig_index, 56 kExprEnd, 57 ]) 58 .exportAs("main"); 59 60var module = builder.instantiate(); 61 62function testWasmTrap(value, reason, position) { 63 try { 64 module.exports.main(value); 65 fail("expected wasm exception"); 66 } catch (e) { 67 assertEquals(kTrapMsgs[reason], e.message, "trap reason"); 68 assertEquals(3, e.stack.length, "number of frames"); 69 assertEquals(0, e.stack[0].getLineNumber(), "wasmFunctionIndex"); 70 assertEquals(position, e.stack[0].getPosition(), "position"); 71 } 72} 73 74// The actual tests: 75testWasmTrap(0, kTrapDivByZero, 12); 76testWasmTrap(1, kTrapMemOutOfBounds, 13); 77testWasmTrap(2, kTrapUnreachable, 26); 78testWasmTrap(3, kTrapFuncInvalid, 30); 79