blob: b31a498767afec7d33844a8371425c2ba9dc83fc [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// 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})();