| // 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: --harmony-classes --allow-natives-syntax |
| |
| |
| (function TestHomeObject() { |
| var object = { |
| method() { |
| return super.method(); |
| }, |
| get getter() { |
| return super.getter; |
| }, |
| set setter(v) { |
| super.setter = v; |
| }, |
| get accessor() { |
| return super.accessor; |
| }, |
| set accessor(v) { |
| super.accessor = v; |
| }, |
| property: function() { |
| super.property(); |
| }, |
| propertyWithParen: (function() { |
| super.property(); |
| }), |
| propertyWithParens: ((function() { |
| super.property(); |
| })), |
| |
| methodNoSuper() {}, |
| get getterNoSuper() {}, |
| set setterNoSuper(v) {}, |
| get accessorNoSuper() {}, |
| set accessorNoSuper(v) {}, |
| propertyNoSuper: function() {}, |
| propertyWithParenNoSuper: (function() {}), |
| propertyWithParensNoSuper: ((function() {})) |
| }; |
| |
| assertEquals(object, object.method[%HomeObjectSymbol()]); |
| var desc = Object.getOwnPropertyDescriptor(object, 'getter'); |
| assertEquals(object, desc.get[%HomeObjectSymbol()]); |
| desc = Object.getOwnPropertyDescriptor(object, 'setter'); |
| assertEquals(object, desc.set[%HomeObjectSymbol()]); |
| desc = Object.getOwnPropertyDescriptor(object, 'accessor'); |
| assertEquals(object, desc.get[%HomeObjectSymbol()]); |
| assertEquals(object, desc.set[%HomeObjectSymbol()]); |
| assertEquals(object, object.property[%HomeObjectSymbol()]); |
| assertEquals(object, object.propertyWithParen[%HomeObjectSymbol()]); |
| assertEquals(object, object.propertyWithParens[%HomeObjectSymbol()]); |
| |
| assertEquals(undefined, object.methodNoSuper[%HomeObjectSymbol()]); |
| desc = Object.getOwnPropertyDescriptor(object, 'getterNoSuper'); |
| assertEquals(undefined, desc.get[%HomeObjectSymbol()]); |
| desc = Object.getOwnPropertyDescriptor(object, 'setterNoSuper'); |
| assertEquals(undefined, desc.set[%HomeObjectSymbol()]); |
| desc = Object.getOwnPropertyDescriptor(object, 'accessorNoSuper'); |
| assertEquals(undefined, desc.get[%HomeObjectSymbol()]); |
| assertEquals(undefined, desc.set[%HomeObjectSymbol()]); |
| assertEquals(undefined, object.propertyNoSuper[%HomeObjectSymbol()]); |
| assertEquals(undefined, object.propertyWithParenNoSuper[%HomeObjectSymbol()]); |
| assertEquals(undefined, |
| object.propertyWithParensNoSuper[%HomeObjectSymbol()]); |
| })(); |
| |
| |
| (function TestMethod() { |
| var object = { |
| __proto__: { |
| method(x) { |
| return 'proto' + x; |
| } |
| }, |
| method(x) { |
| return super.method(x); |
| } |
| }; |
| assertEquals('proto42', object.method(42)); |
| })(); |
| |
| |
| (function TestGetter() { |
| var object = { |
| __proto__: { |
| _x: 42, |
| get x() { |
| return 'proto' + this._x; |
| } |
| }, |
| get x() { |
| return super.x; |
| } |
| }; |
| assertEquals('proto42', object.x); |
| })(); |
| |
| |
| (function TestSetter() { |
| var object = { |
| __proto__: { |
| _x: 0, |
| set x(v) { |
| return this._x = v; |
| } |
| }, |
| set x(v) { |
| super.x = v; |
| } |
| }; |
| assertEquals(1, object.x = 1); |
| assertEquals(1, object._x); |
| assertEquals(0, Object.getPrototypeOf(object)._x); |
| })(); |
| |
| |
| (function TestMethodAsProperty() { |
| var object = { |
| __proto__: { |
| method: function(x) { |
| return 'proto' + x; |
| } |
| }, |
| method: function(x) { |
| return super.method(x); |
| } |
| }; |
| assertEquals('proto42', object.method(42)); |
| })(); |
| |
| |
| (function TestOptimized() { |
| // Object literals without any accessors get optimized. |
| var object = { |
| method() { |
| return super.toString; |
| } |
| }; |
| assertEquals(Object.prototype.toString, object.method()); |
| })(); |
| |
| |
| (function TestConciseGenerator() { |
| var o = { |
| __proto__: { |
| m() { |
| return 42; |
| } |
| }, |
| *g() { |
| yield super.m(); |
| }, |
| g2: function*() { |
| yield super.m() + 1; |
| }, |
| g3: (function*() { |
| yield super.m() + 2; |
| }) |
| }; |
| |
| assertEquals(42, o.g().next().value); |
| assertEquals(43, o.g2().next().value); |
| assertEquals(44, o.g3().next().value); |
| })(); |