ea7064779a
This also removes a broken optimization regarding immutable (i.e. const) global variables. For now mutable and immutable global variables are treated the same and hence copied during module initialization. R=rossberg@chromium.org TEST=mjsunit/asm/global-imports BUG=v8:6279 Change-Id: I020fc12036dc534f5a62fb43f5c6fdb252314e62 Reviewed-on: https://chromium-review.googlesource.com/483360 Reviewed-by: Andreas Rossberg <rossberg@chromium.org> Commit-Queue: Michael Starzinger <mstarzinger@chromium.org> Cr-Commit-Position: refs/heads/master@{#44763}
67 lines
2.4 KiB
JavaScript
67 lines
2.4 KiB
JavaScript
// 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.
|
|
|
|
// Flags: --allow-natives-syntax --validate-asm --fast-validate-asm
|
|
|
|
function MODULE_TEMPLATE(stdlib, foreign, buffer) {
|
|
"use asm";
|
|
var fround = stdlib.Math.fround;
|
|
IMPORT;
|
|
function f(int, flt, dbl) {
|
|
int = int | 0;
|
|
flt = fround(flt);
|
|
dbl = +dbl;
|
|
return EXPRESSION;
|
|
}
|
|
return { f:f };
|
|
}
|
|
|
|
var throws = {};
|
|
var test_count = 0;
|
|
const stdlib = this;
|
|
const buffer = new ArrayBuffer(1024);
|
|
|
|
function assertThrowsOrEquals(result, fun) {
|
|
if (result === throws) {
|
|
assertThrows(fun, TypeError);
|
|
} else {
|
|
assertEquals(result, fun(1, 2.3, 4.2));
|
|
}
|
|
}
|
|
|
|
function RunAsmJsTest(asm_source, imports, result, valid) {
|
|
var nonasm_source = asm_source.replace(new RegExp("use asm"), "");
|
|
|
|
var js_module = eval("(" + nonasm_source + ")")
|
|
var js_instance = js_module(stdlib, imports, buffer);
|
|
assertThrowsOrEquals(result, js_instance.f);
|
|
|
|
var asm_module = eval("(" + asm_source + ")");
|
|
var asm_instance = asm_module(stdlib, imports, buffer);
|
|
assertEquals(valid, %IsAsmWasmCode(asm_module));
|
|
assertThrowsOrEquals(result, asm_instance.f);
|
|
}
|
|
|
|
function Run(imp, exp, imports, result, valid) {
|
|
var name = "test" + (++test_count);
|
|
var src = MODULE_TEMPLATE.toString();
|
|
src = src.replace("IMPORT", imp);
|
|
src = src.replace("EXPRESSION", exp);
|
|
src = src.replace("MODULE_TEMPLATE", name);
|
|
RunAsmJsTest(src, imports, result, valid);
|
|
}
|
|
|
|
Run("var x = foreign.x | 0", "(x + int) | 0", {x:12}, 13, true);
|
|
Run("var x = foreign.x | 0", "(x = int) | 0", {x:12}, 1, true);
|
|
Run("var x = foreign.x | 0", "+(x + dbl)", {x:12}, 16.2, false);
|
|
Run("var x = +foreign.x", "+(x + dbl)", {x:1.2}, 5.4, true);
|
|
Run("var x = +foreign.x", "+(x = dbl)", {x:1.2}, 4.2, true);
|
|
Run("var x = +foreign.x", "(x + int) | 0", {x:1.2}, 2, false);
|
|
Run("const x = foreign.x | 0", "(x + int) | 0", {x:12}, 13, true);
|
|
Run("const x = foreign.x | 0", "(x = int) | 0", {x:12}, throws, false);
|
|
Run("const x = foreign.x | 0", "+(x + dbl)", {x:12}, 16.2, false);
|
|
Run("const x = +foreign.x", "+(x + dbl)", {x:1.2}, 5.4, true);
|
|
Run("const x = +foreign.x", "+(x = dbl)", {x:1.2}, throws, false);
|
|
Run("const x = +foreign.x", "(x + int) | 0", {x:1.2}, 2, false);
|