global variable management fixed. 24/17724/2
Cedric Delamarre [Tue, 26 Jan 2016 17:59:58 +0000 (18:59 +0100)]
test_run core bug_11953
test_run core bug_169
test_run core bug_1955
test_run core bug_2139
test_run core bug_8531
test_run core bug_9523

Change-Id: Ida0c8196976733be9859a90598cf1f578feaee67

scilab/modules/ast/includes/symbol/context.hxx
scilab/modules/ast/src/cpp/symbol/context.cpp
scilab/modules/ast/src/cpp/symbol/variables.cpp
scilab/modules/core/sci_gateway/cpp/sci_global.cpp

index 9e08cb4..92904f5 100644 (file)
@@ -102,7 +102,7 @@ public:
 
     /*remove global variable and all visibility references */
     //clearglobal("a")
-    void removeGlobal(const Symbol& key);
+    bool removeGlobal(const Symbol& key);
 
     /*remove all global variables and references */
     //clearglobal
index da71900..a3d29fb 100644 (file)
@@ -462,22 +462,40 @@ void Context::setGlobal(const Symbol& _key)
     globals->push_back(_key);
 }
 
-void Context::removeGlobal(const Symbol& _key)
+bool Context::removeGlobal(const Symbol& _key)
 {
+    // skip permanant variables : %modalWarning, %toolboxes, %toolboxes_dir
+    if (_key.getName() == L"%modalWarning"  ||
+            _key.getName() == L"%toolboxes"     ||
+            _key.getName() == L"%toolboxes_dir")
+    {
+        return false;
+    }
+
     variables.removeGlobal(_key, m_iLevel);
     globals->remove(_key);
+    return true;
 }
 
 void Context::removeGlobalAll()
 {
     std::list<Symbol>::iterator it = globals->begin();
+
     while (it != globals->end())
     {
-        removeGlobal(*it);
+        if (removeGlobal(*it) == false)
+        {
+            globals->remove(*it);
+        }
+
         it = globals->begin();
     }
 
     globals->clear();
+
+    globals->emplace_back(L"%modalWarning");
+    globals->emplace_back(L"%toolboxes");
+    globals->emplace_back(L"%toolboxes_dir");
 }
 
 void Context::print(std::wostream& ostr, bool sorted) const
index 9784ca0..30f3bf2 100644 (file)
@@ -327,7 +327,7 @@ bool Variables::getGlobalNameForWho(std::list<std::wstring>& lstVarName, int* iV
 {
     for (auto it : vars)
     {
-        if (it.second->empty() == false && it.second->isGlobal())
+        if (it.second->isGlobal())
         {
             std::wstring wstrVarName(it.first.getName().c_str());
             lstVarName.push_back(wstrVarName);
index 78a8a62..4c6643f 100644 (file)
@@ -80,7 +80,7 @@ types::Function::ReturnValue sci_global(types::typed_list &in, int _iRetCount, t
         }
         else
         {
-            pIT = pCtx->getCurrentLevel(pstVar);
+            pIT = pCtx->get(pstVar);
             pCtx->setGlobal(pstVar);
         }