Add broken FS switch behaviour for compatibility.
In the absence of a 'default' label within a switch, FS falls through to the first CASE label (or to the code before the first CASE if there's any). This commit adds an option, active by default for FS compatibility, that mimics this broken behaviour, as well as a warning in case the 'default' label is absent, which also triggers another warning when the option is active.
This commit is contained in:
@@ -1674,10 +1674,15 @@ list lazy_list_set(list L, integer i, list v)
|
||||
]})
|
||||
|
||||
if switchcasedefault is None:
|
||||
switchcasedefault = brk
|
||||
self.breakstack[-1][2] = True
|
||||
prelude.append({'nt':'JUMP', 't':None, 'name':switchcasedefault,
|
||||
'scope':blkscope})
|
||||
warning("No 'default:' label in switch statement")
|
||||
if self.brokennodefault:
|
||||
warning("Broken behaviour active - falling through")
|
||||
if not self.brokennodefault:
|
||||
switchcasedefault = brk
|
||||
self.breakstack[-1][2] = True
|
||||
if switchcasedefault is not None:
|
||||
prelude.append({'nt':'JUMP', 't':None, 'name':switchcasedefault,
|
||||
'scope':blkscope})
|
||||
last = self.breakstack.pop()
|
||||
if last[2]:
|
||||
blk.append({'nt':'@', 'name':brk, 'scope':blkscope})
|
||||
@@ -2311,6 +2316,9 @@ list lazy_list_set(list L, integer i, list v)
|
||||
if self.enableswitch:
|
||||
self.keywords |= frozenset(('switch', 'case', 'break'))
|
||||
|
||||
# Broken behaviour in the absence of a default: label in a switch stmt.
|
||||
self.brokennodefault = 'brokennodefault' in options
|
||||
|
||||
# Allow brackets for assignment of list elements e.g. mylist[5]=4
|
||||
self.lazylists = 'lazylists' in options
|
||||
|
||||
|
||||
7
main.py
7
main.py
@@ -228,6 +228,11 @@ Optimizer options (+ means active by default, - means inactive by default):
|
||||
will go to the last label with that name). This flag
|
||||
works around that limitation by replacing the names of
|
||||
the labels in the output with unique ones.
|
||||
brokennodefault + Mimic Firestorm's legacy broken behaviour when the
|
||||
'default' label in a switch statement is absent. Rather
|
||||
than jumping to the end of the switch in that case
|
||||
(which is how it behaves when this option is not set),
|
||||
it falls through and executes the first 'case' label.
|
||||
|
||||
Deprecated / compatibility syntax extensions options:
|
||||
|
||||
@@ -300,7 +305,7 @@ def main():
|
||||
# Default options
|
||||
options = set(('extendedglobalexpr','extendedtypecast','extendedassignment',
|
||||
'allowkeyconcat','allowmultistrings','skippreproc','optimize',
|
||||
'optsigns','optfloats','constfold','dcr'
|
||||
'optsigns','optfloats','constfold','dcr', 'brokennodefault',
|
||||
))
|
||||
|
||||
try:
|
||||
|
||||
Reference in New Issue
Block a user