summaryrefslogtreecommitdiff
path: root/deps/v8/test/mjsunit/asm/call-annotation.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/test/mjsunit/asm/call-annotation.js')
-rw-r--r--deps/v8/test/mjsunit/asm/call-annotation.js179
1 files changed, 179 insertions, 0 deletions
diff --git a/deps/v8/test/mjsunit/asm/call-annotation.js b/deps/v8/test/mjsunit/asm/call-annotation.js
new file mode 100644
index 0000000000..e2260441e0
--- /dev/null
+++ b/deps/v8/test/mjsunit/asm/call-annotation.js
@@ -0,0 +1,179 @@
+// 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);
+})();