| Index: test/mjsunit/wasm/asm-wasm-stack.js
 | 
| diff --git a/test/mjsunit/wasm/asm-wasm-stack.js b/test/mjsunit/wasm/asm-wasm-stack.js
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..b7dac31e16c9b38d6a9730bcd25f9c7b542b63df
 | 
| --- /dev/null
 | 
| +++ b/test/mjsunit/wasm/asm-wasm-stack.js
 | 
| @@ -0,0 +1,98 @@
 | 
| +// 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
 | 
| +
 | 
| +var filename = '(?:[^ ]+/)?test/mjsunit/wasm/asm-wasm-stack.js';
 | 
| +filename = filename.replace(/\//g, '[/\\\\]');
 | 
| +
 | 
| +function checkPreformattedStack(e, expected_lines) {
 | 
| +  print('preformatted stack: ' + e.stack);
 | 
| +  var lines = e.stack.split('\n');
 | 
| +  assertEquals(expected_lines.length, lines.length);
 | 
| +  for (var i = 0; i < lines.length; ++i) {
 | 
| +    assertMatches(expected_lines[i], lines[i], 'line ' + i);
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +function checkFunctionsOnCallsites(e, locations) {
 | 
| +  var stack = e.stack;
 | 
| +  print('callsite objects (size ' + stack.length + '):');
 | 
| +  for (var i = 0; i < stack.length; ++i) {
 | 
| +    var s = stack[i];
 | 
| +    print(
 | 
| +        ' [' + i + '] ' + s.getFunctionName() + ' (' + s.getFileName() + ':' +
 | 
| +        s.getLineNumber() + ':' + s.getColumnNumber() + ')');
 | 
| +  }
 | 
| +  assertEquals(locations.length, stack.length, 'stack size');
 | 
| +  for (var i = 0; i < locations.length; ++i) {
 | 
| +    var cs = stack[i];
 | 
| +    assertMatches('^' + filename + '$', cs.getFileName(), 'file name at ' + i);
 | 
| +    assertEquals(
 | 
| +        locations[i][0], cs.getFunctionName(), 'function name at ' + i);
 | 
| +    assertEquals(locations[i][1], cs.getLineNumber(), 'line number at ' + i);
 | 
| +    assertEquals(
 | 
| +        locations[i][2], cs.getColumnNumber(), 'column number at ' + i);
 | 
| +    assertNotNull(cs.getThis(), 'receiver should be global');
 | 
| +    assertEquals(stack[0].getThis(), cs.getThis(), 'receiver should be global');
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +function throwException() {
 | 
| +  throw new Error('exception from JS');
 | 
| +}
 | 
| +
 | 
| +function generateWasmFromAsmJs(stdlib, foreign, heap) {
 | 
| +  'use asm';
 | 
| +  var throwFunc = foreign.throwFunc;
 | 
| +  function callThrow() {
 | 
| +    throwFunc();
 | 
| +  }
 | 
| +  function redirectFun() {
 | 
| +    callThrow();
 | 
| +  }
 | 
| +  return redirectFun;
 | 
| +}
 | 
| +
 | 
| +(function PreformattedStackTraceFromJS() {
 | 
| +  var fun = generateWasmFromAsmJs(this, {throwFunc: throwException}, undefined);
 | 
| +  var e = null;
 | 
| +  try {
 | 
| +    fun();
 | 
| +  } catch (ex) {
 | 
| +    e = ex;
 | 
| +  }
 | 
| +  assertInstanceof(e, Error, 'exception should have been thrown');
 | 
| +  checkPreformattedStack(e, [
 | 
| +    '^Error: exception from JS$',
 | 
| +    '^ *at throwException \\(' + filename + ':43:9\\)$',
 | 
| +    '^ *at callThrow \\(' + filename + ':50:5\\)$',
 | 
| +    '^ *at redirectFun \\(' + filename + ':53:5\\)$',
 | 
| +    '^ *at PreformattedStackTraceFromJS \\(' + filename + ':62:5\\)$',
 | 
| +    '^ *at ' + filename + ':75:3$'
 | 
| +  ]);
 | 
| +})();
 | 
| +
 | 
| +// Now collect the Callsite objects instead of just a string.
 | 
| +Error.prepareStackTrace = function(error, frames) {
 | 
| +  return frames;
 | 
| +};
 | 
| +
 | 
| +(function CallsiteObjectsFromJS() {
 | 
| +  var fun = generateWasmFromAsmJs(this, {throwFunc: throwException}, undefined);
 | 
| +  var e = null;
 | 
| +  try {
 | 
| +    fun();
 | 
| +  } catch (ex) {
 | 
| +    e = ex;
 | 
| +  }
 | 
| +  assertInstanceof(e, Error, 'exception should have been thrown');
 | 
| +  checkFunctionsOnCallsites(e, [
 | 
| +    ['throwException', 43, 9],         // --
 | 
| +    ['callThrow', 50, 5],              // --
 | 
| +    ['redirectFun', 53, 5],            // --
 | 
| +    ['CallsiteObjectsFromJS', 86, 5],  // --
 | 
| +    [null, 98, 3]
 | 
| +  ]);
 | 
| +})();
 | 
| 
 |