1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-ayle license that can be
3 // found in the LICENSE file.
5 // Flags: --allow-natives-syntax --track-fields --expose-gc
7 var global = Function('return this')();
10 function test(ctor_desc, use_desc, migr_desc) {
17 print("===========================================================");
18 print("=== " + ctor_desc.name +
19 " | " + use_desc.name + " |--> " + migr_desc.name);
20 print("===========================================================");
23 // Clean ICs and transitions.
24 %NotifyContextDisposed();
30 print("-----------------------------");
31 print("--- construct");
34 for (var i = 0; i < n; i++) {
35 objects[i] = ctor_desc.ctor.apply(ctor_desc, ctor_desc.args(i));
41 print("-----------------------------");
45 var use = use_desc.use1;
46 for (var i = 0; i < n; i++) {
47 if (i == 3) %OptimizeFunctionOnNextCall(use);
48 results[i] = use(objects[i], i);
53 print("-----------------------------");
54 print("--- trigger migration");
57 var migr = migr_desc.migr;
58 for (var i = 0; i < n; i++) {
59 if (i == 3) %OptimizeFunctionOnNextCall(migr);
65 print("-----------------------------");
69 var use = use_desc.use2 !== undefined ? use_desc.use2 : use_desc.use1;
70 for (var i = 0; i < n; i++) {
71 if (i == 3) %OptimizeFunctionOnNextCall(use);
72 results[i] = use(objects[i], i);
73 if (verbose >= 2) print(results[i]);
77 if (verbose) print("--- incompatible use: " + e);
85 name: "none-to-double",
86 ctor: function(v) { return {a: v}; },
87 args: function(i) { return [1.5 + i]; },
91 ctor: function(v) { var o = {}; o.a = v; return o; },
92 args: function(i) { return [1.5 + i]; },
96 ctor: function(v) { return {a: v}; },
97 args: function(i) { return [i]; },
101 ctor: function(v) { var o = {}; o.a = v; return o; },
102 args: function(i) { return [i]; },
105 name: "none-to-object",
106 ctor: function(v) { return {a: v}; },
107 args: function(i) { return ["s"]; },
111 ctor: function(v) { var o = {}; o.a = v; return o; },
112 args: function(i) { return ["s"]; },
115 name: "{a:, b:, c:}",
116 ctor: function(v1, v2, v3) { return {a: v1, b: v2, c: v3}; },
117 args: function(i) { return [1.5 + i, 1.6, 1.7]; },
121 ctor: function(v) { var o = {}; o.h=o.g=o.f=o.e=o.d=o.c=o.b=o.a=v; return o; },
122 args: function(i) { return [1.5 + i]; },
126 ctor: function(v) { var o = 1; o.a = v; return o; },
127 args: function(i) { return [1.5 + i]; },
131 ctor: function(v) { var o = function() { return v;}; o.a = v; return o; },
132 args: function(i) { return [1.5 + i]; },
136 ctor: function(v) { var o = function(a,b,c) { return a+b+c; }; o = o.bind(o, v, v+1, v+2.2); return o; },
137 args: function(i) { return [1.5 + i]; },
140 name: "dictionary elements",
141 ctor: function(v) { var o = []; o[1] = v; o[200000] = v; return o; },
142 args: function(i) { return [1.5 + i]; },
146 ctor: function(v) { var json = '{"a":' + v + ',"b":' + v + '}'; return JSON.parse(json); },
147 args: function(i) { return [1.5 + i]; },
150 name: "fast accessors",
152 get: function() { return this.a_; },
153 set: function(value) {this.a_ = value; },
158 Object.defineProperty(o, "a", this.accessor);
161 args: function(i) { return [1.5 + i]; },
164 name: "slow accessor",
165 accessor1: { value: this.a_, configurable: true },
167 get: function() { return this.a_; },
168 set: function(value) {this.a_ = value; },
173 Object.defineProperty(o, "a", this.accessor1);
174 Object.defineProperty(o, "a", this.accessor2);
177 args: function(i) { return [1.5 + i]; },
183 var o = {__proto__: this.proto};
185 for (var i = 0; %HasFastProperties(o); i++) o["f"+i] = v;
188 args: function(i) { return [1.5 + i]; },
192 ctor: function(v) { return global; },
193 args: function(i) { return [i]; },
202 use1: function(o, i) { return o.a + 1.0; },
203 use2: function(o, i) { return o.a + 1.1; },
207 use1: function(o, i) { return o.b + 1.0; },
208 use2: function(o, i) { return o.b + 1.1; },
212 use1: function(o, i) { return o[1] + 1.0; },
213 use2: function(o, i) { return o[1] + 1.1; },
217 use1: function(o, i) { return o[-1] + 1.0; },
218 use2: function(o, i) { return o[-1] + 1.1; },
222 use1: function(o, i) { return o() + 1.0; },
223 use2: function(o, i) { return o() + 1.1; },
232 migr: function(o, i) { if (i == 0) o.a = 1; },
236 migr: function(o, i) { if (i == 0) o.a = 1.1; },
240 migr: function(o, i) { if (i == 0) o.a = {}; },
243 name: "set prototype {}",
244 migr: function(o, i) { o.__proto__ = {}; },
247 name: "%FunctionSetPrototype",
248 migr: function(o, i) { %FunctionSetPrototype(o, null); },
251 name: "modify prototype",
252 migr: function(o, i) { if (i == 0) o.__proto__.__proto1__ = [,,,5,,,]; },
255 name: "freeze prototype",
256 migr: function(o, i) { if (i == 0) Object.freeze(o.__proto__); },
259 name: "delete and re-add property",
260 migr: function(o, i) { var v = o.a; delete o.a; o.a = v; },
263 name: "modify prototype",
264 migr: function(o, i) { if (i >= 0) o.__proto__ = {}; },
267 name: "set property callback",
268 migr: function(o, i) {
269 Object.defineProperty(o, "a", {
270 get: function() { return 1.5 + i; },
271 set: function(value) {},
278 migr: function(o, i) { Object.observe(o, function(){}); },
281 name: "%EnableAccessChecks",
282 migr: function(o, i) {
283 if (typeof (o) !== 'function') %EnableAccessChecks(o);
287 name: "%DisableAccessChecks",
288 migr: function(o, i) {
289 if ((typeof (o) !== 'function') && (o !== global)) %DisableAccessChecks(o);
294 migr: function(o, i) { Object.seal(o); },
296 { // Must be the last in the sequence, because after the global object freeze
297 // the other modifications does not make sence.
299 migr: function(o, i) { Object.freeze(o); },
305 migrations.forEach(function(migr) {
306 uses.forEach(function(use) {
307 ctors.forEach(function(ctor) {
308 test(ctor, use, migr);