* Bug #16401 fixed - a global external_object_java class crashed Scilab 51/21451/2
Clement David [Tue, 7 Apr 2020 14:01:43 +0000 (16:01 +0200)]
Change-Id: Ibc7c9816b034ebb7544bbd8aff9493c1a4c99c2e

scilab/CHANGES.md
scilab/modules/ast/src/cpp/symbol/context.cpp
scilab/modules/external_objects_java/tests/nonreg_tests/bug_16401.tst [new file with mode: 0644]

index 1f58c95..e53564a 100644 (file)
@@ -269,8 +269,10 @@ Bug Fixes
 * [#16342](https://bugzilla.scilab.org/16342): `strcat()` was much slower in Scilab 6.0.2.
 * [#16350](https://bugzilla.scilab.org/16350): in if/while conditions, the empty sparse boolean was considered as TRUE.
 * [#16365](https://bugzilla.scilab.org/16365): `median(m,"r")` and `median(m,"c")` yielded wrong results (6.1.0 regression)
+* [#16401](https://bugzilla.scilab.org/16401): global `external_object_java` class was crashing Scilab.
 * [#16403](https://bugzilla.scilab.org/16403): 1D extraction of matrix with implicit index had wrong dimensions.
 
+
 ### Bugs fixed in 6.1.0:
 * [#2694](https://bugzilla.scilab.org/2694): `bitget` did not accept positive integers of types int8, int16 or int32.
 * [#5824](https://bugzilla.scilab.org/5824): The `datafit` algorithm was not documented.
index 6e33528..ad766f5 100644 (file)
@@ -89,8 +89,8 @@ void Context::scope_begin()
 
 void Context::clearAll()
 {
-    libraries.clearAll();
     variables.clearAll();
+    libraries.clearAll();
 }
 
 void Context::scope_end()
@@ -217,13 +217,16 @@ types::InternalType* Context::get(const Symbol& _key, int _iLevel)
     types::InternalType* pIT = NULL;
     if (_iLevel == m_iLevel || _iLevel == SCOPE_ALL)
     {
-        //look for in current VarList
-        VarList::iterator it = varStack.top()->find(_key);
-        if (it != varStack.top()->end())
+        if (!varStack.empty())
         {
-            if (it->second->empty() == false)
+            //look for in current VarList
+            VarList::iterator it = varStack.top()->find(_key);
+            if (it != varStack.top()->end())
             {
-                pIT = it->second->get();
+                if (it->second->empty() == false)
+                {
+                    pIT = it->second->get();
+                }
             }
         }
     }
diff --git a/scilab/modules/external_objects_java/tests/nonreg_tests/bug_16401.tst b/scilab/modules/external_objects_java/tests/nonreg_tests/bug_16401.tst
new file mode 100644 (file)
index 0000000..4520c73
--- /dev/null
@@ -0,0 +1,25 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2020 - ESI Group - Clement DAVID
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- NO CHECK REF -->
+//
+// <-- Non-regression test for bug 16401 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=16401
+//
+// <-- Short Description -->
+// Scilab crash at exit after declaring a global klass variable
+//
+
+jimport java.lang.String
+
+global String
+clear String
+
+// crashed at exit
+