14a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// Copyright 2010 the V8 project authors. All rights reserved. 24a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// Redistribution and use in source and binary forms, with or without 34a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// modification, are permitted provided that the following conditions are 44a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// met: 54a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// 64a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// * Redistributions of source code must retain the above copyright 74a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// notice, this list of conditions and the following disclaimer. 84a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// * Redistributions in binary form must reproduce the above 94a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// copyright notice, this list of conditions and the following 104a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// disclaimer in the documentation and/or other materials provided 114a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// with the distribution. 124a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// * Neither the name of Google Inc. nor the names of its 134a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// contributors may be used to endorse or promote products derived 144a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// from this software without specific prior written permission. 154a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// 164a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 174a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 184a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 194a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 204a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 214a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 224a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 234a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 244a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 254a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 264a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 274a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org 284a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// Whenever we enter a with-scope, we copy the context. This in itself is fine 294a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// (contexts may escape), but when leaving a with-scope, we currently also copy 304a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// the context instead of reverting to the original. This does not work because 314a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// inner functions may already have been created using the original context. In 324a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// the failing test case below, the inner function is run in the original context 334a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// (where x is undefined), but the assignment to x after the with-statement is 344a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// run in the copied context: 354a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org 364a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// RegExp caching doesn't set lastIndex correctly. 374a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// See http://code.google.com/p/chromium/issues/detail?id=52801 384a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org 394a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.orgvar re = /a/g; 404a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org 414a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.orgvar str = "bbbbabbbbabbbb"; 424a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org 434a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// Test 444a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org 454a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.orgre.test(str); 464a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.orgassertEquals(5, re.lastIndex); 474a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org 484a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.orgre.lastIndex = 0; 494a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.orgre.test(str); 504a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.orgassertEquals(5, re.lastIndex); // Fails if caching. 514a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org 524a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.orgre.lastIndex = 0; 534a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.orgre.test(str); 544a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.orgassertEquals(5, re.lastIndex); // Fails if caching. 554a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org 564a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// Exec 574a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org 584a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.orgre = /a/g; 594a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org 604a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.orgre.exec(str); 614a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.orgassertEquals(5, re.lastIndex); 624a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org 634a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.orgre.lastIndex = 0; 644a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.orgre.exec(str); 654a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.orgassertEquals(5, re.lastIndex); // Fails if caching. 664a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org 674a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.orgre.lastIndex = 0; 684a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.orgre.exec(str); 694a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.orgassertEquals(5, re.lastIndex); // Fails if caching. 70