1257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Copyright 2011 the V8 project authors. All rights reserved. 2257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Redistribution and use in source and binary forms, with or without 3257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// modification, are permitted provided that the following conditions are 4257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// met: 5257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// 6257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// * Redistributions of source code must retain the above copyright 7257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// notice, this list of conditions and the following disclaimer. 8257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// * Redistributions in binary form must reproduce the above 9257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// copyright notice, this list of conditions and the following 10257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// disclaimer in the documentation and/or other materials provided 11257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// with the distribution. 12257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// * Neither the name of Google Inc. nor the names of its 13257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// contributors may be used to endorse or promote products derived 14257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// from this software without specific prior written permission. 15257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// 16257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 28257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Flags: --allow-natives-syntax 29257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 30257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvar y = 3; 31257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 32257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfunction get_y() { return this.y; } 33257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfunction strict_get_y() { "use strict"; return this.y; } 34257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 35257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Test calls to strict mode function as methods. 36257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfor (var i = 0; i < 10; i++) assertEquals(3, strict_get_y.call(this)); 37257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvar o = { y: 42 }; 38257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfor (var i = 0; i < 10; i++) assertEquals(42, strict_get_y.call(o)); 39257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 40257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Test calls to strict mode function with implicit receiver. 41257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfunction g() { 42257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch var exception = false; 43257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch try { strict_get_y(); } catch(e) { exception = true; } 44257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch assertTrue(exception); 45257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 46257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfor (var i = 0; i < 3; i++) g(); 47257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 48257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Test calls to local strict mode function with implicit receiver. 49257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfunction local_function_test() { 50257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch function get_y() { return this.y; } 51257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch function strict_get_y() { "use strict"; return this.y; } 52257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch assertEquals(3, get_y()); 53257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch assertEquals(3, get_y(23)); 54257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch var exception = false; 55257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch try { 56257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch strict_get_y(); 57257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } catch(e) { 58257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch exception = true; 59257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 60257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch assertTrue(exception); 61257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 62257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 63257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfor (var i = 0; i < 10; i++) { 64257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch local_function_test(); 65257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 66257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 67257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Test call to catch variable strict-mode function. Implicit 68257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// receiver. 69257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvar exception = false; 70257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochtry { 71257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch throw strict_get_y; 72257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} catch(f) { 73257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch try { 74257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch f(); 75257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } catch(e) { 76257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch exception = true; 77257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 78257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch assertTrue(exception); 79257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 80257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 81257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 82257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Test calls to strict-mode function with the object from a with 83257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// statement as the receiver. 84257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochwith(this) { 85257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch assertEquals(3, strict_get_y()); 86257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch assertEquals(3, strict_get_y(32)); 87257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 88257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 89257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvar o = { y: 27 }; 90257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdocho.f = strict_get_y; 91257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochwith(o) { 92257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch assertEquals(27, f()); 93257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch assertEquals(27, f(23)); 94257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 95257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 96257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 97257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Check calls to eval within a function with 'undefined' as receiver. 98257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfunction implicit_receiver_eval() { 99257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch "use strict"; 100257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return eval("this"); 101257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 102257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 103257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochassertEquals(void 0, implicit_receiver_eval()); 104257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochassertEquals(void 0, implicit_receiver_eval(32)); 105257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 106257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 107257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Strict mode function to get inlined. 108257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfunction strict_return_receiver() { 109257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch "use strict"; 110257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return this; 111257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 112257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 113257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Inline with implicit receiver. 114257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfunction g() { 115257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return strict_return_receiver(); 116257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 117257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 118257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfor (var i = 0; i < 5; i++) { 119257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch assertEquals(void 0, g()); 120257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch assertEquals(void 0, g(42)); 121257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 122257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch%OptimizeFunctionOnNextCall(g); 123257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochassertEquals(void 0, g(42)); 124257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochassertEquals(void 0, g()); 125257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 126257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Inline with explicit receiver. 127257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfunction g2() { 128257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch var o = {}; 129257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch o.f = strict_return_receiver; 130257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return o.f(); 131257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 132257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 133257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfor (var i = 0; i < 5; i++) { 134257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch assertTrue(typeof g2() == "object"); 135257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch assertTrue(typeof g2(42) == "object"); 136257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 137257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch%OptimizeFunctionOnNextCall(g2); 138257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochassertTrue(typeof g2() == "object"); 139257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochassertTrue(typeof g2(42) == "object"); 140257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 141257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Test calls of aliased eval. 142257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfunction outer_eval_receiver() { 143257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch var eval = function() { return this; } 144257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch function inner_strict() { 145257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch "use strict"; 146257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch assertEquals('object', typeof eval()); 147257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 148257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch inner_strict(); 149257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 150257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochouter_eval_receiver(); 151257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 152257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfunction outer_eval_conversion3(eval, expected) { 153257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch function inner_strict() { 154257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch "use strict"; 155257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch var x = eval("this"); 156257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch assertEquals(expected, typeof x); 157257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 158257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch inner_strict(); 159257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 160257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 161257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfunction strict_return_this() { "use strict"; return this; } 162257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfunction return_this() { return this; } 163257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfunction strict_eval(s) { "use strict"; return eval(s); } 164257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfunction non_strict_eval(s) { return eval(s); } 165257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 166257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochouter_eval_conversion3(strict_return_this, 'undefined'); 167257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochouter_eval_conversion3(return_this, 'object'); 168257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochouter_eval_conversion3(strict_eval, 'undefined'); 169257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochouter_eval_conversion3(non_strict_eval, 'object'); 170257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochouter_eval_conversion3(eval, 'undefined'); 172257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 173257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfunction test_constant_function() { 174257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch var o = { f: function() { "use strict"; return this; } }; 175257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch this.__proto__ = o; 176257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch for (var i = 0; i < 10; i++) assertEquals(void 0, f()); 177257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 178257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochtest_constant_function(); 179257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 180257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochfunction test_field() { 181257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch var o = { }; 182257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch o.f = function() {}; 183257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch o.f = function() { "use strict"; return this; }; 184257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch this.__proto__ = o; 185257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch for (var i = 0; i < 10; i++) assertEquals(void 0, f()); 186257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 187257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochtest_field(); 188