| Index: test/mjsunit/harmony/super.js
|
| diff --git a/test/mjsunit/harmony/super.js b/test/mjsunit/harmony/super.js
|
| index d5296424368412af771fb257327bcf63bd7a7801..988cef22e2fdc959d2ae7de0878a48d748d44ac6 100644
|
| --- a/test/mjsunit/harmony/super.js
|
| +++ b/test/mjsunit/harmony/super.js
|
| @@ -595,7 +595,7 @@
|
| setCalled = 0;
|
| getCalled = 0;
|
| assertEquals('object', typeof this);
|
| - assertTrue(this instanceof Number)
|
| + assertInstanceof(this, Number)
|
| assertEquals(42, this.valueOf());
|
| assertEquals(1, super.x);
|
| assertEquals(1, getCalled);
|
| @@ -635,7 +635,7 @@
|
| try {
|
| super.newProperty = 15;
|
| } catch (e) { ex = e; }
|
| - assertTrue(ex instanceof TypeError);
|
| + assertInstanceof(ex, TypeError);
|
| }
|
| }
|
|
|
| @@ -654,7 +654,7 @@
|
| super.toString();
|
| } catch(e) { ex = e; }
|
|
|
| - assertTrue(ex instanceof TypeError);
|
| + assertInstanceof(ex, TypeError);
|
| }
|
| };
|
|
|
| @@ -689,7 +689,7 @@
|
| setCalled = 0;
|
| getCalled = 0;
|
| assertEquals('object', typeof this);
|
| - assertTrue(this instanceof Number)
|
| + assertInstanceof(this, Number)
|
| assertEquals(42, this.valueOf());
|
| assertEquals(1, super[x]);
|
| assertEquals(1, getCalled);
|
| @@ -729,7 +729,7 @@
|
| try {
|
| super[newProperty] = 15;
|
| } catch (e) { ex = e; }
|
| - assertTrue(ex instanceof TypeError);
|
| + assertInstanceof(ex,TypeError);
|
| }
|
| };
|
|
|
| @@ -748,7 +748,7 @@
|
| super[toString]();
|
| } catch(e) { ex = e; }
|
|
|
| - assertTrue(ex instanceof TypeError);
|
| + assertInstanceof(ex, TypeError);
|
| }
|
| };
|
| DerivedFromString.prototype.f.call(42);
|
| @@ -784,7 +784,7 @@
|
| setCalled = 0;
|
| getCalled = 0;
|
| assertEquals('object', typeof this);
|
| - assertTrue(this instanceof Number)
|
| + assertInstanceof(this, Number)
|
| assertEquals(42, this.valueOf());
|
| assertEquals(1, super[x]);
|
| assertEquals(1, getCalled);
|
| @@ -824,7 +824,7 @@
|
| try {
|
| super[newProperty] = 15;
|
| } catch (e) { ex = e; }
|
| - assertTrue(ex instanceof TypeError);
|
| + assertInstanceof(ex, TypeError);
|
| }
|
| };
|
|
|
| @@ -849,13 +849,13 @@
|
| try {
|
| super[5] = 'q';
|
| } catch(e) { ex = e; }
|
| - assertTrue(ex instanceof TypeError);
|
| + assertInstanceof(ex, TypeError);
|
|
|
| ex = null;
|
| try {
|
| super[1024] = 'q';
|
| } catch(e) { ex = e; }
|
| - assertTrue(ex instanceof TypeError);
|
| + assertInstanceof(ex, TypeError);
|
| }
|
| };
|
|
|
| @@ -963,8 +963,7 @@
|
| }());
|
|
|
|
|
| -(function TestSetterCreatingOwnProperties() {
|
| - var setterCalled;
|
| +(function TestSetterCreatingOwnPropertiesReconfigurable() {
|
| function Base() {}
|
| function Derived() {}
|
| Derived.prototype = {
|
| @@ -972,44 +971,172 @@
|
| mSloppy() {
|
| assertEquals(42, this.ownReadOnly);
|
| super.ownReadOnly = 55;
|
| - assertEquals(42, this.ownReadOnly);
|
| + assertEquals(55, this.ownReadOnly);
|
| + var descr = Object.getOwnPropertyDescriptor(this, 'ownReadOnly');
|
| + assertEquals(55, descr.value);
|
| + assertTrue(descr.configurable);
|
| + assertFalse(descr.enumerable);
|
| + assertFalse(descr.writable);
|
| + assertFalse(Base.prototype.hasOwnProperty('ownReadOnly'));
|
|
|
| assertEquals(15, this.ownReadonlyAccessor);
|
| - super.ownReadonlyAccessor = 55;
|
| + super.ownReadonlyAccessor = 25;
|
| + assertEquals(25, this.ownReadonlyAccessor);
|
| + var descr = Object.getOwnPropertyDescriptor(this, 'ownReadonlyAccessor');
|
| + assertEquals(25, descr.value);
|
| + assertTrue(descr.configurable);
|
| + assertFalse(descr.enumerable);
|
| + assertTrue(descr.writable);
|
| + assertFalse(Base.prototype.hasOwnProperty('ownReadonlyAccessor'));
|
| +
|
| + super.ownSetter = 35;
|
| + assertEquals(35, this.ownSetter);
|
| + var descr = Object.getOwnPropertyDescriptor(this, 'ownSetter');
|
| + assertEquals(35, descr.value);
|
| + assertTrue(descr.configurable);
|
| + assertFalse(descr.enumerable);
|
| + assertTrue(descr.writable);
|
| + assertFalse(Base.prototype.hasOwnProperty('ownSetter'));
|
| + },
|
| + mStrict() {
|
| + 'use strict';
|
| + assertEquals(42, this.ownReadOnly);
|
| + super.ownReadOnly = 55;
|
| + assertEquals(55, this.ownReadOnly);
|
| + var descr = Object.getOwnPropertyDescriptor(this, 'ownReadOnly');
|
| + assertEquals(55, descr.value);
|
| + assertTrue(descr.configurable);
|
| + assertFalse(descr.enumerable);
|
| + assertFalse(descr.writable);
|
| + assertFalse(Base.prototype.hasOwnProperty('ownReadOnly'));
|
| +
|
| assertEquals(15, this.ownReadonlyAccessor);
|
| + super.ownReadonlyAccessor = 25;
|
| + assertEquals(25, this.ownReadonlyAccessor);
|
| + var descr = Object.getOwnPropertyDescriptor(this, 'ownReadonlyAccessor');
|
| + assertEquals(25, descr.value);
|
| + assertTrue(descr.configurable);
|
| + assertFalse(descr.enumerable);
|
| + assertTrue(descr.writable);
|
| + assertFalse(Base.prototype.hasOwnProperty('ownReadonlyAccessor'));
|
| +
|
| + super.ownSetter = 35;
|
| + assertEquals(35, this.ownSetter);
|
| + var descr = Object.getOwnPropertyDescriptor(this, 'ownSetter');
|
| + assertEquals(35, descr.value);
|
| + assertTrue(descr.configurable);
|
| + assertFalse(descr.enumerable);
|
| + assertTrue(descr.writable);
|
| + assertFalse(Base.prototype.hasOwnProperty('ownSetter'));
|
| + },
|
| + };
|
| +
|
| + var d = new Derived();
|
| + Object.defineProperty(d, 'ownReadOnly', {
|
| + value: 42,
|
| + writable: false,
|
| + configurable: true
|
| + });
|
| + Object.defineProperty(d, 'ownSetter', {
|
| + set: function() { assertUnreachable(); },
|
| + configurable: true
|
| + });
|
| + Object.defineProperty(d, 'ownReadonlyAccessor', {
|
| + get: function() { return 15; },
|
| + configurable: true
|
| + });
|
|
|
| - setterCalled = 0;
|
| - super.ownSetter = 42;
|
| - assertEquals(1, setterCalled);
|
| + d.mSloppy();
|
| +
|
| + var d = new Derived();
|
| + Object.defineProperty(d, 'ownReadOnly', {
|
| + value: 42,
|
| + writable: false,
|
| + configurable: true
|
| + });
|
| + Object.defineProperty(d, 'ownSetter', {
|
| + set: function() { assertUnreachable(); },
|
| + configurable: true
|
| + });
|
| + Object.defineProperty(d, 'ownReadonlyAccessor', {
|
| + get: function() { return 15; },
|
| + configurable: true
|
| + });
|
| + d.mStrict();
|
| +}());
|
| +
|
| +
|
| +(function TestSetterCreatingOwnPropertiesNonConfigurable() {
|
| + function Base() {}
|
| + function Derived() {}
|
| + Derived.prototype = {
|
| + __proto__: Base.prototype,
|
| + mSloppy() {
|
| + assertEquals(42, this.ownReadOnly);
|
| + super.ownReadOnly = 55;
|
| + assertEquals(42, this.ownReadOnly);
|
| + var descr = Object.getOwnPropertyDescriptor(this, 'ownReadOnly');
|
| + assertEquals(42, descr.value);
|
| + assertFalse(descr.configurable);
|
| + assertFalse(descr.enumerable);
|
| + assertFalse(descr.writable);
|
| + assertFalse(Base.prototype.hasOwnProperty('ownReadOnly'));
|
| +
|
| + assertEquals(15, this.ownReadonlyAccessor);
|
| + super.ownReadonlyAccessor = 25;
|
| + assertEquals(15, this.ownReadonlyAccessor);
|
| + var descr = Object.getOwnPropertyDescriptor(this, 'ownReadonlyAccessor');
|
| + assertFalse(descr.configurable);
|
| + assertFalse(descr.enumerable);
|
| + assertFalse(Base.prototype.hasOwnProperty('ownReadonlyAccessor'));
|
| +
|
| + super.ownSetter = 35;
|
| + var descr = Object.getOwnPropertyDescriptor(this, 'ownSetter');
|
| + assertFalse(descr.configurable);
|
| + assertFalse(descr.enumerable);
|
| + assertFalse(Base.prototype.hasOwnProperty('ownSetter'));
|
| },
|
| mStrict() {
|
| 'use strict';
|
| - assertEquals(42, this.ownReadOnly);
|
| var ex;
|
| + assertEquals(42, this.ownReadOnly);
|
| try {
|
| super.ownReadOnly = 55;
|
| - } catch(e) { ex = e; }
|
| - assertTrue(ex instanceof TypeError);
|
| + } catch (e) {
|
| + ex = e;
|
| + }
|
| + assertInstanceof(ex, TypeError);
|
| + assertEquals(
|
| + "Cannot assign to read only property 'ownReadOnly' of #<Base>",
|
| + ex.message);
|
| assertEquals(42, this.ownReadOnly);
|
|
|
| - assertEquals(15, this.ownReadonlyAccessor);
|
| ex = null;
|
| + assertEquals(15, this.ownReadonlyAccessor);
|
| try {
|
| - super.ownReadonlyAccessor = 55;
|
| - } catch(e) { ex = e; }
|
| - assertTrue(ex instanceof TypeError);
|
| + super.ownReadonlyAccessor = 25;
|
| + } catch (e) {
|
| + ex = e;
|
| + }
|
| + assertInstanceof(ex, TypeError);
|
| + assertEquals('Cannot redefine property: ownReadonlyAccessor', ex.message);
|
| assertEquals(15, this.ownReadonlyAccessor);
|
|
|
| - setterCalled = 0;
|
| - super.ownSetter = 42;
|
| - assertEquals(1, setterCalled);
|
| + ex = null;
|
| + try {
|
| + super.ownSetter = 35;
|
| + } catch (e) {
|
| + ex = e;
|
| + }
|
| + assertInstanceof(ex, TypeError);
|
| + assertEquals('Cannot redefine property: ownSetter', ex.message);
|
| }
|
| };
|
|
|
| var d = new Derived();
|
| Object.defineProperty(d, 'ownReadOnly', { value : 42, writable : false });
|
| Object.defineProperty(d, 'ownSetter',
|
| - { set : function() { setterCalled++; } });
|
| + { set : function() { assertUnreachable(); } });
|
| Object.defineProperty(d, 'ownReadonlyAccessor',
|
| { get : function() { return 15; }});
|
| d.mSloppy();
|
| @@ -1076,11 +1203,8 @@
|
| }());
|
|
|
|
|
| -(function TestKeyedSetterCreatingOwnProperties() {
|
| - var ownReadOnly = 'ownReadOnly';
|
| - var ownReadonlyAccessor = 'ownReadonlyAccessor';
|
| - var ownSetter = 'ownSetter';
|
| - var setterCalled;
|
| +function TestKeyedSetterCreatingOwnPropertiesReconfigurable(ownReadOnly,
|
| + ownReadonlyAccessor, ownSetter) {
|
| function Base() {}
|
| function Derived() {}
|
| Derived.prototype = {
|
| @@ -1088,56 +1212,107 @@
|
| mSloppy() {
|
| assertEquals(42, this[ownReadOnly]);
|
| super[ownReadOnly] = 55;
|
| - assertEquals(42, this[ownReadOnly]);
|
| + assertEquals(55, this[ownReadOnly]);
|
| + var descr = Object.getOwnPropertyDescriptor(this, ownReadOnly);
|
| + assertEquals(55, descr.value);
|
| + assertTrue(descr.configurable);
|
| + assertFalse(descr.enumerable);
|
| + assertFalse(descr.writable);
|
| + assertFalse(Base.prototype.hasOwnProperty(ownReadOnly));
|
|
|
| assertEquals(15, this[ownReadonlyAccessor]);
|
| - super[ownReadonlyAccessor] = 55;
|
| - assertEquals(15, this[ownReadonlyAccessor]);
|
| -
|
| - setterCalled = 0;
|
| - super[ownSetter] = 42;
|
| - assertEquals(1, setterCalled);
|
| + super[ownReadonlyAccessor] = 25;
|
| + assertEquals(25, this[ownReadonlyAccessor]);
|
| + var descr = Object.getOwnPropertyDescriptor(this, ownReadonlyAccessor);
|
| + assertEquals(25, descr.value);
|
| + assertTrue(descr.configurable);
|
| + assertFalse(descr.enumerable);
|
| + assertTrue(descr.writable);
|
| + assertFalse(Base.prototype.hasOwnProperty(ownReadonlyAccessor));
|
| +
|
| + super[ownSetter] = 35;
|
| + assertEquals(35, this[ownSetter]);
|
| + var descr = Object.getOwnPropertyDescriptor(this, ownSetter);
|
| + assertEquals(35, descr.value);
|
| + assertTrue(descr.configurable);
|
| + assertFalse(descr.enumerable);
|
| + assertTrue(descr.writable);
|
| + assertFalse(Base.prototype.hasOwnProperty(ownSetter));
|
| },
|
| mStrict() {
|
| 'use strict';
|
| assertEquals(42, this[ownReadOnly]);
|
| - var ex;
|
| - try {
|
| - super[ownReadOnly] = 55;
|
| - } catch(e) { ex = e; }
|
| - assertTrue(ex instanceof TypeError);
|
| - assertEquals(42, this[ownReadOnly]);
|
| + super[ownReadOnly] = 55;
|
| + assertEquals(55, this[ownReadOnly]);
|
| + var descr = Object.getOwnPropertyDescriptor(this, ownReadOnly);
|
| + assertEquals(55, descr.value);
|
| + assertTrue(descr.configurable);
|
| + assertFalse(descr.enumerable);
|
| + assertFalse(descr.writable);
|
| + assertFalse(Base.prototype.hasOwnProperty(ownReadOnly));
|
|
|
| assertEquals(15, this[ownReadonlyAccessor]);
|
| - ex = null;
|
| - try {
|
| - super[ownReadonlyAccessor] = 55;
|
| - } catch(e) { ex = e; }
|
| - assertTrue(ex instanceof TypeError);
|
| - assertEquals(15, this[ownReadonlyAccessor]);
|
| -
|
| - setterCalled = 0;
|
| - super[ownSetter] = 42;
|
| - assertEquals(1, setterCalled);
|
| - }
|
| + super[ownReadonlyAccessor] = 25;
|
| + assertEquals(25, this[ownReadonlyAccessor]);
|
| + var descr = Object.getOwnPropertyDescriptor(this, ownReadonlyAccessor);
|
| + assertEquals(25, descr.value);
|
| + assertTrue(descr.configurable);
|
| + assertFalse(descr.enumerable);
|
| + assertTrue(descr.writable);
|
| + assertFalse(Base.prototype.hasOwnProperty(ownReadonlyAccessor));
|
| +
|
| + super[ownSetter] = 35;
|
| + assertEquals(35, this[ownSetter]);
|
| + var descr = Object.getOwnPropertyDescriptor(this, ownSetter);
|
| + assertEquals(35, descr.value);
|
| + assertTrue(descr.configurable);
|
| + assertFalse(descr.enumerable);
|
| + assertTrue(descr.writable);
|
| + assertFalse(Base.prototype.hasOwnProperty(ownSetter));
|
| + },
|
| };
|
|
|
| var d = new Derived();
|
| - Object.defineProperty(d, 'ownReadOnly', { value : 42, writable : false });
|
| - Object.defineProperty(d, 'ownSetter',
|
| - { set : function() { setterCalled++; } });
|
| - Object.defineProperty(d, 'ownReadonlyAccessor',
|
| - { get : function() { return 15; }});
|
| + Object.defineProperty(d, ownReadOnly, {
|
| + value: 42,
|
| + writable: false,
|
| + configurable: true
|
| + });
|
| + Object.defineProperty(d, ownSetter, {
|
| + set: function() { assertUnreachable(); },
|
| + configurable: true
|
| + });
|
| + Object.defineProperty(d, ownReadonlyAccessor, {
|
| + get: function() { return 15; },
|
| + configurable: true
|
| + });
|
| +
|
| d.mSloppy();
|
| +
|
| + var d = new Derived();
|
| + Object.defineProperty(d, ownReadOnly, {
|
| + value: 42,
|
| + writable: false,
|
| + configurable: true
|
| + });
|
| + Object.defineProperty(d, ownSetter, {
|
| + set: function() { assertUnreachable(); },
|
| + configurable: true
|
| + });
|
| + Object.defineProperty(d, ownReadonlyAccessor, {
|
| + get: function() { return 15; },
|
| + configurable: true
|
| + });
|
| d.mStrict();
|
| -}());
|
| +}
|
| +TestKeyedSetterCreatingOwnPropertiesReconfigurable('ownReadOnly',
|
| + 'ownReadonlyAccessor',
|
| + 'ownSetter');
|
| +TestKeyedSetterCreatingOwnPropertiesReconfigurable(42, 43, 44);
|
|
|
|
|
| -(function TestKeyedNumericSetterCreatingOwnProperties() {
|
| - var ownReadOnly = 42;
|
| - var ownReadonlyAccessor = 43;
|
| - var ownSetter = 44;
|
| - var setterCalled;
|
| +function TestKeyedSetterCreatingOwnPropertiesNonConfigurable(
|
| + ownReadOnly, ownReadonlyAccessor, ownSetter) {
|
| function Base() {}
|
| function Derived() {}
|
| Derived.prototype = {
|
| @@ -1146,48 +1321,78 @@
|
| assertEquals(42, this[ownReadOnly]);
|
| super[ownReadOnly] = 55;
|
| assertEquals(42, this[ownReadOnly]);
|
| + var descr = Object.getOwnPropertyDescriptor(this, ownReadOnly);
|
| + assertEquals(42, descr.value);
|
| + assertFalse(descr.configurable);
|
| + assertFalse(descr.enumerable);
|
| + assertFalse(descr.writable);
|
| + assertFalse(Base.prototype.hasOwnProperty(ownReadOnly));
|
|
|
| assertEquals(15, this[ownReadonlyAccessor]);
|
| - super[ownReadonlyAccessor] = 55;
|
| + super[ownReadonlyAccessor] = 25;
|
| assertEquals(15, this[ownReadonlyAccessor]);
|
| -
|
| - setterCalled = 0;
|
| - super[ownSetter] = 42;
|
| - assertEquals(1, setterCalled);
|
| + var descr = Object.getOwnPropertyDescriptor(this, ownReadonlyAccessor);
|
| + assertFalse(descr.configurable);
|
| + assertFalse(descr.enumerable);
|
| + assertFalse(Base.prototype.hasOwnProperty(ownReadonlyAccessor));
|
| +
|
| + super[ownSetter] = 35;
|
| + var descr = Object.getOwnPropertyDescriptor(this, ownSetter);
|
| + assertFalse(descr.configurable);
|
| + assertFalse(descr.enumerable);
|
| + assertFalse(Base.prototype.hasOwnProperty(ownSetter));
|
| },
|
| mStrict() {
|
| 'use strict';
|
| - assertEquals(42, this[ownReadOnly]);
|
| var ex;
|
| + assertEquals(42, this[ownReadOnly]);
|
| try {
|
| super[ownReadOnly] = 55;
|
| - } catch(e) { ex = e; }
|
| - assertTrue(ex instanceof TypeError);
|
| + } catch (e) {
|
| + ex = e;
|
| + }
|
| + assertInstanceof(ex, TypeError);
|
| + assertEquals(
|
| + "Cannot assign to read only property '" + ownReadOnly +
|
| + "' of #<Base>",
|
| + ex.message);
|
| assertEquals(42, this[ownReadOnly]);
|
|
|
| - assertEquals(15, this[ownReadonlyAccessor]);
|
| ex = null;
|
| + assertEquals(15, this[ownReadonlyAccessor]);
|
| try {
|
| - super[ownReadonlyAccessor] = 55;
|
| - } catch(e) { ex = e; }
|
| - assertTrue(ex instanceof TypeError);
|
| + super[ownReadonlyAccessor] = 25;
|
| + } catch (e) {
|
| + ex = e;
|
| + }
|
| + assertInstanceof(ex, TypeError);
|
| + assertEquals('Cannot redefine property: ' + ownReadonlyAccessor,
|
| + ex.message);
|
| assertEquals(15, this[ownReadonlyAccessor]);
|
|
|
| - setterCalled = 0;
|
| - super[ownSetter] = 42;
|
| - assertEquals(1, setterCalled);
|
| + ex = null;
|
| + try {
|
| + super[ownSetter] = 35;
|
| + } catch (e) {
|
| + ex = e;
|
| + }
|
| + assertInstanceof(ex, TypeError);
|
| + assertEquals('Cannot redefine property: ' + ownSetter, ex.message);
|
| }
|
| - }
|
| + };
|
|
|
| var d = new Derived();
|
| Object.defineProperty(d, ownReadOnly, { value : 42, writable : false });
|
| Object.defineProperty(d, ownSetter,
|
| - { set : function() { setterCalled++; } });
|
| + { set : function() { assertUnreachable(); } });
|
| Object.defineProperty(d, ownReadonlyAccessor,
|
| { get : function() { return 15; }});
|
| d.mSloppy();
|
| d.mStrict();
|
| -}());
|
| +}
|
| +TestKeyedSetterCreatingOwnPropertiesNonConfigurable('ownReadOnly',
|
| + 'ownReadonlyAccessor', 'ownSetter');
|
| +TestKeyedSetterCreatingOwnPropertiesNonConfigurable(42, 43, 44);
|
|
|
|
|
| (function TestSetterNoProtoWalk() {
|
| @@ -1684,7 +1889,7 @@
|
| assertEquals(27, this.x);
|
| var ex = null;
|
| try { super.x = 10; } catch(e) { ex = e; }
|
| - assertTrue(ex instanceof TypeError);
|
| + assertInstanceof(ex, TypeError);
|
| assertEquals(27, super.x);
|
| assertEquals(27, this.x);
|
| }
|
| @@ -1716,7 +1921,7 @@
|
| assertEquals(27, this[x]);
|
| var ex = null;
|
| try { super[x] = 10; } catch(e) { ex = e; }
|
| - assertTrue(ex instanceof TypeError);
|
| + assertInstanceof(ex, TypeError);
|
| assertEquals(27, super[x]);
|
| assertEquals(27, this[x]);
|
| }
|
| @@ -1748,7 +1953,7 @@
|
| assertEquals(27, this[x]);
|
| var ex = null;
|
| try { super[x] = 10; } catch(e) { ex = e; }
|
| - assertTrue(ex instanceof TypeError);
|
| + assertInstanceof(ex, TypeError);
|
| assertEquals(27, super[x]);
|
| assertEquals(27, this[x]);
|
| }
|
| @@ -1845,7 +2050,7 @@
|
| var f = new F(42);
|
|
|
| // TODO(dslomov,arv): Fix this. BUG=v8:3886.
|
| - assertTrue(f instanceof Number);
|
| + assertInstanceof(f, Number);
|
| }());
|
|
|
| (function TestSuperCallErrorCases() {
|
|
|