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