blob: e2260441e0eebc761579253a35b49a80179b341c [file] [log] [blame]
// 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
// This file contains test cases that are particularly interesting for a single
// pass asm.js parsing and validation implementation in regards to the return
// type annotation via the "|0" operation.
var g_was_called = 0;
function g() {
g_was_called++;
return "23.4";
}
(function SuccessExternCoercion() {
function Module(stdlib, imports, heap) {
"use asm";
var g = imports.g;
function f(a) {
a = a | 0;
a = a + (g() | 0) | 0;
return a | 0;
}
return { f:f };
}
g_was_called = 0;
var m = Module(this, { g:g });
assertTrue(%IsAsmWasmCode(Module));
assertEquals(24, m.f(1));
assertEquals(1, g_was_called);
})();
(function FailPrecedenceLeftStronger() {
function Module(stdlib, imports, heap) {
"use asm";
var g = imports.g;
function f(a) {
a = a | 0;
a = a + g() | 0;
return a | 0;
}
return { f:f };
}
g_was_called = 0;
var m = Module(this, { g:g });
assertFalse(%IsAsmWasmCode(Module));
assertEquals(123, m.f(1));
assertEquals(1, g_was_called);
})();
(function FailPrecedenceRightStronger() {
function Module(stdlib, imports, heap) {
"use asm";
var g = imports.g;
function f(a) {
a = a | 0;
a = (g() | 0 + a) | 0;
return a | 0;
}
return { f:f };
}
g_was_called = 0;
var m = Module(this, { g:g });
assertFalse(%IsAsmWasmCode(Module));
assertEquals(127, m.f(127));
assertEquals(1, g_was_called);
})();
(function FailParenthesizedAnnotation() {
function Module(stdlib, imports, heap) {
"use asm";
var g = imports.g;
function f(a) {
a = a | 0;
a = (g()) | 0;
return a | 0;
}
return { f:f };
}
g_was_called = 0;
var m = Module(this, { g:g });
// TODO(6127): Only properly rejected by "new" parser.
// assertFalse(%IsAsmWasmCode(Module));
assertEquals(23, m.f(1));
assertEquals(1, g_was_called);
})();
(function FailNonZeroAnnotation() {
function Module(stdlib, imports, heap) {
"use asm";
var g = imports.g;
function f(a) {
a = a | 0;
a = g() | 127;
return a | 0;
}
return { f:f };
}
g_was_called = 0;
var m = Module(this, { g:g });
assertFalse(%IsAsmWasmCode(Module));
assertEquals(127, m.f(1));
assertEquals(1, g_was_called);
})();
(function FailNestedAnnotation1() {
function Module(stdlib, imports, heap) {
"use asm";
var g = imports.g;
function f(a) {
a = a | 0;
a = g() | g() | 0;
return a | 0;
}
return { f:f };
}
g_was_called = 0;
var m = Module(this, { g:g });
assertFalse(%IsAsmWasmCode(Module));
assertEquals(23, m.f(1));
assertEquals(2, g_was_called);
})();
(function FailNestedAnnotation2() {
function Module(stdlib, imports, heap) {
"use asm";
var g = imports.g;
function f(a) {
a = a | 0;
a = g() | 0 | g() | 0;
return a | 0;
}
return { f:f };
}
g_was_called = 0;
var m = Module(this, { g:g });
assertFalse(%IsAsmWasmCode(Module));
assertEquals(23, m.f(1));
assertEquals(2, g_was_called);
})();
(function SuccessMixedWithDoubleAnnotation() {
function Module(stdlib, imports, heap) {
"use asm";
var g = imports.g;
function f(a) {
a = +a;
a = a + +(g() | 0);
return +a;
}
return { f:f };
}
g_was_called = 0;
var m = Module(this, { g:g });
assertTrue(%IsAsmWasmCode(Module));
assertEquals(23.5, m.f(0.5));
assertEquals(1, g_was_called);
})();
(function SuccessMixedWithFloatAnnotation() {
function Module(stdlib, imports, heap) {
"use asm";
var g = imports.g;
var fround = stdlib.Math.fround;
function f(a) {
a = fround(a);
a = fround(a + fround(g() | 0));
return fround(a);
}
return { f:f };
}
g_was_called = 0;
var m = Module(this, { g:g });
assertTrue(%IsAsmWasmCode(Module));
assertEquals(23.5, m.f(0.5));
assertEquals(1, g_was_called);
})();