// Copyright 2015 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // See: http://code.google.com/p/v8/issues/detail?id=3926 // Switch statements should disable hole check elimination // Ensure that both reads and writes encounter the hole check // FullCodeGen had an issue on reads; TurboFan had an issue on writes function f(x) { var z; switch (x) { case 1: let y = 1; case 2: y = 2; case 3: z = y; } return z; } assertEquals(2, f(1)); assertThrows(function() {f(2)}, ReferenceError); assertThrows(function() {f(3)}, ReferenceError); // Ensure that hole checks are done even in subordinate scopes assertThrows(function() { switch (1) { case 0: let x = 2; case 1: { // this block, plus the let below, adds another linear lexical scope let y = 3; x; } } }, ReferenceError); // Ensure that inner functions and eval don't skip hole checks function g(x) { switch (x) { case 1: let z; case 2: return function() { z = 1; } case 3: return function() { return z; } case 4: return eval("z = 1"); case 5: return eval("z"); } } assertEquals(undefined, g(1)()); assertThrows(g(2), ReferenceError); assertThrows(g(3), ReferenceError); assertThrows(function () {g(4)}, ReferenceError); assertThrows(function () {g(5)}, ReferenceError); // Ensure the same in strict mode, with different eval and function semantics function h(x) { 'use strict' switch (x) { case 1: let z; case 2: return function() { z = 1; } case 3: return function() { return z; } case 4: return eval("z = 1"); case 5: return eval("z"); } } assertEquals(undefined, h(1)()); assertThrows(h(2), ReferenceError); assertThrows(h(3), ReferenceError); assertThrows(function () {h(4)}, ReferenceError); assertThrows(function () {h(5)}, ReferenceError);