169ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org// Copyright 2010 the V8 project authors. All rights reserved.
269ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org// Redistribution and use in source and binary forms, with or without
369ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org// modification, are permitted provided that the following conditions are
469ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org// met:
569ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org//
669ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org//     * Redistributions of source code must retain the above copyright
769ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org//       notice, this list of conditions and the following disclaimer.
869ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org//     * Redistributions in binary form must reproduce the above
969ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org//       copyright notice, this list of conditions and the following
1069ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org//       disclaimer in the documentation and/or other materials provided
1169ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org//       with the distribution.
1269ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org//     * Neither the name of Google Inc. nor the names of its
1369ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org//       contributors may be used to endorse or promote products derived
1469ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org//       from this software without specific prior written permission.
1569ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org//
1669ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1769ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1869ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1969ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2069ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2169ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2269ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2369ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2469ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2569ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2669ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2769ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org
2869ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org// Test dictionary store ICs.
2969ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org
3069ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org// Function that stores property 'x' on an object.
3169ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.orgfunction store(obj) { obj.x = 42; }
3269ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org
3369ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org// Create object and force it to dictionary mode by deleting property.
3469ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.orgvar o = { x: 32, y: 33 };
3569ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.orgdelete o.y;
3669ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org
3769ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org// Make the store ic in the 'store' function go into dictionary store
3869ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org// case.
3969ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.orgfor (var i = 0; i < 3; i++) {
4069ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org  store(o);
4169ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org}
4269ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.orgassertEquals(42, o.x);
4369ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org
4469ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org// Test that READ_ONLY property attribute is respected. Make 'x'
4569ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org// READ_ONLY.
4669ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.orgObject.defineProperty(o, 'x', { value: 32, writable: false });
4769ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org
4869ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org// Attempt to store using the store ic in the 'store' function.
4969ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.orgstore(o);
5069ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org
5169ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org// Check that the store did not change the value.
5269ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.orgassertEquals(32, o.x);
5369ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org
5469ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org// Check that bail-out code works.
5569ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org// Smi.
5669ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.orgstore(1);
5769ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org// Fast case object.
5869ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.orgo = new Object();
5969ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.orgstore(o);
6069ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.orgassertEquals(42, o.x);
6169ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org// Slow case object without x property.
6269ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.orgdelete o.x;
6369ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.orgstore(o);
6469ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.orgassertEquals(42, o.x);
65