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