1589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// Copyright 2011 the V8 project authors. All rights reserved.
2589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// Redistribution and use in source and binary forms, with or without
3589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// modification, are permitted provided that the following conditions are
4589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// met:
5589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch//
6589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch//     * Redistributions of source code must retain the above copyright
7589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch//       notice, this list of conditions and the following disclaimer.
8589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch//     * Redistributions in binary form must reproduce the above
9589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch//       copyright notice, this list of conditions and the following
10589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch//       disclaimer in the documentation and/or other materials provided
11589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch//       with the distribution.
12589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch//     * Neither the name of Google Inc. nor the names of its
13589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch//       contributors may be used to endorse or promote products derived
14589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch//       from this software without specific prior written permission.
15589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch//
16589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Flags: --harmony-scoping
293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// TODO(ES6): properly activate extended mode
313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch"use strict";
32589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
33589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// We want to test the context chain shape.  In each of the tests cases
34589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// below, the outer with is to force a runtime lookup of the identifier 'x'
35589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// to actually verify that the inner context has been discarded.  A static
36589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// lookup of 'x' might accidentally succeed.
37589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
38589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch{
39589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  let x = 2;
40589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  L: {
41589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    let x = 3;
42589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    assertEquals(3, x);
43589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    break L;
44589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    assertTrue(false);
45589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  }
46589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  assertEquals(2, x);
47589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}
48589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
49589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochdo {
50589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  let x = 4;
51589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  assertEquals(4,x);
52589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  {
53589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    let x = 5;
54589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    assertEquals(5, x);
55589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    continue;
56589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    assertTrue(false);
57589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  }
58589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} while (false);
59589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
60589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochvar caught = false;
61589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochtry {
62589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  {
63589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    let xx = 18;
64589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    throw 25;
65589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    assertTrue(false);
66589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  }
67589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} catch (e) {
68589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  caught = true;
69589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  assertEquals(25, e);
703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  (function () {
71589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    try {
72589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch      // NOTE: This checks that the block scope containing xx has been
73589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch      // removed from the context chain.
743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      eval('xx');
75589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch      assertTrue(false);  // should not reach here
76589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    } catch (e2) {
77589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch      assertTrue(e2 instanceof ReferenceError);
78589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    }
793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  })();
80589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}
81589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochassertTrue(caught);
82589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
83589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch(function(x) {
85589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  label: {
86589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    let x = 'inner';
87589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    break label;
88589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  }
893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertEquals('outer', eval('x'));
903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch})('outer');
91589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
92589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch(function(x) {
94589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  label: {
95589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    let x = 'middle';
96589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    {
97589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch      let x = 'inner';
98589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch      break label;
99589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    }
100589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  }
1013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertEquals('outer', eval('x'));
1023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch})('outer');
103589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
104589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
1053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch(function(x) {
106589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  for (var i = 0; i < 10; ++i) {
107589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    let x = 'inner' + i;
108589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    continue;
109589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  }
1103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertEquals('outer', eval('x'));
1113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch})('outer');
112589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
113589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
1143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch(function(x) {
115589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  label: for (var i = 0; i < 10; ++i) {
116589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    let x = 'middle' + i;
117589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    for (var j = 0; j < 10; ++j) {
118589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch      let x = 'inner' + j;
119589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch      continue label;
120589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    }
121589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  }
1223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertEquals('outer', eval('x'));
1233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch})('outer');
124589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
125589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
1263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch(function(x) {
127589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  try {
128589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    let x = 'inner';
129589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    throw 0;
130589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  } catch (e) {
1313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    assertEquals('outer', eval('x'));
132589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  }
1333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch})('outer');
134589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
135589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
1363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch(function(x) {
137589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  try {
138589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    let x = 'middle';
139589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    {
140589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch      let x = 'inner';
141589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch      throw 0;
142589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    }
143589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  } catch (e) {
1443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    assertEquals('outer', eval('x'));
145589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  }
1463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch})('outer');
147589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
148589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
149589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochtry {
1503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  (function(x) {
151589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    try {
152589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch      let x = 'inner';
153589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch      throw 0;
154589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    } finally {
1553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      assertEquals('outer', eval('x'));
156589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    }
1573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  })('outer');
158589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} catch (e) {
159589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  if (e instanceof MjsUnitAssertionError) throw e;
160589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}
161589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
162589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
163589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochtry {
1643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  (function(x) {
165589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    try {
166589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch      let x = 'middle';
167589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch      {
168589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch        let x = 'inner';
169589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch        throw 0;
170589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch      }
171589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    } finally {
1723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      assertEquals('outer', eval('x'));
173589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    }
1743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  })('outer');
175589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} catch (e) {
176589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  if (e instanceof MjsUnitAssertionError) throw e;
177589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}
178589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
179589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
180589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// Verify that the context is correctly set in the stack frame after exiting
181589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// from with.
182589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochfunction f() {}
183589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
1843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch(function(x) {
185589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  label: {
186589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    let x = 'inner';
187589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    break label;
188589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  }
189589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  f();  // The context could be restored from the stack after the call.
1903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertEquals('outer', eval('x'));
1913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch})('outer');
192589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
193589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
1943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch(function(x) {
195589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  for (var i = 0; i < 10; ++i) {
196589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    let x = 'inner';
197589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    continue;
198589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  }
199589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  f();
2003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertEquals('outer', eval('x'));
2013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch})('outer');
202589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
203589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
2043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch(function(x) {
205589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  try {
206589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    let x = 'inner';
207589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    throw 0;
208589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  } catch (e) {
209589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    f();
2103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    assertEquals('outer', eval('x'));
211589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  }
2123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch})('outer');
213589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
214589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
215589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochtry {
2163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  (function(x) {
217589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    try {
218589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch      let x = 'inner';
219589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch      throw 0;
220589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    } finally {
221589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch      f();
2223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      assertEquals('outer', eval('x'));
223589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    }
2243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  })('outer');
225589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} catch (e) {
226589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  if (e instanceof MjsUnitAssertionError) throw e;
227589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}
228