1ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// Copyright 2013 the V8 project authors. All rights reserved.
2ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// Redistribution and use in source and binary forms, with or without
3ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// modification, are permitted provided that the following conditions are
4ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// met:
5ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org//
6ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org//     * Redistributions of source code must retain the above copyright
7ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org//       notice, this list of conditions and the following disclaimer.
8ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org//     * Redistributions in binary form must reproduce the above
9ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org//       copyright notice, this list of conditions and the following
10ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org//       disclaimer in the documentation and/or other materials provided
11ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org//       with the distribution.
12ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org//     * Neither the name of Google Inc. nor the names of its
13ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org//       contributors may be used to endorse or promote products derived
14ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org//       from this software without specific prior written permission.
15ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org//
16ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
28ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// Flags: --allow-natives-syntax
29ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
30ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// Test deopt after generic store with effect context.
31ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvar pro = { x : 1 }
32ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvar a = {}
33ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orga.__proto__ = pro
34ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgdelete pro.x
35ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
36ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgfunction g(o) {
37ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  return 7 + (o.z = 1, 20);
38ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org}
39ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
40ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgg(a);
41ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgg(a);
42ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org%OptimizeFunctionOnNextCall(g);
43ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgObject.defineProperty(pro, "z", {
44ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    set: function(v) { %DeoptimizeFunction(g); },
45ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    get: function() { return 20; }
46ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org});
47ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
48ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgassertEquals(27, g(a));
49ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
50ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// Test deopt after polymorphic as monomorphic store with effect context.
51ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
52ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvar i = { z : 2, r : 1 }
53ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvar j = { z : 2 }
54ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvar p = { a : 10 }
55ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvar pp = { a : 20, b : 1 }
56ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
57ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgfunction bar(o, p) {
58ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  return 7 + (o.z = 1, p.a);
59ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org}
60ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
61ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgbar(i, p);
62ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgbar(i, p);
63ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgbar(j, p);
64ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org%OptimizeFunctionOnNextCall(bar);
65ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgassertEquals(27, bar(i, pp));
66ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
67ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org// Test deopt after polymorphic store with effect context.
68ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
69ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvar i = { r : 1, z : 2 }
70ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvar j = { z : 2 }
71ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvar p = { a : 10 }
72ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvar pp = { a : 20, b : 1 }
73ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
74ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgfunction bar1(o, p) {
75ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  return 7 + (o.z = 1, p.a);
76ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org}
77ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
78ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgbar1(i, p);
79ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgbar1(i, p);
80ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgbar1(j, p);
81ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org%OptimizeFunctionOnNextCall(bar1);
82ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgassertEquals(27, bar1(i, pp));
83