* Bug #13862 fixed - There was no lazy evaluation of 'or' operands in 'if' tests. 18/17318/4
Charlotte HECQUET [Tue, 13 Oct 2015 13:17:36 +0000 (15:17 +0200)]
Change-Id: I5484462a410322cd4f623ff106850a4e0f4c670e

scilab/CHANGES_6.0.X
scilab/modules/ast/includes/operations/types_or.hxx
scilab/modules/ast/src/cpp/operations/types_or.cpp
scilab/modules/ast/tests/nonreg_tests/bug_13862.dia.ref [new file with mode: 0644]
scilab/modules/ast/tests/nonreg_tests/bug_13862.tst [new file with mode: 0644]

index 143f917..65d8491 100644 (file)
@@ -39,6 +39,8 @@ Scilab Bug Fixes
 
 * Bug #13853 fixed - plzr() returned wrong results for discrete-time systems with a numeric time step.
 
+* Bug #13862 fixed - There was no lazy evaluation of 'or' operands in 'if' tests.
+
 * Bug #13872 fixed - Non regression test added for unique function (the indices returned were wrong)
 
 * Bug #13890 fixed - getd did not return loaded symbols in previous scope.
index 78f679e..03092b6 100644 (file)
@@ -123,6 +123,7 @@ template<typename T, typename U, typename O> inline static void int_or(T l, U r,
 
 // ||
 int IntOrInt(types::InternalType* _pL, types::Bool** _pOut);
+int DoubleOrDouble(types::Double* _pI1, types::Bool** _pOut);
 int BoolOrBool(types::Bool* _pI1, types::Bool** _pOut);
 int SparseBoolOrSparseBool(types::InternalType* _pL, types::Bool** _pOut);
 
index 6f24799..b4bb931 100644 (file)
@@ -405,6 +405,11 @@ InternalType* GenericShortcutOr(InternalType* _pL)
         BoolOrBool(_pL->getAs<Bool>(), (Bool**)&pResult);
     }
 
+    if (_pL->isDouble())
+    {
+        DoubleOrDouble(_pL->getAs<Double>(), (Bool**)&pResult);
+    }
+
     if (_pL->isInt())
     {
         IntOrInt(_pL, (Bool**)&pResult);
@@ -455,6 +460,22 @@ int BoolOrBool(Bool* _pL, Bool** _pOut)
     return 0;
 }
 
+int DoubleOrDouble(Double* _pL, Bool** _pOut)
+{
+    for (int i = 0 ; i < _pL->getSize() ; i++)
+    {
+        if (_pL->get(i) == 0)
+        {
+            //call non shorcut operation
+            *_pOut = NULL;
+            return 0;
+        }
+    }
+
+    *_pOut = new Bool(1); //true || something -> true
+    return 0;
+}
+
 template <class K>
 static int IntOrInt(K* _pL, Bool** _pOut)
 {
diff --git a/scilab/modules/ast/tests/nonreg_tests/bug_13862.dia.ref b/scilab/modules/ast/tests/nonreg_tests/bug_13862.dia.ref
new file mode 100644 (file)
index 0000000..36b64f7
--- /dev/null
@@ -0,0 +1,51 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2015 - Scilab Enterprises - Charlotte HECQUET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 13862 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/13862
+//
+// <-- Short Description -->
+// There is no lazy of 'or' operands in 'if' test
+global test;
+function r = updateTest()
+    global test;
+    test = 1;
+    r=%f;
+endfunction
+// short cut
+test = 0;
+thencase = 0;
+elsecase = 0;
+if 1 | updateTest() then thencase = 1;else elsecase = 1;end
+assert_checkequal(test, 0);
+assert_checkequal(thencase, 1);
+assert_checkequal(elsecase, 0);
+test = 0;
+thencase = 0;
+elsecase = 0;
+if [1 1] | updateTest() then thencase = 1;else elsecase = 1;end
+assert_checkequal(test, 0);
+assert_checkequal(thencase, 1);
+assert_checkequal(elsecase, 0);
+// non short cut
+test = 0;
+thencase = 0;
+elsecase = 0;
+if 0 | updateTest() then thencase = 1;else elsecase = 1;end
+assert_checkequal(test, 1);
+assert_checkequal(thencase, 0);
+assert_checkequal(elsecase, 1);
+test = 0;
+thencase = 0;
+elsecase = 0;
+if [0 1] | updateTest() then thencase = 1;else elsecase = 1;end
+assert_checkequal(test, 1);
+assert_checkequal(thencase, 0);
+assert_checkequal(elsecase, 1);
diff --git a/scilab/modules/ast/tests/nonreg_tests/bug_13862.tst b/scilab/modules/ast/tests/nonreg_tests/bug_13862.tst
new file mode 100644 (file)
index 0000000..ac64cf0
--- /dev/null
@@ -0,0 +1,63 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2015 - Scilab Enterprises - Charlotte HECQUET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 13862 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/13862
+//
+// <-- Short Description -->
+// There is no lazy of 'or' operands in 'if' test
+
+global test;
+function r = updateTest()
+    global test;
+    test = 1;
+    r=%f;
+endfunction
+
+// short cut
+test = 0;
+thencase = 0;
+elsecase = 0;
+
+if 1 | updateTest() then thencase = 1;else elsecase = 1;end
+assert_checkequal(test, 0);
+assert_checkequal(thencase, 1);
+assert_checkequal(elsecase, 0);
+
+test = 0;
+thencase = 0;
+elsecase = 0;
+
+if [1 1] | updateTest() then thencase = 1;else elsecase = 1;end
+
+assert_checkequal(test, 0);
+assert_checkequal(thencase, 1);
+assert_checkequal(elsecase, 0);
+
+// non short cut
+test = 0;
+thencase = 0;
+elsecase = 0;
+
+if 0 | updateTest() then thencase = 1;else elsecase = 1;end
+
+assert_checkequal(test, 1);
+assert_checkequal(thencase, 0);
+assert_checkequal(elsecase, 1);
+
+test = 0;
+thencase = 0;
+elsecase = 0;
+
+if [0 1] | updateTest() then thencase = 1;else elsecase = 1;end
+
+assert_checkequal(test, 1);
+assert_checkequal(thencase, 0);
+assert_checkequal(elsecase, 1);