insertion in output of function call 91/17291/4
Cedric Delamarre [Wed, 7 Oct 2015 14:31:40 +0000 (16:31 +0200)]
test_run graphics bug_14141
test_run ast insert

Change-Id: I6b6cfc79fe5a770f53c4c49810ce8c55e83c0e9a

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

index c2b5791..45be4c0 100644 (file)
@@ -85,6 +85,8 @@ Scilab Bug Fixes
 
 * Bug #14113 fixed - Scilab 6 did not detect infinite loop.
 
+* Bug #14141 fixed - recursive insertion: gcf().attribute=value => "Wrong insertion : function or macro are not expected".
+
 * Bug #14144 fixed - Scilab crashed with int64(2^63).
 
 * Bug #14149 fixed - hdf5 could not restore hypermatrix with good dimensions.
index 7211e99..ac300b2 100644 (file)
@@ -311,7 +311,11 @@ public :
             }
             else
             {
-                pArgs->push_back(getResult());
+                if (getResult())
+                {
+                    pArgs->push_back(getResult());
+                }
+                //else optional argument skipped
             }
         }
         //to be sure, delete operation does not delete result
index 9d195f6..417b439 100644 (file)
@@ -814,21 +814,21 @@ types::InternalType* evaluateFields(const ast::Exp* _pExp, std::list<ExpHistory*
             throw ast::InternalError(os.str(), 999, _pExp->getLocation());
         }
 
-
         ast::SimpleVar* spMainExp = pFirstField->getExp();
         pITMain = ctx->getCurrentLevel(spMainExp->getSymbol());
 
+        // looking for a callable
         if (pITMain == NULL)
         {
-            // check if we not redefined a protected variable. (ie: sin(2) = 12 without redefine sin before)
-            symbol::Variable* var = ctx->getOrCreate(spMainExp->getSymbol());
-            if (var->empty() == false && var->top()->m_iLevel == 0)
+            pITMain = ctx->get(spMainExp->getSymbol());
+            if (pITMain && pITMain->isCallable() == false)
             {
-                std::wostringstream os;
-                os << _W("Unexpected redefinition of Scilab function or variable.");
-                throw ast::InternalError(os.str(), 999, _pExp->getLocation());
+                pITMain = NULL;
             }
+        }
 
+        if (pITMain == NULL)
+        {
             if (pFirstField->isCellExp())
             {
                 // a{x}, where "a" doesn't exists
@@ -1463,9 +1463,48 @@ types::InternalType* evaluateFields(const ast::Exp* _pExp, std::list<ExpHistory*
             }
             else if (pITCurrent->isCallable())
             {
-                std::wostringstream os;
-                os << _W("Wrong insertion : function or macro are not expected.");
-                throw ast::InternalError(os.str(), 999, _pExp->getLocation());
+                bool ret = false;
+                types::typed_list out;
+                types::typed_list in;
+                types::optional_list opt;
+
+                if (pEH->getArgs())
+                {
+                    in = *pEH->getArgs();
+                }
+
+                try
+                {
+                    ret = pITCurrent->invoke(in, opt, 1, out, *pEH->getExp());
+                }
+                catch (ast::InternalAbort& ia)
+                {
+                    throw ia;
+                }
+                catch (const ast::InternalError& ie)
+                {
+                    throw ie;
+                }
+
+                if (ret == false || out.size() != 1 || out[0]->isHandle() == false)
+                {
+                    char szError[bsiz];
+                    char* strFName = wide_string_to_UTF8(pITCurrent->getAs<types::Callable>()->getName().c_str());
+                    os_sprintf(szError, _("Wrong insertion: insertion in output of '%s' is not allowed.\n"), strFName);
+                    FREE(strFName);
+
+                    wchar_t* wError = to_wide_string(szError);
+                    std::wstring err(wError);
+                    FREE(wError);
+
+                    throw ast::InternalError(err, 999, pEH->getExp()->getLocation());
+                }
+
+                pEH->setCurrent(out[0]);
+                pEH->setArgs(NULL);
+                pEH->resetReinsertion();
+                workFields.push_front(pEH);
+                evalFields.pop_back();
             }
             else
             {
@@ -1515,6 +1554,12 @@ types::InternalType* evaluateFields(const ast::Exp* _pExp, std::list<ExpHistory*
 
                 pCell->insertCell(pArgs, _pAssignValue);
             }
+            else if (pEH->getCurrent() && pEH->getCurrent()->isCallable())
+            {
+                std::wostringstream os;
+                os << _W("Unexpected redefinition of Scilab function.");
+                throw ast::InternalError(os.str(), 999, _pExp->getLocation());
+            }
             else
             {
                 // insert "something" in b(x,y)
diff --git a/scilab/modules/graphics/tests/nonreg_tests/bug_14141.dia.ref b/scilab/modules/graphics/tests/nonreg_tests/bug_14141.dia.ref
new file mode 100644 (file)
index 0000000..18c7f07
--- /dev/null
@@ -0,0 +1,17 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2015 - Scilab Enterprises - Cedric Delamarre
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- Non-regression test for bug 14141 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/14141
+//
+// <-- Short Description -->
+// recursive insertion: gcf().attribute=value => "Wrong insertion : function or macro are not expected".
+plot2d();
+assert_checkequal(gcf().visible, "on");
+gcf().visible = %f;
+assert_checkequal(gcf().visible, "off");
diff --git a/scilab/modules/graphics/tests/nonreg_tests/bug_14141.tst b/scilab/modules/graphics/tests/nonreg_tests/bug_14141.tst
new file mode 100644 (file)
index 0000000..9218426
--- /dev/null
@@ -0,0 +1,19 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2015 - Scilab Enterprises - Cedric Delamarre
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- Non-regression test for bug 14141 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/14141
+//
+// <-- Short Description -->
+// recursive insertion: gcf().attribute=value => "Wrong insertion : function or macro are not expected".
+
+
+plot2d();
+assert_checkequal(gcf().visible, "on");
+gcf().visible = %f;
+assert_checkequal(gcf().visible, "off");