1ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// Copyright 2010 the V8 project authors. All rights reserved. 2ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// Redistribution and use in source and binary forms, with or without 3ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// modification, are permitted provided that the following conditions are 4ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// met: 5ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// 6ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// * Redistributions of source code must retain the above copyright 7ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// notice, this list of conditions and the following disclaimer. 8ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// * Redistributions in binary form must reproduce the above 9ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// copyright notice, this list of conditions and the following 10ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// disclaimer in the documentation and/or other materials provided 11ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// with the distribution. 12ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// * Neither the name of Google Inc. nor the names of its 13ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// contributors may be used to endorse or promote products derived 14ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// from this software without specific prior written permission. 15ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// 16ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 28ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgvar x = {}; 29ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 30ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// Add property a with getter/setter. 31ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgx.__defineGetter__("a", function() { 32ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org try { 33ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org y.x = 40; 34ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } catch (e) { 351805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org assertEquals(3, e.stack.split('\n').length); 36ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 37ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org return 40; 38ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org}); 39ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 40ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgx.__defineSetter__("a", function(val) { 41ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org try { 42ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org y.x = 40; 43ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } catch(e) { 441805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org assertEquals(3, e.stack.split('\n').length); 45ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 46ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org}); 47ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 48ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// Add property b with getter/setter. 49ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgfunction getB() { 50ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org try { 51ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org y.x = 30; 52ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } catch (e) { 531805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org assertEquals(3, e.stack.split('\n').length); 54ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 55ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org return 30; 56ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org} 57ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 58ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgfunction setB(val) { 59ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org try { 60ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org y.x = 30; 61ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } catch(e) { 621805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org assertEquals(3, e.stack.split('\n').length); 63ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 64ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org} 65ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 66ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgx.__defineGetter__("b", getB); 67ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgx.__defineSetter__("b", setB); 68ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 69ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// Add property c with getter/setter. 70ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgvar descriptor = { 71ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org get: function() { 72ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org try { 73ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org y.x = 40; 74ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } catch (e) { 751805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org assertEquals(3, e.stack.split('\n').length); 76ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 77ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org return 40; 78ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org }, 79ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org set: function(val) { 80ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org try { 81ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org y.x = 40; 82ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } catch(e) { 831805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org assertEquals(3, e.stack.split('\n').length); 84ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 85ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 86ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org} 87ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 88ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgObject.defineProperty(x, 'c', descriptor) 89ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 90ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// Check that the stack for an exception in a getter and setter produce the 911805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org// expected stack height. 92ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgx.a; 93ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgx.b; 94ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgx.c; 95ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgx.a = 1; 96ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgx.b = 1; 97ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgx.c = 1; 98ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 99ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// Do the same with the getters/setters on the a prototype object. 100ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgxx = {} 101ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgxx.__proto__ = x 102ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 103ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgxx.a; 104ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgxx.b; 105ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgxx.c; 106ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgxx.a = 1; 107ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgxx.b = 1; 108ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgxx.c = 1; 109