184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// Copyright 2011 the V8 project authors. All rights reserved.
284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// Redistribution and use in source and binary forms, with or without
384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// modification, are permitted provided that the following conditions are
484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// met:
584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org//
684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org//     * Redistributions of source code must retain the above copyright
784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org//       notice, this list of conditions and the following disclaimer.
884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org//     * Redistributions in binary form must reproduce the above
984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org//       copyright notice, this list of conditions and the following
1084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org//       disclaimer in the documentation and/or other materials provided
1184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org//       with the distribution.
1284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org//     * Neither the name of Google Inc. nor the names of its
1384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org//       contributors may be used to endorse or promote products derived
1484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org//       from this software without specific prior written permission.
1584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org//
1684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
2884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// Flags: --allow-natives-syntax --expose-gc
2984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
3084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgfunction mkCOWArray() {
3184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  var a = [''];
3284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  assertEquals('', a[0]);
3384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  return a;
3484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org}
3584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
3684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgfunction mkArray() {
3784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  var a = [];
3884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  a[0] = '';
3984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  return a;
4084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org}
4184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
4284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgfunction mkNumberDictionary() {
4384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  var a = new Array();
4484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  a[0] = '';
4584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  a[100000] = '';
4684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  return a;
4784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org}
4884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
4984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgfunction write(a, i) { a[i] = "bazinga!"; }
5084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
5184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgfunction test(factories, w) {
5284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  factories.forEach(function(f) { w(f(), 0); });
5384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  factories.forEach(function(f) { w(f(), 0); });
5484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org      %OptimizeFunctionOnNextCall(w);
5584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  factories.forEach(function(f) { w(f(), 0); });
5684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org}
5784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
5884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// Monomorphic case.
5984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgfor (var i = 0; i < 5; i++) write(mkArray(), 0);
6084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org%OptimizeFunctionOnNextCall(write);
6184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgwrite(mkCOWArray(), 0);
6284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgvar failure = mkCOWArray();
6384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
6484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org// Cleanup, then polymorphic case.
6584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org%DeoptimizeFunction(write);
6684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orggc();
6784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgtest([mkArray, mkNumberDictionary], write);
6884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orgtest([mkArray, mkNumberDictionary, mkCOWArray], write);
69