| // Copyright 2014 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Flags: --allow-natives-syntax |
| |
| |
| function ID(x) { |
| return x; |
| } |
| |
| function assertMethodDescriptor(object, name) { |
| var descr = Object.getOwnPropertyDescriptor(object, name); |
| assertTrue(descr.configurable); |
| assertFalse(descr.enumerable); |
| assertTrue(descr.writable); |
| assertEquals('function', typeof descr.value); |
| assertFalse('prototype' in descr.value); |
| assertEquals("" + name, descr.value.name); |
| } |
| |
| |
| function assertGetterDescriptor(object, name) { |
| var descr = Object.getOwnPropertyDescriptor(object, name); |
| assertTrue(descr.configurable); |
| assertFalse(descr.enumerable); |
| assertEquals('function', typeof descr.get); |
| assertFalse('prototype' in descr.get); |
| assertEquals(undefined, descr.set); |
| assertEquals("get " + name, descr.get.name); |
| } |
| |
| |
| function assertSetterDescriptor(object, name) { |
| var descr = Object.getOwnPropertyDescriptor(object, name); |
| assertTrue(descr.configurable); |
| assertFalse(descr.enumerable); |
| assertEquals(undefined, descr.get); |
| assertEquals('function', typeof descr.set); |
| assertFalse('prototype' in descr.set); |
| assertEquals("set " + name, descr.set.name); |
| } |
| |
| |
| function assertAccessorDescriptor(object, name) { |
| var descr = Object.getOwnPropertyDescriptor(object, name); |
| assertTrue(descr.configurable); |
| assertFalse(descr.enumerable); |
| assertEquals('function', typeof descr.get); |
| assertEquals('function', typeof descr.set); |
| assertFalse('prototype' in descr.get); |
| assertFalse('prototype' in descr.set); |
| assertEquals("get " + name, descr.get.name); |
| assertEquals("set " + name, descr.set.name); |
| } |
| |
| |
| |
| (function TestComputedMethodSuper() { |
| class Base { |
| m() { |
| return ' base m'; |
| } |
| } |
| class Derived extends Base { |
| ['a']() { return 'a' + super.m(); } |
| [ID('b')]() { return 'b' + super.m(); } |
| [0]() { return '0' + super.m(); } |
| [ID(1)]() { return '1' + super.m(); } |
| [ID(2147483649)]() { return '2147483649' + super.m(); } |
| [ID(4294967294)]() { return '4294967294' + super.m(); } |
| [ID(4294967295)]() { return '4294967295' + super.m(); } |
| } |
| |
| assertSame(Derived.prototype, Derived.prototype.a[%HomeObjectSymbol()]); |
| |
| assertMethodDescriptor(Derived.prototype, "a"); |
| assertMethodDescriptor(Derived.prototype, "b"); |
| assertMethodDescriptor(Derived.prototype, 0); |
| assertMethodDescriptor(Derived.prototype, 1); |
| assertMethodDescriptor(Derived.prototype, 2147483649); |
| assertMethodDescriptor(Derived.prototype, 4294967294); |
| assertMethodDescriptor(Derived.prototype, 4294967295); |
| |
| assertEquals('a base m', new Derived().a()); |
| assertEquals('b base m', new Derived().b()); |
| assertEquals('0 base m', new Derived()[0]()); |
| assertEquals('1 base m', new Derived()[1]()); |
| assertEquals('2147483649 base m', new Derived()[2147483649]()); |
| assertEquals('4294967294 base m', new Derived()[4294967294]()); |
| assertEquals('4294967295 base m', new Derived()[4294967295]()); |
| })(); |
| |
| |
| (function TestComputedGetterSuper() { |
| class Base { |
| m() { |
| return ' base m'; |
| } |
| } |
| class Derived extends Base { |
| get ['a']() { return 'a' + super.m(); } |
| get [ID('b')]() { return 'b' + super.m(); } |
| get [0]() { return '0' + super.m(); } |
| get [ID(1)]() { return '1' + super.m(); } |
| get [ID(2147483649)]() { return '2147483649' + super.m(); } |
| get [ID(4294967294)]() { return '4294967294' + super.m(); } |
| get [ID(4294967295)]() { return '4294967295' + super.m(); } |
| } |
| |
| assertGetterDescriptor(Derived.prototype, "a"); |
| assertGetterDescriptor(Derived.prototype, "b"); |
| assertGetterDescriptor(Derived.prototype, 0); |
| assertGetterDescriptor(Derived.prototype, 1); |
| assertGetterDescriptor(Derived.prototype, 2147483649); |
| assertGetterDescriptor(Derived.prototype, 4294967294); |
| assertGetterDescriptor(Derived.prototype, 4294967295); |
| |
| assertEquals('a base m', new Derived().a); |
| assertEquals('b base m', new Derived().b); |
| assertEquals('0 base m', new Derived()[0]); |
| assertEquals('1 base m', new Derived()[1]); |
| assertEquals('2147483649 base m', new Derived()[2147483649]); |
| assertEquals('4294967294 base m', new Derived()[4294967294]); |
| assertEquals('4294967295 base m', new Derived()[4294967295]); |
| })(); |
| |
| |
| (function TestComputedSetterSuper() { |
| var value; |
| class Base { |
| m(name, v) { |
| value = name + ' ' + v; |
| } |
| } |
| class Derived extends Base { |
| set ['a'](v) { super.m('a', v); } |
| set [ID('b')](v) { super.m('b', v); } |
| set [0](v) { super.m('0', v); } |
| set [ID(1)](v) { super.m('1', v); } |
| set [ID(2147483649)](v) { super.m('2147483649', v); } |
| set [ID(4294967294)](v) { super.m('4294967294', v); } |
| set [ID(4294967295)](v) { super.m('4294967295', v); } |
| } |
| assertSetterDescriptor(Derived.prototype, "a"); |
| assertSetterDescriptor(Derived.prototype, "b"); |
| assertSetterDescriptor(Derived.prototype, 0); |
| assertSetterDescriptor(Derived.prototype, 1); |
| assertSetterDescriptor(Derived.prototype, 2147483649); |
| assertSetterDescriptor(Derived.prototype, 4294967294); |
| assertSetterDescriptor(Derived.prototype, 4294967295); |
| |
| new Derived().a = 2; |
| assertEquals('a 2', value); |
| new Derived().b = 3; |
| assertEquals('b 3', value); |
| new Derived()[0] = 4; |
| assertEquals('0 4', value); |
| new Derived()[1] = 5; |
| assertEquals('1 5', value); |
| new Derived()[2147483649] = 6; |
| assertEquals('2147483649 6', value); |
| new Derived()[4294967294] = 7; |
| assertEquals('4294967294 7', value); |
| new Derived()[4294967295] = 8; |
| assertEquals('4294967295 8', value); |
| })(); |