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