[bug_14253] Insertion in a struct contained in a list fixed. 64/17464/3
Cedric Delamarre [Wed, 18 Nov 2015 08:51:59 +0000 (09:51 +0100)]
Change-Id: I4ac4ceb9bafc679c82a22163bbb84c38012ce982

scilab/CHANGES_6.0.X
scilab/modules/ast/includes/types/struct.hxx
scilab/modules/ast/src/cpp/ast/visitor_common.cpp
scilab/modules/ast/src/cpp/types/struct.cpp
scilab/modules/ast/tests/nonreg_tests/bug_14253.dia.ref [new file with mode: 0644]
scilab/modules/ast/tests/nonreg_tests/bug_14253.tst [new file with mode: 0644]

index cbf577f..19f43f9 100644 (file)
@@ -15,10 +15,11 @@ For a high-level overview of the changes in this release, please consult the "Wh
 
 * Bug #13990 fixed - Windows installer did not ship all localization files.
 
-* Bug #14257 fixed - English spelling in messages and in comments.
-
 * Bug #14251 fixed - `spec` leaked some memory.
 
+* Bug #14253 fixed - Insertion in a struct contained in a list fixed.
+
+* Bug #14257 fixed - English spelling in messages and in comments.
 
 
         Changes between version 6.0.0-alpha-1 and 6.0.0-alpha-2
@@ -66,7 +67,7 @@ API modification
 
      int sci_Levkov(char *fname, void* pvApiCtx)
 
- instead of any "unsigned long l". This is now requires for some macros, such as Rhs(), to work. 
+ instead of any "unsigned long l". This is now requires for some macros, such as Rhs(), to work.
  (Although not strictly an API change, it may require gateway code to be modified).
 
 Bug Fixes
@@ -446,7 +447,7 @@ Bug Fixes
 * Bug #13972 fixed - Wildcard ('*') was not managed in printf expressions.
 
 * Bug #14043 fixed - Gateway C prototype changed from int sci_...(char *fname, unsigned long l)
-                     to sci_...(char *fname, void* pvApiCtx). Variable name has to be 
+                     to sci_...(char *fname, void* pvApiCtx). Variable name has to be
                      exactly "pvApyCtx" when macros are used in a gateway. (1)
 
 * Bug #14044 fixed - MALLOC.h is now renamed to sci_malloc.h. (1)
index c310b4d..8ac46e9 100644 (file)
@@ -103,9 +103,9 @@ public :
     bool                        subMatrixToString(std::wostringstream& ostr, int* _piDims, int _iDims);
     String*                     getFieldNames();
     bool                        exists(const std::wstring& _sKey);
-    bool                        addField(const std::wstring& _sKey);
-    bool                        addFieldFront(const std::wstring& _sKey);
-    bool                        removeField(const std::wstring& _sKey);
+    Struct*                     addField(const std::wstring& _sKey);
+    Struct*                     addFieldFront(const std::wstring& _sKey);
+    Struct*                     removeField(const std::wstring& _sKey);
     bool                        toString(std::wostringstream& ostr);
     List*                       extractFieldWithoutClone(const std::wstring& _wstField);
     std::vector<InternalType*>  extractFields(std::vector<std::wstring> _wstFields);
index 1d0f4fe..62653a4 100644 (file)
@@ -909,7 +909,11 @@ types::InternalType* evaluateFields(const ast::Exp* _pExp, std::list<ExpHistory*
                 // create field in parent if it not exist
                 if (pStruct->exists(pwcsFieldname) == false)
                 {
-                    pStruct->addField(pwcsFieldname);
+                    pStruct = pStruct->addField(pwcsFieldname);
+                    if (pEH->setCurrent(pStruct))
+                    {
+                        pEH->setReinsertion();
+                    }
                 }
 
                 if (pEH->getArgs())
@@ -2177,12 +2181,12 @@ types::InternalType* insertionCall(const ast::Exp& e, types::typed_list* _pArgs,
                 if (_pInsert->isListDelete())
                 {
                     /* Remove a field */
-                    pStruct->removeField(pS->get(0));
+                    pStruct = pStruct->removeField(pS->get(0));
                 }
                 else
                 {
                     /* Add a field */
-                    pStruct->addField(pS->get(0));
+                    pStruct = pStruct->addField(pS->get(0));
                     for (int i = 0; i < pStruct->getSize(); i++)
                     {
                         pStruct->get(i)->set(pS->get(0), _pInsert);
index 35b46ce..e5de307 100644 (file)
@@ -402,8 +402,17 @@ bool Struct::subMatrixToString(std::wostringstream& /*ostr*/, int* /*_piDims*/,
     return true;
 }
 
-bool Struct::addField(const std::wstring& _sKey)
+Struct* Struct::addField(const std::wstring& _sKey)
 {
+    if (getRef() > 1)
+    {
+        // A Struct content in more than one Scilab variable
+        // must be cloned before to be modified.
+        Struct* pClone = clone()->template getAs<Struct>();
+        pClone->addField(_sKey);
+        return pClone;
+    }
+
     if (getSize() == 0)
     {
         //change dimension to 1x1 and add field
@@ -421,11 +430,21 @@ bool Struct::addField(const std::wstring& _sKey)
         */
         get(i)->addField(_sKey);
     }
-    return true;
+
+    return this;
 }
 
-bool Struct::addFieldFront(const std::wstring& _sKey)
+Struct* Struct::addFieldFront(const std::wstring& _sKey)
 {
+    if (getRef() > 1)
+    {
+        // A Struct content in more than one Scilab variable
+        // must be cloned before to be modified.
+        Struct* pClone = clone()->template getAs<Struct>();
+        pClone->addField(_sKey);
+        return pClone;
+    }
+
     if (getSize() == 0)
     {
         //change dimension to 1x1 and add field
@@ -437,17 +456,26 @@ bool Struct::addFieldFront(const std::wstring& _sKey)
         get(i)->addFieldFront(_sKey);
     }
 
-    return true;
+    return this;
 }
 
-bool Struct::removeField(const std::wstring& _sKey)
+Struct* Struct::removeField(const std::wstring& _sKey)
 {
+    if (getRef() > 1)
+    {
+        // A Struct content in more than one Scilab variable
+        // must be cloned before to be modified.
+        Struct* pClone = clone()->template getAs<Struct>();
+        pClone->addField(_sKey);
+        return pClone;
+    }
+
     for (int j = 0; j < getSize(); j++)
     {
         get(j)->removeField(_sKey);
     }
 
-    return true;
+    return this;
 }
 
 bool Struct::toString(std::wostringstream& ostr)
diff --git a/scilab/modules/ast/tests/nonreg_tests/bug_14253.dia.ref b/scilab/modules/ast/tests/nonreg_tests/bug_14253.dia.ref
new file mode 100644 (file)
index 0000000..6fa7915
--- /dev/null
@@ -0,0 +1,21 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Cedric Delamarre
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 14253 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/14253
+//
+// <-- Short Description -->
+// Problem with the affectation cmde "=" applied to a "list of struct"
+st.a="aa";
+LST=list(st);
+LST1=LST;
+LST(1).a="zz";
+LST=LST1;
+assert_checkequal(LST(1).a, "aa");
diff --git a/scilab/modules/ast/tests/nonreg_tests/bug_14253.tst b/scilab/modules/ast/tests/nonreg_tests/bug_14253.tst
new file mode 100644 (file)
index 0000000..1e6e18c
--- /dev/null
@@ -0,0 +1,22 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Cedric Delamarre
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 14253 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/14253
+//
+// <-- Short Description -->
+// Problem with the affectation cmde "=" applied to a "list of struct"
+
+st.a="aa";
+LST=list(st);
+LST1=LST;
+LST(1).a="zz";
+LST=LST1;
+assert_checkequal(LST(1).a, "aa");