export-table.js 4.38 KB
Newer Older
titzer's avatar
titzer committed
1 2 3 4 5 6 7
// 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");
8
load("test/mjsunit/wasm/wasm-module-builder.js");
titzer's avatar
titzer committed
9 10

(function testExportedMain() {
11
  print("TestExportedMain...");
12
  var kReturnValue = 44;
13
  var builder = new WasmModuleBuilder();
titzer's avatar
titzer committed
14

15
  builder.addFunction("main", kSig_i_v)
16
    .addBody([
17
      kExprI32Const,
18
      kReturnValue,
19
      kExprReturn
20
    ])
21
    .exportFunc();
titzer's avatar
titzer committed
22

23
  var module = builder.instantiate();
titzer's avatar
titzer committed
24 25 26 27 28 29 30 31

  assertEquals("object", typeof module.exports);
  assertEquals("function", typeof module.exports.main);

  assertEquals(kReturnValue, module.exports.main());
})();

(function testExportedTwice() {
32
  print("TestExportedTwice...");
33
  var kReturnValue = 45;
titzer's avatar
titzer committed
34

35 36
  var builder = new WasmModuleBuilder();

37
  builder.addFunction("main", kSig_i_v)
38
    .addBody([
39
      kExprI32Const,
40
      kReturnValue,
41
      kExprReturn
42
    ])
43 44
    .exportAs("blah")
    .exportAs("foo");
titzer's avatar
titzer committed
45

46
  var module = builder.instantiate();
titzer's avatar
titzer committed
47 48 49 50 51 52

  assertEquals("object", typeof module.exports);
  assertEquals("function", typeof module.exports.blah);
  assertEquals("function", typeof module.exports.foo);

  assertEquals(kReturnValue, module.exports.foo());
53
  assertEquals(kReturnValue, module.exports.blah());
54
  assertSame(module.exports.blah, module.exports.foo);
titzer's avatar
titzer committed
55
})();
56

57 58
(function testEmptyName() {
  print("TestEmptyName...");
59
  var kReturnValue = 46;
60 61 62 63 64

  var builder = new WasmModuleBuilder();

  builder.addFunction("main", kSig_i_v)
    .addBody([
65
      kExprI32Const,
66 67 68 69 70 71 72 73 74 75 76 77
      kReturnValue,
      kExprReturn
    ])
    .exportAs("");

  var module = builder.instantiate();

  assertEquals("object", typeof module.exports);
  assertEquals("function", typeof module.exports[""]);

  assertEquals(kReturnValue, module.exports[""]());
})();
78 79

(function testNumericName() {
80
  print("TestNumericName...");
81
  var kReturnValue = 47;
82 83 84

  var builder = new WasmModuleBuilder();

85
  builder.addFunction("main", kSig_i_v)
86
    .addBody([
87
      kExprI32Const,
88
      kReturnValue,
89
      kExprReturn
90 91 92 93 94 95 96 97 98 99
    ])
    .exportAs("0");

  var module = builder.instantiate();

  assertEquals("object", typeof module.exports);
  assertEquals("function", typeof module.exports["0"]);

  assertEquals(kReturnValue, module.exports["0"]());
})();
100 101

(function testExportNameClash() {
102
  print("TestExportNameClash...");
103 104 105 106 107 108 109 110 111 112 113 114 115
  var builder = new WasmModuleBuilder();

  builder.addFunction("one",   kSig_v_v).addBody([kExprNop]).exportAs("main");
  builder.addFunction("two",   kSig_v_v).addBody([kExprNop]).exportAs("other");
  builder.addFunction("three", kSig_v_v).addBody([kExprNop]).exportAs("main");

  try {
    builder.instantiate();
    assertUnreachable("should have thrown an exception");
  } catch (e) {
    assertContains("Duplicate export", e.toString());
  }
})();
116 117 118 119 120 121


(function testExportMultipleIdentity() {
  print("TestExportMultipleIdentity...");
  var builder = new WasmModuleBuilder();

122
  var f = builder.addFunction("one", kSig_v_v).addBody([kExprNop])
123 124 125 126 127 128 129 130 131 132 133
    .exportAs("a")
    .exportAs("b")
    .exportAs("c");

  let instance = builder.instantiate();
  let e = instance.exports;
  assertEquals("function", typeof e.a);
  assertEquals("function", typeof e.b);
  assertEquals("function", typeof e.c);
  assertSame(e.a, e.b);
  assertSame(e.a, e.c);
134
  assertEquals(String(f.index), e.a.name);
135
})();
136 137 138 139 140 141 142 143


(function testReexportJSMultipleIdentity() {
  print("TestReexportMultipleIdentity...");
  var builder = new WasmModuleBuilder();

  function js() {}

144
  var a = builder.addImport("m", "a", kSig_v_v);
145 146 147
  builder.addExport("f", a);
  builder.addExport("g", a);

148
  let instance = builder.instantiate({m: {a: js}});
149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
  let e = instance.exports;
  assertEquals("function", typeof e.f);
  assertEquals("function", typeof e.g);
  assertFalse(e.f == js);
  assertFalse(e.g == js);
  assertTrue(e.f == e.g);
})();


(function testReexportJSMultiple() {
  print("TestReexportMultiple...");
  var builder = new WasmModuleBuilder();

  function js() {}

164 165
  var a = builder.addImport("q", "a", kSig_v_v);
  var b = builder.addImport("q", "b", kSig_v_v);
166 167 168
  builder.addExport("f", a);
  builder.addExport("g", b);

169
  let instance = builder.instantiate({q: {a: js, b: js}});
170 171 172 173 174 175 176
  let e = instance.exports;
  assertEquals("function", typeof e.f);
  assertEquals("function", typeof e.g);
  assertFalse(e.f == js);
  assertFalse(e.g == js);
  assertFalse(e.f == e.g);
})();