* Bug #14455 - macr2tree crashed when passing a FieldExp 35/18035/4
Clément DAVID [Mon, 4 Apr 2016 12:59:15 +0000 (14:59 +0200)]
Change-Id: I8169eb69a20e3be3ea21157865ed20285afd5912

scilab/CHANGES
scilab/modules/ast/includes/ast/treevisitor.hxx
scilab/modules/ast/src/cpp/ast/treevisitor.cpp
scilab/modules/core/tests/nonreg_tests/bug_14455.dia.ref [new file with mode: 0644]
scilab/modules/core/tests/nonreg_tests/bug_14455.tst [new file with mode: 0644]
scilab/modules/core/tests/unit_tests/macr2tree.dia.ref [new file with mode: 0644]
scilab/modules/core/tests/unit_tests/macr2tree.tst [new file with mode: 0644]

index e530a93..c9973f1 100644 (file)
@@ -422,6 +422,8 @@ In 6.0.0:
 
 * Bug #14453 fixed - strcat([]) now returns [] instead of null string
 
+* Bug #14455       - macr2tree crashed when passing a FieldExp
+
 * Bug #14468 fixed - Scinotes was unable to export to HTML.
 
 * Bug #14471 fixed - strange([]) returned [] instead of %nan as all other functions for statistical dispersion
index 59fabe0..e206f6b 100644 (file)
@@ -81,4 +81,4 @@ private:
     types::List* eol;
 };
 }
-#endif /* !__LISTVISITOR_HXX__ */
\ No newline at end of file
+#endif /* !__LISTVISITOR_HXX__ */
index 22f73b4..fc41ae1 100644 (file)
@@ -520,7 +520,7 @@ void TreeVisitor::visit(const AssignExp &e)
     if (left.isCallExp())
     {
         CallExp* call = left.getAs<CallExp>();
-        types::List* ins = createOperation();
+        types::List* operation = createOperation();
         types::List* lhs = new types::List();
         //varname
         call->getName().accept(*this);
@@ -542,14 +542,14 @@ void TreeVisitor::visit(const AssignExp &e)
         {
             dlhs[0] = 1;//lhs = 1
         }
-        ins->append(lhs);
+        operation->append(lhs);
         lhs->killMe();
 
         //operator
-        ins->append(new types::String(L"ins"));
+        operation->append(new types::String(L"ins"));
         types::List* lst = new types::List();
-        lst->append(ins);
-        ins->killMe();
+        lst->append(operation);
+        operation->killMe();
         assign->append(lst);
         lst->killMe();
     }
@@ -619,39 +619,49 @@ void TreeVisitor::visit(const AssignExp &e)
 
 void TreeVisitor::visit(const CallExp &e)
 {
-    types::TList* call = new types::TList();
-
-    //header
-    types::String* varstr = new types::String(1, 4);
-    varstr->set(0, L"funcall");
-    varstr->set(1, L"rhs");
-    varstr->set(2, L"name");
-    varstr->set(3, L"lhsnb");
-    call->append(varstr);
-
-    //rhs
-    types::List* rhs = new types::List();
-    ast::exps_t args = e.getArgs();
-    for (auto arg : args)
+    if (e.getName().isSimpleVar())
     {
-        arg->accept(*this);
-        types::List* tmp = getList();
-        rhs->append(tmp);
-        tmp->killMe();
-    }
+        const ast::SimpleVar & var = static_cast<const ast::SimpleVar &>(e.getName());
+
+        types::TList* call = new types::TList();
 
-    call->append(rhs);
-    rhs->killMe();
+        //header
+        types::String* varstr = new types::String(1, 4);
+        varstr->set(0, L"funcall");
+        varstr->set(1, L"rhs");
+        varstr->set(2, L"name");
+        varstr->set(3, L"lhsnb");
+        call->append(varstr);
 
-    //name
-    call->append(new types::String(e.getName().getAs<SimpleVar>()->getSymbol().getName().c_str()));
+        //rhs
+        types::List* rhs = new types::List();
+        ast::exps_t args = e.getArgs();
+        for (auto arg : args)
+        {
+            arg->accept(*this);
+            types::List* tmp = getList();
+            rhs->append(tmp);
+            tmp->killMe();
+        }
 
-    //lhsnb
-    //use default value 1
-    //parent exp like assign can adapt it.
-    call->append(new types::Double(1));
+        call->append(rhs);
+        rhs->killMe();
 
-    l = call;
+        //name
+        const std::wstring & name = var.getSymbol().getName();
+        call->append(new types::String(name.c_str()));
+
+        //lhsnb
+        //use default value 1
+        //parent exp like assign can adapt it.
+        call->append(new types::Double(1));
+
+        l = call;
+    }
+    else
+    {
+        //not yet managed
+    }
 }
 
 void TreeVisitor::visit(const ForExp &e)
diff --git a/scilab/modules/core/tests/nonreg_tests/bug_14455.dia.ref b/scilab/modules/core/tests/nonreg_tests/bug_14455.dia.ref
new file mode 100644 (file)
index 0000000..67217bd
--- /dev/null
@@ -0,0 +1,12 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2016 - Scilab Enterprises - Clement David
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//<-- CLI SHELL MODE -->
+function test()
+    d = dir(".")
+    d.name(1)
+endfunction
+t1 = macr2tree(test);
diff --git a/scilab/modules/core/tests/nonreg_tests/bug_14455.tst b/scilab/modules/core/tests/nonreg_tests/bug_14455.tst
new file mode 100644 (file)
index 0000000..b4ce522
--- /dev/null
@@ -0,0 +1,16 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2016 - Scilab Enterprises - Clement David
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+//<-- CLI SHELL MODE -->
+
+function test()
+    d = dir(".")
+    d.name(1)
+endfunction
+
+t1 = macr2tree(test);
+
diff --git a/scilab/modules/core/tests/unit_tests/macr2tree.dia.ref b/scilab/modules/core/tests/unit_tests/macr2tree.dia.ref
new file mode 100644 (file)
index 0000000..6106136
--- /dev/null
@@ -0,0 +1,20 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2016 - Scilab Enterprises - Clement David
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//<-- CLI SHELL MODE -->
+// parse all the macros in core
+funs = libraryinfo("corelib");
+for i=1:size(funs, '*')
+    macr2tree(evstr(funs(i)));
+end
+// parse all the tests in ast
+parsing_tests = ls("SCI/modules/ast/tests/unit_tests/*.tst");
+for i=1:size(parsing_tests, '*')
+    text = mgetl(parsing_tests(i));
+    deff('[] = macr2tree_fun()',text);
+    macr2tree(macr2tree_fun);
+    clear macr2tree_fun;
+end
diff --git a/scilab/modules/core/tests/unit_tests/macr2tree.tst b/scilab/modules/core/tests/unit_tests/macr2tree.tst
new file mode 100644 (file)
index 0000000..ce016e1
--- /dev/null
@@ -0,0 +1,24 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2016 - Scilab Enterprises - Clement David
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+//<-- CLI SHELL MODE -->
+
+// parse all the macros in core
+funs = libraryinfo("corelib");
+for i=1:size(funs, "*")
+    macr2tree(evstr(funs(i)));
+end
+
+// parse all the tests in ast
+parsing_tests = ls("SCI/modules/ast/tests/unit_tests/*.tst");
+for i=1:size(parsing_tests, "*")
+    text = mgetl(parsing_tests(i));
+    deff("[] = macr2tree_fun()",text);
+    macr2tree(macr2tree_fun);
+    clear macr2tree_fun;
+end
+