List extraction fixed. 49/15349/5
Cedric Delamarre [Wed, 8 Oct 2014 08:28:26 +0000 (10:28 +0200)]
lst = list("test", 1, 5)
lst(4)
lst = tlist("test", 1, 5)
lst(4)

tl=tlist(["test", "f1" "f2"])
tl("f1")
tl.f1
tl.f3
tl("f3")
tl.f2 = 12

Change-Id: Ie3bebd6ea58defa3faf856669533308086d5fdb0

scilab/modules/ast/includes/types/list.hxx
scilab/modules/ast/src/cpp/ast/runvisitor.cpp
scilab/modules/ast/src/cpp/types/list.cpp
scilab/modules/ast/src/cpp/types/tlist.cpp
scilab/modules/types/sci_gateway/cpp/sci_tlist_or_mlist.hxx

index 75d148f..e17c06f 100644 (file)
@@ -75,6 +75,12 @@ public :
         else
         {
             InternalType * _out = extract(&in);
+            if (_out == NULL)
+            {
+                // invalid index
+                return false;
+            }
+
             List* pList = _out->getAs<types::List>();
             for (int i = 0; i < pList->getSize(); i++)
             {
index 5f54830..4eac2d4 100644 (file)
@@ -156,6 +156,13 @@ void RunVisitorT<T>::visitprivate(const FieldExp &e)
 
     if (ok)
     {
+        if (pReturn == NULL)
+        {
+            std::wostringstream os;
+            os << _W("Invalid index.\n");
+            throw ScilabError(os.str(), 999, e.getLocation());
+        }
+
         setResult(pReturn);
         pValue->killMe();
     }
@@ -175,8 +182,24 @@ void RunVisitorT<T>::visitprivate(const FieldExp &e)
 
         in.push_back(pS);
         in.push_back(pValue);
+        Callable::ReturnValue Ret = Callable::Error;
 
-        Callable::ReturnValue Ret = Overload::call(L"%" + pValue->getShortTypeStr() + L"_e", in, 1, out, this);
+        try
+        {
+            Ret = Overload::call(L"%" + pValue->getShortTypeStr() + L"_e", in, 1, out, this);
+        }
+        catch (ast::ScilabError & se)
+        {
+            // TList or Mlist
+            if (pValue->isList())
+            {
+                Ret = Overload::call(L"%l_e", in, 1, out, this);
+            }
+            else
+            {
+                throw se;
+            }
+        }
 
         if (Ret != Callable::OK)
         {
index 55a508c..bf37a9d 100644 (file)
@@ -173,7 +173,7 @@ InternalType* List::extract(typed_list* _pArgs)
         if (idx > getSize() || idx < 1)
         {
             delete outList;
-            outList = new List();
+            outList = NULL;
             break;
         }
         InternalType* pIT = (*m_plData)[idx - 1];
index 7843fe1..8522dff 100644 (file)
@@ -91,6 +91,11 @@ bool TList::invoke(typed_list & in, optional_list & /*opt*/, int /*_iRetCount*/,
         if (arg->isDouble() || arg->isInt() || arg->isBool() || arg->isImplicitList() || arg->isColon() || arg->isDollar())
         {
             _out = List::extract(&in);
+            if (_out == NULL)
+            {
+                // invalid index
+                return false;
+            }
 
             List* pList = _out->getAs<types::List>();
             for (int i = 0; i < pList->getSize(); i++)
@@ -110,6 +115,11 @@ bool TList::invoke(typed_list & in, optional_list & /*opt*/, int /*_iRetCount*/,
             }
 
             _out = extractStrings(stFields);
+            if (_out == NULL)
+            {
+                // invalid index
+                return false;
+            }
 
             List* pList = _out->getAs<types::List>();
             for (int i = 0; i < pList->getSize(); i++)
@@ -120,7 +130,7 @@ bool TList::invoke(typed_list & in, optional_list & /*opt*/, int /*_iRetCount*/,
             delete pList;
         }
 
-        if (!out.empty())
+        if (out.empty() == false)
         {
             return true;
         }
@@ -203,7 +213,14 @@ InternalType* TList::extractStrings(const std::list<std::wstring>& _stFields)
 
     for (it = _stFields.begin() ; it != _stFields.end() ; it++, i++)
     {
-        pLResult->set(i, getField(*it));
+        InternalType* pIT = getField(*it);
+        if (pIT == NULL)
+        {
+            delete pLResult;
+            return NULL;
+        }
+
+        pLResult->set(i, pIT);
     }
 
     return pLResult;
index 0317dd4..b37043a 100644 (file)
@@ -55,38 +55,12 @@ Function::ReturnValue sci_tlist_or_mlist(typed_list &in, int _piRetCount, typed_
         return Function::Error;
     }
 
-    //first string is the tlist type
-    list<wstring> fieldNames;
-    for (int i = 1 ; i < pS->getSize() ; i++)
-    {
-        list<wstring>::iterator it;
-        for (it = fieldNames.begin() ; it != fieldNames.end() ; it++)
-        {
-            if (*it == wstring(pS->get(i)))
-            {
-                char* pstFunName = wide_string_to_UTF8(_pstrFunName);
-                Scierror(999, _("%s : Fields names must be unique"), pstFunName);
-                FREE(pstFunName);
-                return Function::Error;
-            }
-        }
-        fieldNames.push_back(pS->get(i));
-    }
-
     pRetVal = new TorMList();
     for (unsigned int i = 0 ; i < in.size() ; i++)
     {
         pRetVal->append(in[i]);
     }
 
-    //fill empty field with []
-    InternalType* pITEmpty = Double::Empty();
-    while (pRetVal->getSize() < pS->getSize())
-    {
-        pRetVal->append(pITEmpty);
-    }
-    pITEmpty->killMe();
-
     out.push_back(pRetVal);
     return Function::OK;
 }