| // Copyright 2013 the V8 project authors. All rights reserved. |
| // Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. |
| // |
| // Redistribution and use in source and binary forms, with or without |
| // modification, are permitted provided that the following conditions |
| // are met: |
| // 1. Redistributions of source code must retain the above copyright |
| // notice, this list of conditions and the following disclaimer. |
| // 2. 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. |
| // |
| // THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS 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 APPLE INC. OR ITS 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. |
| |
| description( |
| "This page tests for assertion failures in edge cases of property lookup on primitive values." |
| ); |
| |
| var didNotCrash = true; |
| |
| (function () { |
| delete String.prototype.constructor; |
| for (var i = 0; i < 3; ++i) |
| "".replace; |
| })(); |
| |
| (function () { |
| String.prototype.__proto__ = { x: 1, y: 1 }; |
| delete String.prototype.__proto__.x; |
| for (var i = 0; i < 3; ++i) |
| "".y; |
| })(); |
| |
| (function () { |
| function f(x) { |
| x.y; |
| } |
| |
| String.prototype.x = 1; |
| String.prototype.y = 1; |
| delete String.prototype.x; |
| |
| Number.prototype.x = 1; |
| Number.prototype.y = 1; |
| delete Number.prototype.x; |
| |
| for (var i = 0; i < 3; ++i) |
| f(""); |
| |
| for (var i = 0; i < 3; ++i) |
| f(.5); |
| })(); |
| |
| |
| var checkOkay; |
| |
| function checkGet(x, constructor) |
| { |
| checkOkay = false; |
| Object.defineProperty(constructor.prototype, "foo", { get: function() { checkOkay = typeof this === 'object'; }, configurable: true }); |
| x.foo; |
| delete constructor.prototype.foo; |
| return checkOkay; |
| } |
| |
| function checkSet(x, constructor) |
| { |
| checkOkay = false; |
| Object.defineProperty(constructor.prototype, "foo", { set: function() { checkOkay = typeof this === 'object'; }, configurable: true }); |
| x.foo = null; |
| delete constructor.prototype.foo; |
| return checkOkay; |
| } |
| |
| function checkGetStrict(x, constructor) |
| { |
| checkOkay = false; |
| Object.defineProperty(constructor.prototype, "foo", { get: function() { "use strict"; checkOkay = typeof this !== 'object'; }, configurable: true }); |
| x.foo; |
| delete constructor.prototype.foo; |
| return checkOkay; |
| } |
| |
| function checkSetStrict(x, constructor) |
| { |
| checkOkay = false; |
| Object.defineProperty(constructor.prototype, "foo", { set: function() { "use strict"; checkOkay = typeof this !== 'object'; }, configurable: true }); |
| x.foo = null; |
| delete constructor.prototype.foo; |
| return checkOkay; |
| } |
| |
| shouldBeTrue("checkGet(1, Number)"); |
| shouldBeTrue("checkGet('hello', String)"); |
| shouldBeTrue("checkGet(true, Boolean)"); |
| shouldBeTrue("checkSet(1, Number)"); |
| shouldBeTrue("checkSet('hello', String)"); |
| shouldBeTrue("checkSet(true, Boolean)"); |
| shouldBeTrue("checkGetStrict(1, Number)"); |
| shouldBeTrue("checkGetStrict('hello', String)"); |
| shouldBeTrue("checkGetStrict(true, Boolean)"); |
| shouldBeTrue("checkSetStrict(1, Number)"); |
| shouldBeTrue("checkSetStrict('hello', String)"); |
| shouldBeTrue("checkSetStrict(true, Boolean)"); |
| |
| function checkRead(x, constructor) |
| { |
| return x.foo === undefined; |
| } |
| |
| function checkWrite(x, constructor) |
| { |
| x.foo = null; |
| return x.foo === undefined; |
| } |
| |
| function checkReadStrict(x, constructor) |
| { |
| "use strict"; |
| return x.foo === undefined; |
| } |
| |
| function checkWriteStrict(x, constructor) |
| { |
| "use strict"; |
| x.foo = null; |
| return x.foo === undefined; |
| } |
| |
| shouldBeTrue("checkRead(1, Number)"); |
| shouldBeTrue("checkRead('hello', String)"); |
| shouldBeTrue("checkRead(true, Boolean)"); |
| shouldBeTrue("checkWrite(1, Number)"); |
| shouldBeTrue("checkWrite('hello', String)"); |
| shouldBeTrue("checkWrite(true, Boolean)"); |
| shouldBeTrue("checkReadStrict(1, Number)"); |
| shouldBeTrue("checkReadStrict('hello', String)"); |
| shouldBeTrue("checkReadStrict(true, Boolean)"); |
| shouldThrow("checkWriteStrict(1, Number)"); |
| shouldThrow("checkWriteStrict('hello', String)"); |
| shouldThrow("checkWriteStrict(true, Boolean)"); |
| |
| function checkNumericGet(x, constructor) |
| { |
| checkOkay = false; |
| Object.defineProperty(constructor.prototype, 42, { get: function() { checkOkay = typeof this === 'object'; }, configurable: true }); |
| x[42]; |
| delete constructor.prototype[42]; |
| return checkOkay; |
| } |
| |
| function checkNumericSet(x, constructor) |
| { |
| checkOkay = false; |
| Object.defineProperty(constructor.prototype, 42, { set: function() { checkOkay = typeof this === 'object'; }, configurable: true }); |
| x[42] = null; |
| delete constructor.prototype[42]; |
| return checkOkay; |
| } |
| |
| function checkNumericGetStrict(x, constructor) |
| { |
| checkOkay = false; |
| Object.defineProperty(constructor.prototype, 42, { get: function() { "use strict"; checkOkay = typeof this !== 'object'; }, configurable: true }); |
| x[42]; |
| delete constructor.prototype[42]; |
| return checkOkay; |
| } |
| |
| function checkNumericSetStrict(x, constructor) |
| { |
| checkOkay = false; |
| Object.defineProperty(constructor.prototype, 42, { set: function() { "use strict"; checkOkay = typeof this !== 'object'; }, configurable: true }); |
| x[42] = null; |
| delete constructor.prototype[42]; |
| return checkOkay; |
| } |
| |
| shouldBeTrue("checkNumericGet(1, Number)"); |
| shouldBeTrue("checkNumericGet('hello', String)"); |
| shouldBeTrue("checkNumericGet(true, Boolean)"); |
| shouldBeTrue("checkNumericSet(1, Number)"); |
| shouldBeTrue("checkNumericSet('hello', String)"); |
| shouldBeTrue("checkNumericSet(true, Boolean)"); |
| shouldBeTrue("checkNumericGetStrict(1, Number)"); |
| shouldBeTrue("checkNumericGetStrict('hello', String)"); |
| shouldBeTrue("checkNumericGetStrict(true, Boolean)"); |
| shouldBeTrue("checkNumericSetStrict(1, Number)"); |
| shouldBeTrue("checkNumericSetStrict('hello', String)"); |
| shouldBeTrue("checkNumericSetStrict(true, Boolean)"); |
| |
| function checkNumericRead(x, constructor) |
| { |
| return x[42] === undefined; |
| } |
| |
| function checkNumericWrite(x, constructor) |
| { |
| x[42] = null; |
| return x[42] === undefined; |
| } |
| |
| function checkNumericReadStrict(x, constructor) |
| { |
| "use strict"; |
| return x[42] === undefined; |
| } |
| |
| function checkNumericWriteStrict(x, constructor) |
| { |
| "use strict"; |
| x[42] = null; |
| return x[42] === undefined; |
| } |
| |
| shouldBeTrue("checkNumericRead(1, Number)"); |
| shouldBeTrue("checkNumericRead('hello', String)"); |
| shouldBeTrue("checkNumericRead(true, Boolean)"); |
| shouldBeTrue("checkNumericWrite(1, Number)"); |
| shouldBeTrue("checkNumericWrite('hello', String)"); |
| shouldBeTrue("checkNumericWrite(true, Boolean)"); |
| shouldBeTrue("checkNumericReadStrict(1, Number)"); |
| shouldBeTrue("checkNumericReadStrict('hello', String)"); |
| shouldBeTrue("checkNumericReadStrict(true, Boolean)"); |
| shouldThrow("checkNumericWriteStrict(1, Number)"); |
| shouldThrow("checkNumericWriteStrict('hello', String)"); |
| shouldThrow("checkNumericWriteStrict(true, Boolean)"); |
| |
| shouldBeTrue("didNotCrash"); |