158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved.
258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org// Use of this source code is governed by a BSD-ayle license that can be
358a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org// found in the LICENSE file.
458a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org
558a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org// Flags: --allow-natives-syntax --track-fields --expose-gc
658a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org
758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.orgvar global = Function('return this')();
858a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.orgvar verbose = 0;
958a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org
1058a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.orgfunction test(ctor_desc, use_desc, migr_desc) {
1158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  var n = 5;
1258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  var objects = [];
1358a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  var results = [];
1458a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org
1558a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  if (verbose) {
1658a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    print();
1758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    print("===========================================================");
1858a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    print("=== " + ctor_desc.name +
1958a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org          " | " + use_desc.name + " |--> " + migr_desc.name);
2058a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    print("===========================================================");
2158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  }
2258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org
2358a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  // Clean ICs and transitions.
2458a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  %NotifyContextDisposed();
2558a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  gc(); gc(); gc();
2658a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org
2758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org
2858a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  // create objects
2958a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  if (verbose) {
3058a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    print("-----------------------------");
3158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    print("--- construct");
3258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    print();
3358a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  }
3458a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  for (var i = 0; i < n; i++) {
3558a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    objects[i] = ctor_desc.ctor.apply(ctor_desc, ctor_desc.args(i));
3658a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  }
3758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org
3858a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  try {
3958a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    // use them
4058a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    if (verbose) {
4158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org      print("-----------------------------");
4258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org      print("--- use 1");
4358a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org      print();
4458a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    }
4558a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    var use = use_desc.use1;
4658a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    for (var i = 0; i < n; i++) {
4758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org      if (i == 3) %OptimizeFunctionOnNextCall(use);
4858a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org      results[i] = use(objects[i], i);
4958a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    }
5058a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org
5158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    // trigger migrations
5258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    if (verbose) {
5358a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org      print("-----------------------------");
5458a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org      print("--- trigger migration");
5558a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org      print();
5658a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    }
5758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    var migr = migr_desc.migr;
5858a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    for (var i = 0; i < n; i++) {
5958a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org      if (i == 3) %OptimizeFunctionOnNextCall(migr);
6058a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org      migr(objects[i], i);
6158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    }
6258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org
6358a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    // use again
6458a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    if (verbose) {
6558a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org      print("-----------------------------");
6658a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org      print("--- use 2");
6758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org      print();
6858a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    }
6958a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    var use = use_desc.use2 !== undefined ? use_desc.use2 : use_desc.use1;
7058a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    for (var i = 0; i < n; i++) {
7158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org      if (i == 3) %OptimizeFunctionOnNextCall(use);
7258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org      results[i] = use(objects[i], i);
7358a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org      if (verbose >= 2) print(results[i]);
7458a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    }
7558a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org
7658a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  } catch (e) {
7758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    if (verbose) print("--- incompatible use: " + e);
7858a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  }
7958a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  return results;
8058a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org}
8158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org
8258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org
8358a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.orgvar ctors = [
8458a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  {
8558a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    name: "none-to-double",
8658a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    ctor: function(v) { return {a: v}; },
8758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    args: function(i) { return [1.5 + i]; },
8858a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  },
8958a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  {
9058a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    name: "double",
9158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    ctor: function(v) { var o = {}; o.a = v; return o; },
9258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    args: function(i) { return [1.5 + i]; },
9358a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  },
9458a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  {
9558a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    name: "none-to-smi",
9658a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    ctor: function(v) { return {a: v}; },
9758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    args: function(i) { return [i]; },
9858a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  },
9958a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  {
10058a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    name: "smi",
10158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    ctor: function(v) { var o = {}; o.a = v; return o; },
10258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    args: function(i) { return [i]; },
10358a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  },
10458a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  {
10558a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    name: "none-to-object",
10658a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    ctor: function(v) { return {a: v}; },
10758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    args: function(i) { return ["s"]; },
10858a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  },
10958a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  {
11058a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    name: "object",
11158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    ctor: function(v) { var o = {}; o.a = v; return o; },
11258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    args: function(i) { return ["s"]; },
11358a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  },
11458a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  {
11558a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    name: "{a:, b:, c:}",
11658a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    ctor: function(v1, v2, v3) { return {a: v1, b: v2, c: v3}; },
11758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    args: function(i)    { return [1.5 + i, 1.6, 1.7]; },
11858a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  },
11958a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  {
12058a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    name: "{a..h:}",
12158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    ctor: function(v) { var o = {}; o.h=o.g=o.f=o.e=o.d=o.c=o.b=o.a=v; return o; },
12258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    args: function(i) { return [1.5 + i]; },
12358a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  },
12458a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  {
12558a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    name: "1",
12658a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    ctor: function(v) { var o = 1; o.a = v; return o; },
12758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    args: function(i) { return [1.5 + i]; },
12858a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  },
12958a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  {
13058a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    name: "f()",
13158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    ctor: function(v) { var o = function() { return v;}; o.a = v; return o; },
13258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    args: function(i) { return [1.5 + i]; },
13358a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  },
13458a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  {
13558a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    name: "f().bind",
13658a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    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; },
13758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    args: function(i) { return [1.5 + i]; },
13858a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  },
13958a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  {
14058a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    name: "dictionary elements",
14158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    ctor: function(v) { var o = []; o[1] = v; o[200000] = v; return o; },
14258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    args: function(i) { return [1.5 + i]; },
14358a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  },
14458a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  {
14558a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    name: "json",
14658a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    ctor: function(v) { var json = '{"a":' + v + ',"b":' + v + '}'; return JSON.parse(json); },
14758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    args: function(i) { return [1.5 + i]; },
14858a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  },
14958a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  {
15058a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    name: "fast accessors",
15158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    accessor: {
15258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org        get: function() { return this.a_; },
15358a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org        set: function(value) {this.a_ = value; },
15458a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org        configurable: true,
15558a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    },
15658a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    ctor: function(v) {
15758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org      var o = {a_:v};
15858a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org      Object.defineProperty(o, "a", this.accessor);
15958a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org      return o;
16058a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    },
16158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    args: function(i) { return [1.5 + i]; },
16258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  },
16358a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  {
16458a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    name: "slow accessor",
16558a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    accessor1: { value: this.a_, configurable: true },
16658a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    accessor2: {
16758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org        get: function() { return this.a_; },
16858a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org        set: function(value) {this.a_ = value; },
16958a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org        configurable: true,
17058a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    },
17158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    ctor: function(v) {
17258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org      var o = {a_:v};
17358a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org      Object.defineProperty(o, "a", this.accessor1);
17458a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org      Object.defineProperty(o, "a", this.accessor2);
17558a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org      return o;
17658a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    },
17758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    args: function(i) { return [1.5 + i]; },
17858a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  },
17958a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  {
18058a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    name: "slow",
18158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    proto: {},
18258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    ctor: function(v) {
18358a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org      var o = {__proto__: this.proto};
18458a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org      o.a = v;
18558a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org      for (var i = 0; %HasFastProperties(o); i++) o["f"+i] = v;
18658a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org      return o;
18758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    },
18858a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    args: function(i) { return [1.5 + i]; },
18958a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  },
19058a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  {
19158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    name: "global",
19258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    ctor: function(v) { return global; },
19358a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    args: function(i) { return [i]; },
19458a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  },
19558a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org];
19658a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org
19758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org
19858a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org
19958a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.orgvar uses = [
20058a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  {
20158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    name: "o.a+1.0",
20258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    use1: function(o, i) { return o.a + 1.0; },
20358a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    use2: function(o, i) { return o.a + 1.1; },
20458a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  },
20558a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  {
20658a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    name: "o.b+1.0",
20758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    use1: function(o, i) { return o.b + 1.0; },
20858a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    use2: function(o, i) { return o.b + 1.1; },
20958a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  },
21058a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  {
21158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    name: "o[1]+1.0",
21258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    use1: function(o, i) { return o[1] + 1.0; },
21358a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    use2: function(o, i) { return o[1] + 1.1; },
21458a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  },
21558a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  {
21658a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    name: "o[-1]+1.0",
21758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    use1: function(o, i) { return o[-1] + 1.0; },
21858a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    use2: function(o, i) { return o[-1] + 1.1; },
21958a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  },
22058a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  {
22158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    name: "()",
22258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    use1: function(o, i) { return o() + 1.0; },
22358a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    use2: function(o, i) { return o() + 1.1; },
22458a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  },
22558a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org];
22658a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org
22758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org
22858a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org
22958a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.orgvar migrations = [
23058a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  {
23158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    name: "to smi",
23258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    migr: function(o, i) { if (i == 0) o.a = 1; },
23358a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  },
23458a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  {
23558a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    name: "to double",
23658a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    migr: function(o, i) { if (i == 0) o.a = 1.1; },
23758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  },
23858a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  {
23958a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    name: "to object",
24058a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    migr: function(o, i) { if (i == 0) o.a = {}; },
24158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  },
24258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  {
24358a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    name: "set prototype {}",
24458a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    migr: function(o, i) { o.__proto__ = {}; },
24558a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  },
24658a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  {
24758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    name: "%FunctionSetPrototype",
24858a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    migr: function(o, i) { %FunctionSetPrototype(o, null); },
24958a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  },
25058a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  {
25158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    name: "modify prototype",
25258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    migr: function(o, i) { if (i == 0) o.__proto__.__proto1__ = [,,,5,,,]; },
25358a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  },
25458a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  {
25558a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    name: "freeze prototype",
25658a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    migr: function(o, i) { if (i == 0) Object.freeze(o.__proto__); },
25758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  },
25858a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  {
25958a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    name: "delete and re-add property",
26058a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    migr: function(o, i) { var v = o.a; delete o.a; o.a = v; },
26158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  },
26258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  {
26358a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    name: "modify prototype",
26458a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    migr: function(o, i) { if (i >= 0) o.__proto__ = {}; },
26558a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  },
26658a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  {
26758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    name: "set property callback",
26858a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    migr: function(o, i) {
26958a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org      Object.defineProperty(o, "a", {
27058a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org        get: function() { return 1.5 + i; },
27158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org        set: function(value) {},
27258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org        configurable: true,
27358a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org      });
27458a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    },
27558a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  },
27658a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  {
27758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    name: "observe",
27858a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    migr: function(o, i) { Object.observe(o, function(){}); },
27958a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  },
28058a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  {
28158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    name: "%EnableAccessChecks",
28258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    migr: function(o, i) {
28358a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org      if (typeof (o) !== 'function') %EnableAccessChecks(o);
28458a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    },
28558a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  },
28658a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  {
28758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    name: "%DisableAccessChecks",
28858a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    migr: function(o, i) {
28958a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org      if ((typeof (o) !== 'function') && (o !== global)) %DisableAccessChecks(o);
29058a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    },
29158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  },
29258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  {
29358a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    name: "seal",
29458a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    migr: function(o, i) { Object.seal(o); },
29558a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  },
29658a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  { // Must be the last in the sequence, because after the global object freeze
29758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    // the other modifications does not make sence.
29858a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    name: "freeze",
29958a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    migr: function(o, i) { Object.freeze(o); },
30058a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  },
30158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org];
30258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org
30358a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org
30458a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org
30558a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.orgmigrations.forEach(function(migr) {
30658a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  uses.forEach(function(use) {
30758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    ctors.forEach(function(ctor) {
30858a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org      test(ctor, use, migr);
30958a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    });
31058a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  });
31158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org});
312