Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1471)

Unified Diff: test/mjsunit/es6/classes-subclass-builtins.js

Issue 1510753005: Fix Function subclassing. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Adressing comments Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/transitions-inl.h ('k') | test/mjsunit/harmony/reflect-construct.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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();
})();
« no previous file with comments | « src/transitions-inl.h ('k') | test/mjsunit/harmony/reflect-construct.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698