Revert "* Bug 15310 fixed: isdef regression for void type repaired" 61/20661/1
Antoine ELIAS [Mon, 17 Dec 2018 11:20:53 +0000 (12:20 +0100)]
This reverts commit 12910be31c7649059c55b1913e6c192a0128826a.

Change-Id: Ia3a53d44516486b0028b17eb43ebcc5a4832f53c

scilab/CHANGES.md
scilab/modules/ast/includes/types/internal.hxx
scilab/modules/ast/includes/types/void.hxx
scilab/modules/ast/src/cpp/types/internal.cpp
scilab/modules/core/sci_gateway/cpp/sci_exists.cpp
scilab/modules/core/tests/nonreg_tests/bug_15310.tst [deleted file]

index 1993b1f..fa1ea06 100644 (file)
@@ -515,7 +515,6 @@ 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 728d48d..1e2b93e 100644 (file)
@@ -407,7 +407,6 @@ public :
     virtual bool isPointer(void);
     virtual bool isLibrary(void);
     virtual bool isUserType(void);
-    virtual bool isVoid(void);
 
     void clearPrintState();
 
index 8218c98..a7b616d 100644 (file)
@@ -37,7 +37,7 @@ public :
         return IdVoid;
     }
 
-    bool isVoid() override
+    bool                    isVoid()
     {
         return true;
     }
index 0f8dc1c..0f1e34b 100644 (file)
@@ -325,11 +325,6 @@ bool InternalType::isUserType(void)
     return false;
 }
 
-bool InternalType::isVoid(void)
-{
-    return false;
-}
-
 void InternalType::clearPrintState()
 {
     m_bPrintFromStart = true;
index c310c8d..08c94b2 100644 (file)
@@ -53,9 +53,9 @@ static ScopeRange getScopeFromOption(const wchar_t *_psScope)
     return UnknownRange;
 }
 
-static types::Function::ReturnValue isdef(types::typed_list& in, int _iRetCount, types::typed_list& out, const char* fname)
+types::Function::ReturnValue sci_existsOrIsdef(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)
     {
@@ -82,65 +82,76 @@ static types::Function::ReturnValue isdef(types::typed_list& in, int _iRetCount,
     }
 
     pStrIn  = in[0]->getAs<types::String>();
-
-    types::InternalType *pIT;
-    types::Bool* pBOut = new types::Bool(pStrIn->getDims(), pStrIn->getDimsArray());
-
-    switch (getScopeFromOption(psScope))
+    if (strcmp(fname, "exists") == 0)
     {
-        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->isVoid());
-            }
-            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->isVoid());
-            }
-            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->isVoid());
-            }
-            break;
-        default :
-            Scierror(36, _("%s: Wrong input argument %d.\n"), fname, 2);
-            return types::Function::Error;
+        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;
+        }
+
+        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;
+        }
 
-    out.push_back(pBOut);
+        out.push_back(pBOut);
+    }
 
     return types::Function::OK;
 }
 
-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 isdef(in, _iRetCount, out, "isdef");
+    return sci_existsOrIsdef(in, _iRetCount, out, "exists");
 }
 
-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)
 {
-    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));
-        }
-        out.pop_back();
-        pBOut->killMe();
-        out.push_back(pDblOut);
-    }
-
-    return retVal;
+    return sci_existsOrIsdef(in, _iRetCount, out, "isdef");
 }
-
diff --git a/scilab/modules/core/tests/nonreg_tests/bug_15310.tst b/scilab/modules/core/tests/nonreg_tests/bug_15310.tst
deleted file mode 100644 (file)
index ee27d16..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-// =============================================================================
-// 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])