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