summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/basic/spread-call-eval.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/basic/spread-call-eval.js')
-rw-r--r--js/src/jit-test/tests/basic/spread-call-eval.js54
1 files changed, 54 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/basic/spread-call-eval.js b/js/src/jit-test/tests/basic/spread-call-eval.js
new file mode 100644
index 000000000..1fad8e7a5
--- /dev/null
+++ b/js/src/jit-test/tests/basic/spread-call-eval.js
@@ -0,0 +1,54 @@
+load(libdir + "asserts.js");
+load(libdir + "iteration.js");
+
+assertEq(eval(...[]), undefined);
+assertEq(eval(...["1 + 2"]), 3);
+
+let a = 10, b = 1;
+assertEq(eval(...["a + b"]), 11);
+
+(function() {
+ let a = 20;
+ assertEq(eval(...["a + b"]), 21);
+})();
+
+with ({ a: 30 }) {
+ assertEq(eval(...["a + b"]), 31);
+}
+
+let line0 = Error().lineNumber;
+try { // line0 + 1
+ eval(...["("]); // line0 + 2
+} catch (e) {
+ assertEq(e.lineNumber, 1);
+}
+
+// other iterable objects
+assertEq(eval(...["a + b"][Symbol.iterator]()), 11);
+assertEq(eval(...new Set(["a + b"])), 11);
+let itr = {};
+itr[Symbol.iterator] = function() {
+ return {
+ i: 0,
+ next: function() {
+ this.i++;
+ if (this.i == 1)
+ return { value: "a + b", done: false };
+ else
+ return { value: undefined, done: true };
+ }
+ };
+};
+assertEq(eval(...itr), 11);
+function* gen() {
+ yield "a + b";
+}
+assertEq(eval(...gen()), 11);
+
+let c = ["C"], d = "D";
+assertEq(eval(...c=["c[0] + d"]), "c[0] + dD");
+
+// 12.2.4.1.2 Runtime Semantics: ArrayAccumulation
+// If Type(spreadObj) is not Object, then throw a TypeError exception.
+assertThrowsInstanceOf(() => eval("a + b", ...null), TypeError);
+assertThrowsInstanceOf(() => eval("a + b", ...undefined), TypeError);