summaryrefslogtreecommitdiff
path: root/deps/v8/test/mjsunit/wasm/unicode.js
blob: 379a513d428eb4ca9aaa05b1c0125f68fc3523e8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// Copyright 2017 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.

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

function checkImport(
    imported_module_name, imported_function_name) {
  var builder = new WasmModuleBuilder();
  builder.addImport(imported_module_name, imported_function_name, kSig_i_i);
  builder.addFunction('call_imp', kSig_i_i)
      .addBody([kExprGetLocal, 0, kExprCallFunction, 0])
      .exportFunc();

  let imp = i => i + 3;
  let instance = builder.instantiate(
      {[imported_module_name]: {[imported_function_name]: imp}});
  assertEquals(imp(0), instance.exports.call_imp(0));
  assertEquals(imp(4), instance.exports.call_imp(4));
}

checkImport('mod', 'foo');  // sanity check
checkImport('mod', '☺☺happy☺☺');
checkImport('☺☺happy☺☺', 'foo');
checkImport('☺☺happy☺☺', '☼+☃=☹');

function checkExports(
    internal_name_mul, exported_name_mul, internal_name_add,
    exported_name_add) {
  var builder = new WasmModuleBuilder();
  builder.addFunction(internal_name_mul, kSig_i_ii)
      .addBody([kExprGetLocal, 0, kExprGetLocal, 1, kExprI32Mul])
      .exportAs(exported_name_mul);
  builder.addFunction(internal_name_add, kSig_i_ii)
      .addBody([kExprGetLocal, 0, kExprGetLocal, 1, kExprI32Add])
      .exportAs(exported_name_add);

  let instance = builder.instantiate();
  assertEquals(14, instance.exports[exported_name_add](3, 11));
  assertEquals(-7, instance.exports[exported_name_add](5, -12));
  assertEquals(28, instance.exports[exported_name_mul](4, 7));
  assertEquals(-6, instance.exports[exported_name_mul](-3, 2));
}

checkExports('mul', 'mul', 'add', 'add');  // sanity check
checkExports('☺☺mul☺☺', 'mul', '☺☺add☺☺', 'add');
checkExports('☺☺mul☺☺', '☺☺mul☺☺', '☺☺add☺☺', '☺☺add☺☺');

(function errorMessageUnicodeInFuncName() {
  var builder = new WasmModuleBuilder();
  builder.addFunction('three snowmen: ☃☃☃', kSig_i_v).addBody([]).exportFunc();
  assertThrows(
      () => builder.instantiate(), WebAssembly.CompileError,
      /Compiling wasm function "three snowmen: ☃☃☃" failed: /);
})();

(function errorMessageUnicodeInImportModuleName() {
  var builder = new WasmModuleBuilder();
  builder.addImport('three snowmen: ☃☃☃', 'foo', kSig_i_v);
  assertThrows(
      () => builder.instantiate({}), TypeError,
      /WebAssembly.Instance\(\): Import #0 module="three snowmen: ☃☃☃" error: /);
})();

(function errorMessageUnicodeInImportElemName() {
  var builder = new WasmModuleBuilder();
  builder.addImport('mod', 'three snowmen: ☃☃☃', kSig_i_v);
  assertThrows(
      () => builder.instantiate({mod: {}}), WebAssembly.LinkError,
      'WebAssembly.Instance\(\): Import #0 module="mod" function="three ' +
          'snowmen: ☃☃☃" error: function import requires a callable');
})();

(function errorMessageUnicodeInImportModAndElemName() {
  var builder = new WasmModuleBuilder();
  let mod_name = '☮▁▂▃▄☾ ♛ ◡ ♛ ☽▄▃▂▁☮';
  let func_name = '☾˙❀‿❀˙☽';
  builder.addImport(mod_name, func_name, kSig_i_v);
  assertThrows(
      () => builder.instantiate({[mod_name]: {}}), WebAssembly.LinkError,
      'WebAssembly.Instance(): Import #0 module="' + mod_name +
          '" function="' + func_name +
          '" error: function import requires a callable');
})();