DescriptionEnsure hole checks take place in switch statement scopes
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
Committed: https://crrev.com/d6fb6de7097da908fd0a66804027ea189b559c0f
Cr-Commit-Position: refs/heads/master@{#30453}
Patch Set 1 #Patch Set 2 : skip on TF; roll back arrows #
Total comments: 16
Patch Set 3 : Changes based on review #
Total comments: 8
Patch Set 4 : style fixes #
Total comments: 9
Patch Set 5 : Reorder methods #Patch Set 6 : comment and tests #Patch Set 7 : Rename function and add sloppy mode tests #
Messages
Total messages: 51 (19 generated)
|