From 1ab9dd69b465e70265ae02cb9639ce183892b493 Mon Sep 17 00:00:00 2001 From: Sei Lisa Date: Tue, 16 Jul 2019 01:58:19 +0200 Subject: [PATCH] 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!) --- lslopt/lslfoldconst.py | 12 ++++++------ unit_tests/regression.suite/comparison-min-max.out | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lslopt/lslfoldconst.py b/lslopt/lslfoldconst.py index 28f9659..4946dbc 100644 --- a/lslopt/lslfoldconst.py +++ b/lslopt/lslfoldconst.py @@ -549,23 +549,23 @@ class foldconst(object): sym = self.symtab[0][child[a].name] 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 and child[0].nt == 'FNCALL' and 'min' in sym and sym['min'] == -1 ): - node = parent[index] = nr(nt='~', t='integer', - ch=[child[0]]) + node = parent[index] = nr(nt='!', t='integer', + ch=[nr(nt='~', t='integer', ch=[child[0]])]) self.FoldTree(parent, index) 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 and child[1].nt == 'FNCALL' and 'min' in sym and sym['min'] == -1 ): - node = parent[index] = nr(nt='!', t='integer', - ch=[nr(nt='~', t='integer', ch=[child[1]])]) + node = parent[index] = nr(nt='~', t='integer', + ch=[child[1]]) self.FoldTree(parent, index) return diff --git a/unit_tests/regression.suite/comparison-min-max.out b/unit_tests/regression.suite/comparison-min-max.out index 639fcae..bdb3255 100644 --- a/unit_tests/regression.suite/comparison-min-max.out +++ b/unit_tests/regression.suite/comparison-min-max.out @@ -2,7 +2,7 @@ default { changed(integer ch) { - if (~llListFindList(llGetPrimitiveParams((list)9), (list)"a")) + if (!~llListFindList(llGetPrimitiveParams((list)9), (list)"a")) llDie(); if (!llSameGroup(llGetOwner())) llOwnerSay("e");