• littledan's avatar
    Ensure hole checks take place in switch statement scopes · d6fb6de7
    littledan authored
    Switch statements introduce their own scope for cases, but this scope
    is not necessarily executed in order, as the following function shows:
    
      switch (x) {
        case 1:
          let y = 1;
        case 2:
          y = 2;
        case 3:
          print(y);
      }
    
    If x = 2 or x = 3, the code should throw a ReferenceError. However,
    FullCodeGen's hole check elimination used the simple algorithm of
    assuming that if the initializer was in the same scope, then it was
    reached before the use, and therefore the hole check could be
    eliminated.
    
    This patch adds an extra bit to scopes, to track if they may
    nonlinearly. The parser marks the scope that switch introduces as
    nonlinear. FullCodeGen does not eliminate the hole check from
    a scope which is nonlinear. This patch refactors FullCodeGen to
    put the hole check elimination in one place, rather than in each
    backend.
    
    BUG=v8:3926
    LOG=Y
    R=adamk
    
    Review URL: https://codereview.chromium.org/1312613003
    
    Cr-Commit-Position: refs/heads/master@{#30453}
    d6fb6de7
regress-3926.js 2 KB