Bug 15310 fixed: isdef regression for void type repaired bis 62/20662/2
Antoine ELIAS [Mon, 17 Dec 2018 14:03:31 +0000 (15:03 +0100)]
Change-Id: Ic38bb8c8c1ea009a38652e2589a7398eae932f1a

scilab/CHANGES.md
scilab/modules/core/sci_gateway/cpp/sci_exists.cpp
scilab/modules/core/tests/nonreg_tests/bug_15310.tst [new file with mode: 0644]

index fa1ea06..1993b1f 100644 (file)
@@ -515,6 +515,7 @@ Known issues
 * [#15187](http://bugzilla.scilab.org/show_bug.cgi?id=15187): Super block diagram title (on the window bar) was not set.
 * [#15263](http://bugzilla.scilab.org/show_bug.cgi?id=15263): Assignments in an array of structures often overwrote some untargeted elements.
 * [#15279](http://bugzilla.scilab.org/show_bug.cgi?id=15279): `unique` could not be used on sets of complex numbers.
+* [#15310](http://bugzilla.scilab.org/show_bug.cgi?id=15310): `isdef` considered void arguments as defined (regression)
 * [#15346](http://bugzilla.scilab.org/show_bug.cgi?id=15346): In an array of rationals, there was no way to address components with their linearized indices.
 * [#15404](http://bugzilla.scilab.org/show_bug.cgi?id=15404): `surf()` and `mesh()` did not allow to specify `foreground`, `facecolor`, `markforeground` and `markbackground` global properties colors as a predefined named color out of a list of the 9 main color names. Colors specifications as "#RRGGBB" hexa code or Colors indices in the color map were nor allowed.
 * [#15422](http://bugzilla.scilab.org/show_bug.cgi?id=15422): `strsubst("ab", "", "cd")` crashed Scilab.
index 08c94b2..59a5db6 100644 (file)
@@ -53,9 +53,9 @@ static ScopeRange getScopeFromOption(const wchar_t *_psScope)
     return UnknownRange;
 }
 
-types::Function::ReturnValue sci_existsOrIsdef(types::typed_list &in, int _iRetCount, types::typed_list &out, const char* fname)
+static types::Function::ReturnValue isdef(types::typed_list& in, int _iRetCount, types::typed_list& out, const char* fname)
 {
-    types::String* pStrIn       = NULL;
+    types::String* pStrIn = NULL;
 
     if (in.size() != 1 && in.size() != 2)
     {
@@ -81,77 +81,66 @@ types::Function::ReturnValue sci_existsOrIsdef(types::typed_list &in, int _iRetC
         psScope = in[1]->getAs<types::String>()->get(0);
     }
 
-    pStrIn  = in[0]->getAs<types::String>();
-    if (strcmp(fname, "exists") == 0)
-    {
-        types::Double* pDblOut = new types::Double(pStrIn->getDims(), pStrIn->getDimsArray());
-        switch (getScopeFromOption(psScope))
-        {
-            case All:
-                for (int i = 0; i < pStrIn->getSize(); i++)
-                {
-                    symbol::Context::getInstance()->get(symbol::Symbol(pStrIn->get(i))) ? pDblOut->set(i, 1) : pDblOut->set(i, 0);
-                }
-                break;
-            case Local:
-                for (int i = 0; i < pStrIn->getSize(); i++)
-                {
-                    symbol::Context::getInstance()->getCurrentLevel(symbol::Symbol(pStrIn->get(i))) ? pDblOut->set(i, 1) : pDblOut->set(i, 0);
-                }
-                break;
-            case NoLocal:
-                for (int i = 0; i < pStrIn->getSize(); i++)
-                {
-                    symbol::Context::getInstance()->getAllButCurrentLevel(symbol::Symbol(pStrIn->get(i))) ? pDblOut->set(i, 1) : pDblOut->set(i, 0);
-                }
-                break;
-            default :
-                Scierror(36, _("%s: Wrong input argument %d.\n"), fname, 2);
-                return types::Function::Error;
-        }
+    pStrIn = in[0]->getAs<types::String>();
 
-        out.push_back(pDblOut);
-    }
-    else
-    {
-        types::Bool* pBOut = new types::Bool(pStrIn->getDims(), pStrIn->getDimsArray());
-        switch (getScopeFromOption(psScope))
-        {
-            case All:
-                for (int i = 0; i < pStrIn->getSize(); i++)
-                {
-                    symbol::Context::getInstance()->get(symbol::Symbol(pStrIn->get(i))) ? pBOut->set(i, 1) : pBOut->set(i, 0);
-                }
-                break;
-            case Local:
-                for (int i = 0; i < pStrIn->getSize(); i++)
-                {
-                    symbol::Context::getInstance()->getCurrentLevel(symbol::Symbol(pStrIn->get(i))) ? pBOut->set(i, 1) : pBOut->set(i, 0);
-                }
-                break;
-            case NoLocal:
-                for (int i = 0; i < pStrIn->getSize(); i++)
-                {
-                    symbol::Context::getInstance()->getAllButCurrentLevel(symbol::Symbol(pStrIn->get(i))) ? pBOut->set(i, 1) : pBOut->set(i, 0);
-                }
-                break;
-            default :
-                Scierror(36, _("%s: Wrong input argument %d.\n"), fname, 2);
-                return types::Function::Error;
-        }
+    types::InternalType *pIT;
+    types::Bool* pBOut = new types::Bool(pStrIn->getDims(), pStrIn->getDimsArray());
 
-        out.push_back(pBOut);
+    switch (getScopeFromOption(psScope))
+    {
+        case All:
+            for (int i = 0; i < pStrIn->getSize(); i++)
+            {
+                pIT = symbol::Context::getInstance()->get(symbol::Symbol(pStrIn->get(i)));
+                pBOut->set(i, pIT != NULL && pIT->getType() != types::InternalType::ScilabVoid);
+            }
+            break;
+        case Local:
+            for (int i = 0; i < pStrIn->getSize(); i++)
+            {
+                pIT = symbol::Context::getInstance()->getCurrentLevel(symbol::Symbol(pStrIn->get(i)));
+                pBOut->set(i, pIT != NULL && pIT->getType() != types::InternalType::ScilabVoid);
+            }
+            break;
+        case NoLocal:
+            for (int i = 0; i < pStrIn->getSize(); i++)
+            {
+                pIT = symbol::Context::getInstance()->getAllButCurrentLevel(symbol::Symbol(pStrIn->get(i)));
+                pBOut->set(i, pIT != NULL && pIT->getType() != types::InternalType::ScilabVoid);
+            }
+            break;
+        default:
+            Scierror(36, _("%s: Wrong input argument %d.\n"), fname, 2);
+            return types::Function::Error;
     }
 
+    out.push_back(pBOut);
+
     return types::Function::OK;
 }
 
-types::Function::ReturnValue sci_exists(types::typed_list &in, int _iRetCount, types::typed_list &out)
+types::Function::ReturnValue sci_isdef(types::typed_list &in, int _iRetCount, types::typed_list &out)
 {
-    return sci_existsOrIsdef(in, _iRetCount, out, "exists");
+    return isdef(in, _iRetCount, out, "isdef");
 }
 
-types::Function::ReturnValue sci_isdef(types::typed_list &in, int _iRetCount, types::typed_list &out)
+types::Function::ReturnValue sci_exists(types::typed_list &in, int _iRetCount, types::typed_list &out)
 {
-    return sci_existsOrIsdef(in, _iRetCount, out, "isdef");
+    types::Function::ReturnValue retVal = isdef(in, _iRetCount, out, "exists");
+
+    if (retVal == types::Function::OK)
+    {
+        types::Bool* pBOut = out[0]->getAs<types::Bool>();
+        types::Double* pDblOut = new types::Double(pBOut->getDims(), pBOut->getDimsArray());
+        for (int i = 0; i < pBOut->getSize(); i++)
+        {
+            pDblOut->set(i, (double)pBOut->get(i));
+        }
+
+        pBOut->killMe();
+        out.pop_back();
+        out.push_back(pDblOut);
+    }
+
+    return retVal;
 }
diff --git a/scilab/modules/core/tests/nonreg_tests/bug_15310.tst b/scilab/modules/core/tests/nonreg_tests/bug_15310.tst
new file mode 100644 (file)
index 0000000..e071571
--- /dev/null
@@ -0,0 +1,34 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2018 - St├ęphane MOTTELET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+//
+//
+// <-- Non-regression test for bug 15310 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=15310
+//
+// <-- Short Description -->
+// unlike isdef(varargin(k),"l"), isdef(argin,"l") now always returns %t even for unpassed arguments (REGRESSION)
+
+function out=f(_x,_y)
+  out=isdef(['_x','_y'],'local')
+endfunction
+
+function out=g(_x,_y)
+  out=exists(['_x','_y'],'local')
+endfunction
+
+assert_checkequal(f(,),  [%f,%f])
+assert_checkequal(f(,2), [%f,%t])
+assert_checkequal(f(1,), [%t,%f])
+
+assert_checkequal(g(,),  [0,0])
+assert_checkequal(g(,2), [0,1])
+assert_checkequal(g(1,), [1,0])