| // 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); |
| })(); |