[bug_14437] struct clone missing when ref is more than 1 33/18633/3
Cedric Delamarre [Tue, 25 Oct 2016 15:44:38 +0000 (17:44 +0200)]
test_run ast bug_14437

Change-Id: I165e1113cb8153f415761a44df4c472c8c2f881c

scilab/CHANGES.md
scilab/modules/ast/src/cpp/ast/visitor_common.cpp
scilab/modules/ast/tests/nonreg_tests/bug_14437.dia.ref [new file with mode: 0644]
scilab/modules/ast/tests/nonreg_tests/bug_14437.tst [new file with mode: 0644]

index 745bd9c..1c97be3 100644 (file)
@@ -346,6 +346,7 @@ Bug Fixes
 * [#14379](http://bugzilla.scilab.org/show_bug.cgi?id=14379): Problem with lists of functions having 2 arguments.
 * [#14395](http://bugzilla.scilab.org/show_bug.cgi?id=14395): `dir` displayed a []+".." warning when no subdirectory exists.
 * [#14411](http://bugzilla.scilab.org/show_bug.cgi?id=14411): abort crashes scilab in a loop while
+* [#14437](http://bugzilla.scilab.org/show_bug.cgi?id=14437): Problem with the affectation cmde "=" applied to a "list of struct"
 * [#14448](http://bugzilla.scilab.org/show_bug.cgi?id=14448): removed havewindow() was still documented
 * [#14461](http://bugzilla.scilab.org/show_bug.cgi?id=14461): Calling `grand(n, "markov", P, x0)` did not return all outputs.
 * [#14513](http://bugzilla.scilab.org/show_bug.cgi?id=14513): `isqual` comparing two built-in functions yielded an error.
index 76de2d4..5f3886b 100644 (file)
@@ -896,6 +896,15 @@ types::InternalType* evaluateFields(const ast::Exp* _pExp, std::list<ExpHistory*
             if (pITCurrent->isStruct())
             {
                 types::Struct* pStruct = pITCurrent->getAs<types::Struct>();
+                // In case where pStruct is in several scilab variable,
+                // we have to clone it for keep the other variables unchanged.
+                if (pStruct->getRef() > 1)
+                {
+                    pStruct = pStruct->clone();
+                    pEH->setCurrent(pStruct);
+                    pEH->setReinsertion();
+                }
+
                 std::wstring pwcsFieldname = (*iterFields)->getExpAsString();
 
                 if (pEH->needResize())
diff --git a/scilab/modules/ast/tests/nonreg_tests/bug_14437.dia.ref b/scilab/modules/ast/tests/nonreg_tests/bug_14437.dia.ref
new file mode 100644 (file)
index 0000000..4e20c9e
--- /dev/null
@@ -0,0 +1,19 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2016 - Scilab Enterprises - Cedric Delamarre
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- Non-regression test for bug 14437 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=14437
+//
+// <-- Short Description -->
+// Problem with the affectation cmde "=" applied to a "list of struct"
+lst=list();
+lst(1)=struct("f",[1,2]);
+lst(2)=lst(1);
+lst(2).f(2)=3;
+assert_checkequal(lst(1).f, [1,2]);
+assert_checkequal(lst(2).f, [1,3]);
diff --git a/scilab/modules/ast/tests/nonreg_tests/bug_14437.tst b/scilab/modules/ast/tests/nonreg_tests/bug_14437.tst
new file mode 100644 (file)
index 0000000..1b126e3
--- /dev/null
@@ -0,0 +1,22 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2016 - Scilab Enterprises - Cedric Delamarre
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- Non-regression test for bug 14437 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=14437
+//
+// <-- Short Description -->
+// Problem with the affectation cmde "=" applied to a "list of struct"
+
+lst=list();
+lst(1)=struct("f",[1,2]);
+lst(2)=lst(1);
+lst(2).f(2)=3;
+
+assert_checkequal(lst(1).f, [1,2]);
+assert_checkequal(lst(2).f, [1,3]);