1d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org// Copyright 2011 the V8 project authors. All rights reserved. 2d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org// Redistribution and use in source and binary forms, with or without 3d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org// modification, are permitted provided that the following conditions are 4d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org// met: 5d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org// 6d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org// * Redistributions of source code must retain the above copyright 7d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org// notice, this list of conditions and the following disclaimer. 8d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org// * Redistributions in binary form must reproduce the above 9d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org// copyright notice, this list of conditions and the following 10d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org// disclaimer in the documentation and/or other materials provided 11d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org// with the distribution. 12d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org// * Neither the name of Google Inc. nor the names of its 13d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org// contributors may be used to endorse or promote products derived 14d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org// from this software without specific prior written permission. 15d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org// 16d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org 28d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org// See: http://code.google.com/p/v8/issues/detail?id=1365 29d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org 30d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org// Check that builtin methods are passed undefined as the receiver 31d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org// when called as functions through variables. 32d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org 33d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org// Flags: --allow-natives-syntax 34d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org 35d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org// Global variable. 36d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgvar valueOf = Object.prototype.valueOf; 37d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgvar hasOwnProperty = Object.prototype.hasOwnProperty; 38d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org 39d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgfunction callGlobalValueOf() { valueOf(); } 40d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgfunction callGlobalHasOwnProperty() { valueOf(); } 41d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org 42d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgassertEquals(Object.prototype, Object.prototype.valueOf()); 43d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgassertThrows(callGlobalValueOf); 44d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgassertThrows(callGlobalHasOwnProperty); 45d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org 46d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org%OptimizeFunctionOnNextCall(Object.prototype.valueOf); 47d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgObject.prototype.valueOf(); 48d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org 49d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgassertEquals(Object.prototype, Object.prototype.valueOf()); 50d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgassertThrows(callGlobalValueOf); 51d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgassertThrows(callGlobalHasOwnProperty); 52d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org 53d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgfunction CheckExceptionCallLocal() { 54d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org var valueOf = Object.prototype.valueOf; 55d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org var hasOwnProperty = Object.prototype.hasOwnProperty; 56d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org var exception = false; 57d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org try { valueOf(); } catch(e) { exception = true; } 58d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org assertTrue(exception); 59d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org exception = false; 60d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org try { hasOwnProperty(); } catch(e) { exception = true; } 61d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org assertTrue(exception); 62d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org} 63d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgCheckExceptionCallLocal(); 64d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org 65d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgfunction CheckExceptionCallParameter(f) { 66d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org var exception = false; 67d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org try { f(); } catch(e) { exception = true; } 68d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org assertTrue(exception); 69d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org} 70d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgCheckExceptionCallParameter(Object.prototype.valueOf); 71d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgCheckExceptionCallParameter(Object.prototype.hasOwnProperty); 72d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org 73d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgfunction CheckPotentiallyShadowedByEval() { 74d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org var exception = false; 75d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org try { 76d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org eval("hasOwnProperty('x')"); 77d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org } catch(e) { 78d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org exception = true; 79d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org } 80d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org assertTrue(exception); 81d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org} 82d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgCheckPotentiallyShadowedByEval(); 83