* Bug #15139 fixed - return in try/catch expression 57/19257/2
Antoine ELIAS [Tue, 18 Apr 2017 16:07:48 +0000 (18:07 +0200)]
Change-Id: I3cdbc4a7e765eae73f6a552332b6764d6eb75203

scilab/CHANGES.md
scilab/modules/ast/src/cpp/ast/runvisitor.cpp
scilab/modules/ast/tests/unit_tests/trycatch.dia.ref [new file with mode: 0644]
scilab/modules/ast/tests/unit_tests/trycatch.tst [new file with mode: 0644]

index fd4d491..a56e234 100644 (file)
@@ -374,6 +374,7 @@ the [development mailing list](dev@lists.scilab.org) for a particular toolbox.
 * [#15121](http://bugzilla.scilab.org/show_bug.cgi?id=15121): getOptionals() fails to recognize some options.
 * [#15137](http://bugzilla.scilab.org/show_bug.cgi?id=15137): ilib_build cannot build a library with more than 999 function entries in Scilab 6
 * [#15138](http://bugzilla.scilab.org/show_bug.cgi?id=15138): Scilab crashes at start on Windows
+* [#15139](http://bugzilla.scilab.org/show_bug.cgi?id=15139): Fix return in try/catch expression
 
 ### Bugs fixed in 6.0.0:
 * [#592](http://bugzilla.scilab.org/show_bug.cgi?id=592): `linspace(a, b, n<=0)` returned `b` instead of `[]`
index e7f51a7..dd8a027 100644 (file)
@@ -1927,9 +1927,16 @@ void RunVisitorT<T>::visitprivate(const TryCatchExp  &e)
         int level = ConfigVariable::getRecursionLevel();
         try
         {
+            const_cast<Exp*>(&e.getTry())->setReturnable();
             e.getTry().accept(*this);
             //restore previous prompt mode
             ConfigVariable::setSilentError(oldVal);
+
+            if (e.getTry().isReturn())
+            {
+                const_cast<Exp*>(&e.getTry())->resetReturn();
+                const_cast<TryCatchExp*>(&e)->setReturn();
+            }
         }
         catch (const RecursionException& /* re */)
         {
@@ -1966,7 +1973,13 @@ void RunVisitorT<T>::visitprivate(const TryCatchExp  &e)
         ConfigVariable::resetWhereError();
         try
         {
+            const_cast<Exp*>(&e.getCatch())->setReturnable();
             e.getCatch().accept(*this);
+            if (e.getCatch().isReturn())
+            {
+                const_cast<Exp*>(&e.getCatch())->resetReturn();
+                const_cast<TryCatchExp*>(&e)->setReturn();
+            }
         }
         catch (ScilabException &)
         {
diff --git a/scilab/modules/ast/tests/unit_tests/trycatch.dia.ref b/scilab/modules/ast/tests/unit_tests/trycatch.dia.ref
new file mode 100644 (file)
index 0000000..759a6fb
--- /dev/null
@@ -0,0 +1,35 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2017 - ESI - Antoine ELIAS
+//
+// Copyright (C) 2012 - 2016 - Scilab Enterprises
+//
+// This file is hereby licensed under the terms of the GNU GPL v2.0,
+// pursuant to article 5.3.4 of the CeCILL v.2.1.
+// This file was originally licensed under the terms of the CeCILL v2.1,
+// and continues to be available under such terms.
+// For more information, see the COPYING file which you should have received
+// along with this program.
+//
+//
+// <-- CLI SHELL MODE -->
+function foo()
+    try
+        error("random err")
+    catch
+        disp("should display")
+        return
+    end
+    disp("should not display")
+endfunction
+foo()
+ should display
+function bar()
+    try
+        disp("should display")
+        return
+    catch
+    end
+    disp("should not display")
+endfunction
+bar()
+ should display
diff --git a/scilab/modules/ast/tests/unit_tests/trycatch.tst b/scilab/modules/ast/tests/unit_tests/trycatch.tst
new file mode 100644 (file)
index 0000000..9b1c034
--- /dev/null
@@ -0,0 +1,38 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2017 - ESI - Antoine ELIAS
+//
+// Copyright (C) 2012 - 2016 - Scilab Enterprises
+//
+// This file is hereby licensed under the terms of the GNU GPL v2.0,
+// pursuant to article 5.3.4 of the CeCILL v.2.1.
+// This file was originally licensed under the terms of the CeCILL v2.1,
+// and continues to be available under such terms.
+// For more information, see the COPYING file which you should have received
+// along with this program.
+//
+//
+
+// <-- CLI SHELL MODE -->
+
+function foo()
+    try
+        error("random err")
+    catch
+        disp("should display")
+        return
+    end
+    disp("should not display")
+endfunction
+
+foo()
+
+function bar()
+    try
+        disp("should display")
+        return
+    catch
+    end
+    disp("should not display")
+endfunction
+
+bar()