globals.js 3.18 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13
// 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");

function TestImported(type, val, expected) {
  print("TestImported " + type + "(" + val +")" + " = " + expected);
  var builder = new WasmModuleBuilder();
  var sig = makeSig([], [type]);
14
  var g = builder.addImportedGlobal("uuu", "foo", type);
15 16 17
  builder.addFunction("main", sig)
    .addBody([kExprGetGlobal, g.index])
    .exportAs("main");
18
  builder.addGlobal(kWasmI32);  // pad
19

20
  var instance = builder.instantiate({uuu: {foo: val}});
21 22 23
  assertEquals(expected, instance.exports.main());
}

24 25 26
TestImported(kWasmI32, 300.1, 300);
TestImported(kWasmF32, 87234.87238, Math.fround(87234.87238));
TestImported(kWasmF64, 77777.88888, 77777.88888);
27 28 29 30 31 32


function TestExported(type, val, expected) {
  print("TestExported " + type + "(" + val +")" + " = " + expected);
  var builder = new WasmModuleBuilder();
  var sig = makeSig([type], []);
33
  builder.addGlobal(kWasmI32);  // pad
34 35 36
  var g = builder.addGlobal(type, false)
      .exportAs("foo");
  g.init = val;
37
  builder.addGlobal(kWasmI32);  // pad
38 39 40 41 42

  var instance = builder.instantiate();
  assertEquals(expected, instance.exports.foo);
}

43 44 45
TestExported(kWasmI32, 455.5, 455);
TestExported(kWasmF32, -999.34343, Math.fround(-999.34343));
TestExported(kWasmF64, 87347.66666, 87347.66666);
46

47 48 49 50 51 52 53 54 55 56 57
(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

  assertThrows(()=> {builder.instantiate()}, WebAssembly.LinkError);
})();
58 59 60 61 62

function TestImportedExported(type, val, expected) {
  print("TestImportedExported " + type + "(" + val +")" + " = " + expected);
  var builder = new WasmModuleBuilder();
  var sig = makeSig([type], []);
63
  var i = builder.addImportedGlobal("ttt", "foo", type);
64
  builder.addGlobal(kWasmI32);  // pad
65 66 67
  var o = builder.addGlobal(type, false)
      .exportAs("bar");
  o.init_index = i;
68
  builder.addGlobal(kWasmI32);  // pad
69

70
  var instance = builder.instantiate({ttt: {foo: val}});
71 72 73
  assertEquals(expected, instance.exports.bar);
}

74 75 76
TestImportedExported(kWasmI32, 415.5, 415);
TestImportedExported(kWasmF32, -979.34343, Math.fround(-979.34343));
TestImportedExported(kWasmF64, 81347.66666, 81347.66666);
77 78 79 80

function TestGlobalIndexSpace(type, val) {
  print("TestGlobalIndexSpace(" + val + ") = " + val);
  var builder = new WasmModuleBuilder();
81
  var im = builder.addImportedGlobal("nnn", "foo", type);
82 83 84 85 86 87 88 89 90 91
  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)
    .addBody([kExprGetGlobal, def.index])
    .exportAs("main");

92
  var instance = builder.instantiate({nnn: {foo: val}});
93 94 95
  assertEquals(val, instance.exports.main());
}

96 97 98
TestGlobalIndexSpace(kWasmI32, 123);
TestGlobalIndexSpace(kWasmF32, 54321.125);
TestGlobalIndexSpace(kWasmF64, 12345.678);