xref: /reactos/sdk/lib/cpprt/ehvec.cpp (revision 1734f297)
1 /*
2  * PROJECT:         ReactOS c++ runtime library
3  * LICENSE:         GPLv2+ - See COPYING in the top level directory
4  * PURPOSE:         Exception-handling vector ctor/dtor iterator implementation
5  * PROGRAMMER:      Thomas Faber (thomas.faber@reactos.org)
6  */
7 
8 #include <stddef.h>
9 
10 void __stdcall MSVCRTEX_eh_vector_constructor_iterator(void *pMem, size_t sizeOfItem, int nItems, void (__thiscall *ctor)(void *), void (__thiscall *dtor)(void *))
11 {
12     char *pEnd = static_cast<char *>(pMem) + nItems * sizeOfItem;
13     for (char *pItem = static_cast<char *>(pMem);
14          pItem < pEnd;
15          pItem += sizeOfItem)
16     {
17         try
18         {
19             ctor(pItem);
20         }
21         catch (...)
22         {
23             for (pItem -= sizeOfItem; pItem >= pMem; pItem -= sizeOfItem)
24                 dtor(pItem);
25             throw;
26         }
27     }
28 }
29 
30 void __stdcall MSVCRTEX_eh_vector_destructor_iterator(void *pMem, size_t sizeOfItem, int nItems, void (__thiscall *dtor)(void *))
31 {
32     char *pEnd = static_cast<char *>(pMem) + nItems * sizeOfItem;
33     for (char *pItem = pEnd - sizeOfItem;
34          pItem >= pMem;
35          pItem -= sizeOfItem)
36     {
37         try
38         {
39             dtor(pItem);
40         }
41         catch (...)
42         {
43             for (pItem -= sizeOfItem; pItem >= pMem; pItem -= sizeOfItem)
44                 dtor(pItem);
45             throw;
46         }
47     }
48 }
49