mirror of
https://github.com/Sei-Lisa/LSL-PyOptimizer
synced 2025-07-01 15:48:21 +00:00
Fix inlining of functions in conditions in DO loops
This commit is contained in:
parent
47a324f4a6
commit
55cb941234
1 changed files with 43 additions and 2 deletions
|
@ -318,7 +318,33 @@ class inliner(object):
|
||||||
# }
|
# }
|
||||||
#
|
#
|
||||||
# The for loop is similar, but the initializer and iterator must be
|
# The for loop is similar, but the initializer and iterator must be
|
||||||
# expanded as well, to convert it to a while loop.
|
# expanded as well, to convert it to a while loop. When expanding the
|
||||||
|
# iterator, care must be taken to avoid name clashes. For example:
|
||||||
|
#
|
||||||
|
# for (i = 0; f(i); i++)
|
||||||
|
# {
|
||||||
|
# integer i;
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# should be expanded to:
|
||||||
|
#
|
||||||
|
# i = 0;
|
||||||
|
# @loop_label;
|
||||||
|
# integer ___ret__00001;
|
||||||
|
# {
|
||||||
|
# llOwnerSay("body of f");
|
||||||
|
# ___ret__00001 = 1,
|
||||||
|
# }
|
||||||
|
# if (___ret__00001)
|
||||||
|
# {
|
||||||
|
# {
|
||||||
|
# integer i;
|
||||||
|
# }
|
||||||
|
# i++;
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# The extra {} inside the 'if' are needed to protect the iterator from
|
||||||
|
# being affected by the variables defined in the inner block.
|
||||||
#
|
#
|
||||||
# Do loops are different:
|
# Do loops are different:
|
||||||
#
|
#
|
||||||
|
@ -334,7 +360,7 @@ class inliner(object):
|
||||||
# llOwnerSay("doing stuff");
|
# llOwnerSay("doing stuff");
|
||||||
# {
|
# {
|
||||||
# llOwnerSay("body_of_f");
|
# llOwnerSay("body_of_f");
|
||||||
# __ret__00001 = 1;
|
# ___ret__00001 = 1;
|
||||||
# }
|
# }
|
||||||
# }
|
# }
|
||||||
# while (___ret__00001);
|
# while (___ret__00001);
|
||||||
|
@ -343,6 +369,21 @@ class inliner(object):
|
||||||
elif nt == 'DO':
|
elif nt == 'DO':
|
||||||
self.RecurseSingleStatement(child, 0, scope)
|
self.RecurseSingleStatement(child, 0, scope)
|
||||||
fns = self.RecurseExpression(child, 1, scope)
|
fns = self.RecurseExpression(child, 1, scope)
|
||||||
|
if fns:
|
||||||
|
# Need to do some plumbing to move the bodies into the loop
|
||||||
|
i = 0;
|
||||||
|
while i < len(fns):
|
||||||
|
if fns[i].nt != 'DECL':
|
||||||
|
assert fns[i].nt in ('{}', '@')
|
||||||
|
# All bodies must be moved inside the loop
|
||||||
|
if child[0].nt != '{}':
|
||||||
|
# Needs wrapping now
|
||||||
|
child[0] = nr(nt='{}', t=None, ch=[child[0]],
|
||||||
|
scope=len(self.symtab))
|
||||||
|
self.symtab.append({})
|
||||||
|
child[0].ch.append(fns.pop(i))
|
||||||
|
else:
|
||||||
|
i += 1
|
||||||
|
|
||||||
elif nt == 'WHILE':
|
elif nt == 'WHILE':
|
||||||
fns = self.RecurseExpression(child, 0, scope)
|
fns = self.RecurseExpression(child, 0, scope)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue