11e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Copyright 2011 the V8 project authors. All rights reserved. 21e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Redistribution and use in source and binary forms, with or without 31e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// modification, are permitted provided that the following conditions are 41e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// met: 51e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// 61e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// * Redistributions of source code must retain the above copyright 71e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// notice, this list of conditions and the following disclaimer. 81e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// * Redistributions in binary form must reproduce the above 91e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// copyright notice, this list of conditions and the following 101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// disclaimer in the documentation and/or other materials provided 111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// with the distribution. 121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// * Neither the name of Google Inc. nor the names of its 131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// contributors may be used to endorse or promote products derived 141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// from this software without specific prior written permission. 151e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// 161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Regression test for Chromium issue 70066. Delete should work properly 291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// from inside 'with' scopes. 301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// http://code.google.com/p/chromium/issues/detail?id=70066 311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockx = 0; 331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Delete on a slot from a function's own context. 351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockfunction test1() { 361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block var value = 1; 371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block var status; 381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block with ({}) { status = delete value; } 391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return value + ":" + status; 401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 421e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertEquals("1:false", test1(), "test1"); 431e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertEquals(0, x, "test1"); // Global x is undisturbed. 441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Delete on a slot from an outer context. 471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockfunction test2() { 481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block function f() { 491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block with ({}) { return delete value; } 501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block var value = 2; 521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block var status = f(); 531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return value + ":" + status; 541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 561e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertEquals("2:false", test2(), "test2"); 571e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertEquals(0, x, "test2"); // Global x is undisturbed. 581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Delete on a parameter. 611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockfunction test3(value) { 621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block var status; 631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block with ({}) { status = delete value; } 641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return value + ":" + status; 651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 673fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochassertEquals("3:false", test3(3), "test3"); 681e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertEquals(0, x, "test3"); // Global x is undisturbed. 691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Delete on a parameter found in an outer context. 721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockfunction test4(value) { 731e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block function f() { 741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block with ({}) { return delete value; } 751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block var status = f(); 771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return value + ":" + status; 781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 801e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertEquals("4:false", test4(4), "test4"); 811e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertEquals(0, x, "test4"); // Global x is undisturbed. 821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Delete on a parameter, arguments object should be unaffected. 851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockfunction test5(value) { 861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block var status; 871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block with ({}) { status = delete value; } 881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return arguments[0] + ":" + status; 891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 913fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochassertEquals("5:false", test5(5), "test5"); 921e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertEquals(0, x, "test5"); // Global x is undisturbed. 931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockfunction test6(value) { 951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block function f() { 961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block with ({}) { return delete value; } 971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block var status = f(); 991e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return arguments[0] + ":" + status; 1001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 1011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1023fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochassertEquals("6:false", test6(6), "test6"); 1031e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertEquals(0, x, "test6"); // Global x is undisturbed. 1041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1051e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Delete on a property found on 'with' object. 1071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockfunction test7(object) { 1081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block with (object) { return delete value; } 1091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 1101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvar o = {value: 7}; 1121e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertEquals(true, test7(o), "test7"); 1131e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertEquals(void 0, o.value, "test7"); 1141e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertEquals(0, x, "test7"); // Global x is undisturbed. 1151e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Delete on a global property. 1181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockfunction test8() { 1191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block with ({}) { return delete x; } 1201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 1211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1221e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertEquals(true, test8(), "test8"); 1231e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertThrows("x", "test8"); // Global x should be deleted. 1241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Delete on a property that is not found anywhere. 1271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockfunction test9() { 1281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block with ({}) { return delete x; } 1291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 1301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1311e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertThrows("x", "test9"); // Make sure it's not there. 1321e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertEquals(true, test9(), "test9"); 1331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Delete on a DONT_DELETE property of the global object. 1361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvar y = 10; 1371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockfunction test10() { 1381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block with ({}) { return delete y; } 1391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 1401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1411e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertEquals(false, test10(), "test10"); 1421e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockassertEquals(10, y, "test10"); 143