1d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org// Copyright 2013 the V8 project authors. All rights reserved.
2d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org// Redistribution and use in source and binary forms, with or without
3d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org// modification, are permitted provided that the following conditions are
4d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org// met:
5d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org//
6d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org//     * Redistributions of source code must retain the above copyright
7d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org//       notice, this list of conditions and the following disclaimer.
8d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org//     * Redistributions in binary form must reproduce the above
9d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org//       copyright notice, this list of conditions and the following
10d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org//       disclaimer in the documentation and/or other materials provided
11d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org//       with the distribution.
12d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org//     * Neither the name of Google Inc. nor the names of its
13d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org//       contributors may be used to endorse or promote products derived
14d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org//       from this software without specific prior written permission.
15d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org//
16d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org
28d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org// Flags: --allow-natives-syntax
29d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org
30d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org// Test usage of static type information for loads that would otherwise
31d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org// turn into polymorphic or generic loads.
32d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org
33d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org// Prepare a highly polymorphic load to be used by all tests.
34d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.orgObject.prototype.load = function() { return this.property; };
35d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.orgObject.prototype.load.call({ A:0, property:10 });
36d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.orgObject.prototype.load.call({ A:0, B:0, property:11 });
37d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.orgObject.prototype.load.call({ A:0, B:0, C:0, property:12 });
38d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.orgObject.prototype.load.call({ A:0, B:0, C:0, D:0, property:13 });
39d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.orgObject.prototype.load.call({ A:0, B:0, C:0, D:0, E:0, property:14 });
40d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.orgObject.prototype.load.call({ A:0, B:0, C:0, D:0, E:0, F:0, property:15 });
41d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org
42d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org// Test for object literals.
43d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org(function() {
44d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  function f(x) {
45d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org    var object = { property:x };
46d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org    return object.load();
47d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  }
48d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org
49d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  assertSame(1, f(1));
50d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  assertSame(2, f(2));
51d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  %OptimizeFunctionOnNextCall(f);
52d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  assertSame(3, f(3));
53d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org})();
54d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org
55d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org// Test for inlined constructors.
56d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org(function() {
57d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  function c(x) {
58d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org    this.property = x;
59d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  }
60d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  function f(x) {
61d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org    var object = new c(x);
62d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org    return object.load();
63d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  }
64d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org
65d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  assertSame(1, f(1));
66d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  assertSame(2, f(2));
67d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  %OptimizeFunctionOnNextCall(f);
68d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  assertSame(3, f(3));
69d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org})();
70