blob: 313aad1d8f6190eb7d3624e5572876f548d9eb62 [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// 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
3// found in the LICENSE file.
4
5// Flags: --allow-natives-syntax --harmony-reflect --harmony-regexp-subclass
6// Flags: --expose-gc --strong-mode
7
8"use strict";
9
10
11function checkPrototypeChain(object, constructors) {
12 var proto = object.__proto__;
13 for (var i = 0; i < constructors.length; i++) {
14 assertEquals(constructors[i].prototype, proto);
15 assertEquals(constructors[i], proto.constructor);
16 proto = proto.__proto__;
17 }
18}
19
20
21(function() {
22 class A extends Object {
23 constructor(...args) {
24 assertFalse(new.target === undefined);
25 super(...args);
26 this.a = 42;
27 this.d = 4.2;
28 this.o = {foo:153};
29 }
30 }
31
32 var s = new A("foo");
33 assertTrue(s instanceof Object);
34 assertTrue(s instanceof A);
35 assertEquals("object", typeof s);
36 checkPrototypeChain(s, [A, Object]);
37 assertEquals(42, s.a);
38 assertEquals(4.2, s.d);
39 assertEquals(153, s.o.foo);
40
41 var s1 = new A("bar");
42 assertTrue(%HaveSameMap(s, s1));
43
44
45 var n = new A(153);
46 assertTrue(n instanceof Object);
47 assertTrue(n instanceof A);
48 assertEquals("object", typeof s);
49 checkPrototypeChain(s, [A, Object]);
50 assertEquals(42, n.a);
51 assertEquals(4.2, n.d);
52 assertEquals(153, n.o.foo);
53
54 var n1 = new A(312);
55 assertTrue(%HaveSameMap(n, n1));
56 assertTrue(%HaveSameMap(n, s));
57
58
59 var b = new A(true);
60 assertTrue(b instanceof Object);
61 assertTrue(b instanceof A);
62 assertEquals("object", typeof s);
63 checkPrototypeChain(s, [A, Object]);
64 assertEquals(42, b.a);
65 assertEquals(4.2, b.d);
66 assertEquals(153, b.o.foo);
67
68 var b1 = new A(true);
69 assertTrue(%HaveSameMap(b, b1));
70 assertTrue(%HaveSameMap(b, s));
71
72 gc();
73})();
74
75
76(function() {
77 class A extends Function {
78 constructor(...args) {
79 assertFalse(new.target === undefined);
80 super(...args);
81 // Strong functions are not extensible, so don't add fields.
82 if (args[args.length - 1].indexOf("use strong") >= 0) {
83 assertThrows(()=>{ this.a = 10; }, TypeError);
84 return;
85 }
86 this.a = 42;
87 this.d = 4.2;
88 this.o = {foo:153};
89 }
90 }
91 var sloppy_func = new A("");
92 var strict_func = new A("'use strict';");
93 assertNull(sloppy_func.caller);
94 assertThrows("strict_f.caller");
95 assertNull(Object.getOwnPropertyDescriptor(sloppy_func, "caller").value);
96 assertEquals(undefined, Object.getOwnPropertyDescriptor(strict_func, "caller"));
97
98 function CheckFunction(func, is_strong) {
99 assertEquals("function", typeof func);
100 assertTrue(func instanceof Object);
101 assertTrue(func instanceof Function);
102 assertTrue(func instanceof A);
103 checkPrototypeChain(func, [A, Function, Object]);
104 if (!is_strong) {
105 assertEquals(42, func.a);
106 assertEquals(4.2, func.d);
107 assertEquals(153, func.o.foo);
108 assertTrue(undefined !== func.prototype);
109 func.prototype.bar = "func.bar";
110 var obj = new func();
111 assertTrue(obj instanceof Object);
112 assertTrue(obj instanceof func);
113 assertEquals("object", typeof obj);
114 assertEquals(113, obj.foo);
115 assertEquals("func.bar", obj.bar);
116 delete func.prototype.bar;
117 }
118 }
119
120 var source = "this.foo = 113;";
121
122 // Sloppy function
123 var sloppy_func = new A(source);
124 assertTrue(undefined !== sloppy_func.prototype);
125 CheckFunction(sloppy_func, false);
126
127 var sloppy_func1 = new A("return 312;");
128 assertTrue(%HaveSameMap(sloppy_func, sloppy_func1));
129
130 // Strict function
131 var strict_func = new A("'use strict'; " + source);
132 assertFalse(%HaveSameMap(strict_func, sloppy_func));
133 CheckFunction(strict_func, false);
134
135 var strict_func1 = new A("'use strict'; return 312;");
136 assertTrue(%HaveSameMap(strict_func, strict_func1));
137
138 // Strong function
139 var strong_func = new A("'use strong'; " + source);
140 assertFalse(%HaveSameMap(strong_func, sloppy_func));
141 assertFalse(%HaveSameMap(strong_func, strict_func));
142 CheckFunction(strong_func, true);
143
144 var strong_func1 = new A("'use strong'; return 312;");
145 assertTrue(%HaveSameMap(strong_func, strong_func1));
146
147 gc();
148})();
149
150
151(function() {
152 class A extends Boolean {
153 constructor(...args) {
154 assertFalse(new.target === undefined);
155 super(...args);
156 this.a = 42;
157 this.d = 4.2;
158 this.o = {foo:153};
159 }
160 }
161
162 var o = new A(true);
163 assertTrue(o instanceof Object);
164 assertTrue(o instanceof Boolean);
165 assertTrue(o instanceof A);
166 assertEquals("object", typeof o);
167 checkPrototypeChain(o, [A, Boolean]);
168 assertTrue(o.valueOf());
169 assertEquals(42, o.a);
170 assertEquals(4.2, o.d);
171 assertEquals(153, o.o.foo);
172
173 var o1 = new A(false);
174 assertTrue(%HaveSameMap(o, o1));
175
176 gc();
177})();
178
179
180function TestErrorSubclassing(error) {
181 class A extends error {
182 constructor(...args) {
183 assertFalse(new.target === undefined);
184 super(...args);
185 this.a = 42;
186 this.d = 4.2;
187 this.o = {foo:153};
188 }
189 }
190
191 var o = new A("message");
192 assertTrue(o instanceof Object);
193 assertTrue(o instanceof error);
194 assertTrue(o instanceof Error);
195 assertTrue(o instanceof A);
196 assertEquals("object", typeof o);
197 if (error == Error) {
198 checkPrototypeChain(o, [A, Error, Object]);
199 } else {
200 checkPrototypeChain(o, [A, error, Error, Object]);
201 }
202 assertEquals("message", o.message);
203 assertEquals(error.name + ": message", o.toString());
204 assertEquals(42, o.a);
205 assertEquals(4.2, o.d);
206 assertEquals(153, o.o.foo);
207
208 var o1 = new A("achtung!");
209 assertTrue(%HaveSameMap(o, o1));
210
211 gc();
212}
213
214
215(function() {
216 TestErrorSubclassing(Error);
217 TestErrorSubclassing(EvalError);
218 TestErrorSubclassing(RangeError);
219 TestErrorSubclassing(ReferenceError);
220 TestErrorSubclassing(SyntaxError);
221 TestErrorSubclassing(TypeError);
222 TestErrorSubclassing(URIError);
223})();
224
225
226(function() {
227 class A extends Number {
228 constructor(...args) {
229 assertFalse(new.target === undefined);
230 super(...args);
231 this.a = 42;
232 this.d = 4.2;
233 this.o = {foo:153};
234 }
235 }
236
237 var o = new A(153);
238 assertTrue(o instanceof Object);
239 assertTrue(o instanceof Number);
240 assertTrue(o instanceof A);
241 assertEquals("object", typeof o);
242 checkPrototypeChain(o, [A, Number, Object]);
243 assertEquals(153, o.valueOf());
244 assertEquals(42, o.a);
245 assertEquals(4.2, o.d);
246 assertEquals(153, o.o.foo);
247
248 var o1 = new A(312);
249 assertTrue(%HaveSameMap(o, o1));
250
251 gc();
252})();
253
254
255(function() {
256 class A extends Date {
257 constructor(...args) {
258 assertFalse(new.target === undefined);
259 super(...args);
260 this.a = 42;
261 this.d = 4.2;
262 this.o = {foo:153};
263 }
264 }
265
266 var o = new A(1234567890);
267 assertTrue(o instanceof Object);
268 assertTrue(o instanceof Date);
269 assertTrue(o instanceof A);
270 assertEquals("object", typeof o);
271 checkPrototypeChain(o, [A, Date, Object]);
272 assertEquals(1234567890, o.getTime());
273 assertEquals(42, o.a);
274 assertEquals(4.2, o.d);
275 assertEquals(153, o.o.foo);
276
277 var o1 = new A(2015, 10, 29);
278 assertEquals(2015, o1.getFullYear());
279 assertEquals(10, o1.getMonth());
280 assertEquals(29, o1.getDate());
281 assertTrue(%HaveSameMap(o, o1));
282
283 gc();
284})();
285
286
287(function() {
288 class A extends String {
289 constructor(...args) {
290 assertFalse(new.target === undefined);
291 super(...args);
292 this.a = 42;
293 this.d = 4.2;
294 this.o = {foo:153};
295 }
296 }
297
298 var o = new A("foo");
299 assertTrue(o instanceof Object);
300 assertTrue(o instanceof String);
301 assertTrue(o instanceof A);
302 assertEquals("object", typeof o);
303 checkPrototypeChain(o, [A, String, Object]);
304
305 assertEquals("foo", o.valueOf());
306 assertEquals(42, o.a);
307 assertEquals(4.2, o.d);
308 assertEquals(153, o.o.foo);
309
310 var o1 = new A("bar");
311 assertTrue(%HaveSameMap(o, o1));
312
313 gc();
314})();
315
316
317(function() {
318 class A extends RegExp {
319 constructor(...args) {
320 assertFalse(new.target === undefined);
321 super(...args);
322 this.a = 42;
323 this.d = 4.2;
324 this.o = {foo:153};
325 }
326 }
327
328 var o = new A("o(..)h", "g");
329 assertTrue(o instanceof Object);
330 assertTrue(o instanceof RegExp);
331 assertTrue(o instanceof A);
332 assertEquals("object", typeof o);
333 checkPrototypeChain(o, [A, RegExp, Object]);
334 assertTrue(o.test("ouch"));
335 assertArrayEquals(["ouch", "uc"], o.exec("boom! ouch! bam!"));
336 assertEquals("o(..)h", o.source);
337 assertTrue(o.global);
338 assertFalse(o.ignoreCase);
339 assertFalse(o.multiline);
340 assertEquals(10, o.lastIndex);
341 assertEquals(42, o.a);
342 assertEquals(4.2, o.d);
343 assertEquals(153, o.o.foo);
344
345 var o1 = new A(7);
346 assertTrue(%HaveSameMap(o, o1));
347
348 gc();
349})();
350
351
352(function TestArraySubclassing() {
353 class A extends Array {
354 constructor(...args) {
355 assertFalse(new.target === undefined);
356 super(...args);
357 this.a = 42;
358 this.d = 4.2;
359 this.o = {foo:153};
360 }
361 }
362
363 var o = new Array(13);
364 assertTrue(o instanceof Object);
365 assertTrue(o instanceof Array);
366 assertEquals("object", typeof o);
367 checkPrototypeChain(o, [Array, Object]);
368 assertEquals(13, o.length);
369
370 var o = new A(10);
371 assertTrue(o instanceof Object);
372 assertTrue(o instanceof Array);
373 assertTrue(o instanceof A);
374 assertEquals("object", typeof o);
375 checkPrototypeChain(o, [A, Array, Object]);
376 assertEquals(10, o.length);
377 assertEquals(42, o.a);
378 assertEquals(4.2, o.d);
379 assertEquals(153, o.o.foo);
380
381 var o1 = new A(7);
382 assertTrue(%HaveSameMap(o, o1));
383})();
384
385
386var TypedArray = Uint8Array.__proto__;
387
388function TestTypedArraySubclassing(array) {
389 class A extends array {
390 constructor(...args) {
391 assertFalse(new.target === undefined);
392 super(...args);
393 this.a = 42;
394 this.d = 4.2;
395 this.o = {foo:153};
396 }
397 }
398
399 var o = new array(13);
400 assertTrue(o instanceof Object);
401 assertTrue(o instanceof TypedArray);
402 assertTrue(o instanceof array);
403 assertEquals("object", typeof o);
404 checkPrototypeChain(o, [array, TypedArray, Object]);
405 assertEquals(13, o.length);
406
407 var o = new A(10);
408 assertTrue(o instanceof Object);
409 assertTrue(o instanceof TypedArray);
410 assertTrue(o instanceof array);
411 assertTrue(o instanceof A);
412 assertEquals("object", typeof o);
413 checkPrototypeChain(o, [A, array, TypedArray, Object]);
414 assertEquals(10, o.length);
415 assertEquals(42, o.a);
416 assertEquals(4.2, o.d);
417 assertEquals(153, o.o.foo);
418
419 var o1 = new A(7);
420 assertTrue(%HaveSameMap(o, o1));
421}
422
423
424(function() {
425 TestTypedArraySubclassing(Int8Array);
426 TestTypedArraySubclassing(Uint8Array);
427 TestTypedArraySubclassing(Uint8ClampedArray);
428 TestTypedArraySubclassing(Int16Array);
429 TestTypedArraySubclassing(Uint16Array);
430 TestTypedArraySubclassing(Int32Array);
431 TestTypedArraySubclassing(Uint32Array);
432 TestTypedArraySubclassing(Float32Array);
433 TestTypedArraySubclassing(Float64Array);
434})();
435
436
437function TestMapSetSubclassing(container, is_map) {
438 var keys = [{name: "banana"}, {name: "cow"}, {name: "orange"}, {name: "chicken"}, {name: "apple"}];
439
440 class A extends container {
441 constructor(...args) {
442 assertFalse(new.target === undefined);
443 super(...args);
444 this.a = 42;
445 this.d = 4.2;
446 this.o = {foo:153};
447 }
448 }
449
450 var o = new A();
451 assertTrue(o instanceof Object);
452 assertTrue(o instanceof container);
453 assertTrue(o instanceof A);
454 assertEquals("object", typeof o);
455 checkPrototypeChain(o, [A, container, Object]);
456
457 for (var i = 0; i < keys.length; i++) {
458 if (is_map) {
459 o.set(keys[i], (i + 1) * 11);
460 } else {
461 o.add(keys[i]);
462 }
463 }
464 o.delete(keys[1]);
465 o.delete(keys[3]);
466
467 assertTrue(o.has(keys[0]));
468 assertFalse(o.has(keys[1]));
469 assertTrue(o.has(keys[2]));
470 assertFalse(o.has(keys[1]));
471 assertTrue(o.has(keys[4]));
472 if (is_map) {
473 assertEquals(11, o.get(keys[0]));
474 assertEquals(undefined, o.get(keys[1]));
475 assertEquals(33, o.get(keys[2]));
476 assertEquals(undefined, o.get(keys[3]));
477 assertEquals(55, o.get(keys[4]));
478 }
479 assertEquals(42, o.a);
480 assertEquals(4.2, o.d);
481 assertEquals(153, o.o.foo);
482
483 var o1 = new A();
484 assertTrue(%HaveSameMap(o, o1));
485
486 gc();
487}
488
489
490(function() {
491 TestMapSetSubclassing(Map, true);
492 TestMapSetSubclassing(WeakMap, true);
493 TestMapSetSubclassing(Set, false);
494 TestMapSetSubclassing(WeakSet, false);
495})();
496
497
498(function() {
499 class A extends ArrayBuffer {
500 constructor(...args) {
501 assertFalse(new.target === undefined);
502 super(...args);
503 this.a = 42;
504 this.d = 4.2;
505 this.o = {foo:153};
506 }
507 }
508
509 var o = new A(16);
510 assertTrue(o instanceof Object);
511 assertTrue(o instanceof ArrayBuffer);
512 assertTrue(o instanceof A);
513 assertEquals("object", typeof o);
514 checkPrototypeChain(o, [A, ArrayBuffer, Object]);
515
516 assertEquals(16, o.byteLength);
517 assertEquals(42, o.a);
518 assertEquals(4.2, o.d);
519 assertEquals(153, o.o.foo);
520
521 var o1 = new A("bar");
522 assertTrue(%HaveSameMap(o, o1));
523
524
525 class MyInt32Array extends Int32Array {
526 constructor(v, name) {
527 super(v);
528 this.name = name;
529 }
530 }
531
532 class MyUint32Array extends Uint32Array {
533 constructor(v, name) {
534 super(v);
535 this.name = name;
536 }
537 }
538
539 var int32view = new MyInt32Array(o, "cats");
540 var uint32view = new MyUint32Array(o, "dogs");
541
542 int32view[0] = -2;
543 uint32view[1] = 0xffffffff;
544
545 assertEquals("cats", int32view.name);
546 assertEquals("dogs", uint32view.name);
547 assertEquals(-2, int32view[0]);
548 assertEquals(-1, int32view[1]);
549 assertEquals(0xfffffffe, uint32view[0]);
550 assertEquals(0xffffffff, uint32view[1]);
551
552 gc();
553})();
554
555
556(function() {
557 class A extends DataView {
558 constructor(...args) {
559 assertFalse(new.target === undefined);
560 super(...args);
561 this.a = 42;
562 this.d = 4.2;
563 this.o = {foo:153};
564 }
565 }
566
567 var buffer = new ArrayBuffer(16);
568 var o = new A(buffer);
569 assertTrue(o instanceof Object);
570 assertTrue(o instanceof DataView);
571 assertTrue(o instanceof A);
572 assertEquals("object", typeof o);
573 checkPrototypeChain(o, [A, DataView, Object]);
574
575 o.setUint32(0, 0xcafebabe, false);
576 assertEquals(0xcafebabe, o.getUint32(0, false));
577 assertEquals(0xbebafeca, o.getUint32(0, true));
578 assertEquals(42, o.a);
579 assertEquals(4.2, o.d);
580 assertEquals(153, o.o.foo);
581
582 var o1 = new A(buffer);
583 assertTrue(%HaveSameMap(o, o1));
584
585 gc();
586})();
587
588
589(function() {
590 var GeneratorFunction = (function*() {}).constructor;
591 class A extends GeneratorFunction {
592 constructor(...args) {
593 assertFalse(new.target === undefined);
594 super(...args);
595 // Strong functions are not extensible, so don't add fields.
596 if (args[args.length - 1].indexOf("use strong") >= 0) {
597 assertThrows(()=>{ this.a = 10; }, TypeError);
598 return;
599 }
600 this.a = 42;
601 this.d = 4.2;
602 this.o = {foo:153};
603 }
604 }
605 var sloppy_func = new A("yield 153;");
606 var strict_func = new A("'use strict'; yield 153;");
607 // Unfortunately the difference is not observable from outside.
608 assertThrows("sloppy_func.caller");
609 assertThrows("strict_f.caller");
610 assertEquals(undefined, Object.getOwnPropertyDescriptor(sloppy_func, "caller"));
611 assertEquals(undefined, Object.getOwnPropertyDescriptor(strict_func, "caller"));
612
613 function CheckFunction(func, is_strong) {
614 assertEquals("function", typeof func);
615 assertTrue(func instanceof Object);
616 assertTrue(func instanceof Function);
617 assertTrue(func instanceof GeneratorFunction);
618 assertTrue(func instanceof A);
619 checkPrototypeChain(func, [A, GeneratorFunction, Function, Object]);
620 if (!is_strong) {
621 assertEquals(42, func.a);
622 assertEquals(4.2, func.d);
623 assertEquals(153, func.o.foo);
624
625 assertTrue(undefined !== func.prototype);
626 func.prototype.bar = "func.bar";
627 var obj = func(); // Generator object.
628 assertTrue(obj instanceof Object);
629 assertTrue(obj instanceof func);
630 assertEquals("object", typeof obj);
631 assertEquals("func.bar", obj.bar);
632 delete func.prototype.bar;
633
634 assertPropertiesEqual({done: false, value: 1}, obj.next());
635 assertPropertiesEqual({done: false, value: 1}, obj.next());
636 assertPropertiesEqual({done: false, value: 2}, obj.next());
637 assertPropertiesEqual({done: false, value: 3}, obj.next());
638 assertPropertiesEqual({done: false, value: 5}, obj.next());
639 assertPropertiesEqual({done: false, value: 8}, obj.next());
640 assertPropertiesEqual({done: true, value: undefined}, obj.next());
641 }
642 }
643
644 var source = "yield 1; yield 1; yield 2; yield 3; yield 5; yield 8;";
645
646 // Sloppy generator function
647 var sloppy_func = new A(source);
648 assertTrue(undefined !== sloppy_func.prototype);
649 CheckFunction(sloppy_func, false);
650
651 var sloppy_func1 = new A("yield 312;");
652 assertTrue(%HaveSameMap(sloppy_func, sloppy_func1));
653
654 // Strict generator function
655 var strict_func = new A("'use strict'; " + source);
656 assertFalse(%HaveSameMap(strict_func, sloppy_func));
657 CheckFunction(strict_func, false);
658
659 var strict_func1 = new A("'use strict'; yield 312;");
660 assertTrue(%HaveSameMap(strict_func, strict_func1));
661
662 // Strong generator function
663 var strong_func = new A("'use strong'; " + source);
664 assertFalse(%HaveSameMap(strong_func, sloppy_func));
665 assertFalse(%HaveSameMap(strong_func, strict_func));
666 CheckFunction(strong_func, true);
667
668 var strong_func1 = new A("'use strong'; yield 312;");
669 assertTrue(%HaveSameMap(strong_func, strong_func1));
670
671 gc();
672})();
673
674
675(function() {
676 class A extends Promise {
677 constructor(...args) {
678 assertFalse(new.target === undefined);
679 super(...args);
680 this.a = 42;
681 this.d = 4.2;
682 this.o = {foo:153};
683 }
684 }
685
686 var o = new A(function(resolve, reject) {
687 resolve("ok");
688 });
689 assertTrue(o instanceof Object);
690 assertTrue(o instanceof Promise);
691 assertTrue(o instanceof A);
692 assertEquals("object", typeof o);
693 checkPrototypeChain(o, [A, Promise, Object]);
694 assertEquals(42, o.a);
695 assertEquals(4.2, o.d);
696 assertEquals(153, o.o.foo);
697 o.then(
698 function(val) { assertEquals("ok", val); },
699 function(reason) { assertUnreachable(); })
700 .catch(function(reason) { %AbortJS("catch handler called: " + reason); });
701
702 var o1 = new A(function(resolve, reject) {
703 reject("fail");
704 });
705 o1.then(
706 function(val) { assertUnreachable(); },
707 function(reason) { assertEquals("fail", reason); })
708 .catch(function(reason) { %AbortJS("catch handler called: " + reason); });
709 assertTrue(%HaveSameMap(o, o1));
710
711 gc();
712})();
713
714
715(function() {
716 class A extends Boolean {
717 constructor() {
718 assertFalse(new.target === undefined);
719 super(true);
720 this.a00 = 0
721 this.a01 = 0
722 this.a02 = 0
723 this.a03 = 0
724 this.a04 = 0
725 this.a05 = 0
726 this.a06 = 0
727 this.a07 = 0
728 this.a08 = 0
729 this.a09 = 0
730 this.a10 = 0
731 this.a11 = 0
732 this.a12 = 0
733 this.a13 = 0
734 this.a14 = 0
735 this.a15 = 0
736 this.a16 = 0
737 this.a17 = 0
738 this.a18 = 0
739 this.a19 = 0
740 }
741 }
742
743 class B extends A {
744 constructor() {
745 assertFalse(new.target === undefined);
746 super();
747 this.b00 = 0
748 this.b01 = 0
749 this.b02 = 0
750 this.b03 = 0
751 this.b04 = 0
752 this.b05 = 0
753 this.b06 = 0
754 this.b07 = 0
755 this.b08 = 0
756 this.b09 = 0
757 this.b10 = 0
758 this.b11 = 0
759 this.b12 = 0
760 this.b13 = 0
761 this.b14 = 0
762 this.b15 = 0
763 this.b16 = 0
764 this.b17 = 0
765 this.b18 = 0
766 this.b19 = 0
767 }
768 }
769
770 class C extends B {
771 constructor() {
772 assertFalse(new.target === undefined);
773 super();
774 this.c00 = 0
775 this.c01 = 0
776 this.c02 = 0
777 this.c03 = 0
778 this.c04 = 0
779 this.c05 = 0
780 this.c06 = 0
781 this.c07 = 0
782 this.c08 = 0
783 this.c09 = 0
784 this.c10 = 0
785 this.c11 = 0
786 this.c12 = 0
787 this.c13 = 0
788 this.c14 = 0
789 this.c15 = 0
790 this.c16 = 0
791 this.c17 = 0
792 this.c18 = 0
793 this.c19 = 0
794 }
795 }
796
797 var o = new C();
798 assertTrue(o instanceof Object);
799 assertTrue(o instanceof Boolean);
800 assertTrue(o instanceof A);
801 assertTrue(o instanceof B);
802 assertTrue(o instanceof C);
803 assertEquals("object", typeof o);
804 checkPrototypeChain(o, [C, B, A, Boolean, Object]);
805
806 gc();
807})();
808
809
810(function() {
811 assertThrows("class A extends undefined {}");
812 assertThrows("class B extends NaN {}");
813 assertThrows("class C extends Infinity {}");
814})();
815
816
817(function() {
818 class A extends null {}
819 assertThrows("new A");
820})();
821
822
823(function() {
824 class A extends Symbol {}
825 assertThrows("new A");
826})();
827
828
829(function() {
830 function f() {}
831
832 var p = f.prototype;
833 var p2 = {};
834 var o = Reflect.construct(
835 Number, [{valueOf() { f.prototype=p2; return 10; }}], f);
836
837 assertTrue(o.__proto__ === f.prototype);
838 assertTrue(p2 === f.prototype);
839 assertFalse(p === o.__proto__);
840 assertEquals(10, Number.prototype.valueOf.call(o));
841})();
842
843
844(function() {
845 function f() {}
846
847 var p = f.prototype;
848 var p2 = {};
849 var o = Reflect.construct(
850 String, [{toString() { f.prototype=p2; return "biep"; }}], f);
851
852 assertTrue(o.__proto__ === f.prototype);
853 assertTrue(p2 === o.__proto__);
854 assertFalse(p === o.__proto__);
855 assertEquals("biep", String.prototype.toString.call(o));
856})();
857
858
859(function() {
860 function f() {}
861
862 var p = f.prototype;
863 var p2 = {};
864 var o = Reflect.construct(
865 Date, [{valueOf() { f.prototype=p2; return 1447836899614; }}], f);
866
867 assertTrue(o.__proto__ === f.prototype);
868 assertTrue(p2 === f.prototype);
869 assertFalse(p === o.__proto__);
870 assertEquals(new Date(1447836899614).toString(),
871 Date.prototype.toString.call(o));
872})();
873
874
875(function() {
876 function f() {}
877
878 var p = f.prototype;
879 var p2 = {};
880 var o = Reflect.construct(
881 Date, [2015, {valueOf() { f.prototype=p2; return 10; }}], f);
882
883 assertTrue(o.__proto__ === f.prototype);
884 assertTrue(p2 === f.prototype);
885 assertFalse(p === o.__proto__);
886 assertEquals(new Date(2015, 10).getYear(), Date.prototype.getYear.call(o));
887 assertEquals(new Date(2015, 10).getMonth(), Date.prototype.getMonth.call(o));
888})();
889
890
891(function() {
892 function f() {}
893
894 var p = f.prototype;
895 var p2 = {};
896 var o = Reflect.construct(
897 DataView, [new ArrayBuffer(100),
898 {valueOf(){ f.prototype=p2; return 5; }}], f);
899
900 var byteOffset = Object.getOwnPropertyDescriptor(
901 DataView.prototype, "byteOffset").get;
902 var byteLength = Object.getOwnPropertyDescriptor(
903 DataView.prototype, "byteLength").get;
904
905 assertTrue(o.__proto__ === f.prototype);
906 assertTrue(p2 === f.prototype);
907 assertFalse(p === o.__proto__);
908 assertEquals(5, byteOffset.call(o));
909 assertEquals(95, byteLength.call(o));
910})();
911
912
913(function() {
914 function f() {}
915
916 var p = f.prototype;
917 var p2 = {};
918 var o = Reflect.construct(
919 DataView, [new ArrayBuffer(100),
920 30, {valueOf() { f.prototype=p2; return 5; }}], f);
921
922 var byteOffset = Object.getOwnPropertyDescriptor(
923 DataView.prototype, "byteOffset").get;
924 var byteLength = Object.getOwnPropertyDescriptor(
925 DataView.prototype, "byteLength").get;
926
927 assertTrue(o.__proto__ === f.prototype);
928 assertTrue(p2 === f.prototype);
929 assertFalse(p === o.__proto__);
930 assertEquals(30, byteOffset.call(o));
931 assertEquals(5, byteLength.call(o));
932})();
933
934
935(function() {
936 function f() {}
937
938 var p = f.prototype;
939 var p2 = {};
940 var p3 = {};
941
942 var log = [];
943
944 var pattern = {toString() {
945 log.push("tostring");
946 f.prototype = p3; return "biep" }};
947
948 Object.defineProperty(pattern, Symbol.match, {
949 get() { log.push("match"); f.prototype = p2; return false; }});
950
951 var o = Reflect.construct(RegExp, [pattern], f);
952 assertEquals(["match", "tostring"], log);
953 assertEquals(/biep/, o);
954 assertTrue(o.__proto__ === p2);
955 assertTrue(f.prototype === p3);
956})();