function-names.js 2.19 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12
// 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

load("test/mjsunit/wasm/wasm-constants.js");
load("test/mjsunit/wasm/wasm-module-builder.js");

var builder = new WasmModuleBuilder();

var last_func_index = builder.addFunction("exec_unreachable", kSig_v_v)
13
  .addBody([kExprUnreachable]).index
14 15 16 17 18 19 20 21

var illegal_func_name = [0xff];
var func_names = [ "☠", illegal_func_name, "some math: (½)² = ¼", "" ];
var expected_names = ["exec_unreachable", "☠", null,
                      "some math: (½)² = ¼", "", "main"];

for (var func_name of func_names) {
  last_func_index = builder.addFunction(func_name, kSig_v_v)
22
    .addBody([kExprCallFunction, last_func_index]).index;
23 24 25
}

builder.addFunction("main", kSig_v_v)
26
  .addBody([kExprCallFunction, last_func_index])
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
  .exportFunc();

var module = builder.instantiate();

(function testFunctionNamesAsString() {
  var names = expected_names.concat(["testFunctionNamesAsString", null]);
  try {
    module.exports.main();
    assertFalse("should throw");
  } catch (e) {
    var lines = e.stack.split(/\r?\n/);
    lines.shift();
    assertEquals(names.length, lines.length);
    for (var i = 0; i < names.length; ++i) {
      var line = lines[i].trim();
      if (names[i] === null) continue;
      var printed_name = names[i] === undefined ? "<WASM UNNAMED>" : names[i]
      var expected_start = "at " + printed_name + " (";
      assertTrue(line.startsWith(expected_start),
          "should start with '" + expected_start + "': '" + line + "'");
    }
  }
})();

// For the remaining tests, collect the Callsite objects instead of just a
// string:
Error.prepareStackTrace = function(error, frames) {
  return frames;
};

(function testFunctionNamesAsCallSites() {
58
  var names = expected_names.concat(['testFunctionNamesAsCallSites', null]);
59 60
  try {
    module.exports.main();
61
    assertFalse('should throw');
62
  } catch (e) {
63
    assertEquals(names.length, e.stack.length, 'stack length');
64
    for (var i = 0; i < names.length; ++i) {
65 66
      assertEquals(
          names[i], e.stack[i].getFunctionName(), 'function name at ' + i);
67 68 69
    }
  }
})();