globals.js 5.95 KB
Newer Older
1 2 3 4 5 6 7 8
// 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");

9 10 11 12 13 14 15 16 17
(function TestMultipleInstances() {
  print("TestMultipleInstances");

  var builder = new WasmModuleBuilder();

  let g = builder.addGlobal(kWasmI32, true);
  let sig_index = builder.addType(kSig_i_v);
  builder.addFunction("get", sig_index)
    .addBody([
18
      kExprGlobalGet, g.index])
19 20 21
    .exportAs("get");
  builder.addFunction("set", kSig_v_i)
    .addBody([
22
      kExprLocalGet, 0,
23
      kExprGlobalSet, g.index])
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
    .exportAs("set");

  let module = new WebAssembly.Module(builder.toBuffer());

  let a = new WebAssembly.Instance(module);
  let b = new WebAssembly.Instance(module);

  assertEquals(0, a.exports.get());
  assertEquals(0, b.exports.get());

  a.exports.set(1);

  assertEquals(1, a.exports.get());
  assertEquals(0, b.exports.get());

  b.exports.set(6);

  assertEquals(1, a.exports.get());
  assertEquals(6, b.exports.get());

  a.exports.set(7);

  assertEquals(7, a.exports.get());
  assertEquals(6, b.exports.get());

})();

51 52 53 54
function TestImported(type, val, expected) {
  print("TestImported " + type + "(" + val +")" + " = " + expected);
  var builder = new WasmModuleBuilder();
  var sig = makeSig([], [type]);
55
  var g = builder.addImportedGlobal("uuu", "foo", type);
56
  builder.addFunction("main", sig)
57
    .addBody([kExprGlobalGet, g])
58
    .exportAs("main");
59
  builder.addGlobal(kWasmI32);  // pad
60

61
  var instance = builder.instantiate({uuu: {foo: val}});
62 63 64
  assertEquals(expected, instance.exports.main());
}

65 66 67
TestImported(kWasmI32, 300.1, 300);
TestImported(kWasmF32, 87234.87238, Math.fround(87234.87238));
TestImported(kWasmF64, 77777.88888, 77777.88888);
68 69


70 71 72 73 74 75 76 77 78
(function TestImportedMultipleInstances() {
  print("TestImportedMultipleInstances");

  var builder = new WasmModuleBuilder();

  let g = builder.addImportedGlobal("mod", "g", kWasmI32);
  let sig_index = builder.addType(kSig_i_v);
  builder.addFunction("main", sig_index)
    .addBody([
79
      kExprGlobalGet, g])
80 81 82 83 84 85 86 87 88 89 90 91 92
    .exportAs("main");

  let module = new WebAssembly.Module(builder.toBuffer());

  print("  i 100...");
  let i100 = new WebAssembly.Instance(module, {mod: {g: 100}});
  assertEquals(100, i100.exports.main());

  print("  i 300...");
  let i300 = new WebAssembly.Instance(module, {mod: {g: 300}});
  assertEquals(300, i300.exports.main());
})();

93 94 95 96
function TestExported(type, val, expected) {
  print("TestExported " + type + "(" + val +")" + " = " + expected);
  var builder = new WasmModuleBuilder();
  var sig = makeSig([type], []);
97
  builder.addGlobal(kWasmI32);  // pad
98 99 100
  var g = builder.addGlobal(type, false)
      .exportAs("foo");
  g.init = val;
101
  builder.addGlobal(kWasmI32);  // pad
102 103

  var instance = builder.instantiate();
104
  assertEquals(expected, instance.exports.foo.value);
105 106
}

107 108 109
TestExported(kWasmI32, 455.5, 455);
TestExported(kWasmF32, -999.34343, Math.fround(-999.34343));
TestExported(kWasmF64, 87347.66666, 87347.66666);
110

111 112 113 114 115 116 117 118 119
(function TestI64Exported() {
  var builder = new WasmModuleBuilder();
  var sig = makeSig([kWasmI64], []);
  builder.addGlobal(kWasmI32);  // pad
  var g = builder.addGlobal(kWasmI64, false)
      .exportAs("foo");
  g.init = 1234;
  builder.addGlobal(kWasmI32);  // pad

120 121
  var instance = builder.instantiate();
  assertTrue(instance.exports.foo instanceof WebAssembly.Global);
122
  assertEquals(instance.exports.foo.value, 1234n);
123
})();
124 125 126 127 128

function TestImportedExported(type, val, expected) {
  print("TestImportedExported " + type + "(" + val +")" + " = " + expected);
  var builder = new WasmModuleBuilder();
  var sig = makeSig([type], []);
129
  var i = builder.addImportedGlobal("ttt", "foo", type);
130
  builder.addGlobal(kWasmI32);  // pad
131 132 133
  var o = builder.addGlobal(type, false)
      .exportAs("bar");
  o.init_index = i;
134
  builder.addGlobal(kWasmI32);  // pad
135

136
  var instance = builder.instantiate({ttt: {foo: val}});
137
  assertEquals(expected, instance.exports.bar.value);
138 139
}

140 141 142
TestImportedExported(kWasmI32, 415.5, 415);
TestImportedExported(kWasmF32, -979.34343, Math.fround(-979.34343));
TestImportedExported(kWasmF64, 81347.66666, 81347.66666);
143 144 145 146

function TestGlobalIndexSpace(type, val) {
  print("TestGlobalIndexSpace(" + val + ") = " + val);
  var builder = new WasmModuleBuilder();
147
  var im = builder.addImportedGlobal("nnn", "foo", type);
148 149 150 151 152 153 154
  assertEquals(0, im);
  var def = builder.addGlobal(type, false);
  assertEquals(1, def.index);
  def.init_index = im;

  var sig = makeSig([], [type]);
  builder.addFunction("main", sig)
155
    .addBody([kExprGlobalGet, def.index])
156 157
    .exportAs("main");

158
  var instance = builder.instantiate({nnn: {foo: val}});
159 160 161
  assertEquals(val, instance.exports.main());
}

162 163 164
TestGlobalIndexSpace(kWasmI32, 123);
TestGlobalIndexSpace(kWasmF32, 54321.125);
TestGlobalIndexSpace(kWasmF64, 12345.678);
165 166 167 168 169 170 171 172 173 174 175

(function TestAccessesInBranch() {
  print("TestAccessesInBranches");

  var builder = new WasmModuleBuilder();

  let g = builder.addGlobal(kWasmI32, true);
  let h = builder.addGlobal(kWasmI32, true);
  let sig_index = builder.addType(kSig_i_i);
  builder.addFunction("get", sig_index)
    .addBody([
176
      kExprLocalGet, 0,
177
      kExprIf, kWasmI32,
178
      kExprGlobalGet, g.index,
179
      kExprElse,
180
      kExprGlobalGet, h.index,
181 182 183 184
      kExprEnd])
    .exportAs("get");
  builder.addFunction("set", kSig_v_ii)
    .addBody([
185
      kExprLocalGet, 0,
186
      kExprIf, kWasmStmt,
187
      kExprLocalGet, 1,
188
      kExprGlobalSet, g.index,
189
      kExprElse,
190
      kExprLocalGet, 1,
191
      kExprGlobalSet, h.index,
192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215
      kExprEnd])
    .exportAs("set");

  let module = new WebAssembly.Module(builder.toBuffer());

  let a = new WebAssembly.Instance(module);
  let get = a.exports.get;
  let set = a.exports.set;

  assertEquals(0, get(0));
  assertEquals(0, get(1));
  set(0, 1);
  assertEquals(1, get(0));
  assertEquals(0, get(1));

  set(0, 7);
  assertEquals(7, get(0));
  assertEquals(0, get(1));

  set(1, 9);
  assertEquals(7, get(0));
  assertEquals(9, get(1));

})();