mirror of
https://github.com/Sei-Lisa/LSL-PyOptimizer
synced 2025-07-01 23:58:20 +00:00
Warn about float constants that can't be represented in globals. Also don't duplicate the globals warnings.
This commit is contained in:
parent
c1d837674c
commit
59cdd64228
2 changed files with 16 additions and 7 deletions
|
@ -18,6 +18,7 @@
|
||||||
# Constant folding and simplification of expressions and statements.
|
# Constant folding and simplification of expressions and statements.
|
||||||
|
|
||||||
import lslfuncs
|
import lslfuncs
|
||||||
|
import math
|
||||||
from lslparse import warning
|
from lslparse import warning
|
||||||
|
|
||||||
class foldconst(object):
|
class foldconst(object):
|
||||||
|
@ -1041,17 +1042,25 @@ class foldconst(object):
|
||||||
assert False, 'Internal error: This should not happen, node type = ' \
|
assert False, 'Internal error: This should not happen, node type = ' \
|
||||||
+ nt # pragma: no cover
|
+ nt # pragma: no cover
|
||||||
|
|
||||||
|
def IsValidGlobalIdOrConst(self, node):
|
||||||
|
# inf and nan can't be represented as a simple constant
|
||||||
|
return not (node['nt'] == 'CONST' and node['t'] == 'float'
|
||||||
|
and (math.isinf(node['value'])
|
||||||
|
or math.isnan(node['value'])))
|
||||||
|
|
||||||
def IsValidGlobalConstant(self, decl):
|
def IsValidGlobalConstant(self, decl):
|
||||||
if 'ch' not in decl:
|
if 'ch' not in decl:
|
||||||
return True
|
return True
|
||||||
expr = decl['ch'][0]
|
expr = decl['ch'][0]
|
||||||
if expr['nt'] in ('CONST', 'IDENT'):
|
if expr['nt'] in ('CONST', 'IDENT'):
|
||||||
return True
|
return self.IsValidGlobalIdOrConst(expr)
|
||||||
if expr['nt'] not in ('VECTOR', 'ROTATION', 'LIST'):
|
if expr['nt'] not in ('VECTOR', 'ROTATION', 'LIST'):
|
||||||
return False
|
return False
|
||||||
return all(elem['nt'] in ('CONST', 'IDENT') for elem in expr['ch'])
|
return all(elem['nt'] in ('CONST', 'IDENT')
|
||||||
|
and self.IsValidGlobalIdOrConst(elem)
|
||||||
|
for elem in expr['ch'])
|
||||||
|
|
||||||
def FoldScript(self):
|
def FoldScript(self, warningpass = True):
|
||||||
"""Optimize the symbolic table symtab in place. Requires a table of
|
"""Optimize the symbolic table symtab in place. Requires a table of
|
||||||
predefined functions for folding constants.
|
predefined functions for folding constants.
|
||||||
"""
|
"""
|
||||||
|
@ -1066,7 +1075,7 @@ class foldconst(object):
|
||||||
self.globalmode = True
|
self.globalmode = True
|
||||||
self.FoldTree(tree, idx)
|
self.FoldTree(tree, idx)
|
||||||
self.globalmode = False
|
self.globalmode = False
|
||||||
if not self.IsValidGlobalConstant(tree[idx]):
|
if warningpass and not self.IsValidGlobalConstant(tree[idx]):
|
||||||
warning('Expression does not resolve to a single constant.')
|
warning('Expression does not resolve to a simple constant.')
|
||||||
else:
|
else:
|
||||||
self.FoldTree(tree, idx)
|
self.FoldTree(tree, idx)
|
||||||
|
|
|
@ -82,7 +82,7 @@ class optimizer(foldconst, renamer, deadcode):
|
||||||
self.globalmode = False
|
self.globalmode = False
|
||||||
|
|
||||||
if self.constfold:
|
if self.constfold:
|
||||||
self.FoldScript()
|
self.FoldScript(warningpass=False)
|
||||||
|
|
||||||
if self.dcr:
|
if self.dcr:
|
||||||
self.RemoveDeadCode()
|
self.RemoveDeadCode()
|
||||||
|
@ -90,7 +90,7 @@ class optimizer(foldconst, renamer, deadcode):
|
||||||
# Make another fold pass, since RemoveDeadCode can embed expressions
|
# Make another fold pass, since RemoveDeadCode can embed expressions
|
||||||
# into other expressions and generate unoptimized code.
|
# into other expressions and generate unoptimized code.
|
||||||
if self.constfold:
|
if self.constfold:
|
||||||
self.FoldScript()
|
self.FoldScript(warningpass=True)
|
||||||
|
|
||||||
if self.shrinknames:
|
if self.shrinknames:
|
||||||
self.ShrinkNames()
|
self.ShrinkNames()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue