fix ast memory leak in tests 65/16365/4
Antoine ELIAS [Tue, 14 Apr 2015 09:31:52 +0000 (11:31 +0200)]
Change-Id: I4a8305d8371b73ed5ac38c1c9eb2ebafc14f02c5

12 files changed:
scilab/modules/ast/includes/analysis/AnalysisVisitor.hxx
scilab/modules/ast/includes/analysis/Decorator.hxx
scilab/modules/ast/includes/analysis/checkers/Checkers.hxx
scilab/modules/ast/includes/analysis/gvn/MultivariateMonomial.hxx
scilab/modules/ast/includes/analysis/gvn/MultivariatePolynomial.hxx
scilab/modules/ast/includes/analysis/tools.hxx
scilab/modules/ast/includes/types/inspector.hxx
scilab/modules/ast/src/cpp/ast/runvisitor.cpp
scilab/modules/ast/src/cpp/ast/visitor_common.cpp
scilab/modules/ast/src/cpp/operations/types_dotdivide.cpp
scilab/modules/ast/src/cpp/operations/types_power.cpp
scilab/modules/ast/src/cpp/types/inspector.cpp

index bff3b77..97caa1f 100644 (file)
@@ -524,7 +524,7 @@ private:
             if (e.getRightExp().isCallExp())
             {
                 const ast::exps_t & exps = ale.getExps();
-                visit(static_cast<ast::CallExp &>(e.getRightExp()), /* LHS */ exps.size());
+                visit(static_cast<ast::CallExp &>(e.getRightExp()), /* LHS */ static_cast<unsigned int>(exps.size()));
                 std::vector<Result>::iterator j = multipleLHS.begin();
                 for (const auto exp : exps)
                 {
index 6758440..e30f293 100644 (file)
@@ -43,6 +43,7 @@ struct Decorator
 
     inline Call & setCall(Call && call)
     {
+        delete this->call;
         this->call = new Call(std::move(call));
         return *this->call;
     }
index 073f769..1601609 100644 (file)
 
 namespace analysis
 {
-    class Checkers
+class Checkers
+{
+    struct __NName
     {
-        struct __NName
-        {
-            const unsigned short nargs;
-            const std::wstring name;
+        const unsigned short nargs;
+        const std::wstring name;
 
-            //__NName(unsigned short n, const char * _name) : nargs(n), name(_name) { }
-            __NName(unsigned short n, const std::wstring & _name) : nargs(n), name(_name) { }
-            inline bool operator==(const __NName & R) const { return nargs == R.nargs && name == R.name; }
-        };
+        //__NName(unsigned short n, const char * _name) : nargs(n), name(_name) { }
+        __NName(unsigned short n, const std::wstring & _name) : nargs(n), name(_name) { }
+        inline bool operator==(const __NName & R) const
+        {
+            return nargs == R.nargs && name == R.name;
+        }
+    };
 
-       struct __Infos
-       {
-           const unsigned short pos;
-           const bool elementwise;
-           const bool notconst;
-           const bool jitted;
+    struct __Infos
+    {
+        const unsigned short pos;
+        const bool elementwise;
+        const bool notconst;
+        const bool jitted;
 
-           __Infos(const unsigned short _pos, const bool _ew, const bool _nc, const bool _j) : pos(_pos), elementwise(_ew), notconst(_nc), jitted(_j) { }
-       };
+        __Infos(const unsigned short _pos, const bool _ew, const bool _nc, const bool _j) : pos(_pos), elementwise(_ew), notconst(_nc), jitted(_j) { }
+    };
 
-        struct __Hasher
+    struct __Hasher
+    {
+        inline std::size_t operator()(const __NName & nn) const
         {
-            inline std::size_t operator()(const __NName & nn) const { return (std::hash<std::wstring>()(nn.name) << 4) ^ nn.nargs; }
-        };
+            return (std::hash<std::wstring>()(nn.name) << 4) ^ nn.nargs;
+        }
+    };
+
+    typedef std::unordered_map<__NName, __Infos, __Hasher> CheckersMap;
+    static CheckersMap map;
+    static TIType (*ARGS0[3])(GVN &);
+    static TIType (*ARGS1[40])(GVN &, const TIType &);
+    static TIType (*ARGS2[5])(GVN &, const TIType &, const TIType &);
 
-        typedef std::unordered_map<__NName, __Infos, __Hasher> CheckersMap;
-        static CheckersMap map;
-        static TIType (*ARGS0[3])(GVN &);
-        static TIType (*ARGS1[40])(GVN &, const TIType &);
-        static TIType (*ARGS2[5])(GVN &, const TIType &, const TIType &);
+public:
 
-    public:
-        
-        static TIType check(GVN & gvn, const std::wstring & name, const std::vector<TIType> & args)
+    static TIType check(GVN & gvn, const std::wstring & name, const std::vector<TIType> & args)
+    {
+        const unsigned short size = static_cast<unsigned short>(args.size());
+        CheckersMap::const_iterator i = map.find(__NName(size, name));
+        if (i != map.end())
         {
-            const unsigned short size = args.size();
-            CheckersMap::const_iterator i = map.find(__NName(size, name));
-            if (i != map.end())
+            // TODO : remove array of function pointers and replace by a switch statement
+            switch (size)
             {
-                // TODO : remove array of function pointers and replace by a switch statement
-                switch (size)
-                {
                 case 0:
-                     return ARGS0[i->second.pos](gvn);
+                    return ARGS0[i->second.pos](gvn);
                 case 1:
-                     return ARGS1[i->second.pos](gvn, args[0]);
+                    return ARGS1[i->second.pos](gvn, args[0]);
                 case 2:
-                     return ARGS2[i->second.pos](gvn, args[0], args[1]);
-                }
+                    return ARGS2[i->second.pos](gvn, args[0], args[1]);
             }
-            
-            return TIType(gvn);
         }
 
-        static bool isElementWise(const std::wstring & name, unsigned short nargs = 1)
+        return TIType(gvn);
+    }
+
+    static bool isElementWise(const std::wstring & name, unsigned short nargs = 1)
+    {
+        CheckersMap::const_iterator i = map.find(__NName(nargs, name));
+        if (i != map.end())
         {
-            CheckersMap::const_iterator i = map.find(__NName(nargs, name));
-            if (i != map.end())
-            {
-                return i->second.elementwise;
-            }
-            return false;
+            return i->second.elementwise;
         }
+        return false;
+    }
 
-        static bool isJitted(const std::wstring & name, unsigned short nargs = 1)
+    static bool isJitted(const std::wstring & name, unsigned short nargs = 1)
+    {
+        CheckersMap::const_iterator i = map.find(__NName(nargs, name));
+        if (i != map.end())
         {
-            CheckersMap::const_iterator i = map.find(__NName(nargs, name));
-            if (i != map.end())
-            {
-                return i->second.jitted;
-            }
-            return false;
+            return i->second.jitted;
         }
+        return false;
+    }
 
-    private:
+private:
 
-        static CheckersMap initMap()
-        {
-            CheckersMap map;
-            map.emplace(__NName(0, L"rand"), __Infos(0, false, true, false));
-            map.emplace(__NName(0, L"zeros"), __Infos(1, false, false, false));
-            map.emplace(__NName(0, L"ones"), __Infos(2, false, false, false));
-            map.emplace(__NName(1, L"rand"), __Infos(0, false, true, false));
-            map.emplace(__NName(1, L"int"), __Infos(1, true, false, true));
-            map.emplace(__NName(1, L"cosh"), __Infos(2, true, false, true));
-            map.emplace(__NName(1, L"tan"), __Infos(3, true, false, true));
-            map.emplace(__NName(1, L"cumsum"), __Infos(4, true, false, true));
-            map.emplace(__NName(1, L"asin"), __Infos(5, true, false, false));
-            map.emplace(__NName(1, L"isnan"), __Infos(6, true, false, true));
-            map.emplace(__NName(1, L"floor"), __Infos(7, true, false, true));
-            map.emplace(__NName(1, L"fix"), __Infos(8, true, false, true));
-            map.emplace(__NName(1, L"sqrt"), __Infos(9, true, false, true));
-            map.emplace(__NName(1, L"uint16"), __Infos(10, true, false, true));
-            map.emplace(__NName(1, L"abs"), __Infos(11, true, false, true));
-            map.emplace(__NName(1, L"zeros"), __Infos(12, false, false, false));
-            map.emplace(__NName(1, L"max"), __Infos(13, false, false, true));
-            map.emplace(__NName(1, L"uint32"), __Infos(14, true, false, true));
-            map.emplace(__NName(1, L"int64"), __Infos(15, true, false, true));
-            map.emplace(__NName(1, L"prod"), __Infos(16, false, false, true));
-            map.emplace(__NName(1, L"sin"), __Infos(17, true, false, true));
-            map.emplace(__NName(1, L"int32"), __Infos(18, true, false, true));
-            map.emplace(__NName(1, L"int16"), __Infos(19, true, false, true));
-            map.emplace(__NName(1, L"exp"), __Infos(20, true, false, true));
-            map.emplace(__NName(1, L"atan"), __Infos(21, true, false, false));
-            map.emplace(__NName(1, L"uint8"), __Infos(22, true, false, true));
-            map.emplace(__NName(1, L"ceil"), __Infos(23, true, false, true));
-            map.emplace(__NName(1, L"sinm"), __Infos(24, false, false, false));
-            map.emplace(__NName(1, L"isinf"), __Infos(25, true, false, true));
-            map.emplace(__NName(1, L"sinh"), __Infos(26, true, false, true));
-            map.emplace(__NName(1, L"int8"), __Infos(27, true, false, true));
-            map.emplace(__NName(1, L"log"), __Infos(28, true, false, false));
-            map.emplace(__NName(1, L"uint64"), __Infos(29, true, false, true));
-            map.emplace(__NName(1, L"cos"), __Infos(30, true, false, true));
-            map.emplace(__NName(1, L"tanh"), __Infos(31, true, false, true));
-            map.emplace(__NName(1, L"min"), __Infos(32, false, false, true));
-            map.emplace(__NName(1, L"cumprod"), __Infos(33, true, false, true));
-            map.emplace(__NName(1, L"erf"), __Infos(34, true, false, true));
-            map.emplace(__NName(1, L"ones"), __Infos(35, false, false, false));
-            map.emplace(__NName(1, L"erfc"), __Infos(36, true, false, true));
-            map.emplace(__NName(1, L"sum"), __Infos(37, false, false, true));
-            map.emplace(__NName(1, L"acos"), __Infos(38, true, false, false));
-            map.emplace(__NName(1, L"round"), __Infos(39, true, false, true));
-            map.emplace(__NName(2, L"rand"), __Infos(0, false, true, false));
-            map.emplace(__NName(2, L"dothypot"), __Infos(1, true, false, true));
-            map.emplace(__NName(2, L"hypot"), __Infos(2, false, false, true));
-            map.emplace(__NName(2, L"zeros"), __Infos(3, false, false, false));
-            map.emplace(__NName(2, L"ones"), __Infos(4, false, false, false));           
-            ARGS0[0] = &check_rand;
-            ARGS0[1] = &check_zeros;
-            ARGS0[2] = &check_ones;
-            ARGS1[0] = &check_rand;
-            ARGS1[1] = &check_int;
-            ARGS1[2] = &check_cosh;
-            ARGS1[3] = &check_tan;
-            ARGS1[4] = &check_cumsum;
-            ARGS1[5] = &check_asin;
-            ARGS1[6] = &check_isnan;
-            ARGS1[7] = &check_floor;
-            ARGS1[8] = &check_fix;
-            ARGS1[9] = &check_sqrt;
-            ARGS1[10] = &check_uint16;
-            ARGS1[11] = &check_abs;
-            ARGS1[12] = &check_zeros;
-            ARGS1[13] = &check_max;
-            ARGS1[14] = &check_uint32;
-            ARGS1[15] = &check_int64;
-            ARGS1[16] = &check_prod;
-            ARGS1[17] = &check_sin;
-            ARGS1[18] = &check_int32;
-            ARGS1[19] = &check_int16;
-            ARGS1[20] = &check_exp;
-            ARGS1[21] = &check_atan;
-            ARGS1[22] = &check_uint8;
-            ARGS1[23] = &check_ceil;
-            ARGS1[24] = &check_sinm;
-            ARGS1[25] = &check_isinf;
-            ARGS1[26] = &check_sinh;
-            ARGS1[27] = &check_int8;
-            ARGS1[28] = &check_log;
-            ARGS1[29] = &check_uint64;
-            ARGS1[30] = &check_cos;
-            ARGS1[31] = &check_tanh;
-            ARGS1[32] = &check_min;
-            ARGS1[33] = &check_cumprod;
-            ARGS1[34] = &check_erf;
-            ARGS1[35] = &check_ones;
-            ARGS1[36] = &check_erfc;
-            ARGS1[37] = &check_sum;
-            ARGS1[38] = &check_acos;
-            ARGS1[39] = &check_round;
-            ARGS2[0] = &check_rand;
-            ARGS2[1] = &check_dothypot;
-            ARGS2[2] = &check_hypot;
-            ARGS2[3] = &check_zeros;
-            ARGS2[4] = &check_ones;
+    static CheckersMap initMap()
+    {
+        CheckersMap map;
+        map.emplace(__NName(0, L"rand"), __Infos(0, false, true, false));
+        map.emplace(__NName(0, L"zeros"), __Infos(1, false, false, false));
+        map.emplace(__NName(0, L"ones"), __Infos(2, false, false, false));
+        map.emplace(__NName(1, L"rand"), __Infos(0, false, true, false));
+        map.emplace(__NName(1, L"int"), __Infos(1, true, false, true));
+        map.emplace(__NName(1, L"cosh"), __Infos(2, true, false, true));
+        map.emplace(__NName(1, L"tan"), __Infos(3, true, false, true));
+        map.emplace(__NName(1, L"cumsum"), __Infos(4, true, false, true));
+        map.emplace(__NName(1, L"asin"), __Infos(5, true, false, false));
+        map.emplace(__NName(1, L"isnan"), __Infos(6, true, false, true));
+        map.emplace(__NName(1, L"floor"), __Infos(7, true, false, true));
+        map.emplace(__NName(1, L"fix"), __Infos(8, true, false, true));
+        map.emplace(__NName(1, L"sqrt"), __Infos(9, true, false, true));
+        map.emplace(__NName(1, L"uint16"), __Infos(10, true, false, true));
+        map.emplace(__NName(1, L"abs"), __Infos(11, true, false, true));
+        map.emplace(__NName(1, L"zeros"), __Infos(12, false, false, false));
+        map.emplace(__NName(1, L"max"), __Infos(13, false, false, true));
+        map.emplace(__NName(1, L"uint32"), __Infos(14, true, false, true));
+        map.emplace(__NName(1, L"int64"), __Infos(15, true, false, true));
+        map.emplace(__NName(1, L"prod"), __Infos(16, false, false, true));
+        map.emplace(__NName(1, L"sin"), __Infos(17, true, false, true));
+        map.emplace(__NName(1, L"int32"), __Infos(18, true, false, true));
+        map.emplace(__NName(1, L"int16"), __Infos(19, true, false, true));
+        map.emplace(__NName(1, L"exp"), __Infos(20, true, false, true));
+        map.emplace(__NName(1, L"atan"), __Infos(21, true, false, false));
+        map.emplace(__NName(1, L"uint8"), __Infos(22, true, false, true));
+        map.emplace(__NName(1, L"ceil"), __Infos(23, true, false, true));
+        map.emplace(__NName(1, L"sinm"), __Infos(24, false, false, false));
+        map.emplace(__NName(1, L"isinf"), __Infos(25, true, false, true));
+        map.emplace(__NName(1, L"sinh"), __Infos(26, true, false, true));
+        map.emplace(__NName(1, L"int8"), __Infos(27, true, false, true));
+        map.emplace(__NName(1, L"log"), __Infos(28, true, false, false));
+        map.emplace(__NName(1, L"uint64"), __Infos(29, true, false, true));
+        map.emplace(__NName(1, L"cos"), __Infos(30, true, false, true));
+        map.emplace(__NName(1, L"tanh"), __Infos(31, true, false, true));
+        map.emplace(__NName(1, L"min"), __Infos(32, false, false, true));
+        map.emplace(__NName(1, L"cumprod"), __Infos(33, true, false, true));
+        map.emplace(__NName(1, L"erf"), __Infos(34, true, false, true));
+        map.emplace(__NName(1, L"ones"), __Infos(35, false, false, false));
+        map.emplace(__NName(1, L"erfc"), __Infos(36, true, false, true));
+        map.emplace(__NName(1, L"sum"), __Infos(37, false, false, true));
+        map.emplace(__NName(1, L"acos"), __Infos(38, true, false, false));
+        map.emplace(__NName(1, L"round"), __Infos(39, true, false, true));
+        map.emplace(__NName(2, L"rand"), __Infos(0, false, true, false));
+        map.emplace(__NName(2, L"dothypot"), __Infos(1, true, false, true));
+        map.emplace(__NName(2, L"hypot"), __Infos(2, false, false, true));
+        map.emplace(__NName(2, L"zeros"), __Infos(3, false, false, false));
+        map.emplace(__NName(2, L"ones"), __Infos(4, false, false, false));
+        ARGS0[0] = &check_rand;
+        ARGS0[1] = &check_zeros;
+        ARGS0[2] = &check_ones;
+        ARGS1[0] = &check_rand;
+        ARGS1[1] = &check_int;
+        ARGS1[2] = &check_cosh;
+        ARGS1[3] = &check_tan;
+        ARGS1[4] = &check_cumsum;
+        ARGS1[5] = &check_asin;
+        ARGS1[6] = &check_isnan;
+        ARGS1[7] = &check_floor;
+        ARGS1[8] = &check_fix;
+        ARGS1[9] = &check_sqrt;
+        ARGS1[10] = &check_uint16;
+        ARGS1[11] = &check_abs;
+        ARGS1[12] = &check_zeros;
+        ARGS1[13] = &check_max;
+        ARGS1[14] = &check_uint32;
+        ARGS1[15] = &check_int64;
+        ARGS1[16] = &check_prod;
+        ARGS1[17] = &check_sin;
+        ARGS1[18] = &check_int32;
+        ARGS1[19] = &check_int16;
+        ARGS1[20] = &check_exp;
+        ARGS1[21] = &check_atan;
+        ARGS1[22] = &check_uint8;
+        ARGS1[23] = &check_ceil;
+        ARGS1[24] = &check_sinm;
+        ARGS1[25] = &check_isinf;
+        ARGS1[26] = &check_sinh;
+        ARGS1[27] = &check_int8;
+        ARGS1[28] = &check_log;
+        ARGS1[29] = &check_uint64;
+        ARGS1[30] = &check_cos;
+        ARGS1[31] = &check_tanh;
+        ARGS1[32] = &check_min;
+        ARGS1[33] = &check_cumprod;
+        ARGS1[34] = &check_erf;
+        ARGS1[35] = &check_ones;
+        ARGS1[36] = &check_erfc;
+        ARGS1[37] = &check_sum;
+        ARGS1[38] = &check_acos;
+        ARGS1[39] = &check_round;
+        ARGS2[0] = &check_rand;
+        ARGS2[1] = &check_dothypot;
+        ARGS2[2] = &check_hypot;
+        ARGS2[3] = &check_zeros;
+        ARGS2[4] = &check_ones;
 
-            return map;
-        }
-    };
+        return map;
+    }
+};
 
 } // namespace analysis
 
index d0f2254..48f9bb0 100644 (file)
@@ -308,8 +308,8 @@ struct MultivariateMonomial
             }
             else if (le == re)
             {
-                const unsigned int ls = L.monomial.size();
-                const unsigned int rs = R.monomial.size();
+                const unsigned int ls = static_cast<unsigned int>(L.monomial.size());
+                const unsigned int rs = static_cast<unsigned int>(R.monomial.size());
                 if (ls > rs)
                 {
                     return true;
index d288424..8e60140 100644 (file)
@@ -394,7 +394,7 @@ struct MultivariatePolynomial
             }
             else
             {
-                MultivariatePolynomial res((polynomial.size() + 1) * (R.polynomial.size() + 1) - 1, constant * R.constant);
+                MultivariatePolynomial res(static_cast<unsigned int>((polynomial.size() + 1) * (R.polynomial.size() + 1) - 1), constant * R.constant);
                 for (const auto & mR : R.polynomial)
                 {
                     res.add(mR, constant);
@@ -500,7 +500,7 @@ struct MultivariatePolynomial
     {
         if (isValid())
         {
-            MultivariatePolynomial res(polynomial.size() + 1, 0.);
+            MultivariatePolynomial res(static_cast<unsigned int>(polynomial.size() + 1), 0.);
             res.add(constant * R);
             for (const auto & mL : polynomial)
             {
index 50c0b6d..fe7706e 100644 (file)
@@ -178,12 +178,12 @@ inline static unsigned char popcount(const T x)
 
 inline static unsigned char log2(const unsigned int x)
 {
-    return (sizeof(unsigned int) << 3) - clz(x) - 1;
+    return (unsigned char)((sizeof(unsigned int) << 3) - clz(x) - 1);
 }
 
 inline static unsigned char log2(const unsigned long long x)
 {
-    return (sizeof(unsigned long long) << 3) - clzll(x) - 1;
+    return (unsigned char)((sizeof(unsigned long long) << 3) - clzll(x) - 1);
 }
 
 template<typename T>
index c29951d..1aaab73 100644 (file)
@@ -29,7 +29,7 @@ namespace types
 class EXTERN_AST Inspector
 {
 protected :
-    static std::vector<InternalType*> m_vIT;
+    static std::list<InternalType*> m_vIT;
 
 public :
     static size_t getItemCount();
index a26216a..4c523d4 100644 (file)
@@ -412,6 +412,7 @@ template <class T>
 void RunVisitorT<T>::visitprivate(const ForExp  &e)
 {
     symbol::Context* ctx = symbol::Context::getInstance();
+    //vardec visit increase its result reference
     e.getVardec().accept(*this);
     InternalType* pIT = getResult();
     //allow break and continue operations
@@ -483,7 +484,23 @@ void RunVisitorT<T>::visitprivate(const ForExp  &e)
 
             pVar->extractValue(i, pIL);
 
-            e.getBody().accept(*this);
+            bool clearAndExit = false;
+            try
+            {
+                e.getBody().accept(*this);
+            }
+            catch (ScilabMessage& sm)
+            {
+                //unlock loop index and implicit list
+                pIL->DecreaseRef();
+                pIL->killMe();
+                pIT->DecreaseRef();
+                pIT->killMe();
+
+                setResult(NULL);
+                throw sm;
+            }
+
             if (e.getBody().isBreak())
             {
                 const_cast<Exp&>(e.getBody()).resetBreak();
@@ -525,7 +542,19 @@ void RunVisitorT<T>::visitprivate(const ForExp  &e)
             }
             ctx->put(var, pNew);
 
-            e.getBody().accept(*this);
+            try
+            {
+                e.getBody().accept(*this);
+            }
+            catch (ScilabMessage& sm)
+            {
+                //implicit list
+                pIT->DecreaseRef();
+                pIT->killMe();
+                setResult(NULL);
+                throw sm;
+            }
+
             if (e.getBody().isBreak())
             {
                 const_cast<Exp*>(&(e.getBody()))->resetBreak();
@@ -576,7 +605,19 @@ void RunVisitorT<T>::visitprivate(const ForExp  &e)
             }
             ctx->put(var, pNew);
 
-            e.getBody().accept(*this);
+            try
+            {
+                e.getBody().accept(*this);
+            }
+            catch (ScilabMessage& sm)
+            {
+                //implicit list
+                pIT->DecreaseRef();
+                pIT->killMe();
+                setResult(NULL);
+                throw sm;
+            }
+
             if (e.getBody().isBreak())
             {
                 const_cast<Exp*>(&(e.getBody()))->resetBreak();
index 8cbd637..f7f72f2 100644 (file)
@@ -1021,6 +1021,7 @@ InternalType* evaluateFields(const ast::Exp* _pExp, std::list<ExpHistory*>& fiel
 
                         if (pList->getSize() > 1)
                         {
+                            pList->killMe();
                             std::wostringstream os;
                             os << _W("Unable to insert multiple item in a List.");
                             throw ast::ScilabError(os.str(), 999, _pExp->getLocation());
index 7c2f584..33ab4c3 100644 (file)
@@ -810,24 +810,25 @@ InternalType *GenericDotRDivide(InternalType *_pLeftOperand, InternalType *_pRig
         ConfigVariable::setDivideByZero(false);
         pResult = dotdiv(_pLeftOperand, _pRightOperand);
 
-        bool iszero = ConfigVariable::isDivideByZero();
-        ConfigVariable::setDivideByZero(false);
-
-        if (iszero)
+        if (pResult)
         {
-            if (ConfigVariable::getIeee() == 0)
-            {
-                throw ast::ScilabError(_("Division by zero...\n"));
-            }
+            bool iszero = ConfigVariable::isDivideByZero();
+            ConfigVariable::setDivideByZero(false);
 
-            if (ConfigVariable::getIeee() == 1)
+            if (iszero)
             {
-                sciprint(_("Warning : division by zero...\n"));
+                if (ConfigVariable::getIeee() == 0)
+                {
+                    pResult->killMe();
+                    throw ast::ScilabError(_("Division by zero...\n"));
+                }
+
+                if (ConfigVariable::getIeee() == 1)
+                {
+                    sciprint(_("Warning : division by zero...\n"));
+                }
             }
-        }
 
-        if (pResult)
-        {
             return pResult;
         }
     }
index 9e8707d..2236e19 100644 (file)
@@ -525,13 +525,14 @@ int DotPowerPolyByDouble(Polynom* _pPoly, Double* _pDouble, InternalType** _pOut
     }
 
     int iSize = _pPoly->getSize();
-    Double** pDblPower  = new Double*[iSize];
-    double* pdblPower   = _pDouble->get();
     if (_pPoly->isScalar())
     {
         return PowerPolyByDouble(_pPoly, _pDouble, _pOut);
     }
-    else if (_pDouble->isScalar())
+
+    Double** pDblPower = new Double*[iSize];
+    double* pdblPower = _pDouble->get();
+    if (_pDouble->isScalar())
     {
         if (pdblPower[0] < 0)
         {
index 35060be..cfa1e29 100644 (file)
@@ -20,7 +20,7 @@
 namespace types
 {
 #ifndef NDEBUG
-std::vector<InternalType*> Inspector::m_vIT;
+std::list<InternalType*> Inspector::m_vIT;
 
 size_t Inspector::getItemCount()
 {
@@ -30,9 +30,9 @@ size_t Inspector::getItemCount()
 size_t Inspector::getUnreferencedItemCount()
 {
     int iCount = 0;
-    for (size_t i = 0 ; i < m_vIT.size() ; i++)
+    for (auto it : m_vIT)
     {
-        if (m_vIT[i]->getRef() == 0)
+        if (it->getRef() == 0)
         {
             iCount++;
         }
@@ -49,38 +49,30 @@ void Inspector::addItem(InternalType* _pIT)
 
 void Inspector::removeItem(InternalType* _pIT)
 {
-    std::vector<InternalType*>::iterator it;
-    for (it = m_vIT.begin() ; it != m_vIT.end() ; it++)
-    {
-        if ((*it) == _pIT)
-        {
-            types::GenericType* pGT = _pIT->getAs<types::GenericType>();
-            m_vIT.erase(it);
-            break;
-        }
-    }
+    m_vIT.remove(_pIT);
 }
 
 InternalType* Inspector::getItem(size_t _iPos)
 {
-    if (_iPos >= m_vIT.size())
+    if (m_vIT.size() > _iPos)
     {
-        return NULL;
+        return *std::next(m_vIT.begin(), _iPos);
     }
-    return m_vIT[_iPos];
+
+    return NULL;
 }
 
 InternalType* Inspector::getUnreferencedItem(size_t _iPos)
 {
     size_t iCount = 0;
-    for (size_t i = 0 ; i < m_vIT.size() ; i++)
+    for (auto it : m_vIT)
     {
-        if (m_vIT[i]->getRef() == 0)
+        if (it->getRef() == 0)
         {
             if (iCount == _iPos)
             {
-                std::wcout << L"getUnreferencedItem : " << m_vIT[i] << std::endl;
-                return m_vIT[i];
+                std::wcout << L"getUnreferencedItem : " << it << std::endl;
+                return it;
             }
             iCount++;
         }
@@ -121,25 +113,12 @@ std::wstring Inspector::showUnreferencedItem(size_t _iPos)
 
 void Inspector::deleteItems()
 {
-    InternalType** pIT = new InternalType*[m_vIT.size()];
-
-    //copy item values
-    for (size_t i = 0 ; i < m_vIT.size() ; i++)
+    for (auto it : m_vIT)
     {
-        pIT[i] = m_vIT[i];
+        delete it;
     }
 
-    //delete each item
-    for (size_t i = 0 ; i < m_vIT.size() ; i++)
-    {
-        delete pIT[i];
-    }
-
-    //check vector update
-    if (m_vIT.size() != 0)
-    {
-        printf("Oo\n");
-    }
+    m_vIT.clear();
 }
 
 void Inspector::displayMemleak()
@@ -149,23 +128,23 @@ void Inspector::displayMemleak()
     if (m_vIT.size() != 0)
     {
         // construct the statistic map
-        for (size_t i = 0; i < m_vIT.size(); ++i)
+        for (auto it : m_vIT)
         {
-            statistics[m_vIT[i]->getTypeStr()]++;
+            statistics[it->getTypeStr()]++;
         }
 
         // display the result
         std::wcerr << L"Memory leaked, please file a bug on http://bugzilla.scilab.org" << std::endl;
-        for (auto it = statistics.begin(), itEnd = statistics.end(); it != itEnd;  ++it)
+        for (auto it = statistics.begin(), itEnd = statistics.end(); it != itEnd; ++it)
         {
             std::wcerr << L"    " << it->second << L" " << it->first;
 
             // list the not free-ed pointers
             std::wcerr << L" : ";
             bool isFirst = true;
-            for (size_t i = 0; i < m_vIT.size(); ++i)
+            for (auto pi : m_vIT)
             {
-                if (it->first == m_vIT[i]->getTypeStr())
+                if (it->first == pi->getTypeStr())
                 {
                     if (isFirst)
                     {
@@ -175,13 +154,13 @@ void Inspector::displayMemleak()
                     {
                         std::wcerr << " , ";
                     }
-                    std::wcerr << m_vIT[i];
+
+                    std::wcerr << pi;
                 }
             }
 
             std::wcerr << std::endl;
         }
-
     }
 }