function-names.js 2.11 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11
// 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-module-builder.js");

var builder = new WasmModuleBuilder();

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

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)
21
    .addBody([kExprCallFunction, last_func_index]).index;
22 23 24
}

builder.addFunction("main", kSig_v_v)
25
  .addBody([kExprCallFunction, last_func_index])
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
  .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;
42
      var printed_name = names[i];
43 44 45 46 47 48 49 50 51 52 53 54 55 56
      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() {
57
  var names = expected_names.concat(['testFunctionNamesAsCallSites', null]);
58 59
  try {
    module.exports.main();
60
    assertFalse('should throw');
61
  } catch (e) {
62
    assertEquals(names.length, e.stack.length, 'stack length');
63
    for (var i = 0; i < names.length; ++i) {
64 65
      assertEquals(
          names[i], e.stack[i].getFunctionName(), 'function name at ' + i);
66 67 68
    }
  }
})();