mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 04:23:32 +00:00
[CPPRT]
- Add C++ runtime library for MSVC (analogous to GCC's libsupc++) CORE-6950 svn path=/trunk/; revision=59289
This commit is contained in:
parent
d8b4a7bd9e
commit
77ce0c5663
5 changed files with 98 additions and 0 deletions
|
@ -1,5 +1,8 @@
|
||||||
|
|
||||||
add_subdirectory(comsupp)
|
add_subdirectory(comsupp)
|
||||||
|
if(MSVC)
|
||||||
|
add_subdirectory(cpprt)
|
||||||
|
endif()
|
||||||
add_subdirectory(crt)
|
add_subdirectory(crt)
|
||||||
add_subdirectory(delayimp)
|
add_subdirectory(delayimp)
|
||||||
add_subdirectory(dxguid)
|
add_subdirectory(dxguid)
|
||||||
|
|
4
reactos/lib/sdk/cpprt/CMakeLists.txt
Normal file
4
reactos/lib/sdk/cpprt/CMakeLists.txt
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
|
||||||
|
set_cpp(WITH_EXCEPTIONS)
|
||||||
|
|
||||||
|
add_library(cpprt ehvec.cpp typeinfo.cpp i386/cpprt.s)
|
48
reactos/lib/sdk/cpprt/ehvec.cpp
Normal file
48
reactos/lib/sdk/cpprt/ehvec.cpp
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
/*
|
||||||
|
* PROJECT: ReactOS c++ runtime library
|
||||||
|
* LICENSE: GPLv2+ - See COPYING in the top level directory
|
||||||
|
* PURPOSE: Exception-handling vector ctor/dtor iterator implementation
|
||||||
|
* PROGRAMMER: Thomas Faber (thomas.faber@reactos.org)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
void __stdcall MSVCRTEX_eh_vector_constructor_iterator(void *pMem, size_t sizeOfItem, int nItems, void (__thiscall *ctor)(void *), void (__thiscall *dtor)(void *))
|
||||||
|
{
|
||||||
|
char *pEnd = static_cast<char *>(pMem) + nItems * sizeOfItem;
|
||||||
|
for (char *pItem = static_cast<char *>(pMem);
|
||||||
|
pItem < pEnd;
|
||||||
|
pItem += sizeOfItem)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ctor(pItem);
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
for (pItem -= sizeOfItem; pItem >= pMem; pItem -= sizeOfItem)
|
||||||
|
dtor(pItem);
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void __stdcall MSVCRTEX_eh_vector_destructor_iterator(void *pMem, size_t sizeOfItem, int nItems, void (__thiscall *dtor)(void *))
|
||||||
|
{
|
||||||
|
char *pEnd = static_cast<char *>(pMem) + nItems * sizeOfItem;
|
||||||
|
for (char *pItem = pEnd - sizeOfItem;
|
||||||
|
pItem >= pMem;
|
||||||
|
pItem -= sizeOfItem)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
dtor(pItem);
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
for (pItem -= sizeOfItem; pItem >= pMem; pItem -= sizeOfItem)
|
||||||
|
dtor(pItem);
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
16
reactos/lib/sdk/cpprt/i386/cpprt.s
Normal file
16
reactos/lib/sdk/cpprt/i386/cpprt.s
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
#include <asm.inc>
|
||||||
|
|
||||||
|
.code
|
||||||
|
|
||||||
|
MACRO(DEFINE_ALIAS, alias, orig, type)
|
||||||
|
EXTERN &orig:&type
|
||||||
|
ALIAS <&alias> = <&orig>
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
; void __stdcall `eh vector constructor iterator'(void *,unsigned int,int,void (__thiscall*)(void *),void (__thiscall*)(void *))
|
||||||
|
DEFINE_ALIAS ??_L@YGXPAXIHP6EX0@Z1@Z, ?MSVCRTEX_eh_vector_constructor_iterator@@YGXPAXIHP6EX0@Z1@Z
|
||||||
|
|
||||||
|
; void __stdcall `eh vector destructor iterator'(void *,unsigned int,int,void (__thiscall*)(void *))
|
||||||
|
DEFINE_ALIAS ??_M@YGXPAXIHP6EX0@Z@Z, ?MSVCRTEX_eh_vector_destructor_iterator@@YGXPAXIHP6EX0@Z@Z
|
||||||
|
|
||||||
|
END
|
27
reactos/lib/sdk/cpprt/typeinfo.cpp
Normal file
27
reactos/lib/sdk/cpprt/typeinfo.cpp
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
/*
|
||||||
|
* PROJECT: ReactOS c++ runtime library
|
||||||
|
* LICENSE: GPLv2+ - See COPYING in the top level directory
|
||||||
|
* PURPOSE: Type info stub implementation
|
||||||
|
* PROGRAMMER: Thomas Faber (thomas.faber@reactos.org)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* TODO: #include <exception> instead */
|
||||||
|
class type_info {
|
||||||
|
public:
|
||||||
|
__declspec(dllimport) virtual ~type_info();
|
||||||
|
private:
|
||||||
|
type_info(const type_info &);
|
||||||
|
type_info &operator=(const type_info &);
|
||||||
|
};
|
||||||
|
|
||||||
|
/* These stubs don't need to do anything (those private functions are never
|
||||||
|
* called). They need to be in cpprt, though, in order to have the vtable
|
||||||
|
* and generated destructor thunks available to programs */
|
||||||
|
type_info::type_info(const type_info &)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
type_info &type_info::operator=(const type_info &)
|
||||||
|
{
|
||||||
|
return *this;
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue