11e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// Copyright 2013 the V8 project authors. All rights reserved. 21e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// Redistribution and use in source and binary forms, with or without 31e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// modification, are permitted provided that the following conditions are 41e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// met: 51e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// 61e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// * Redistributions of source code must retain the above copyright 71e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// notice, this list of conditions and the following disclaimer. 81e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// * Redistributions in binary form must reproduce the above 91e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// copyright notice, this list of conditions and the following 101e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// disclaimer in the documentation and/or other materials provided 111e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// with the distribution. 121e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// * Neither the name of Google Inc. nor the names of its 131e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// contributors may be used to endorse or promote products derived 141e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// from this software without specific prior written permission. 151e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// 161e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 171e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 181e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 191e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 201e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 211e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 221e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 231e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 241e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 251e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 261e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 271e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 281e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// In the assertions but the first, the ES5 spec actually requires 0, but 291e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// that is arguably a spec bug, and other browsers return 1 like us. 301e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// In ES6, all of those will presumably result in a ReferenceError. 311e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// Our main concern with this test is that we do not crash, though. 321e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 331e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgfunction f1() { 341e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org var XXX = 0 351e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org try { throw 1 } catch (XXX) { 361e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org eval("var h = function() { return XXX }") 371e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 381e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org return h() 391e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org} 401e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgassertEquals(1, f1()) 411e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 421e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgfunction f2() { 431e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org var XXX = 0 441e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org try { throw 1 } catch (XXX) { 451e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org eval("function h(){ return XXX }") 461e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 471e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org return h() 481e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org} 491e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgassertEquals(1, f2()) 501e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 511e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgfunction f3() { 521e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org var XXX = 0 531e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org try { throw 1 } catch (XXX) { 541e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org try { throw 2 } catch (y) { 551e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org eval("function h(){ return XXX }") 561e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 571e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 581e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org return h() 591e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org} 601e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgassertEquals(1, f3()) 611e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 621e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgfunction f4() { 631e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org var XXX = 0 641e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org try { throw 1 } catch (XXX) { 651e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org with ({}) { 661e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org eval("function h(){ return XXX }") 671e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 681e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 691e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org return h() 701e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org} 711e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgassertEquals(1, f4()) 721e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 731e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgfunction f5() { 741e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org var XXX = 0 751e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org try { throw 1 } catch (XXX) { 761e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org eval('eval("function h(){ return XXX }")') 771e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 781e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org return h() 791e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org} 801e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgassertEquals(1, f5()) 811e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 821e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgfunction f6() { 831e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org var XXX = 0 841e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org try { throw 1 } catch (XXX) { 851e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org eval("var h = (function() { function g(){ return XXX } return g })()") 861e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 871e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org return h() 881e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org} 891e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgassertEquals(1, f6()) 901e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 911e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgfunction f7() { 921e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org var XXX = 0 931e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org try { throw 1 } catch (XXX) { 941e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org eval("function h() { var XXX=2; function g(){ return XXX } return g }") 951e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 961e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org return h()() 971e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org} 981e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgassertEquals(2, f7()) // ! 991e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 1001e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgvar XXX = 0 1011e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgtry { throw 1 } catch (XXX) { 1021e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org eval("function h(){ return XXX }") 1031e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org} 1041e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgassertEquals(1, h()) 105