Remove support for labels as immediate children of IF/ELSE/WHILE/FOR/DO.

This extremely uncommon coding pattern was becoming a hell to support. It has caused many bugs in past that need them being treated as special cases.

Getting rid of the possibility entirely seems like the best approach.

It's still supported if the code is not to be optimized (e.g. with --pretty).
This commit is contained in:
Sei Lisa 2018-04-01 20:05:35 +02:00
parent 27698a92ef
commit 6ef4c03994
2 changed files with 16 additions and 0 deletions

View file

@ -24,6 +24,7 @@ from lslfuncs import ZERO_VECTOR, ZERO_ROTATION
import math import math
from lslfuncopt import OptimizeFunc, OptimizeArgs, FuncOptSetup from lslfuncopt import OptimizeFunc, OptimizeArgs, FuncOptSetup
# TODO: Remove special handling of @ within IF,WHILE,FOR,DO
class foldconst(object): class foldconst(object):

View file

@ -193,6 +193,13 @@ class EParseInvalidBackslash(EParse):
u"Preprocessor directive can't end in backslash." u"Preprocessor directive can't end in backslash."
u" Activate the preprocessor or put everything in the same line.") u" Activate the preprocessor or put everything in the same line.")
class EParseInvalidLabelOpt(EParse):
def __init__(self, parser):
super(EParseInvalidLabelOpt, self).__init__(parser,
u"When optimization is active, a label can't be the immediate"
u" child of a 'for', 'if', 'while' or 'do'. Disable optimization"
u" or rewrite the code in some other way.")
class EInternal(Exception): class EInternal(Exception):
"""This exception is a construct to allow a different function to cause an """This exception is a construct to allow a different function to cause an
immediate return of EOF from parser.GetToken(). immediate return of EOF from parser.GetToken().
@ -1688,6 +1695,8 @@ list lazy_list_set(list L, integer i, list v)
return nr(nt=';', t=None) return nr(nt=';', t=None)
if tok0 == '@': if tok0 == '@':
if not AllowDecl and self.forbidlabels:
raise EParseInvalidLabelOpt(self)
self.NextToken() self.NextToken()
self.expect('IDENT') self.expect('IDENT')
name = self.tok[1] name = self.tok[1]
@ -2762,6 +2771,12 @@ list lazy_list_set(list L, integer i, list v)
# Prettify a source file # Prettify a source file
self.prettify = 'prettify' in options self.prettify = 'prettify' in options
# We've decided to ditch support for optimization when the code
# includes a label as the immediate child of FOR, IF, DO or WHILE.
# If optimization is on, such a label will raise an error. That
# coding pattern is normally easy to work around anyway.
self.forbidlabels = 'optimize' in options
# Symbol table: # Symbol table:
# This is a list of all local and global symbol tables. # This is a list of all local and global symbol tables.
# The first element (0) is the global scope. Each symbol table is a # The first element (0) is the global scope. Each symbol table is a