insert in struct corrected. 18/15118/3
Cedric Delamarre [Thu, 28 Aug 2014 09:55:44 +0000 (11:55 +0200)]
a("b")(2) = 12
a(3)("b")(2)=13

test_run ast insert

Change-Id: Ib56a320de05e7e2581b714e11de42eeded04e62d

scilab/modules/ast/includes/ast/expHistory.hxx
scilab/modules/ast/src/cpp/ast/expHistory.cpp
scilab/modules/ast/src/cpp/ast/visitor_common.cpp
scilab/modules/ast/src/cpp/types/struct.cpp

index 92da592..3f678e5 100644 (file)
@@ -43,6 +43,7 @@ public :
     void                    computeArgs();
     bool                    needResize();
     void                    setArgsOwner(bool);
+    void                    setExpOwner(bool);
 
     // current InternalType a
     bool                    setCurrent(types::InternalType*);
@@ -84,6 +85,7 @@ private :
 
     bool                    m_bCellExp;
     bool                    m_pArgsOwner;
+    bool                    m_pExpOwner;
 };
 
 #endif /* __EXPHISTORY_HXX__ */
index c8fd68c..b5b874c 100644 (file)
 ** Constructor & Destructor (public)
 */
 
-ExpHistory::ExpHistory() : m_pArgs(NULL), m_piArgsDimsArray(NULL), m_pExp(NULL), m_pParent(NULL), m_pITCurrent(NULL), m_bReinsertMe(false), m_bCellExp(false), m_iArgsDims(0), m_iWhere(-1), m_iLevel(0), m_pArgsOwner(false)
+ExpHistory::ExpHistory() : m_pArgs(NULL), m_piArgsDimsArray(NULL), m_pExp(NULL), m_pParent(NULL), m_pITCurrent(NULL), m_bReinsertMe(false), m_bCellExp(false), m_iArgsDims(0), m_iWhere(-1), m_iLevel(0), m_pArgsOwner(false), m_pExpOwner(false)
 {
 }
 
 
-ExpHistory::ExpHistory(ExpHistory* _pEH, ast::SimpleVar* _pExp) : m_pArgs(NULL), m_piArgsDimsArray(NULL), m_pExp(_pExp), m_pParent(_pEH), m_pITCurrent(NULL), m_bReinsertMe(false), m_bCellExp(false), m_iArgsDims(0), m_iWhere(-1), m_iLevel(0), m_pArgsOwner(false)
+ExpHistory::ExpHistory(ExpHistory* _pEH, ast::SimpleVar* _pExp) : m_pArgs(NULL), m_piArgsDimsArray(NULL), m_pExp(_pExp), m_pParent(_pEH), m_pITCurrent(NULL), m_bReinsertMe(false), m_bCellExp(false), m_iArgsDims(0), m_iWhere(-1), m_iLevel(0), m_pArgsOwner(false), m_pExpOwner(false)
 {
 }
 
-ExpHistory::ExpHistory(ExpHistory* _pParent, types::typed_list* _pArgs) : m_pArgs(_pArgs), m_piArgsDimsArray(NULL), m_pExp(NULL), m_pParent(_pParent), m_pITCurrent(NULL), m_bReinsertMe(false), m_bCellExp(false), m_iArgsDims(0), m_iWhere(-1), m_iLevel(0), m_pArgsOwner(false)
+ExpHistory::ExpHistory(ExpHistory* _pParent, types::typed_list* _pArgs) : m_pArgs(_pArgs), m_piArgsDimsArray(NULL), m_pExp(NULL), m_pParent(_pParent), m_pITCurrent(NULL), m_bReinsertMe(false), m_bCellExp(false), m_iArgsDims(0), m_iWhere(-1), m_iLevel(0), m_pArgsOwner(false), m_pExpOwner(false)
 {
 }
 
@@ -43,12 +43,18 @@ ExpHistory::ExpHistory(ExpHistory* _pParent, ast::SimpleVar* _pExp, types::typed
     m_iArgsDims(0),
     m_iWhere(-1),
     m_iLevel(_iLevel),
-    m_pArgsOwner(false)
+    m_pArgsOwner(false),
+    m_pExpOwner(false)
 {
 }
 
 ExpHistory::~ExpHistory()
 {
+    if (m_pExpOwner)
+    {
+        delete m_pExp;
+    }
+
     if (m_piArgsDimsArray)
     {
         delete[] m_piArgsDimsArray;
@@ -59,10 +65,7 @@ ExpHistory::~ExpHistory()
         types::typed_list::iterator iter = m_pArgs->begin();
         for (; iter != m_pArgs->end(); ++iter)
         {
-            if ((*iter)->isDeletable())
-            {
-                delete *iter;
-            }
+            (*iter)->killMe();
         }
 
         delete m_pArgs;
@@ -110,6 +113,11 @@ void ExpHistory::setArgsOwner(bool owner)
     m_pArgsOwner = owner;
 }
 
+void ExpHistory::setExpOwner(bool owner)
+{
+    m_pExpOwner = owner;
+}
+
 void ExpHistory::computeArgs()
 {
     if (m_pArgs)
index c0af272..4fd8b28 100644 (file)
@@ -695,7 +695,21 @@ bool getFieldsFromExp(ast::Exp* _pExp, std::list<ExpHistory*>& fields)
         typed_list* pCurrentArgs = execMe.GetArgumentList(pCall->args_get());
 
         bool bErr = getFieldsFromExp(&pCall->name_get(), fields);
-        if (fields.back()->getArgs())
+        if (pCurrentArgs && (*pCurrentArgs)[0]->isString())
+        {
+            // a("b") => a.b or a(x)("b") => a(x).b
+            ExpHistory * pEHParent = fields.back();
+            ast::SimpleVar* pFieldVar = new ast::SimpleVar(pCall->location_get(), *new symbol::Symbol((*pCurrentArgs)[0]->getAs<String>()->get(0)));
+            ExpHistory * pEH = new ExpHistory(pEHParent, pFieldVar);
+            pEH->setLevel(pEHParent->getLevel() + 1);
+            pEH->setExpOwner(true);
+
+            (*pCurrentArgs)[0]->killMe();
+            delete pCurrentArgs;
+
+            fields.push_back(pEH);
+        }
+        else if (fields.back()->getArgs())
         {
             // a(x)(y)(z)
             ExpHistory * pEHParent = fields.back();
@@ -708,6 +722,7 @@ bool getFieldsFromExp(ast::Exp* _pExp, std::list<ExpHistory*>& fields)
         {
             // a(x)
             fields.back()->setArgs(pCurrentArgs);
+            fields.back()->setArgsOwner(true);
         }
 
         if (pCell)
index 0a27ace..51ce5f8 100644 (file)
@@ -193,10 +193,10 @@ bool Struct::invoke(typed_list & in, optional_list & opt, int _iRetCount, typed_
                     return true;
                 }
             }
-        }
 
-        out.swap(_out);
-        return true;
+            out.swap(_out);
+            return true;
+        }
     }
 
     return ArrayOf<SingleStruct*>::invoke(in, opt, _iRetCount, out, execFunc, e);