diff options
Diffstat (limited to 'bridges/source/cpp_uno/gcc3_linux_aarch64')
-rw-r--r-- | bridges/source/cpp_uno/gcc3_linux_aarch64/abi.cxx | 9 | ||||
-rw-r--r-- | bridges/source/cpp_uno/gcc3_linux_aarch64/cpp2uno.cxx | 11 |
2 files changed, 13 insertions, 7 deletions
diff --git a/bridges/source/cpp_uno/gcc3_linux_aarch64/abi.cxx b/bridges/source/cpp_uno/gcc3_linux_aarch64/abi.cxx index 8db8c37140e5..dcd27e95ae30 100644 --- a/bridges/source/cpp_uno/gcc3_linux_aarch64/abi.cxx +++ b/bridges/source/cpp_uno/gcc3_linux_aarch64/abi.cxx @@ -29,6 +29,7 @@ #include <com/sun/star/uno/RuntimeException.hpp> #include <com/sun/star/uno/genfunc.h> +#include <o3tl/string_view.hxx> #include <rtl/strbuf.hxx> #include <rtl/ustrbuf.hxx> #include <rtl/ustring.hxx> @@ -94,14 +95,12 @@ std::type_info * Rtti::getRtti(typelib_TypeDescription const & type) { osl::MutexGuard g(mutex_); Map::iterator i(map_.find(unoName)); if (i == map_.end()) { - OStringBuffer b; - b.append("_ZTIN"); + OStringBuffer b("_ZTIN"); for (sal_Int32 j = 0; j != -1;) { OString t( OUStringToOString( - unoName.getToken(0, '.', j), RTL_TEXTENCODING_ASCII_US)); - b.append(t.getLength()); - b.append(t); + o3tl::getToken(unoName, 0, '.', j), RTL_TEXTENCODING_ASCII_US)); + b.append(OString::number(t.getLength()) + t); } b.append('E'); OString sym(b.makeStringAndClear()); diff --git a/bridges/source/cpp_uno/gcc3_linux_aarch64/cpp2uno.cxx b/bridges/source/cpp_uno/gcc3_linux_aarch64/cpp2uno.cxx index 775a4aff6962..669c4443c5f0 100644 --- a/bridges/source/cpp_uno/gcc3_linux_aarch64/cpp2uno.cxx +++ b/bridges/source/cpp_uno/gcc3_linux_aarch64/cpp2uno.cxx @@ -24,6 +24,7 @@ #include <cstddef> #include <cstdlib> #include <cstring> +#include <typeinfo> #include <dlfcn.h> @@ -502,7 +503,7 @@ unsigned char * generateCodeSnippet( } -struct bridges::cpp_uno::shared::VtableFactory::Slot { void * fn; }; +struct bridges::cpp_uno::shared::VtableFactory::Slot { void const * fn; }; bridges::cpp_uno::shared::VtableFactory::Slot * bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block) { @@ -515,6 +516,12 @@ std::size_t bridges::cpp_uno::shared::VtableFactory::getBlockSize( return (slotCount + 2) * sizeof (Slot) + slotCount * codeSnippetSize; } +namespace { +// Some dummy type whose RTTI is used in the synthesized proxy vtables to make uses of dynamic_cast +// on such proxy objects not crash: +struct ProxyRtti {}; +} + bridges::cpp_uno::shared::VtableFactory::Slot * bridges::cpp_uno::shared::VtableFactory::initializeBlock( void * block, sal_Int32 slotCount, sal_Int32, @@ -522,7 +529,7 @@ bridges::cpp_uno::shared::VtableFactory::initializeBlock( { Slot * slots = mapBlockToVtable(block); slots[-2].fn = nullptr; - slots[-1].fn = nullptr; + slots[-1].fn = &typeid(ProxyRtti); return slots + slotCount; } |