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: --allow-natives-syntax --harmony-reflect --harmony-regexp-subclass | 5 // Flags: --allow-natives-syntax --harmony-reflect --harmony-regexp-subclass |
6 // Flags: --expose-gc --strong-mode | 6 // Flags: --expose-gc |
7 | 7 |
8 "use strict"; | 8 "use strict"; |
9 | 9 |
10 | 10 |
11 function checkPrototypeChain(object, constructors) { | 11 function checkPrototypeChain(object, constructors) { |
12 var proto = object.__proto__; | 12 var proto = object.__proto__; |
13 for (var i = 0; i < constructors.length; i++) { | 13 for (var i = 0; i < constructors.length; i++) { |
14 assertEquals(constructors[i].prototype, proto); | 14 assertEquals(constructors[i].prototype, proto); |
15 assertEquals(constructors[i], proto.constructor); | 15 assertEquals(constructors[i], proto.constructor); |
16 proto = proto.__proto__; | 16 proto = proto.__proto__; |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
83 this.o = {foo:153}; | 83 this.o = {foo:153}; |
84 } | 84 } |
85 } | 85 } |
86 var sloppy_func = new A(""); | 86 var sloppy_func = new A(""); |
87 var strict_func = new A("'use strict';"); | 87 var strict_func = new A("'use strict';"); |
88 assertNull(sloppy_func.caller); | 88 assertNull(sloppy_func.caller); |
89 assertThrows("strict_f.caller"); | 89 assertThrows("strict_f.caller"); |
90 assertNull(Object.getOwnPropertyDescriptor(sloppy_func, "caller").value); | 90 assertNull(Object.getOwnPropertyDescriptor(sloppy_func, "caller").value); |
91 assertEquals(undefined, Object.getOwnPropertyDescriptor(strict_func, "caller")
); | 91 assertEquals(undefined, Object.getOwnPropertyDescriptor(strict_func, "caller")
); |
92 | 92 |
93 function CheckFunction(func, is_strong) { | 93 function CheckFunction(func) { |
94 assertEquals("function", typeof func); | 94 assertEquals("function", typeof func); |
95 assertTrue(func instanceof Object); | 95 assertTrue(func instanceof Object); |
96 assertTrue(func instanceof Function); | 96 assertTrue(func instanceof Function); |
97 assertTrue(func instanceof A); | 97 assertTrue(func instanceof A); |
98 checkPrototypeChain(func, [A, Function, Object]); | 98 checkPrototypeChain(func, [A, Function, Object]); |
99 if (!is_strong) { | 99 assertEquals(42, func.a); |
100 assertEquals(42, func.a); | 100 assertEquals(4.2, func.d); |
101 assertEquals(4.2, func.d); | 101 assertEquals(153, func.o.foo); |
102 assertEquals(153, func.o.foo); | 102 assertTrue(undefined !== func.prototype); |
103 assertTrue(undefined !== func.prototype); | 103 func.prototype.bar = "func.bar"; |
104 func.prototype.bar = "func.bar"; | 104 var obj = new func(); |
105 var obj = new func(); | 105 assertTrue(obj instanceof Object); |
106 assertTrue(obj instanceof Object); | 106 assertTrue(obj instanceof func); |
107 assertTrue(obj instanceof func); | 107 assertEquals("object", typeof obj); |
108 assertEquals("object", typeof obj); | 108 assertEquals(113, obj.foo); |
109 assertEquals(113, obj.foo); | 109 assertEquals("func.bar", obj.bar); |
110 assertEquals("func.bar", obj.bar); | 110 delete func.prototype.bar; |
111 delete func.prototype.bar; | |
112 } | |
113 } | 111 } |
114 | 112 |
115 var source = "this.foo = 113;"; | 113 var source = "this.foo = 113;"; |
116 | 114 |
117 // Sloppy function | 115 // Sloppy function |
118 var sloppy_func = new A(source); | 116 var sloppy_func = new A(source); |
119 assertTrue(undefined !== sloppy_func.prototype); | 117 assertTrue(undefined !== sloppy_func.prototype); |
120 CheckFunction(sloppy_func, false); | 118 CheckFunction(sloppy_func, false); |
121 | 119 |
122 var sloppy_func1 = new A("return 312;"); | 120 var sloppy_func1 = new A("return 312;"); |
123 assertTrue(%HaveSameMap(sloppy_func, sloppy_func1)); | 121 assertTrue(%HaveSameMap(sloppy_func, sloppy_func1)); |
124 | 122 |
125 // Strict function | 123 // Strict function |
126 var strict_func = new A("'use strict'; " + source); | 124 var strict_func = new A("'use strict'; " + source); |
127 assertFalse(%HaveSameMap(strict_func, sloppy_func)); | 125 assertFalse(%HaveSameMap(strict_func, sloppy_func)); |
128 CheckFunction(strict_func, false); | 126 CheckFunction(strict_func, false); |
129 | 127 |
130 var strict_func1 = new A("'use strict'; return 312;"); | 128 var strict_func1 = new A("'use strict'; return 312;"); |
131 assertTrue(%HaveSameMap(strict_func, strict_func1)); | 129 assertTrue(%HaveSameMap(strict_func, strict_func1)); |
132 | 130 |
133 // Strong function | |
134 var strong_func = new A("'use strong'; " + source); | |
135 assertFalse(%HaveSameMap(strong_func, sloppy_func)); | |
136 assertFalse(%HaveSameMap(strong_func, strict_func)); | |
137 CheckFunction(strong_func, true); | |
138 | |
139 var strong_func1 = new A("'use strong'; return 312;"); | |
140 assertTrue(%HaveSameMap(strong_func, strong_func1)); | |
141 | |
142 gc(); | 131 gc(); |
143 })(); | 132 })(); |
144 | 133 |
145 | 134 |
146 (function() { | 135 (function() { |
147 class A extends Boolean { | 136 class A extends Boolean { |
148 constructor(...args) { | 137 constructor(...args) { |
149 assertFalse(new.target === undefined); | 138 assertFalse(new.target === undefined); |
150 super(...args); | 139 super(...args); |
151 this.a = 42; | 140 this.a = 42; |
(...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
580 gc(); | 569 gc(); |
581 })(); | 570 })(); |
582 | 571 |
583 | 572 |
584 (function() { | 573 (function() { |
585 var GeneratorFunction = (function*() {}).constructor; | 574 var GeneratorFunction = (function*() {}).constructor; |
586 class A extends GeneratorFunction { | 575 class A extends GeneratorFunction { |
587 constructor(...args) { | 576 constructor(...args) { |
588 assertFalse(new.target === undefined); | 577 assertFalse(new.target === undefined); |
589 super(...args); | 578 super(...args); |
590 // Strong functions are not extensible, so don't add fields. | |
591 if (args[args.length - 1].indexOf("use strong") >= 0) { | |
592 assertThrows(()=>{ this.a = 10; }, TypeError); | |
593 return; | |
594 } | |
595 this.a = 42; | 579 this.a = 42; |
596 this.d = 4.2; | 580 this.d = 4.2; |
597 this.o = {foo:153}; | 581 this.o = {foo:153}; |
598 } | 582 } |
599 } | 583 } |
600 var sloppy_func = new A("yield 153;"); | 584 var sloppy_func = new A("yield 153;"); |
601 var strict_func = new A("'use strict'; yield 153;"); | 585 var strict_func = new A("'use strict'; yield 153;"); |
602 // Unfortunately the difference is not observable from outside. | 586 // Unfortunately the difference is not observable from outside. |
603 assertThrows("sloppy_func.caller"); | 587 assertThrows("sloppy_func.caller"); |
604 assertThrows("strict_f.caller"); | 588 assertThrows("strict_f.caller"); |
605 assertEquals(undefined, Object.getOwnPropertyDescriptor(sloppy_func, "caller")
); | 589 assertEquals(undefined, Object.getOwnPropertyDescriptor(sloppy_func, "caller")
); |
606 assertEquals(undefined, Object.getOwnPropertyDescriptor(strict_func, "caller")
); | 590 assertEquals(undefined, Object.getOwnPropertyDescriptor(strict_func, "caller")
); |
607 | 591 |
608 function CheckFunction(func, is_strong) { | 592 function CheckFunction(func) { |
609 assertEquals("function", typeof func); | 593 assertEquals("function", typeof func); |
610 assertTrue(func instanceof Object); | 594 assertTrue(func instanceof Object); |
611 assertTrue(func instanceof Function); | 595 assertTrue(func instanceof Function); |
612 assertTrue(func instanceof GeneratorFunction); | 596 assertTrue(func instanceof GeneratorFunction); |
613 assertTrue(func instanceof A); | 597 assertTrue(func instanceof A); |
614 checkPrototypeChain(func, [A, GeneratorFunction, Function, Object]); | 598 checkPrototypeChain(func, [A, GeneratorFunction, Function, Object]); |
615 if (!is_strong) { | |
616 assertEquals(42, func.a); | |
617 assertEquals(4.2, func.d); | |
618 assertEquals(153, func.o.foo); | |
619 | 599 |
620 assertTrue(undefined !== func.prototype); | 600 assertEquals(42, func.a); |
621 func.prototype.bar = "func.bar"; | 601 assertEquals(4.2, func.d); |
622 var obj = func(); // Generator object. | 602 assertEquals(153, func.o.foo); |
623 assertTrue(obj instanceof Object); | |
624 assertTrue(obj instanceof func); | |
625 assertEquals("object", typeof obj); | |
626 assertEquals("func.bar", obj.bar); | |
627 delete func.prototype.bar; | |
628 | 603 |
629 assertPropertiesEqual({done: false, value: 1}, obj.next()); | 604 assertTrue(undefined !== func.prototype); |
630 assertPropertiesEqual({done: false, value: 1}, obj.next()); | 605 func.prototype.bar = "func.bar"; |
631 assertPropertiesEqual({done: false, value: 2}, obj.next()); | 606 var obj = func(); // Generator object. |
632 assertPropertiesEqual({done: false, value: 3}, obj.next()); | 607 assertTrue(obj instanceof Object); |
633 assertPropertiesEqual({done: false, value: 5}, obj.next()); | 608 assertTrue(obj instanceof func); |
634 assertPropertiesEqual({done: false, value: 8}, obj.next()); | 609 assertEquals("object", typeof obj); |
635 assertPropertiesEqual({done: true, value: undefined}, obj.next()); | 610 assertEquals("func.bar", obj.bar); |
636 } | 611 delete func.prototype.bar; |
| 612 |
| 613 assertPropertiesEqual({done: false, value: 1}, obj.next()); |
| 614 assertPropertiesEqual({done: false, value: 1}, obj.next()); |
| 615 assertPropertiesEqual({done: false, value: 2}, obj.next()); |
| 616 assertPropertiesEqual({done: false, value: 3}, obj.next()); |
| 617 assertPropertiesEqual({done: false, value: 5}, obj.next()); |
| 618 assertPropertiesEqual({done: false, value: 8}, obj.next()); |
| 619 assertPropertiesEqual({done: true, value: undefined}, obj.next()); |
637 } | 620 } |
638 | 621 |
639 var source = "yield 1; yield 1; yield 2; yield 3; yield 5; yield 8;"; | 622 var source = "yield 1; yield 1; yield 2; yield 3; yield 5; yield 8;"; |
640 | 623 |
641 // Sloppy generator function | 624 // Sloppy generator function |
642 var sloppy_func = new A(source); | 625 var sloppy_func = new A(source); |
643 assertTrue(undefined !== sloppy_func.prototype); | 626 assertTrue(undefined !== sloppy_func.prototype); |
644 CheckFunction(sloppy_func, false); | 627 CheckFunction(sloppy_func, false); |
645 | 628 |
646 var sloppy_func1 = new A("yield 312;"); | 629 var sloppy_func1 = new A("yield 312;"); |
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
933 | 916 |
934 Object.defineProperty(pattern, Symbol.match, { | 917 Object.defineProperty(pattern, Symbol.match, { |
935 get() { log.push("match"); f.prototype = p2; return false; }}); | 918 get() { log.push("match"); f.prototype = p2; return false; }}); |
936 | 919 |
937 var o = Reflect.construct(RegExp, [pattern], f); | 920 var o = Reflect.construct(RegExp, [pattern], f); |
938 assertEquals(["match", "tostring"], log); | 921 assertEquals(["match", "tostring"], log); |
939 assertEquals(/biep/, o); | 922 assertEquals(/biep/, o); |
940 assertTrue(o.__proto__ === p2); | 923 assertTrue(o.__proto__ === p2); |
941 assertTrue(f.prototype === p3); | 924 assertTrue(f.prototype === p3); |
942 })(); | 925 })(); |
OLD | NEW |