Leak memory in elementary_functions tests
[scilab.git] / scilab / modules / ast / src / cpp / types / inspector.cpp
1 /*
2 *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 *  Copyright (C) 2011 - DIGITEO - Antoine ELIAS
4 *
5 *  This file must be used under the terms of the CeCILL.
6 *  This source file is licensed as described in the file COPYING, which
7 *  you should have received as part of this distribution.  The terms
8 *  are also available at
9 *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10 *
11 */
12
13 #include <string>
14 #include <iostream>
15 #include <map>
16
17 #include "inspector.hxx"
18 #include "types.hxx"
19
20 namespace types
21 {
22 #ifndef NDEBUG
23 std::vector<InternalType*> Inspector::m_vIT;
24
25 size_t Inspector::getItemCount()
26 {
27     return m_vIT.size();
28 }
29
30 size_t Inspector::getUnreferencedItemCount()
31 {
32     int iCount = 0;
33     for (size_t i = 0 ; i < m_vIT.size() ; i++)
34     {
35         if (m_vIT[i]->getRef() == 0)
36         {
37             iCount++;
38         }
39     }
40     return iCount;
41 }
42
43
44 void Inspector::addItem(InternalType* _pIT)
45 {
46     types::GenericType* pGT = _pIT->getAs<types::GenericType>();
47     m_vIT.push_back(_pIT);
48 }
49
50 void Inspector::removeItem(InternalType* _pIT)
51 {
52     std::vector<InternalType*>::iterator it;
53     for (it = m_vIT.begin() ; it != m_vIT.end() ; it++)
54     {
55         if ((*it) == _pIT)
56         {
57             types::GenericType* pGT = _pIT->getAs<types::GenericType>();
58             m_vIT.erase(it);
59             break;
60         }
61     }
62 }
63
64 InternalType* Inspector::getItem(size_t _iPos)
65 {
66     if (_iPos >= m_vIT.size())
67     {
68         return NULL;
69     }
70     return m_vIT[_iPos];
71 }
72
73 InternalType* Inspector::getUnreferencedItem(size_t _iPos)
74 {
75     size_t iCount = 0;
76     for (size_t i = 0 ; i < m_vIT.size() ; i++)
77     {
78         if (m_vIT[i]->getRef() == 0)
79         {
80             if (iCount == _iPos)
81             {
82                 std::wcout << L"getUnreferencedItem : " << m_vIT[i] << std::endl;
83                 return m_vIT[i];
84             }
85             iCount++;
86         }
87     }
88
89     return NULL;
90 }
91
92 std::wstring Inspector::showItem(size_t _iPos)
93 {
94     std::wstring st;
95     InternalType* pIT = getItem(_iPos);
96     if (pIT == NULL)
97     {
98         st = L"NULL";
99     }
100     else
101     {
102         st = pIT->getTypeStr();
103     }
104     return st;
105 }
106
107 std::wstring Inspector::showUnreferencedItem(size_t _iPos)
108 {
109     std::wstring st;
110     InternalType* pIT = getUnreferencedItem(_iPos);
111     if (pIT == NULL)
112     {
113         st = L"NULL";
114     }
115     else
116     {
117         st = pIT->getTypeStr();
118     }
119     return st;
120 }
121
122 void Inspector::deleteItems()
123 {
124     InternalType** pIT = new InternalType*[m_vIT.size()];
125
126     //copy item values
127     for (size_t i = 0 ; i < m_vIT.size() ; i++)
128     {
129         pIT[i] = m_vIT[i];
130     }
131
132     //delete each item
133     for (size_t i = 0 ; i < m_vIT.size() ; i++)
134     {
135         delete pIT[i];
136     }
137
138     //check vector update
139     if (m_vIT.size() != 0)
140     {
141         printf("Oo\n");
142     }
143 }
144
145 void Inspector::displayMemleak()
146 {
147     std::map<std::wstring, size_t> statistics;
148
149     if (m_vIT.size() != 0)
150     {
151         // construct the statistic map
152         for (size_t i = 0; i < m_vIT.size(); ++i)
153         {
154             statistics[m_vIT[i]->getTypeStr()]++;
155         }
156
157         // display the result
158         std::wcerr << L"Memory leaked, please file a bug on http://bugzilla.scilab.org" << std::endl;
159         for (auto it = statistics.begin(), itEnd = statistics.end(); it != itEnd;  ++it)
160         {
161             std::wcerr << L"    " << it->second << L" " << it->first;
162
163             // list the not free-ed pointers
164             std::wcerr << L" : ";
165             bool isFirst = true;
166             for (size_t i = 0; i < m_vIT.size(); ++i)
167             {
168                 if (it->first == m_vIT[i]->getTypeStr())
169                 {
170                     if (isFirst)
171                     {
172                         isFirst = false;
173                     }
174                     else
175                     {
176                         std::wcerr << " , ";
177                     }
178                     std::wcerr << m_vIT[i];
179                 }
180             }
181
182             std::wcerr << std::endl;
183         }
184
185     }
186 }
187
188 #endif
189 }