fix ast memory leak in 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::list<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 (auto it : m_vIT)
34     {
35         if (it->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     m_vIT.remove(_pIT);
53 }
54
55 InternalType* Inspector::getItem(size_t _iPos)
56 {
57     if (m_vIT.size() > _iPos)
58     {
59         return *std::next(m_vIT.begin(), _iPos);
60     }
61
62     return NULL;
63 }
64
65 InternalType* Inspector::getUnreferencedItem(size_t _iPos)
66 {
67     size_t iCount = 0;
68     for (auto it : m_vIT)
69     {
70         if (it->getRef() == 0)
71         {
72             if (iCount == _iPos)
73             {
74                 std::wcout << L"getUnreferencedItem : " << it << std::endl;
75                 return it;
76             }
77             iCount++;
78         }
79     }
80
81     return NULL;
82 }
83
84 std::wstring Inspector::showItem(size_t _iPos)
85 {
86     std::wstring st;
87     InternalType* pIT = getItem(_iPos);
88     if (pIT == NULL)
89     {
90         st = L"NULL";
91     }
92     else
93     {
94         st = pIT->getTypeStr();
95     }
96     return st;
97 }
98
99 std::wstring Inspector::showUnreferencedItem(size_t _iPos)
100 {
101     std::wstring st;
102     InternalType* pIT = getUnreferencedItem(_iPos);
103     if (pIT == NULL)
104     {
105         st = L"NULL";
106     }
107     else
108     {
109         st = pIT->getTypeStr();
110     }
111     return st;
112 }
113
114 void Inspector::deleteItems()
115 {
116     for (auto it : m_vIT)
117     {
118         delete it;
119     }
120
121     m_vIT.clear();
122 }
123
124 void Inspector::displayMemleak()
125 {
126     std::map<std::wstring, size_t> statistics;
127
128     if (m_vIT.size() != 0)
129     {
130         // construct the statistic map
131         for (auto it : m_vIT)
132         {
133             statistics[it->getTypeStr()]++;
134         }
135
136         // display the result
137         std::wcerr << L"Memory leaked, please file a bug on http://bugzilla.scilab.org" << std::endl;
138         for (auto it = statistics.begin(), itEnd = statistics.end(); it != itEnd; ++it)
139         {
140             std::wcerr << L"    " << it->second << L" " << it->first;
141
142             // list the not free-ed pointers
143             std::wcerr << L" : ";
144             bool isFirst = true;
145             for (auto pi : m_vIT)
146             {
147                 if (it->first == pi->getTypeStr())
148                 {
149                     if (isFirst)
150                     {
151                         isFirst = false;
152                     }
153                     else
154                     {
155                         std::wcerr << " , ";
156                     }
157
158                     std::wcerr << pi;
159                 }
160             }
161
162             std::wcerr << std::endl;
163         }
164     }
165 }
166
167 #endif
168 }