1// Copyright 2014 the V8 project authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5// Flags: --allow-natives-syntax 6 7 8(function TestHomeObject() { 9 var object = { 10 method() { 11 return super.method(); 12 }, 13 get getter() { 14 return super.getter; 15 }, 16 set setter(v) { 17 super.setter = v; 18 }, 19 get accessor() { 20 return super.accessor; 21 }, 22 set accessor(v) { 23 super.accessor = v; 24 }, 25 26 methodNoSuper() {}, 27 get getterNoSuper() {}, 28 set setterNoSuper(v) {}, 29 get accessorNoSuper() {}, 30 set accessorNoSuper(v) {}, 31 propertyNoSuper: function() {}, 32 propertyWithParenNoSuper: (function() {}), 33 propertyWithParensNoSuper: ((function() {})) 34 }; 35 36 assertEquals(object, object.method[%HomeObjectSymbol()]); 37 var desc = Object.getOwnPropertyDescriptor(object, 'getter'); 38 assertEquals(object, desc.get[%HomeObjectSymbol()]); 39 desc = Object.getOwnPropertyDescriptor(object, 'setter'); 40 assertEquals(object, desc.set[%HomeObjectSymbol()]); 41 desc = Object.getOwnPropertyDescriptor(object, 'accessor'); 42 assertEquals(object, desc.get[%HomeObjectSymbol()]); 43 assertEquals(object, desc.set[%HomeObjectSymbol()]); 44 45 assertEquals(undefined, object.methodNoSuper[%HomeObjectSymbol()]); 46 desc = Object.getOwnPropertyDescriptor(object, 'getterNoSuper'); 47 assertEquals(undefined, desc.get[%HomeObjectSymbol()]); 48 desc = Object.getOwnPropertyDescriptor(object, 'setterNoSuper'); 49 assertEquals(undefined, desc.set[%HomeObjectSymbol()]); 50 desc = Object.getOwnPropertyDescriptor(object, 'accessorNoSuper'); 51 assertEquals(undefined, desc.get[%HomeObjectSymbol()]); 52 assertEquals(undefined, desc.set[%HomeObjectSymbol()]); 53 assertEquals(undefined, object.propertyNoSuper[%HomeObjectSymbol()]); 54 assertEquals(undefined, object.propertyWithParenNoSuper[%HomeObjectSymbol()]); 55 assertEquals(undefined, 56 object.propertyWithParensNoSuper[%HomeObjectSymbol()]); 57})(); 58 59 60(function TestMethod() { 61 var object = { 62 __proto__: { 63 method(x) { 64 return 'proto' + x; 65 } 66 }, 67 method(x) { 68 return super.method(x); 69 } 70 }; 71 assertEquals('proto42', object.method(42)); 72})(); 73 74 75(function TestGetter() { 76 var object = { 77 __proto__: { 78 _x: 42, 79 get x() { 80 return 'proto' + this._x; 81 } 82 }, 83 get x() { 84 return super.x; 85 } 86 }; 87 assertEquals('proto42', object.x); 88})(); 89 90 91(function TestSetter() { 92 var object = { 93 __proto__: { 94 _x: 0, 95 set x(v) { 96 return this._x = v; 97 } 98 }, 99 set x(v) { 100 super.x = v; 101 } 102 }; 103 assertEquals(1, object.x = 1); 104 assertEquals(1, object._x); 105 assertEquals(0, Object.getPrototypeOf(object)._x); 106})(); 107 108 109(function TestOptimized() { 110 // Object literals without any accessors get optimized. 111 var object = { 112 method() { 113 return super.toString; 114 } 115 }; 116 assertEquals(Object.prototype.toString, object.method()); 117})(); 118 119 120(function TestConciseGenerator() { 121 var o = { 122 __proto__: { 123 m() { 124 return 42; 125 } 126 }, 127 *g() { 128 yield super.m(); 129 }, 130 }; 131 132 assertEquals(42, o.g().next().value); 133})(); 134 135 136(function TestSuperPropertyInEval() { 137 var y = 3; 138 var p = { 139 m() { return 1; }, 140 get x() { return 2; } 141 }; 142 var o = { 143 __proto__: p, 144 evalM() { 145 assertEquals(1, eval('super.m()')); 146 }, 147 evalX() { 148 assertEquals(2, eval('super.x')); 149 }, 150 globalEval1() { 151 assertThrows('super.x', SyntaxError); 152 assertThrows('super.m()', SyntaxError); 153 }, 154 globalEval2() { 155 super.x; 156 assertThrows('super.x', SyntaxError); 157 assertThrows('super.m()', SyntaxError); 158 } 159 }; 160 o.evalM(); 161 o.evalX(); 162 o.globalEval1(); 163 o.globalEval2(); 164})(); 165 166 167(function TestSuperPropertyInArrow() { 168 var y = 3; 169 var p = { 170 m() { return 1; }, 171 get x() { return 2; } 172 }; 173 var o = { 174 __proto__: p, 175 arrow() { 176 assertSame(super.x, (() => super.x)()); 177 assertSame(super.m(), (() => super.m())()); 178 return (() => super.m())(); 179 } 180 }; 181 assertSame(1, o.arrow()); 182})(); 183