// 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); })();