mirror of
https://github.com/Sei-Lisa/LSL-PyOptimizer
synced 2025-07-01 23:58:20 +00:00
Finish inlining for all loop conditions
This commit is contained in:
parent
0ffe823c18
commit
c5fd4932f1
3 changed files with 81 additions and 8 deletions
|
@ -293,7 +293,8 @@ class inliner(object):
|
||||||
if len(child) > 2:
|
if len(child) > 2:
|
||||||
self.RecurseSingleStatement(child, 2, scope)
|
self.RecurseSingleStatement(child, 2, scope)
|
||||||
|
|
||||||
# TODO: Handle loops properly
|
# Loop handling is tricky.
|
||||||
|
#
|
||||||
# Consider this:
|
# Consider this:
|
||||||
#
|
#
|
||||||
# integer f()
|
# integer f()
|
||||||
|
@ -388,19 +389,47 @@ class inliner(object):
|
||||||
i += 1
|
i += 1
|
||||||
|
|
||||||
elif nt == 'WHILE':
|
elif nt == 'WHILE':
|
||||||
|
# Convert to if()
|
||||||
|
lbl = self.newId('whl', scope, {'Kind':'l','Scope':scope,'ref':1})
|
||||||
|
parent.insert(index, nr(nt='@', t=None, name=lbl, scope=scope))
|
||||||
|
index += 1
|
||||||
|
node.nt = 'IF'
|
||||||
|
if child[1].nt != '{}':
|
||||||
|
# Needs wrapping now
|
||||||
|
child[1] = nr(nt='{}', t=None, ch=[child[1]],
|
||||||
|
scope=self.newSymtab())
|
||||||
|
child[1].ch.append(nr(nt='JUMP', t=None, name=lbl, scope=scope))
|
||||||
fns = self.RecurseExpression(child, 0, scope)
|
fns = self.RecurseExpression(child, 0, scope)
|
||||||
self.RecurseSingleStatement(child, 1, scope)
|
self.RecurseSingleStatement(child, 1, scope)
|
||||||
|
|
||||||
elif nt == 'FOR':
|
elif nt == 'FOR':
|
||||||
assert child[0].nt == 'EXPRLIST'
|
assert child[0].nt == 'EXPRLIST'
|
||||||
assert child[2].nt == 'EXPRLIST'
|
assert child[2].nt == 'EXPRLIST'
|
||||||
fns = []
|
for i in child[0].ch:
|
||||||
for i in range(len(child[0].ch)):
|
parent.insert(index, nr(nt='EXPR', t=i.t, ch=[i]))
|
||||||
fns.extend(self.RecurseExpression(child[0].ch, i, scope))
|
fns = self.RecurseExpression(parent, index, scope)
|
||||||
fns.extend(self.RecurseExpression(child, 1, scope))
|
parent[index:index] = fns
|
||||||
for i in range(len(child[2].ch)):
|
index += 1 + len(fns)
|
||||||
fns.extend(self.RecurseExpression(child[2].ch, i, scope))
|
lbl = self.newId('for', scope, {'Kind':'l','Scope':scope,'ref':1})
|
||||||
self.RecurseSingleStatement(child, 3, scope)
|
parent.insert(index, nr(nt='@', t=None, name=lbl, scope=scope))
|
||||||
|
index += 1
|
||||||
|
node.nt = 'IF'
|
||||||
|
if child[3].nt != '{}':
|
||||||
|
# Needs wrapping now
|
||||||
|
child[3] = nr(nt='{}', t=None, ch=[child[3]],
|
||||||
|
scope=self.newSymtab())
|
||||||
|
# Needs another wrapping if iterator is not empty
|
||||||
|
if child[2].ch:
|
||||||
|
child[3] = nr(nt='{}', t=None, ch=[child[3]],
|
||||||
|
scope=self.newSymtab())
|
||||||
|
for i in child[2].ch:
|
||||||
|
child[3].ch.append(nr(nt='EXPR', t=i.t, ch=[i]))
|
||||||
|
del child[2]
|
||||||
|
del child[0]
|
||||||
|
child[1].ch.append(nr(nt='JUMP', t=None, name=lbl, scope=scope))
|
||||||
|
fns.extend(self.RecurseExpression(child, 0, scope))
|
||||||
|
self.RecurseSingleStatement(child, 1, scope)
|
||||||
|
#assert False, parent[index]
|
||||||
|
|
||||||
else:
|
else:
|
||||||
assert False, u"Unexpected node type: %s" % nt.decode('utf8')
|
assert False, u"Unexpected node type: %s" % nt.decode('utf8')
|
||||||
|
|
|
@ -18,7 +18,17 @@ vector f3(integer f3p1, string f3p2) inline
|
||||||
}
|
}
|
||||||
@x;
|
@x;
|
||||||
if (f3p2 != "") return <1,1,1>;
|
if (f3p2 != "") return <1,1,1>;
|
||||||
|
|
||||||
do ; while (f4());
|
do ; while (f4());
|
||||||
|
|
||||||
|
while (f4()) ;
|
||||||
|
|
||||||
|
for (f3p1=0; f4(); f3p1++, llDie())
|
||||||
|
{
|
||||||
|
integer f3p1 = llGetNumberOfPrims();
|
||||||
|
llOwnerSay((string)f3p1);
|
||||||
|
}
|
||||||
|
|
||||||
return <0,0,0>;
|
return <0,0,0>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -50,6 +50,40 @@ default
|
||||||
@___rtl__00006;
|
@___rtl__00006;
|
||||||
}
|
}
|
||||||
while (___ret__00002);
|
while (___ret__00002);
|
||||||
|
@___whl__00001;
|
||||||
|
integer ___ret__00003;
|
||||||
|
{
|
||||||
|
{
|
||||||
|
___ret__00003 = llGetLinkNumber();
|
||||||
|
jump ___rtl__00007;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@___rtl__00007;
|
||||||
|
if (___ret__00003)
|
||||||
|
{
|
||||||
|
;
|
||||||
|
jump ___whl__00001;
|
||||||
|
}
|
||||||
|
f3p1 = 0;
|
||||||
|
@___for__00001;
|
||||||
|
integer ___ret__00004;
|
||||||
|
{
|
||||||
|
{
|
||||||
|
___ret__00004 = llGetLinkNumber();
|
||||||
|
jump ___rtl__00008;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@___rtl__00008;
|
||||||
|
if (___ret__00004)
|
||||||
|
{
|
||||||
|
{
|
||||||
|
integer f3p1 = llGetNumberOfPrims();
|
||||||
|
llOwnerSay((string)f3p1);
|
||||||
|
}
|
||||||
|
f3p1++;
|
||||||
|
llDie();
|
||||||
|
jump ___for__00001;
|
||||||
|
}
|
||||||
{
|
{
|
||||||
___ret__00001 = <0, 0, 0>;
|
___ret__00001 = <0, 0, 0>;
|
||||||
jump ___rtl__00004;
|
jump ___rtl__00004;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue