| // Copyright 2008 the V8 project authors. All rights reserved. | 
 | // Redistribution and use in source and binary forms, with or without | 
 | // modification, are permitted provided that the following conditions are | 
 | // met: | 
 | // | 
 | //     * Redistributions of source code must retain the above copyright | 
 | //       notice, this list of conditions and the following disclaimer. | 
 | //     * Redistributions in binary form must reproduce the above | 
 | //       copyright notice, this list of conditions and the following | 
 | //       disclaimer in the documentation and/or other materials provided | 
 | //       with the distribution. | 
 | //     * Neither the name of Google Inc. nor the names of its | 
 | //       contributors may be used to endorse or promote products derived | 
 | //       from this software without specific prior written permission. | 
 | // | 
 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 
 | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 
 | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 
 | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 
 | // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
 | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 
 | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
 | // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
 | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 
 | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
 | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
 |  | 
 | // We use the has() function to avoid relying on a functioning | 
 | // implementation of 'in'. | 
 | function has(o, k) { return typeof o[k] !== 'undefined'; } | 
 |  | 
 | assertTrue(delete null); | 
 | assertTrue(delete 2); | 
 | assertTrue(delete 'foo'); | 
 | assertTrue(delete Number(7)); | 
 | assertTrue(delete new Number(8)); | 
 |  | 
 | assertTrue(delete {}.x); | 
 | assertTrue(delete {}.y); | 
 | assertTrue(delete {}.toString); | 
 |  | 
 | x = 42; | 
 | assertEquals(42, x); | 
 | assertTrue(delete x); | 
 | assertTrue(typeof x === 'undefined', "x is gone"); | 
 |  | 
 | var y = 87; // should have DontDelete attribute | 
 | assertEquals(87, y); | 
 | assertFalse(delete y, "don't delete"); | 
 | assertFalse(typeof y === 'undefined'); | 
 | assertEquals(87, y); | 
 |  | 
 | var o = { x: 42, y: 87 }; | 
 | assertTrue(has(o, 'x')); | 
 | assertTrue(has(o, 'y')); | 
 | assertTrue(delete o.x); | 
 | assertFalse(has(o, 'x')); | 
 | assertTrue(has(o, 'y')); | 
 | assertTrue(delete o['y']); | 
 | assertFalse(has(o, 'x')); | 
 | assertFalse(has(o, 'y')); | 
 |  | 
 |  | 
 | var o = {}; | 
 | for (var i = 0x0020; i < 0x02ff; i+=2) { | 
 |   o[String.fromCharCode(i)] = i; | 
 |   o[String.fromCharCode(i+1)] = i+1; | 
 | } | 
 | for (var i = 0x0020; i < 0x02ff; i+=2) { | 
 |   assertTrue(delete o[String.fromCharCode(i)]); | 
 | } | 
 | for (var i = 0x0020; i < 0x02ff; i+=2) { | 
 |   assertFalse(has(o, String.fromCharCode(i)), "deleted (" + i + ")"); | 
 |   assertTrue(has(o, String.fromCharCode(i+1)), "still here (" + i + ")"); | 
 | } | 
 |  | 
 |  | 
 | var a = [0,1,2]; | 
 | assertTrue(has(a, 0)); | 
 | assertTrue(delete a[0]); | 
 | assertFalse(has(a, 0), "delete 0"); | 
 | assertEquals(1, a[1]); | 
 | assertEquals(2, a[2]); | 
 | assertTrue(delete a[100], "delete 100"); | 
 | assertTrue(delete a[Math.pow(2,31)-1], "delete 2^31-1"); | 
 | assertFalse(has(a, 0), "delete 0"); | 
 | assertEquals(1, a[1]); | 
 | assertEquals(2, a[2]); | 
 |  | 
 |  | 
 | var a = [0,1,2]; | 
 | assertEquals(3, a.length); | 
 | assertTrue(delete a[2]); | 
 | assertEquals(3, a.length); | 
 | assertTrue(delete a[0]); | 
 | assertEquals(3, a.length); | 
 | assertTrue(delete a[1]); | 
 | assertEquals(3, a.length); | 
 |  | 
 |  | 
 | var o = {}; | 
 | o[Math.pow(2,30)-1] = 0; | 
 | o[Math.pow(2,31)-1] = 0; | 
 | o[1] = 0; | 
 | assertTrue(delete o[0]); | 
 | assertTrue(delete o[Math.pow(2,30)]); | 
 | assertFalse(has(o, 0), "delete 0"); | 
 | assertFalse(has(o, Math.pow(2,30))); | 
 | assertTrue(has(o, 1)); | 
 | assertTrue(has(o, Math.pow(2,30)-1)); | 
 | assertTrue(has(o, Math.pow(2,31)-1)); | 
 |  | 
 | assertTrue(delete o[Math.pow(2,30)-1]); | 
 | assertTrue(has(o, 1)); | 
 | assertFalse(has(o, Math.pow(2,30)-1), "delete 2^30-1"); | 
 | assertTrue(has(o, Math.pow(2,31)-1)); | 
 |  | 
 | assertTrue(delete o[1]); | 
 | assertFalse(has(o, 1), "delete 1"); | 
 | assertFalse(has(o, Math.pow(2,30)-1), "delete 2^30-1"); | 
 | assertTrue(has(o, Math.pow(2,31)-1)); | 
 |  | 
 | assertTrue(delete o[Math.pow(2,31)-1]); | 
 | assertFalse(has(o, 1), "delete 1"); | 
 | assertFalse(has(o, Math.pow(2,30)-1), "delete 2^30-1"); | 
 | assertFalse(has(o, Math.pow(2,31)-1), "delete 2^31-1"); | 
 |  | 
 |  | 
 | var a = []; | 
 | a[Math.pow(2,30)-1] = 0; | 
 | a[Math.pow(2,31)-1] = 0; | 
 | a[1] = 0; | 
 | assertTrue(delete a[0]); | 
 | assertTrue(delete a[Math.pow(2,30)]); | 
 | assertFalse(has(a, 0), "delete 0"); | 
 | assertFalse(has(a, Math.pow(2,30)), "delete 2^30"); | 
 | assertTrue(has(a, 1)); | 
 | assertTrue(has(a, Math.pow(2,30)-1)); | 
 | assertTrue(has(a, Math.pow(2,31)-1)); | 
 | assertEquals(Math.pow(2,31), a.length); | 
 |  | 
 | assertTrue(delete a[Math.pow(2,30)-1]); | 
 | assertTrue(has(a, 1)); | 
 | assertFalse(has(a, Math.pow(2,30)-1), "delete 2^30-1"); | 
 | assertTrue(has(a, Math.pow(2,31)-1)); | 
 | assertEquals(Math.pow(2,31), a.length); | 
 |  | 
 | assertTrue(delete a[1]); | 
 | assertFalse(has(a, 1), "delete 1"); | 
 | assertFalse(has(a, Math.pow(2,30)-1), "delete 2^30-1"); | 
 | assertTrue(has(a, Math.pow(2,31)-1)); | 
 | assertEquals(Math.pow(2,31), a.length); | 
 |  | 
 | assertTrue(delete a[Math.pow(2,31)-1]); | 
 | assertFalse(has(a, 1), "delete 1"); | 
 | assertFalse(has(a, Math.pow(2,30)-1), "delete 2^30-1"); | 
 | assertFalse(has(a, Math.pow(2,31)-1), "delete 2^31-1"); | 
 | assertEquals(Math.pow(2,31), a.length); | 
 |  | 
 | // Check that a LoadIC for a dictionary field works, even | 
 | // when the dictionary probe misses. | 
 | function load_deleted_property_using_IC() { | 
 |   var x = new Object(); | 
 |   x.a = 3; | 
 |   x.b = 4; | 
 |   x.c = 5; | 
 |  | 
 |   delete x.c; | 
 |   assertEquals(3, load_a(x)); | 
 |   assertEquals(3, load_a(x)); | 
 |   delete x.a; | 
 |   assertTrue(typeof load_a(x) === 'undefined', "x.a is gone"); | 
 |   assertTrue(typeof load_a(x) === 'undefined', "x.a is gone"); | 
 | } | 
 |  | 
 | function load_a(x) { | 
 |   return x.a; | 
 | } | 
 |  | 
 | load_deleted_property_using_IC(); | 
 |  | 
 |  | 
 | (function deleteLargeDoubleArrayAtEnd() { | 
 |   var o = {}; | 
 |   var max = 100000; | 
 |   for (var i = 0; i <= max; i++) { | 
 |     o[i] = 1.1; | 
 |   } | 
 |   delete o[max]; | 
 |   for (var i = 0; i < max; i++) { | 
 |     assertEquals(1.1, o[i]); | 
 |   } | 
 |   assertEquals(undefined, o[max]); | 
 | })(); |