OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 // | 4 // |
5 // Flags: --harmony-destructuring --harmony-computed-property-names | 5 // Flags: --harmony-destructuring --harmony-computed-property-names |
6 // Flags: --harmony-arrow-functions | 6 // Flags: --harmony-arrow-functions --harmony-rest-parameters |
7 | 7 |
8 (function TestObjectLiteralPattern() { | 8 (function TestObjectLiteralPattern() { |
9 var { x : x, y : y } = { x : 1, y : 2 }; | 9 var { x : x, y : y } = { x : 1, y : 2 }; |
10 assertEquals(1, x); | 10 assertEquals(1, x); |
11 assertEquals(2, y); | 11 assertEquals(2, y); |
12 | 12 |
13 var {z} = { z : 3 }; | 13 var {z} = { z : 3 }; |
14 assertEquals(3, z); | 14 assertEquals(3, z); |
15 | 15 |
16 | 16 |
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
220 let {x = y, y} = { y : 42 }; | 220 let {x = y, y} = { y : 42 }; |
221 }, ReferenceError); | 221 }, ReferenceError); |
222 | 222 |
223 { | 223 { |
224 let {x, y = eval("x+1")} = {x:42}; | 224 let {x, y = eval("x+1")} = {x:42}; |
225 assertEquals(42, x); | 225 assertEquals(42, x); |
226 assertEquals(43, y); | 226 assertEquals(43, y); |
227 } | 227 } |
228 | 228 |
229 { | 229 { |
| 230 let {x, y = () => eval("x+1")} = {x:42}; |
| 231 assertEquals(42, x); |
| 232 assertEquals(43, y()); |
| 233 } |
| 234 |
| 235 { |
230 let {x = function() {return y+1;}, y} = {y:42}; | 236 let {x = function() {return y+1;}, y} = {y:42}; |
231 assertEquals(43, x()); | 237 assertEquals(43, x()); |
232 assertEquals(42, y); | 238 assertEquals(42, y); |
233 } | 239 } |
234 { | 240 { |
235 let {x = function() {return eval("y+1");}, y} = {y:42}; | 241 let {x = function() {return eval("y+1");}, y} = {y:42}; |
236 assertEquals(43, x()); | 242 assertEquals(43, x()); |
237 assertEquals(42, y); | 243 assertEquals(42, y); |
238 } | 244 } |
239 }()); | 245 }()); |
(...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
722 function f1({a = x}) { var x = 2; return a; } | 728 function f1({a = x}) { var x = 2; return a; } |
723 assertEquals(1, f1({})); | 729 assertEquals(1, f1({})); |
724 function f2({a = x}) { function x() {}; return a; } | 730 function f2({a = x}) { function x() {}; return a; } |
725 assertEquals(1, f2({})); | 731 assertEquals(1, f2({})); |
726 function f3({a = x}) { 'use strict'; let x = 2; return a; } | 732 function f3({a = x}) { 'use strict'; let x = 2; return a; } |
727 assertEquals(1, f3({})); | 733 assertEquals(1, f3({})); |
728 function f4({a = x}) { 'use strict'; const x = 2; return a; } | 734 function f4({a = x}) { 'use strict'; const x = 2; return a; } |
729 assertEquals(1, f4({})); | 735 assertEquals(1, f4({})); |
730 function f5({a = x}) { 'use strict'; function x() {}; return a; } | 736 function f5({a = x}) { 'use strict'; function x() {}; return a; } |
731 assertEquals(1, f5({})); | 737 assertEquals(1, f5({})); |
| 738 // TODO(rossberg): Apparently, eval in default expressions is not working yet. |
| 739 // function f6({a = eval("x")}) { var x; return a; } |
| 740 // assertEquals(1, f6({})); |
| 741 // function f61({a = eval("x")}) { 'use strict'; var x; return a; } |
| 742 // assertEquals(1, f61({})); |
| 743 // function f62({a = eval("'use strict'; x")}) { var x; return a; } |
| 744 // assertEquals(1, f62({})); |
| 745 function f7({a = function() { return x }}) { var x; return a(); } |
| 746 assertEquals(1, f7({})); |
| 747 function f8({a = () => x}) { var x; return a(); } |
| 748 assertEquals(1, f8({})); |
| 749 // function f9({a = () => eval("x")}) { var x; return a(); } |
| 750 // assertEquals(1, f9({})); |
| 751 // function f91({a = () => eval("x")}) { 'use strict'; var x; return a(); } |
| 752 // assertEquals(1, f91({})); |
| 753 // function f92({a = () => { 'use strict'; return eval("x") }}) { var x; retur
n a(); } |
| 754 // assertEquals(1, f92({})); |
| 755 // function f93({a = () => eval("'use strict'; x")}) { var x; return a(); } |
| 756 // assertEquals(1, f93({})); |
732 | 757 |
733 var g1 = ({a = x}) => { var x = 2; return a; }; | 758 var g1 = ({a = x}) => { var x = 2; return a; }; |
734 assertEquals(1, g1({})); | 759 assertEquals(1, g1({})); |
735 var g2 = ({a = x}) => { function x() {}; return a; }; | 760 var g2 = ({a = x}) => { function x() {}; return a; }; |
736 assertEquals(1, g2({})); | 761 assertEquals(1, g2({})); |
737 var g3 = ({a = x}) => { 'use strict'; let x = 2; return a; }; | 762 var g3 = ({a = x}) => { 'use strict'; let x = 2; return a; }; |
738 assertEquals(1, g3({})); | 763 assertEquals(1, g3({})); |
739 var g4 = ({a = x}) => { 'use strict'; const x = 2; return a; }; | 764 var g4 = ({a = x}) => { 'use strict'; const x = 2; return a; }; |
740 assertEquals(1, g4({})); | 765 assertEquals(1, g4({})); |
741 var g5 = ({a = x}) => { 'use strict'; function x() {}; return a; }; | 766 var g5 = ({a = x}) => { 'use strict'; function x() {}; return a; }; |
742 assertEquals(1, g5({})); | 767 assertEquals(1, g5({})); |
| 768 // var g6 = ({a = eval("x")}) => { var x; return a; }; |
| 769 // assertEquals(1, g6({})); |
| 770 // var g61 = ({a = eval("x")}) => { 'use strict'; var x; return a; }; |
| 771 // assertEquals(1, g61({})); |
| 772 // var g62 = ({a = eval("'use strict'; x")}) => { var x; return a; }; |
| 773 // assertEquals(1, g62({})); |
| 774 var g7 = ({a = function() { return x }}) => { var x; return a(); }; |
| 775 assertEquals(1, g7({})); |
| 776 var g8 = ({a = () => x}) => { var x; return a(); }; |
| 777 assertEquals(1, g8({})); |
| 778 // var g9 = ({a = () => eval("x")}) => { var x; return a(); }; |
| 779 // assertEquals(1, g9({})); |
| 780 // var g91 = ({a = () => eval("x")}) => { 'use strict'; var x; return a(); }; |
| 781 // assertEquals(1, g91({})); |
| 782 // var g92 = ({a = () => { 'use strict'; return eval("x") }}) => { var x; retu
rn a(); }; |
| 783 // assertEquals(1, g92({})); |
| 784 // var g93 = ({a = () => eval("'use strict'; x")}) => { var x; return a(); }; |
| 785 // assertEquals(1, g93({})); |
743 | 786 |
744 var f6 = function f({x = f}) { var f; return x; } | 787 var f11 = function f({x = f}) { var f; return x; } |
745 assertSame(f6, f6({})); | 788 assertSame(f11, f11({})); |
746 var f7 = function f({x = f}) { function f() {}; return x; } | 789 var f12 = function f({x = f}) { function f() {}; return x; } |
747 assertSame(f7, f7({})); | 790 assertSame(f12, f12({})); |
748 var f8 = function f({x = f}) { 'use strict'; let f; return x; } | 791 var f13 = function f({x = f}) { 'use strict'; let f; return x; } |
749 assertSame(f8, f8({})); | 792 assertSame(f13, f13({})); |
750 var f9 = function f({x = f}) { 'use strict'; const f = 0; return x; } | 793 var f14 = function f({x = f}) { 'use strict'; const f = 0; return x; } |
751 assertSame(f9, f9({})); | 794 assertSame(f14, f14({})); |
752 var f10 = function f({x = f}) { 'use strict'; function f() {}; return x; } | 795 var f15 = function f({x = f}) { 'use strict'; function f() {}; return x; } |
753 assertSame(f10, f10({})); | 796 assertSame(f15, f15({})); |
754 var f11 = function f({f = 7, x = f}) { return x; } | 797 var f16 = function f({f = 7, x = f}) { return x; } |
755 assertSame(7, f11({})); | 798 assertSame(7, f16({})); |
756 | 799 |
757 var y = 'a'; | 800 var y = 'a'; |
758 function f20({[y]: x}) { var y = 'b'; return x; } | 801 function f20({[y]: x}) { var y = 'b'; return x; } |
759 assertEquals(1, f20({a: 1, b: 2})); | 802 assertEquals(1, f20({a: 1, b: 2})); |
| 803 // function f21({[eval('y')]: x}) { var y = 'b'; return x; } |
| 804 // assertEquals(1, f21({a: 1, b: 2})); |
760 var g20 = ({[y]: x}) => { var y = 'b'; return x; }; | 805 var g20 = ({[y]: x}) => { var y = 'b'; return x; }; |
761 assertEquals(1, g20({a: 1, b: 2})); | 806 assertEquals(1, g20({a: 1, b: 2})); |
| 807 // var g21 = ({[eval('y')]: x}) => { var y = 'b'; return x; }; |
| 808 // assertEquals(1, g21({a: 1, b: 2})); |
| 809 |
| 810 // TODO(caitp): TDZ for rest parameters is not working yet. |
| 811 // function f30({x = a}, ...a) {} |
| 812 // assertThrows(() => f30({}), ReferenceError); |
| 813 // function f31({x = eval("a")}, ...a) {} |
| 814 // assertThrows(() => f31({}), ReferenceError); |
| 815 // function f32({x = eval("a")}, ...a) { 'use strict'; } |
| 816 // assertThrows(() => f32({}), ReferenceError); |
| 817 // function f33({x = eval("'use strict'; a")}, ...a) {} |
| 818 // assertThrows(() => f33({}), ReferenceError); |
| 819 function f34({x = function() { return a }}, ...a) { return x()[0] } |
| 820 assertEquals(4, f34({}, 4)); |
| 821 function f35({x = () => a}, ...a) { return x()[0] } |
| 822 assertEquals(4, f35({}, 4)); |
| 823 // function f36({x = () => eval("a")}, ...a) { return x()[0] } |
| 824 // assertEquals(4, f36({}, 4)); |
| 825 // function f37({x = () => eval("a")}, ...a) { 'use strict'; return x()[0] } |
| 826 // assertEquals(4, f37({}, 4)); |
| 827 // function f38({x = () => { 'use strict'; return eval("a") }}, ...a) { return
x()[0] } |
| 828 // assertEquals(4, f38({}, 4)); |
| 829 // function f39({x = () => eval("'use strict'; a")}, ...a) { return x()[0] } |
| 830 // assertEquals(4, f39({}, 4)); |
| 831 |
| 832 // var g30 = ({x = a}, ...a) => {}; |
| 833 // assertThrows(() => g30({}), ReferenceError); |
| 834 // var g31 = ({x = eval("a")}, ...a) => {}; |
| 835 // assertThrows(() => g31({}), ReferenceError); |
| 836 // var g32 = ({x = eval("a")}, ...a) => { 'use strict'; }; |
| 837 // assertThrows(() => g32({}), ReferenceError); |
| 838 // var g33 = ({x = eval("'use strict'; a")}, ...a) => {}; |
| 839 // assertThrows(() => g33({}), ReferenceError); |
| 840 var g34 = ({x = function() { return a }}, ...a) => { return x()[0] }; |
| 841 assertEquals(4, g34({}, 4)); |
| 842 var g35 = ({x = () => a}, ...a) => { return x()[0] }; |
| 843 assertEquals(4, g35({}, 4)); |
762 })(); | 844 })(); |
763 | 845 |
764 | 846 |
765 (function TestDuplicatesInParameters() { | 847 (function TestDuplicatesInParameters() { |
766 assertThrows("'use strict';function f(x,x){}", SyntaxError); | 848 assertThrows("'use strict';function f(x,x){}", SyntaxError); |
767 assertThrows("'use strict';function f({x,x}){}", SyntaxError); | 849 assertThrows("'use strict';function f({x,x}){}", SyntaxError); |
768 assertThrows("'use strict';function f(x, {x}){}", SyntaxError); | 850 assertThrows("'use strict';function f(x, {x}){}", SyntaxError); |
769 assertThrows("'use strict';var f = (x,x) => {};", SyntaxError); | 851 assertThrows("'use strict';var f = (x,x) => {};", SyntaxError); |
770 assertThrows("'use strict';var f = ({x,x}) => {};", SyntaxError); | 852 assertThrows("'use strict';var f = ({x,x}) => {};", SyntaxError); |
771 assertThrows("'use strict';var f = (x, {x}) => {};", SyntaxError); | 853 assertThrows("'use strict';var f = (x, {x}) => {};", SyntaxError); |
772 | 854 |
773 function ok(x) { var x; }; ok(); | 855 function ok1(x) { var x; return x; }; |
774 // TODO(rossberg): Check for variable collision. | 856 assertEquals(1, ok1(1)); |
775 // assertThrows("function f({x}) { var x; }; f({});", SyntaxError); | 857 function ok2(x) { 'use strict'; { let x = 2; return x; } }; |
776 // assertThrows("'use strict'; function f({x}) { let x = 0; }; f({});", Syntax
Error); | 858 assertEquals(2, ok2(1)); |
| 859 |
| 860 assertThrows("function f({x}) { var x; }; f({});", SyntaxError); |
| 861 assertThrows("function f({x}) { { var x; } }; f({});", SyntaxError); |
| 862 assertThrows("'use strict'; function f(x) { let x = 0; }; f({});", SyntaxError
); |
| 863 assertThrows("'use strict'; function f({x}) { let x = 0; }; f({});", SyntaxErr
or); |
777 }()); | 864 }()); |
778 | 865 |
779 | 866 |
780 (function TestForInOfTDZ() { | 867 (function TestForInOfTDZ() { |
781 assertThrows("'use strict'; let x = {}; for (let [x, y] of {x});", ReferenceEr
ror); | 868 assertThrows("'use strict'; let x = {}; for (let [x, y] of {x});", ReferenceEr
ror); |
782 assertThrows("'use strict'; let x = {}; for (let [y, x] of {x});", ReferenceEr
ror); | 869 assertThrows("'use strict'; let x = {}; for (let [y, x] of {x});", ReferenceEr
ror); |
783 assertThrows("'use strict'; let x = {}; for (let [x, y] in {x});", ReferenceEr
ror); | 870 assertThrows("'use strict'; let x = {}; for (let [x, y] in {x});", ReferenceEr
ror); |
784 assertThrows("'use strict'; let x = {}; for (let [y, x] in {x});", ReferenceEr
ror); | 871 assertThrows("'use strict'; let x = {}; for (let [y, x] in {x});", ReferenceEr
ror); |
785 }()); | 872 }()); |
OLD | NEW |