Fix optimization of fn > -1 and fn < 0 when fn's minimum is -1 in conditions

E.g. llSubStringIndex(...) > -1 was converted into !~llSubStringIndex(...) which is incorrect. We even had a test case for it... with a wrong expected response file.

Bug report and test case by Sinha Hynes (thanks!)
This commit is contained in:
Sei Lisa 2019-07-16 01:58:19 +02:00
parent 1bdaff32ab
commit 1ab9dd69b4
2 changed files with 7 additions and 7 deletions

View file

@ -549,23 +549,23 @@ class foldconst(object):
sym = self.symtab[0][child[a].name] sym = self.symtab[0][child[a].name]
break break
# cond(FNCALL < 0) -> cond(~FNCALL) if min == -1 # cond(FNCALL < 0) -> cond(!~FNCALL) if min == -1
if (child[1].nt == 'CONST' and child[1].value == 0 if (child[1].nt == 'CONST' and child[1].value == 0
and child[0].nt == 'FNCALL' and child[0].nt == 'FNCALL'
and 'min' in sym and sym['min'] == -1 and 'min' in sym and sym['min'] == -1
): ):
node = parent[index] = nr(nt='~', t='integer', node = parent[index] = nr(nt='!', t='integer',
ch=[child[0]]) ch=[nr(nt='~', t='integer', ch=[child[0]])])
self.FoldTree(parent, index) self.FoldTree(parent, index)
return return
# cond(FNCALL > -1) -> cond(!~FNCALL) if min == -1 # cond(FNCALL > -1) -> cond(~FNCALL) if min == -1
if (child[0].nt == 'CONST' and child[0].value == -1 if (child[0].nt == 'CONST' and child[0].value == -1
and child[1].nt == 'FNCALL' and child[1].nt == 'FNCALL'
and 'min' in sym and sym['min'] == -1 and 'min' in sym and sym['min'] == -1
): ):
node = parent[index] = nr(nt='!', t='integer', node = parent[index] = nr(nt='~', t='integer',
ch=[nr(nt='~', t='integer', ch=[child[1]])]) ch=[child[1]])
self.FoldTree(parent, index) self.FoldTree(parent, index)
return return

View file

@ -2,7 +2,7 @@ default
{ {
changed(integer ch) changed(integer ch)
{ {
if (~llListFindList(llGetPrimitiveParams((list)9), (list)"a")) if (!~llListFindList(llGetPrimitiveParams((list)9), (list)"a"))
llDie(); llDie();
if (!llSameGroup(llGetOwner())) if (!llSameGroup(llGetOwner()))
llOwnerSay("e"); llOwnerSay("e");