| Index: test/mjsunit/es6/classes-subclass-builtins.js
|
| diff --git a/test/mjsunit/es6/classes-subclass-builtins.js b/test/mjsunit/es6/classes-subclass-builtins.js
|
| index 5ecca0ed986f4824573a11f6044007ea4b1e5dc3..e4d44be06adbc3695188430be6eb74674a023ec6 100644
|
| --- a/test/mjsunit/es6/classes-subclass-builtins.js
|
| +++ b/test/mjsunit/es6/classes-subclass-builtins.js
|
| @@ -3,7 +3,7 @@
|
| // found in the LICENSE file.
|
|
|
| // Flags: --allow-natives-syntax --harmony-reflect --harmony-regexp-subclass
|
| -// Flags: --expose-gc
|
| +// Flags: --expose-gc --strong-mode
|
|
|
| "use strict";
|
|
|
| @@ -78,26 +78,71 @@ function checkPrototypeChain(object, constructors) {
|
| constructor(...args) {
|
| assertFalse(new.target === undefined);
|
| super(...args);
|
| + // Strong functions are not extensible, so don't add fields.
|
| + if (args[args.length - 1].indexOf("use strong") >= 0) {
|
| + assertThrows(()=>{ this.a = 10; }, TypeError);
|
| + return;
|
| + }
|
| this.a = 42;
|
| this.d = 4.2;
|
| this.o = {foo:153};
|
| }
|
| }
|
| + var sloppy_func = new A("");
|
| + var strict_func = new A("'use strict';");
|
| + assertNull(sloppy_func.caller);
|
| + assertThrows("strict_f.caller");
|
| + assertNull(Object.getOwnPropertyDescriptor(sloppy_func, "caller").value);
|
| + assertEquals(undefined, Object.getOwnPropertyDescriptor(strict_func, "caller"));
|
| +
|
| + function CheckFunction(func, is_strong) {
|
| + assertEquals("function", typeof func);
|
| + assertTrue(func instanceof Object);
|
| + assertTrue(func instanceof Function);
|
| + assertTrue(func instanceof A);
|
| + checkPrototypeChain(func, [A, Function, Object]);
|
| + if (!is_strong) {
|
| + assertEquals(42, func.a);
|
| + assertEquals(4.2, func.d);
|
| + assertEquals(153, func.o.foo);
|
| + assertTrue(undefined !== func.prototype);
|
| + func.prototype.bar = "func.bar";
|
| + var obj = new func();
|
| + assertTrue(obj instanceof Object);
|
| + assertTrue(obj instanceof func);
|
| + assertEquals("object", typeof obj);
|
| + assertEquals(113, obj.foo);
|
| + assertEquals("func.bar", obj.bar);
|
| + delete func.prototype.bar;
|
| + }
|
| + }
|
|
|
| - var o = new A("this.foo = 113;");
|
| - assertTrue(o instanceof Object);
|
| - assertTrue(o instanceof Function);
|
| - assertTrue(o instanceof A);
|
| - assertEquals("function", typeof o);
|
| - checkPrototypeChain(o, [A, Function, Object]);
|
| - assertEquals(42, o.a);
|
| - assertEquals(4.2, o.d);
|
| - assertEquals(153, o.o.foo);
|
| - var oo = new o();
|
| - assertEquals(113, oo.foo);
|
| + var source = "this.foo = 113;";
|
|
|
| - var o1 = new A("return 312;");
|
| - assertTrue(%HaveSameMap(o, o1));
|
| + // Sloppy function
|
| + var sloppy_func = new A(source);
|
| + assertTrue(undefined !== sloppy_func.prototype);
|
| + CheckFunction(sloppy_func, false);
|
| +
|
| + var sloppy_func1 = new A("return 312;");
|
| + assertTrue(%HaveSameMap(sloppy_func, sloppy_func1));
|
| +
|
| + // Strict function
|
| + var strict_func = new A("'use strict'; " + source);
|
| + assertFalse(%HaveSameMap(strict_func, sloppy_func));
|
| + CheckFunction(strict_func, false);
|
| +
|
| + var strict_func1 = new A("'use strict'; return 312;");
|
| + assertTrue(%HaveSameMap(strict_func, strict_func1));
|
| +
|
| + // Strong function
|
| + var strong_func = new A("'use strong'; " + source);
|
| + assertFalse(%HaveSameMap(strong_func, sloppy_func));
|
| + assertFalse(%HaveSameMap(strong_func, strict_func));
|
| + CheckFunction(strong_func, true);
|
| +
|
| + var strong_func1 = new A("'use strong'; return 312;");
|
| + assertTrue(%HaveSameMap(strong_func, strong_func1));
|
|
|
| gc();
|
| })();
|
| @@ -505,42 +550,86 @@ function TestMapSetSubclassing(container, is_map) {
|
|
|
|
|
| (function() {
|
| - // TODO(ishell): remove once GeneratorFunction is available.
|
| - var GeneratorFunction = (function*() {}).__proto__.constructor;
|
| + var GeneratorFunction = (function*() {}).constructor;
|
| class A extends GeneratorFunction {
|
| constructor(...args) {
|
| assertFalse(new.target === undefined);
|
| super(...args);
|
| + // Strong functions are not extensible, so don't add fields.
|
| + if (args[args.length - 1].indexOf("use strong") >= 0) {
|
| + assertThrows(()=>{ this.a = 10; }, TypeError);
|
| + return;
|
| + }
|
| this.a = 42;
|
| this.d = 4.2;
|
| this.o = {foo:153};
|
| }
|
| }
|
| - var generator_func = new A("var index = 0; while (index < 5) { yield ++index; }");
|
| - assertTrue(generator_func instanceof Object);
|
| - assertTrue(generator_func instanceof Function);
|
| - assertTrue(generator_func instanceof GeneratorFunction);
|
| - assertTrue(generator_func instanceof A);
|
| - assertEquals("function", typeof generator_func);
|
| - checkPrototypeChain(generator_func, [A, GeneratorFunction, Function, Object]);
|
| - assertEquals(42, generator_func.a);
|
| - assertEquals(4.2, generator_func.d);
|
| - assertEquals(153, generator_func.o.foo);
|
| -
|
| - var o = new generator_func();
|
| - assertTrue(o instanceof Object);
|
| - assertTrue(o instanceof generator_func);
|
| - assertEquals("object", typeof o);
|
| + var sloppy_func = new A("yield 153;");
|
| + var strict_func = new A("'use strict'; yield 153;");
|
| + // Unfortunately the difference is not observable from outside.
|
| + assertThrows("sloppy_func.caller");
|
| + assertThrows("strict_f.caller");
|
| + assertEquals(undefined, Object.getOwnPropertyDescriptor(sloppy_func, "caller"));
|
| + assertEquals(undefined, Object.getOwnPropertyDescriptor(strict_func, "caller"));
|
| +
|
| + function CheckFunction(func, is_strong) {
|
| + assertEquals("function", typeof func);
|
| + assertTrue(func instanceof Object);
|
| + assertTrue(func instanceof Function);
|
| + assertTrue(func instanceof GeneratorFunction);
|
| + assertTrue(func instanceof A);
|
| + checkPrototypeChain(func, [A, GeneratorFunction, Function, Object]);
|
| + if (!is_strong) {
|
| + assertEquals(42, func.a);
|
| + assertEquals(4.2, func.d);
|
| + assertEquals(153, func.o.foo);
|
| +
|
| + assertTrue(undefined !== func.prototype);
|
| + func.prototype.bar = "func.bar";
|
| + var obj = func(); // Generator object.
|
| + assertTrue(obj instanceof Object);
|
| + assertTrue(obj instanceof func);
|
| + assertEquals("object", typeof obj);
|
| + assertEquals("func.bar", obj.bar);
|
| + delete func.prototype.bar;
|
| +
|
| + assertPropertiesEqual({done: false, value: 1}, obj.next());
|
| + assertPropertiesEqual({done: false, value: 1}, obj.next());
|
| + assertPropertiesEqual({done: false, value: 2}, obj.next());
|
| + assertPropertiesEqual({done: false, value: 3}, obj.next());
|
| + assertPropertiesEqual({done: false, value: 5}, obj.next());
|
| + assertPropertiesEqual({done: false, value: 8}, obj.next());
|
| + assertPropertiesEqual({done: true, value: undefined}, obj.next());
|
| + }
|
| + }
|
| +
|
| + var source = "yield 1; yield 1; yield 2; yield 3; yield 5; yield 8;";
|
| +
|
| + // Sloppy generator function
|
| + var sloppy_func = new A(source);
|
| + assertTrue(undefined !== sloppy_func.prototype);
|
| + CheckFunction(sloppy_func, false);
|
| +
|
| + var sloppy_func1 = new A("yield 312;");
|
| + assertTrue(%HaveSameMap(sloppy_func, sloppy_func1));
|
| +
|
| + // Strict generator function
|
| + var strict_func = new A("'use strict'; " + source);
|
| + assertFalse(%HaveSameMap(strict_func, sloppy_func));
|
| + CheckFunction(strict_func, false);
|
| +
|
| + var strict_func1 = new A("'use strict'; yield 312;");
|
| + assertTrue(%HaveSameMap(strict_func, strict_func1));
|
|
|
| - assertPropertiesEqual({done: false, value: 1}, o.next());
|
| - assertPropertiesEqual({done: false, value: 2}, o.next());
|
| - assertPropertiesEqual({done: false, value: 3}, o.next());
|
| - assertPropertiesEqual({done: false, value: 4}, o.next());
|
| - assertPropertiesEqual({done: false, value: 5}, o.next());
|
| - assertPropertiesEqual({done: true, value: undefined}, o.next());
|
| + // Strong generator function
|
| + var strong_func = new A("'use strong'; " + source);
|
| + assertFalse(%HaveSameMap(strong_func, sloppy_func));
|
| + assertFalse(%HaveSameMap(strong_func, strict_func));
|
| + CheckFunction(strong_func, true);
|
|
|
| - var generator_func1 = new A("return 0;");
|
| - assertTrue(%HaveSameMap(generator_func, generator_func1));
|
| + var strong_func1 = new A("'use strong'; yield 312;");
|
| + assertTrue(%HaveSameMap(strong_func, strong_func1));
|
|
|
| gc();
|
| })();
|
|
|