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