Rebased ref, commits from common ancestor:
commit a4f54cfbe5877fad9c12e8c77f2f951e7719fdc9
Author: Jan-Marek Glogowski <[email protected]>
AuthorDate: Fri Oct 29 22:24:12 2021 +0200
Commit: Jan-Marek Glogowski <[email protected]>
CommitDate: Fri Oct 29 22:24:17 2021 +0200
Qt5 don't create a window handle for non-xcb
Fix the non-hidden main fallback window and the native menu bar
overlay window for WASM.
Change-Id: I6b6edfa26466814cb0500116098eafcbe41bba26
diff --git a/include/vcl/sysdata.hxx b/include/vcl/sysdata.hxx
index 57d9c2220ecf..00cd5142c2e3 100644
--- a/include/vcl/sysdata.hxx
+++ b/include/vcl/sysdata.hxx
@@ -62,7 +62,7 @@ struct VCL_DLLPUBLIC SystemEnvData
#elif defined( IOS )
// Nothing
#elif defined( UNX )
- enum class Platform { Wayland, Xcb };
+ enum class Platform { Wayland, Xcb, WASM };
void* pDisplay; // the relevant display connection
SalFrame* pSalFrame; // contains a salframe, if object has
one
diff --git a/vcl/qt5/QtFrame.cxx b/vcl/qt5/QtFrame.cxx
index d6db37d21579..364b7afd2f04 100644
--- a/vcl/qt5/QtFrame.cxx
+++ b/vcl/qt5/QtFrame.cxx
@@ -181,13 +181,21 @@ QtFrame::QtFrame(QtFrame* pParent, SalFrameStyleFlags
nStyle, bool bUseCairo)
pChildWindow->setTransientParent(pParentWindow);
}
+ if (QGuiApplication::platformName() == "wayland")
+ m_aSystemData.platform = SystemEnvData::Platform::Wayland;
+ else if (QGuiApplication::platformName() == "xcb")
+ m_aSystemData.platform = SystemEnvData::Platform::Xcb;
+ else if (QGuiApplication::platformName() == "wasm")
+ m_aSystemData.platform = SystemEnvData::Platform::WASM;
+ else
+ std::abort();
+
// Calling 'QWidget::winId()' implicitly enables native windows to be used
// rather than "alien widgets" that are unknown to the windowing system,
// s. https://doc.qt.io/qt-5/qwidget.html#native-widgets-vs-alien-widgets
// Avoid this on Wayland due to problems with missing 'mouseMoveEvent's,
// s. tdf#122293/QTBUG-75766
- const bool bWayland = QGuiApplication::platformName() == "wayland";
- if (!bWayland)
+ if (m_aSystemData.platform == SystemEnvData::Platform::Xcb)
m_aSystemData.SetWindowHandle(m_pQWidget->winId());
else
{
@@ -204,10 +212,6 @@ QtFrame::QtFrame(QtFrame* pParent, SalFrameStyleFlags
nStyle, bool bUseCairo)
m_aSystemData.pWidget = m_pQWidget;
//m_aSystemData.nScreen = m_nXScreen.getXScreen();
m_aSystemData.toolkit = SystemEnvData::Toolkit::Qt;
- if (!bWayland)
- m_aSystemData.platform = SystemEnvData::Platform::Xcb;
- else
- m_aSystemData.platform = SystemEnvData::Platform::Wayland;
SetIcon(SV_ICON_ID_OFFICE);
@@ -224,7 +228,7 @@ void QtFrame::fixICCCMwindowGroup()
return;
g_bNeedsWmHintsWindowGroup = false;
- if (QGuiApplication::platformName() != "xcb")
+ if (m_aSystemData.platform != SystemEnvData::Platform::Xcb)
return;
if (QVersionNumber::fromString(qVersion()) >= QVersionNumber(5, 12))
return;
@@ -1256,7 +1260,7 @@ void QtFrame::SetScreenNumber(unsigned int nScreen)
void QtFrame::SetApplicationID(const OUString& rWMClass)
{
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) && QT5_USING_X11
- if (QGuiApplication::platformName() != "xcb" || !m_pTopLevel)
+ if (m_aSystemData.platform != SystemEnvData::Platform::Xcb || !m_pTopLevel)
return;
OString aResClass = OUStringToOString(rWMClass, RTL_TEXTENCODING_ASCII_US);
commit d113809547b9eee936e13d2b9d3a7ed5ce624ffe
Author: Jan-Marek Glogowski <[email protected]>
AuthorDate: Fri Oct 29 21:04:21 2021 +0200
Commit: Jan-Marek Glogowski <[email protected]>
CommitDate: Fri Oct 29 21:04:21 2021 +0200
LibreOfficeWASM32 defaults are now in configure.ac
Change-Id: I6d578abba0368efe12c85f8bc72b49484a76dbb7
diff --git a/distro-configs/LibreOfficeWASM32.conf
b/distro-configs/LibreOfficeWASM32.conf
index 962b76a55302..b4a3f1dc6ae7 100644
--- a/distro-configs/LibreOfficeWASM32.conf
+++ b/distro-configs/LibreOfficeWASM32.conf
@@ -1,5 +1 @@
--host=wasm32-local-emscripten
---enable-services-rdb-from-build
---enable-wasm-strip
---disable-gtk3
---enable-qt5
commit b61246582322d843edf34aa02d14292810a82fb5
Author: Jan-Marek Glogowski <[email protected]>
AuthorDate: Fri Oct 29 20:32:43 2021 +0200
Commit: Jan-Marek Glogowski <[email protected]>
CommitDate: Fri Oct 29 20:42:00 2021 +0200
Minimize bridge code
This way it doesn't fail the optimized build.
Change-Id: I7d1b1e56da359835373ce093bb18df8219a09aac
diff --git a/bridges/source/cpp_uno/gcc3_wasm/cpp2uno.cxx
b/bridges/source/cpp_uno/gcc3_wasm/cpp2uno.cxx
index 90e1d372da03..fd7fa817588a 100644
--- a/bridges/source/cpp_uno/gcc3_wasm/cpp2uno.cxx
+++ b/bridges/source/cpp_uno/gcc3_wasm/cpp2uno.cxx
@@ -5,536 +5,43 @@
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
-#include <com/sun/star/uno/RuntimeException.hpp>
-#include <sal/log.hxx>
-#include <uno/data.h>
-#include <typelib/typedescription.hxx>
-#include "bridge.hxx"
-#include "cppinterfaceproxy.hxx"
-#include "types.hxx"
-#include "vtablefactory.hxx"
-#include "share.hxx"
-
-
-
-extern "C" int codeSnippets[];
-const int nFunIndexes = 8;
-const int nVtableOffsets = 4;
-
+#include <typelib/typedescription.hxx>
+#include <vtablefactory.hxx>
using namespace ::com::sun::star::uno;
-namespace
-{
- static typelib_TypeClass cpp2uno_call(
- bridges::cpp_uno::shared::CppInterfaceProxy* pThis,
- const typelib_TypeDescription * pMemberTypeDescr,
- typelib_TypeDescriptionReference * pReturnTypeRef,
- sal_Int32 nParams,
- typelib_MethodParameter * pParams,
- void ** pCallStack,
- sal_Int64 * pRegisterReturn /* space for register return */ )
- {
- // pCallStack: x8, lr, d0..d7, x0..x7, rest of params originally on
stack
- char *pTopStack = (char *)pCallStack;
- char *pFloatRegs = pTopStack + 2;
- char *pGPRegs = pTopStack + (2+8)*8;
- char *pStackedArgs = pTopStack + (2+8+8)*8;
-
- int nGPR = 0;
- int nFPR = 0;
-
- // return
- typelib_TypeDescription * pReturnTypeDescr = 0;
- if (pReturnTypeRef)
- TYPELIB_DANGER_GET( &pReturnTypeDescr, pReturnTypeRef );
-
- void * pUnoReturn = 0;
- // complex return ptr: if != 0 && != pUnoReturn, reconversion need
- void * pCppReturn = 0;
-
- if (pReturnTypeDescr)
- {
- if (!arm::return_in_x8(pReturnTypeRef))
- pUnoReturn = pRegisterReturn; // direct way for simple types
- else // complex return via x8
- {
- pCppReturn = pCallStack[0];
-
- pUnoReturn = (bridges::cpp_uno::shared::relatesToInterfaceType(
- pReturnTypeDescr )
- ? alloca( pReturnTypeDescr->nSize )
- : pCppReturn); // direct way
- }
- }
-
- // Skip 'this'
- pGPRegs += 8;
- nGPR++;
-
- // Parameters
- void ** pUnoArgs = (void **)alloca( sizeof(void *) * nParams );
- void ** pCppArgs = (void **)alloca( sizeof(void *) * nParams );
-
- // Indices of values this have to be converted (interface conversion
- // cpp<=>uno)
- int * pTempIndices = (int *)alloca( sizeof(int) * nParams);
-
- // Type descriptions for reconversions
- typelib_TypeDescription ** ppTempParamTypeDescr =
(typelib_TypeDescription **)alloca( sizeof(typelib_TypeDescription *) *
nParams);
-
- int nTempIndices = 0;
-
- for ( int nPos = 0; nPos < nParams; ++nPos )
- {
- const typelib_MethodParameter & rParam = pParams[nPos];
- typelib_TypeDescription * pParamTypeDescr = 0;
- TYPELIB_DANGER_GET( &pParamTypeDescr, rParam.pTypeRef );
-
- if (!rParam.bOut &&
- bridges::cpp_uno::shared::isSimpleType( pParamTypeDescr ))
- {
- if (nFPR < 8 && (pParamTypeDescr->eTypeClass ==
typelib_TypeClass_FLOAT ||
- pParamTypeDescr->eTypeClass ==
typelib_TypeClass_DOUBLE))
- {
- pCppArgs[nPos] = pUnoArgs[nPos] = pFloatRegs;
- pFloatRegs += 8;
- nFPR++;
- }
- else if (pParamTypeDescr->eTypeClass ==
typelib_TypeClass_FLOAT)
- {
- if ((pStackedArgs - pTopStack) % 4)
- pStackedArgs += 4 - ((pStackedArgs - pTopStack) % 4);
- pCppArgs[nPos] = pUnoArgs[nPos] = pStackedArgs;
- pStackedArgs += 4;
- }
- else if (pParamTypeDescr->eTypeClass ==
typelib_TypeClass_DOUBLE)
- {
- if ((pStackedArgs - pTopStack) % 8)
- pStackedArgs += 8 - ((pStackedArgs - pTopStack) % 8);
- pCppArgs[nPos] = pUnoArgs[nPos] = pStackedArgs;
- pStackedArgs += 8;
- }
- else if (nGPR < 8)
- {
- pCppArgs[nPos] = pUnoArgs[nPos] = pGPRegs;
- pGPRegs += 8;
- nGPR++;
- }
- else
- switch (pParamTypeDescr->eTypeClass)
- {
- case typelib_TypeClass_HYPER:
- case typelib_TypeClass_UNSIGNED_HYPER:
- if ((pStackedArgs - pTopStack) % 8)
- pStackedArgs += 8 - ((pStackedArgs - pTopStack) %
8);
- pCppArgs[nPos] = pUnoArgs[nPos] = pStackedArgs;
- pStackedArgs += 8;
- break;
- case typelib_TypeClass_ENUM:
- case typelib_TypeClass_LONG:
- case typelib_TypeClass_UNSIGNED_LONG:
- if ((pStackedArgs - pTopStack) % 4)
- pStackedArgs += 4 - ((pStackedArgs - pTopStack) %
4);
- pCppArgs[nPos] = pUnoArgs[nPos] = pStackedArgs;
- pStackedArgs += 4;
- break;
- case typelib_TypeClass_CHAR:
- case typelib_TypeClass_SHORT:
- case typelib_TypeClass_UNSIGNED_SHORT:
- if ((pStackedArgs - pTopStack) % 2)
- pStackedArgs += 1;
- pCppArgs[nPos] = pUnoArgs[nPos] = pStackedArgs;
- pStackedArgs += 2;
- break;
- case typelib_TypeClass_BOOLEAN:
- case typelib_TypeClass_BYTE:
- pCppArgs[nPos] = pUnoArgs[nPos] = pStackedArgs;
- pStackedArgs += 1;
- break;
- default:
- assert(!"should not happen");
- break;
- }
- // no longer needed
- TYPELIB_DANGER_RELEASE( pParamTypeDescr );
- }
- else // ptr to complex value | ref
- {
- if (nGPR < 8)
- {
- pCppArgs[nPos] = *(void **)pGPRegs;
- pGPRegs += 8;
- }
- else
- {
- if ((pStackedArgs - pTopStack) % 8)
- pStackedArgs += 8 - ((pStackedArgs - pTopStack) % 8);
- pCppArgs[nPos] = pStackedArgs;
- pStackedArgs += 8;
- }
-
- if (! rParam.bIn) // is pure out
- {
- // uno out is unconstructed mem!
- pUnoArgs[nPos] = alloca( pParamTypeDescr->nSize );
- pTempIndices[nTempIndices] = nPos;
- // will be released at reconversion
- ppTempParamTypeDescr[nTempIndices++] = pParamTypeDescr;
- }
- // is in/inout
- else if (bridges::cpp_uno::shared::relatesToInterfaceType(
pParamTypeDescr ))
- {
- uno_copyAndConvertData( pUnoArgs[nPos] =
- alloca( pParamTypeDescr->nSize ),
- pCppArgs[nPos], pParamTypeDescr,
- pThis->getBridge()->getCpp2Uno() );
- pTempIndices[nTempIndices] = nPos; // has to be reconverted
- // will be released at reconversion
- ppTempParamTypeDescr[nTempIndices++] = pParamTypeDescr;
- }
- else // direct way
- {
- pUnoArgs[nPos] = pCppArgs[nPos];
- // no longer needed
- TYPELIB_DANGER_RELEASE( pParamTypeDescr );
- }
- }
- }
-
- // ExceptionHolder
- uno_Any aUnoExc; // Any will be constructed by callee
- uno_Any * pUnoExc = &aUnoExc;
-
- // invoke uno dispatch call
- (*pThis->getUnoI()->pDispatcher)(
- pThis->getUnoI(), pMemberTypeDescr, pUnoReturn, pUnoArgs, &pUnoExc );
-
- // in case an exception occurred...
- if (pUnoExc)
- {
- // destruct temporary in/inout params
- for ( ; nTempIndices--; )
- {
- int nIndex = pTempIndices[nTempIndices];
-
- if (pParams[nIndex].bIn) // is in/inout => was constructed
- uno_destructData( pUnoArgs[nIndex],
- ppTempParamTypeDescr[nTempIndices], 0 );
- TYPELIB_DANGER_RELEASE( ppTempParamTypeDescr[nTempIndices] );
- }
- if (pReturnTypeDescr)
- TYPELIB_DANGER_RELEASE( pReturnTypeDescr );
-
- CPPU_CURRENT_NAMESPACE::raiseException( &aUnoExc,
- pThis->getBridge()->getUno2Cpp() ); // has to destruct the any
- // is here for dummy
- return typelib_TypeClass_VOID;
- }
- else // else no exception occurred...
- {
- // temporary params
- for ( ; nTempIndices--; )
- {
- int nIndex = pTempIndices[nTempIndices];
- typelib_TypeDescription * pParamTypeDescr =
- ppTempParamTypeDescr[nTempIndices];
-
- if (pParams[nIndex].bOut) // inout/out
- {
- // convert and assign
- uno_destructData( pCppArgs[nIndex], pParamTypeDescr,
- cpp_release );
- uno_copyAndConvertData( pCppArgs[nIndex], pUnoArgs[nIndex],
- pParamTypeDescr, pThis->getBridge()->getUno2Cpp() );
- }
- // destroy temp uno param
- uno_destructData( pUnoArgs[nIndex], pParamTypeDescr, 0 );
-
- TYPELIB_DANGER_RELEASE( pParamTypeDescr );
- }
- // return
- if (pCppReturn) // has complex return
- {
- if (pUnoReturn != pCppReturn) // needs reconversion
- {
- uno_copyAndConvertData( pCppReturn, pUnoReturn,
- pReturnTypeDescr, pThis->getBridge()->getUno2Cpp() );
- // destroy temp uno return
- uno_destructData( pUnoReturn, pReturnTypeDescr, 0 );
- }
- *(void **)pRegisterReturn = pCppReturn;
- }
- if (pReturnTypeDescr)
- {
- typelib_TypeClass eRet =
- (typelib_TypeClass)pReturnTypeDescr->eTypeClass;
- TYPELIB_DANGER_RELEASE( pReturnTypeDescr );
- return eRet;
- }
- else
- return typelib_TypeClass_VOID;
- }
- }
-
-
- static void cpp_mediate(sal_Int32 nFunctionIndex,
- sal_Int32 nVtableOffset,
- void ** pCallStack)
- {
- sal_Int64 nRegReturn;
- sal_Int64 *pRegisterReturn = &nRegReturn;
-
- // pCallStack: x8, lr, d0..d7, x0..x7, rest of params originally on
stack
- // _this_ ptr is patched cppu_XInterfaceProxy object
- void *pThis = pCallStack[2 + 8];
+using bridges::cpp_uno::shared::VtableFactory;
- pThis = static_cast< char * >(pThis) - nVtableOffset;
- bridges::cpp_uno::shared::CppInterfaceProxy * pCppI =
- bridges::cpp_uno::shared::CppInterfaceProxy::castInterfaceToProxy(
- pThis);
-
- typelib_InterfaceTypeDescription * pTypeDescr = pCppI->getTypeDescr();
-
- // determine called method
- assert( nFunctionIndex < pTypeDescr->nMapFunctionIndexToMemberIndex );
-
- if (nFunctionIndex >= pTypeDescr->nMapFunctionIndexToMemberIndex)
- {
- throw RuntimeException( "illegal vtable index!", (XInterface
*)pCppI );
- }
-
- sal_Int32 nMemberPos =
- pTypeDescr->pMapFunctionIndexToMemberIndex[nFunctionIndex];
- assert( nMemberPos < pTypeDescr->nAllMembers );
-
- TypeDescription aMemberDescr( pTypeDescr->ppAllMembers[nMemberPos] );
-
- typelib_TypeClass eRet;
- switch (aMemberDescr.get()->eTypeClass)
- {
- case typelib_TypeClass_INTERFACE_ATTRIBUTE:
- {
- if (pTypeDescr->pMapMemberIndexToFunctionIndex[nMemberPos] ==
- nFunctionIndex)
- {
- // is GET method
- eRet = cpp2uno_call(
- pCppI, aMemberDescr.get(),
- ((typelib_InterfaceAttributeTypeDescription
*)aMemberDescr.get())->pAttributeTypeRef,
- 0, 0, // no params
- pCallStack, pRegisterReturn );
- }
- else
- {
- // is SET method
- typelib_MethodParameter aParam;
- aParam.pTypeRef =
- ((typelib_InterfaceAttributeTypeDescription
*)aMemberDescr.get())->pAttributeTypeRef;
- aParam.bIn = sal_True;
- aParam.bOut = sal_False;
-
- eRet = cpp2uno_call(
- pCppI, aMemberDescr.get(),
- 0, // indicates void return
- 1, &aParam,
- pCallStack, pRegisterReturn );
- }
- break;
- }
- case typelib_TypeClass_INTERFACE_METHOD:
- {
- // is METHOD
- switch (nFunctionIndex)
- {
- case 1: // acquire()
- pCppI->acquireProxy(); // non virtual call!
- eRet = typelib_TypeClass_VOID;
- break;
- case 2: // release()
- pCppI->releaseProxy(); // non virtual call!
- eRet = typelib_TypeClass_VOID;
- break;
- case 0: // queryInterface() opt
- {
- typelib_TypeDescription * pTD = 0;
- TYPELIB_DANGER_GET(&pTD,
- reinterpret_cast<Type *>(pCallStack[2])->getTypeLibType());
- if (pTD)
- {
- XInterface * pInterface = 0;
- (*pCppI->getBridge()->getCppEnv()->getRegisteredInterface)(
- pCppI->getBridge()->getCppEnv(),
- (void **)&pInterface, pCppI->getOid().pData,
- (typelib_InterfaceTypeDescription *)pTD );
-
- if (pInterface)
- {
- ::uno_any_construct(
- reinterpret_cast< uno_Any * >( pCallStack[0] ),
- &pInterface, pTD, cpp_acquire );
- pInterface->release();
- TYPELIB_DANGER_RELEASE( pTD );
- *(void **)pRegisterReturn = pCallStack[0];
- eRet = typelib_TypeClass_ANY;
- break;
- }
- TYPELIB_DANGER_RELEASE( pTD );
- }
- } // else perform queryInterface()
- [[fallthrough]];
- default:
- eRet = cpp2uno_call(
- pCppI, aMemberDescr.get(),
- ((typelib_InterfaceMethodTypeDescription
*)aMemberDescr.get())->pReturnTypeRef,
- ((typelib_InterfaceMethodTypeDescription
*)aMemberDescr.get())->nParams,
- ((typelib_InterfaceMethodTypeDescription
*)aMemberDescr.get())->pParams,
- pCallStack, pRegisterReturn );
- }
- break;
- }
- default:
- {
- throw RuntimeException( "no member description found!",
(XInterface *)pCppI );
- }
- }
-
- (void)eRet;
- return;
- }
-}
-
-/**
- * is called on incoming vtable calls
- * (called by asm snippets)
- */
-
-extern "C" void cpp_vtable_call( sal_Int32 func, sal_Int32 offset,
- void **pStack )
+struct VtableFactory::Slot
{
- cpp_mediate(func, offset, pStack);
-}
+};
-namespace
+VtableFactory::Slot* VtableFactory::mapBlockToVtable(void* block)
{
- unsigned char *codeSnippet(const typelib_InterfaceTypeDescription *type,
- const typelib_TypeDescription *member,
- sal_Int32 functionIndex,
- sal_Int32 vtableOffset)
- {
- // For now temporarily assert when we get here. The intent is
- // that we won't need the code snippets at all on iOS.
- assert(false);
-
- assert(functionIndex < nFunIndexes);
- if (!(functionIndex < nFunIndexes))
- return NULL;
-
- assert(vtableOffset < nVtableOffsets);
- if (!(vtableOffset < nVtableOffsets))
- return NULL;
-
- // The codeSnippets table is indexed by functionIndex and vtableOffset
-
- int index = functionIndex*nVtableOffsets + vtableOffset;
- unsigned char *result = ((unsigned char *) &codeSnippets) +
codeSnippets[index];
-
- SAL_INFO( "bridges", "codeSnippet(" << OUString(type->aBase.pTypeName)
<< "::" << OUString(member->pTypeName) << "): [" << functionIndex << "," <<
vtableOffset << "]=" << (void *) result << " (" << std::hex <<
((int*)result)[0] << "," << ((int*)result)[1] << "," << ((int*)result)[2] <<
"," << ((int*)result)[3] << ")");
-
- return result;
- }
-}
-
-struct bridges::cpp_uno::shared::VtableFactory::Slot { void * fn; };
-
-bridges::cpp_uno::shared::VtableFactory::Slot *
-bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block)
-{
- return static_cast< Slot * >(block) + 2;
+ return static_cast<Slot*>(block) + 2;
}
-std::size_t bridges::cpp_uno::shared::VtableFactory::getBlockSize(
- sal_Int32 slotCount)
+std::size_t VtableFactory::getBlockSize(sal_Int32 slotCount)
{
- return (slotCount + 2) * sizeof (Slot);
+ return (slotCount + 2) * sizeof(Slot);
}
-bridges::cpp_uno::shared::VtableFactory::Slot *
-bridges::cpp_uno::shared::VtableFactory::initializeBlock(
- void * block, sal_Int32 slotCount, sal_Int32,
- typelib_InterfaceTypeDescription *)
+VtableFactory::Slot* VtableFactory::initializeBlock(void* block, sal_Int32
slotCount, sal_Int32,
+
typelib_InterfaceTypeDescription*)
{
- Slot * slots = mapBlockToVtable(block);
- slots[-2].fn = 0;
- slots[-1].fn = 0;
+ Slot* slots = mapBlockToVtable(block);
return slots + slotCount;
}
-unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions(
- Slot ** slots,
- unsigned char * code,
- typelib_InterfaceTypeDescription const * type,
- sal_Int32 functionOffset,
- sal_Int32 functionCount,
- sal_Int32 vtableOffset)
-{
- (*slots) -= functionCount;
- Slot * s = *slots;
- for (sal_Int32 i = 0; i < type->nMembers; ++i)
- {
- typelib_TypeDescription * member = 0;
- TYPELIB_DANGER_GET(&member, type->ppMembers[i]);
- assert(member != 0);
- switch (member->eTypeClass)
- {
- case typelib_TypeClass_INTERFACE_ATTRIBUTE:
- {
- typelib_InterfaceAttributeTypeDescription *pAttrTD =
- reinterpret_cast<typelib_InterfaceAttributeTypeDescription
*>( member );
-
- // Getter:
- (s++)->fn = codeSnippet( type, member, functionOffset++,
vtableOffset );
-
- // Setter:
- if (!pAttrTD->bReadOnly)
- {
- (s++)->fn = codeSnippet( type, member, functionOffset++,
vtableOffset );
- }
- break;
- }
- case typelib_TypeClass_INTERFACE_METHOD:
- {
- (s++)->fn = codeSnippet( type, member, functionOffset++,
vtableOffset );
- break;
- }
- default:
- assert(false);
- break;
- }
- TYPELIB_DANGER_RELEASE(member);
- }
- return code;
-}
-
-
-
-void bridges::cpp_uno::shared::VtableFactory::flushCode(
- unsigned char const *, unsigned char const *)
+unsigned char* VtableFactory::addLocalFunctions(Slot**, unsigned char*,
+
typelib_InterfaceTypeDescription const*, sal_Int32,
+ sal_Int32, sal_Int32)
{
- // No dynamic code generation so nothing to flush
+ std::abort();
}
+void VtableFactory::flushCode(unsigned char const*, unsigned char const*) {}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/bridges/source/cpp_uno/gcc3_wasm/except.cxx
b/bridges/source/cpp_uno/gcc3_wasm/except.cxx
index fd5637617d56..36778c65a11a 100644
--- a/bridges/source/cpp_uno/gcc3_wasm/except.cxx
+++ b/bridges/source/cpp_uno/gcc3_wasm/except.cxx
@@ -5,412 +5,18 @@
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
-#include "sal/config.h"
-
-#include <cassert>
-#include <new>
-#include <stdio.h>
-#include <string.h>
-#include <typeinfo>
-
-#include <cxxabi.h>
-#include <dlfcn.h>
-
-#include "com/sun/star/uno/RuntimeException.hpp"
-#include "com/sun/star/uno/genfunc.hxx"
-#include <sal/log.hxx>
-#include "osl/mutex.hxx"
-#include "rtl/strbuf.hxx"
-#include "rtl/ustrbuf.hxx"
-#include "typelib/typedescription.h"
-#include "uno/any2.h"
-#include <unordered_map>
-#include "share.hxx"
-
-#include <config_wasm_strip.h>
-
-using namespace ::osl;
-using namespace ::com::sun::star::uno;
-
-namespace CPPU_CURRENT_NAMESPACE {
-
-namespace {
-
-struct Fake_type_info {
- virtual ~Fake_type_info() = delete;
- char const * name;
-};
-
-struct Fake_class_type_info: Fake_type_info {
- virtual ~Fake_class_type_info() override = delete;
-};
-
-struct Fake_si_class_type_info: Fake_class_type_info {
- virtual ~Fake_si_class_type_info() override = delete;
- void const * base;
-};
-
-struct Base {};
-struct Derived: Base {};
-
-std::type_info * createFake_class_type_info(char const * name) {
- char * buf = new char[sizeof (Fake_class_type_info)];
-
- *reinterpret_cast<void **>(buf) = *reinterpret_cast<void * const *>(
- &typeid(Base));
- // copy __cxxabiv1::__class_type_info vtable into place
- Fake_class_type_info * fake = reinterpret_cast<Fake_class_type_info
*>(buf);
- fake->name = name;
- return reinterpret_cast<std::type_info *>(
- static_cast<Fake_type_info *>(fake));
-}
-
-std::type_info * createFake_si_class_type_info(
- char const * name, std::type_info const * base)
-{
- char * buf = new char[sizeof (Fake_si_class_type_info)];
-
- *reinterpret_cast<void **>(buf) = *reinterpret_cast<void * const *>(
- &typeid(Derived));
- // copy __cxxabiv1::__si_class_type_info vtable into place
- Fake_si_class_type_info * fake
- = reinterpret_cast<Fake_si_class_type_info *>(buf);
- fake->name = name;
- fake->base = base;
- return reinterpret_cast<std::type_info *>(
- static_cast<Fake_type_info *>(fake));
-}
-
-}
-
-#ifdef __GNUC__
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-function"
-#endif
-void dummy_can_throw_anything( char const * )
-{
-}
-#ifdef __GNUC__
-#pragma GCC diagnostic pop
-#endif
-
-static OUString toUNOname( char const * p )
-{
-#if OSL_DEBUG_LEVEL > 1
- char const * start = p;
-#endif
-
- // example: N3com3sun4star4lang24IllegalArgumentExceptionE
-
- OUStringBuffer buf( 64 );
- assert( 'N' == *p );
- ++p; // skip N
-
- while ('E' != *p)
- {
- // read chars count
- long n = (*p++ - '0');
- while ('0' <= *p && '9' >= *p)
- {
- n *= 10;
- n += (*p++ - '0');
- }
- buf.appendAscii( p, n );
- p += n;
- if ('E' != *p)
- buf.append( '.' );
- }
-
-#if OSL_DEBUG_LEVEL > 1
- OUString ret( buf.makeStringAndClear() );
- OString c_ret( OUStringToOString( ret, RTL_TEXTENCODING_ASCII_US ) );
- fprintf( stderr, "> toUNOname(): %s => %s\n", start, c_ret.getStr() );
- return ret;
-#else
- return buf.makeStringAndClear();
-#endif
-}
-
-class RTTI
-{
- typedef std::unordered_map< OUString, std::type_info *, OUStringHash >
t_rtti_map;
-
- Mutex m_mutex;
- t_rtti_map m_rttis;
- t_rtti_map m_generatedRttis;
-
- void * m_hApp;
-
-public:
- RTTI();
- ~RTTI();
-
- std::type_info * getRTTI( typelib_CompoundTypeDescription * );
-};
-
-RTTI::RTTI()
- : m_hApp( dlopen( nullptr, RTLD_LAZY ) )
-{
-}
-
-RTTI::~RTTI()
-{
- dlclose( m_hApp );
-}
-
-
-std::type_info * RTTI::getRTTI( typelib_CompoundTypeDescription *pTypeDescr )
-{
- std::type_info * rtti;
-
- OUString const & unoName =
OUString::unacquired(&pTypeDescr->aBase.pTypeName);
-
- MutexGuard guard( m_mutex );
- t_rtti_map::const_iterator iFind( m_rttis.find( unoName ) );
- if (iFind == m_rttis.end())
- {
- // RTTI symbol
- OStringBuffer buf( 64 );
- buf.append( "_ZTIN" );
- sal_Int32 index = 0;
- do
- {
- OUString token( unoName.getToken( 0, '.', index ) );
- buf.append( token.getLength() );
- OString c_token( OUStringToOString( token,
RTL_TEXTENCODING_ASCII_US ) );
- buf.append( c_token );
- }
- while (index >= 0);
- buf.append( 'E' );
-
- OString symName( buf.makeStringAndClear() );
- rtti = static_cast<std::type_info *>(dlsym( m_hApp, symName.getStr()
));
-
- if (rtti)
- {
- std::pair< t_rtti_map::iterator, bool > insertion(
- m_rttis.insert( t_rtti_map::value_type( unoName, rtti ) ) );
- SAL_WARN_IF( !insertion.second,
- "bridges",
- "inserting new rtti failed" );
- }
- else
- {
- // try to lookup the symbol in the generated rtti map
- t_rtti_map::const_iterator iFind2( m_generatedRttis.find( unoName
) );
- if (iFind2 == m_generatedRttis.end())
- {
- // we must generate it !
- // symbol and rtti-name is nearly identical,
- // the symbol is prefixed with _ZTI
- char * rttiName = strdup(symName.getStr() + 4);
- if (rttiName == nullptr) {
- throw std::bad_alloc();
- }
-#if OSL_DEBUG_LEVEL > 1
- fprintf( stderr,"generated rtti for %s\n", rttiName );
-#endif
- if (pTypeDescr->pBaseTypeDescription)
- {
- // ensure availability of base
- std::type_info * base_rtti = getRTTI(
- pTypeDescr->pBaseTypeDescription );
- rtti = createFake_si_class_type_info(rttiName, base_rtti);
- }
- else
- {
- rtti = createFake_class_type_info(rttiName);
- }
+#include <cstdlib>
- std::pair< t_rtti_map::iterator, bool > insertion(
- m_generatedRttis.insert( t_rtti_map::value_type( unoName,
rtti ) ) );
- SAL_WARN_IF( !insertion.second,
- "bridges",
- "inserting new generated rtti failed" );
- }
- else // taking already generated rtti
- {
- rtti = iFind2->second;
- }
- }
- }
- else
- {
- rtti = iFind->second;
- }
+#include <uno/mapping.h>
+#include <uno/any2.h>
- return rtti;
-}
-
-
-static void deleteException( void * pExc )
+namespace CPPU_CURRENT_NAMESPACE
{
- __cxa_exception const * header = static_cast<__cxa_exception const
*>(pExc) - 1;
- // The libcxxabi commit
- // <http://llvm.org/viewvc/llvm-project?view=revision&revision=303175>
- // "[libcxxabi] Align unwindHeader on a double-word boundary" towards
- // LLVM 5.0 changed the size of __cxa_exception by adding
- //
- // __attribute__((aligned))
- //
- // to the final member unwindHeader, on x86-64 effectively adding a hole of
- // size 8 in front of that member (changing its offset from 88 to 96,
- // sizeof(__cxa_exception) from 120 to 128, and alignof(__cxa_exception)
- // from 8 to 16); a hack to dynamically determine whether we run against a
- // LLVM 5 libcxxabi is to look at the exceptionDestructor member, which
must
- // point to this function (the use of __cxa_exception in fillUnoException
is
- // unaffected, as it only accesses members towards the start of the struct,
- // through a pointer known to actually point at the start). The libcxxabi
commit
- //
<https://github.com/llvm/llvm-project/commit/9ef1daa46edb80c47d0486148c0afc4e0d83ddcf>
- // "Insert padding before the __cxa_exception header to ensure the thrown"
in LLVM 6
- // removes the need for this hack, so it can be removed again once we can
be sure that we only
- // run against libcxxabi from LLVM >= 6:
- if (header->exceptionDestructor != &deleteException) {
- header = reinterpret_cast<__cxa_exception const *>(
- reinterpret_cast<char const *>(header) - 8);
- assert(header->exceptionDestructor == &deleteException);
- }
- typelib_TypeDescription * pTD = nullptr;
- OUString unoName( toUNOname( header->exceptionType->name() ) );
- ::typelib_typedescription_getByName( &pTD, unoName.pData );
- assert(pTD && "### unknown exception type! leaving out destruction =>
leaking!!!");
- if (pTD)
- {
- ::uno_destructData( pExc, pTD, cpp_release );
- ::typelib_typedescription_release( pTD );
- }
-}
-
-void raiseException( uno_Any * pUnoExc, uno_Mapping * pUno2Cpp )
-{
-#if ENABLE_WASM_EXCEPTIONS
-#if OSL_DEBUG_LEVEL > 1
- OString cstr(
- OUStringToOString(
- OUString::unacquired( &pUnoExc->pType->pTypeName ),
- RTL_TEXTENCODING_ASCII_US ) );
- fprintf( stderr, "> uno exception occurred: %s\n", cstr.getStr() );
-#endif
- void * pCppExc;
- std::type_info * rtti;
-
- {
- // construct cpp exception object
- typelib_TypeDescription * pTypeDescr = nullptr;
- TYPELIB_DANGER_GET( &pTypeDescr, pUnoExc->pType );
- assert(pTypeDescr);
- if (! pTypeDescr)
- {
- throw RuntimeException(
- "cannot get typedescription for type " +
- OUString::unacquired( &pUnoExc->pType->pTypeName ) );
- }
-
- pCppExc = __cxxabiv1::__cxa_allocate_exception( pTypeDescr->nSize );
- ::uno_copyAndConvertData( pCppExc, pUnoExc->pData, pTypeDescr, pUno2Cpp );
-
- // destruct uno exception
- ::uno_any_destruct( pUnoExc, nullptr );
- // avoiding locked counts
- static RTTI rtti_data;
- rtti =
rtti_data.getRTTI(reinterpret_cast<typelib_CompoundTypeDescription*>(pTypeDescr));
- TYPELIB_DANGER_RELEASE( pTypeDescr );
- assert(rtti && "### no rtti for throwing exception!");
- if (! rtti)
- {
- throw RuntimeException(
- "no rtti for type " +
- OUString::unacquired( &pUnoExc->pType->pTypeName ) );
- }
- }
-
- // void __cxa_throw(void* thrown_exception,
- // struct std::type_info * tinfo,
- // void (*dest)(void*));
- __cxxabiv1::__cxa_throw( pCppExc, rtti, deleteException );
-#else
- std::abort();
-#endif
-}
-
-void fillUnoException(uno_Any * pUnoExc, uno_Mapping * pCpp2Uno)
-{
-#if ENABLE_WASM_EXCEPTIONS
- __cxa_exception * header =
__cxxabiv1::__cxa_get_globals()->caughtExceptions;
- if (! header)
- {
- RuntimeException aRE( "no exception header!" );
- Type const & rType = cppu::UnoType<decltype(aRE)>::get();
- uno_type_any_constructAndConvert( pUnoExc, &aRE,
rType.getTypeLibType(), pCpp2Uno );
- SAL_WARN("bridges", aRE.Message);
- return;
- }
-
- // Very bad HACK to find out whether we run against a libcxxabi that has a
new
- // __cxa_exception::reserved member at the start, introduced with LLVM 10
- //
<https://github.com/llvm/llvm-project/commit/674ec1eb16678b8addc02a4b0534ab383d22fa77>
- // "[libcxxabi] Insert padding in __cxa_exception struct for
compatibility". The layout of the
- // start of __cxa_exception is
- //
- // [8 byte void *reserve]
- // 8 byte size_t referenceCount
- //
- // where the (bad, hacky) assumption is that reserve (if present) is null
- // (__cxa_allocate_exception in at least LLVM 11 zero-fills the object,
and nothing actively
- // sets reserve) while referenceCount is non-null (__cxa_throw sets it to
1, and
- // __cxa_decrement_exception_refcount destroys the exception as soon as it
drops to 0; for a
- // __cxa_dependent_exception, the referenceCount member is rather
- //
- // 8 byte void* primaryException
- //
- // but which also will always be set to a non-null value in
__cxa_rethrow_primary_exception).
- // As described in the definition of __cxa_exception
- // (bridges/source/cpp_uno/gcc3_macosx_x86-64/share.hxx), this hack
(together with the "#if 0"
- // there) can be dropped once we can be sure that we only run against new
libcxxabi that has the
- // reserve member:
- if (*reinterpret_cast<void **>(header) == nullptr) {
- header = reinterpret_cast<__cxa_exception *>(reinterpret_cast<void
**>(header) + 1);
- }
-
- std::type_info *exceptionType = nullptr; // TODO:
__cxxabiv1::__cxa_current_exception_type();
-
- typelib_TypeDescription * pExcTypeDescr = nullptr;
- OUString unoName( toUNOname( exceptionType->name() ) );
-#if OSL_DEBUG_LEVEL > 1
- OString cstr_unoName( OUStringToOString( unoName,
RTL_TEXTENCODING_ASCII_US ) );
- fprintf( stderr, "> c++ exception occurred: %s\n", cstr_unoName.getStr() );
-#endif
- typelib_typedescription_getByName( &pExcTypeDescr, unoName.pData );
- if (nullptr == pExcTypeDescr)
- {
- RuntimeException aRE( "exception type not found: " + unoName );
- Type const & rType = cppu::UnoType<decltype(aRE)>::get();
- uno_type_any_constructAndConvert( pUnoExc, &aRE,
rType.getTypeLibType(), pCpp2Uno );
- SAL_WARN("bridges", aRE.Message);
- }
- else
- {
- // construct uno exception any
- uno_any_constructAndConvert( pUnoExc, header->adjustedPtr,
pExcTypeDescr, pCpp2Uno );
- typelib_typedescription_release( pExcTypeDescr );
- }
-#else
- std::abort();
-#endif
-}
+void raiseException(uno_Any*, uno_Mapping*) { std::abort(); }
+void fillUnoException(uno_Any*, uno_Mapping*) { std::abort(); }
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/bridges/source/cpp_uno/gcc3_wasm/rtti.h
b/bridges/source/cpp_uno/gcc3_wasm/rtti.h
deleted file mode 100644
index fd8ef3715082..000000000000
--- a/bridges/source/cpp_uno/gcc3_wasm/rtti.h
+++ /dev/null
@@ -1,410 +0,0 @@
-// Copyright (C) 2000, 2002, 2003, 2004, 2006 Free Software Foundation, Inc.
-//
-// This file is part of GCC.
-//
-// GCC is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2, or (at your option)
-// any later version.
-// GCC is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-// You should have received a copy of the GNU General Public License
-// along with GCC; see the file COPYING. If not, write to
-// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
-// Boston, MA 02110-1301, USA.
-//
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file does not by itself cause the resulting executable to be covered by
-// the GNU General Public License. This exception does not however
-// invalidate any other reasons why the executable file might be covered by
-// the GNU General Public License.
-//
-// Written by Nathan Sidwell, Codesourcery LLC, <[email protected]>
-#ifndef __RTTI_H
-#define __RTTI_H
-
-#include <typeinfo>
-
-namespace __cxxabiv1
-{
- // Type information for int, float etc.
- class __fundamental_type_info : public std::type_info
- {
- public:
- explicit
- __fundamental_type_info(const char* __n) : std::type_info(__n) { }
-
- virtual
- ~__fundamental_type_info();
- };
-
- // Type information for array objects.
- class __array_type_info : public std::type_info
- {
- public:
- explicit
- __array_type_info(const char* __n) : std::type_info(__n) { }
-
- virtual
- ~__array_type_info();
- };
-
- // Type information for functions (both member and non-member).
- class __function_type_info : public std::type_info
- {
- public:
- explicit
- __function_type_info(const char* __n) : std::type_info(__n) { }
-
- virtual
- ~__function_type_info();
-
- protected:
- // Implementation defined member function.
- virtual bool
- __is_function_p() const;
- };
-
- // Type information for enumerations.
- class __enum_type_info : public std::type_info
- {
- public:
- explicit
- __enum_type_info(const char* __n) : std::type_info(__n) { }
-
- virtual
- ~__enum_type_info();
- };
-
- // Common type information for simple pointers and pointers to member.
- class __pbase_type_info : public std::type_info
- {
- public:
- unsigned int __flags; // Qualification of the target object.
- const std::type_info* __pointee; // Type of pointed to object.
-
- explicit
- __pbase_type_info(const char* __n, int __quals,
- const std::type_info* __type)
- : std::type_info(__n), __flags(__quals), __pointee(__type)
- { }
-
- virtual
- ~__pbase_type_info();
-
- // Implementation defined type.
- enum __masks
- {
- __const_mask = 0x1,
- __volatile_mask = 0x2,
- __restrict_mask = 0x4,
- __incomplete_mask = 0x8,
- __incomplete_class_mask = 0x10
- };
-
- protected:
- __pbase_type_info(const __pbase_type_info&);
-
- __pbase_type_info&
- operator=(const __pbase_type_info&);
-
- // Implementation defined member functions.
- virtual bool
- __do_catch(const std::type_info* __thr_type, void** __thr_obj,
- unsigned int __outer) const;
-
- inline virtual bool
- __pointer_catch(const __pbase_type_info* __thr_type, void** __thr_obj,
- unsigned __outer) const;
- };
-
- // Type information for simple pointers.
- class __pointer_type_info : public __pbase_type_info
- {
- public:
- explicit
- __pointer_type_info(const char* __n, int __quals,
- const std::type_info* __type)
- : __pbase_type_info (__n, __quals, __type) { }
-
-
- virtual
- ~__pointer_type_info();
-
- protected:
- // Implementation defined member functions.
- virtual bool
- __is_pointer_p() const;
-
- virtual bool
- __pointer_catch(const __pbase_type_info* __thr_type, void** __thr_obj,
- unsigned __outer) const;
- };
-
- class __class_type_info;
-
- // Type information for a pointer to member variable.
- class __pointer_to_member_type_info : public __pbase_type_info
- {
- public:
- __class_type_info* __context; // Class of the member.
-
- explicit
- __pointer_to_member_type_info(const char* __n, int __quals,
- const std::type_info* __type,
- __class_type_info* __klass)
- : __pbase_type_info(__n, __quals, __type), __context(__klass) { }
-
- virtual
- ~__pointer_to_member_type_info();
-
- protected:
- __pointer_to_member_type_info(const __pointer_to_member_type_info&);
-
- __pointer_to_member_type_info&
- operator=(const __pointer_to_member_type_info&);
-
- // Implementation defined member function.
- virtual bool
- __pointer_catch(const __pbase_type_info* __thr_type, void** __thr_obj,
- unsigned __outer) const;
- };
-
- // Helper class for __vmi_class_type.
- class __base_class_type_info
- {
- public:
- const __class_type_info* __base_type; // Base class type.
- long __offset_flags; // Offset and info.
-
- enum __offset_flags_masks
- {
- __virtual_mask = 0x1,
- __public_mask = 0x2,
- __hwm_bit = 2,
- __offset_shift = 8 // Bits to shift offset.
- };
-
- // Implementation defined member functions.
- bool
- __is_virtual_p() const
- { return __offset_flags & __virtual_mask; }
-
- bool
- __is_public_p() const
- { return __offset_flags & __public_mask; }
-
- ptrdiff_t
- __offset() const
- {
- // This shift, being of a signed type, is implementation
- // defined. GCC implements such shifts as arithmetic, which is
- // what we want.
- return static_cast<ptrdiff_t>(__offset_flags) >> __offset_shift;
- }
- };
-
- // Type information for a class.
- class __class_type_info : public std::type_info
- {
- public:
- explicit
- __class_type_info (const char *__n) : type_info(__n) { }
-
- virtual
- ~__class_type_info ();
-
- // Implementation defined types.
- // The type sub_kind tells us about how a base object is contained
- // within a derived object. We often do this lazily, hence the
- // UNKNOWN value. At other times we may use NOT_CONTAINED to mean
- // not publicly contained.
- enum __sub_kind
- {
- // We have no idea.
- __unknown = 0,
-
- // Not contained within us (in some circumstances this might
- // mean not contained publicly)
- __not_contained,
-
- // Contained ambiguously.
- __contained_ambig,
-
- // Via a virtual path.
- __contained_virtual_mask = __base_class_type_info::__virtual_mask,
-
- // Via a public path.
- __contained_public_mask = __base_class_type_info::__public_mask,
-
- // Contained within us.
- __contained_mask = 1 << __base_class_type_info::__hwm_bit,
-
- __contained_private = __contained_mask,
- __contained_public = __contained_mask | __contained_public_mask
- };
-
- struct __upcast_result;
- struct __dyncast_result;
-
- protected:
- // Implementation defined member functions.
- virtual bool
- __do_upcast(const __class_type_info* __dst_type, void**__obj_ptr) const;
-
- virtual bool
- __do_catch(const type_info* __thr_type, void** __thr_obj,
- unsigned __outer) const;
-
- public:
- // Helper for upcast. See if DST is us, or one of our bases.
- // Return false if not found, true if found.
- virtual bool
- __do_upcast(const __class_type_info* __dst, const void* __obj,
- __upcast_result& __restrict __result) const;
-
- // Indicate whether SRC_PTR of type SRC_TYPE is contained publicly
- // within OBJ_PTR. OBJ_PTR points to a base object of our type,
- // which is the destination type. SRC2DST indicates how SRC
- // objects might be contained within this type. If SRC_PTR is one
- // of our SRC_TYPE bases, indicate the virtuality. Returns
- // not_contained for non containment or private containment.
- inline __sub_kind
- __find_public_src(ptrdiff_t __src2dst, const void* __obj_ptr,
- const __class_type_info* __src_type,
- const void* __src_ptr) const;
-
- // Helper for dynamic cast. ACCESS_PATH gives the access from the
- // most derived object to this base. DST_TYPE indicates the
- // desired type we want. OBJ_PTR points to a base of our type
- // within the complete object. SRC_TYPE indicates the static type
- // started from and SRC_PTR points to that base within the most
- // derived object. Fill in RESULT with what we find. Return true
- // if we have located an ambiguous match.
- virtual bool
- __do_dyncast(ptrdiff_t __src2dst, __sub_kind __access_path,
- const __class_type_info* __dst_type, const void* __obj_ptr,
- const __class_type_info* __src_type, const void* __src_ptr,
- __dyncast_result& __result) const;
-
- // Helper for find_public_subobj. SRC2DST indicates how SRC_TYPE
- // bases are inherited by the type started from -- which is not
- // necessarily the current type. The current type will be a base
- // of the destination type. OBJ_PTR points to the current base.
- virtual __sub_kind
- __do_find_public_src(ptrdiff_t __src2dst, const void* __obj_ptr,
- const __class_type_info* __src_type,
- const void* __src_ptr) const;
- };
-
- // Type information for a class with a single non-virtual base.
- class __si_class_type_info : public __class_type_info
- {
- public:
- const __class_type_info* __base_type;
-
- explicit
- __si_class_type_info(const char *__n, const __class_type_info *__base)
- : __class_type_info(__n), __base_type(__base) { }
-
- virtual
- ~__si_class_type_info();
-
- protected:
- __si_class_type_info(const __si_class_type_info&);
-
- __si_class_type_info&
- operator=(const __si_class_type_info&);
-
- // Implementation defined member functions.
- virtual bool
- __do_dyncast(ptrdiff_t __src2dst, __sub_kind __access_path,
- const __class_type_info* __dst_type, const void* __obj_ptr,
- const __class_type_info* __src_type, const void* __src_ptr,
- __dyncast_result& __result) const;
-
- virtual __sub_kind
- __do_find_public_src(ptrdiff_t __src2dst, const void* __obj_ptr,
- const __class_type_info* __src_type,
- const void* __sub_ptr) const;
-
- virtual bool
- __do_upcast(const __class_type_info*__dst, const void*__obj,
- __upcast_result& __restrict __result) const;
- };
-
- // Type information for a class with multiple and/or virtual bases.
- class __vmi_class_type_info : public __class_type_info
- {
- public:
- unsigned int __flags; // Details about the class hierarchy.
- unsigned int __base_count; // Number of direct bases.
-
- // The array of bases uses the trailing array struct hack so this
- // class is not constructable with a normal constructor. It is
- // internally generated by the compiler.
- __base_class_type_info __base_info[1]; // Array of bases.
-
- explicit
- __vmi_class_type_info(const char* __n, int ___flags)
- : __class_type_info(__n), __flags(___flags), __base_count(0) { }
-
- virtual
- ~__vmi_class_type_info();
-
- // Implementation defined types.
- enum __flags_masks
- {
- __non_diamond_repeat_mask = 0x1, // Distinct instance of repeated base.
- __diamond_shaped_mask = 0x2, // Diamond shaped multiple inheritance.
- __flags_unknown_mask = 0x10
- };
-
- protected:
- // Implementation defined member functions.
- virtual bool
- __do_dyncast(ptrdiff_t __src2dst, __sub_kind __access_path,
- const __class_type_info* __dst_type, const void* __obj_ptr,
- const __class_type_info* __src_type, const void* __src_ptr,
- __dyncast_result& __result) const;
-
- virtual __sub_kind
- __do_find_public_src(ptrdiff_t __src2dst, const void* __obj_ptr,
- const __class_type_info* __src_type,
- const void* __src_ptr) const;
-
- virtual bool
- __do_upcast(const __class_type_info* __dst, const void* __obj,
- __upcast_result& __restrict __result) const;
- };
-
- // Dynamic cast runtime.
- // src2dst has the following possible values
- // >-1: src_type is a unique public non-virtual base of dst_type
- // dst_ptr + src2dst == src_ptr
- // -1: unspecified relationship
- // -2: src_type is not a public base of dst_type
- // -3: src_type is a multiple public non-virtual base of dst_type
- extern "C" void*
- __dynamic_cast(const void* __src_ptr, // Starting object.
- const __class_type_info* __src_type, // Static type of object.
- const __class_type_info* __dst_type, // Desired target type.
- ptrdiff_t __src2dst); // How src and dst are related.
-
-
- // Returns the type_info for the currently handled exception [15.3/8], or
- // null if there is none.
- extern "C" std::type_info*
- __cxa_current_exception_type();
-} // namespace __cxxabiv1
-
-// User programs should use the alias `abi'.
-namespace abi = __cxxabiv1;
-
-
-#endif // __RTTI_H
diff --git a/bridges/source/cpp_uno/gcc3_wasm/share.hxx
b/bridges/source/cpp_uno/gcc3_wasm/share.hxx
deleted file mode 100644
index 65461d7fd37f..000000000000
--- a/bridges/source/cpp_uno/gcc3_wasm/share.hxx
+++ /dev/null
@@ -1,57 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-#pragma once
-
-#include "uno/mapping.h"
-
-#include <typeinfo>
-#include <exception>
-#include <cstddef>
-
-// from opensource.apple.com: libcppabi-24.4/include/rtti.h
-#include "rtti.h"
-
-// from opensource.apple.com: libcppabi-24.4/include/unwind-cxx.h
-#include "unwind-cxx.h"
-
-// Import the __cxxabiv1 a.k.a. "abi" namespace
-using namespace abi;
-
-namespace CPPU_CURRENT_NAMESPACE
-{
- void dummy_can_throw_anything( char const * );
-
- void raiseException(
- uno_Any * pUnoExc, uno_Mapping * pUno2Cpp );
-
- void fillUnoException(uno_Any *, uno_Mapping * pCpp2Uno);
-
- bool isSimpleReturnType(typelib_TypeDescription * pTD, bool recursive =
false);
-}
-
-namespace arm
-{
- enum armlimits {
- MAX_GPR_REGS = 8,
- MAX_FPR_REGS = 8
- };
- bool return_in_x8( typelib_TypeDescriptionReference *pTypeRef );
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/bridges/source/cpp_uno/gcc3_wasm/uno2cpp.cxx
b/bridges/source/cpp_uno/gcc3_wasm/uno2cpp.cxx
index 38ee3c1208b8..ddb51166b51e 100644
--- a/bridges/source/cpp_uno/gcc3_wasm/uno2cpp.cxx
+++ b/bridges/source/cpp_uno/gcc3_wasm/uno2cpp.cxx
@@ -5,533 +5,89 @@
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
-#include <sal/config.h>
-
-#include <exception>
-#include <typeinfo>
-
-#include <com/sun/star/uno/Exception.hpp>
#include <com/sun/star/uno/RuntimeException.hpp>
-#include <o3tl/runtimetooustring.hxx>
-
-#include "bridge.hxx"
-#include "types.hxx"
-#include "unointerfaceproxy.hxx"
-#include "vtables.hxx"
-#include "share.hxx"
+#include <bridge.hxx>
+#include <types.hxx>
+#include <unointerfaceproxy.hxx>
+#include <vtables.hxx>
using namespace ::com::sun::star::uno;
-namespace arm
-{
- bool is_hfa_struct(const typelib_TypeDescription * type)
- {
- const typelib_CompoundTypeDescription * p
- = reinterpret_cast< const typelib_CompoundTypeDescription *
>(type);
- if (p->nMembers >= 4)
- return false;
- for (sal_Int32 i = 0; i < p->nMembers; ++i)
- {
- if ((p->ppTypeRefs[i]->eTypeClass != typelib_TypeClass_FLOAT &&
- p->ppTypeRefs[i]->eTypeClass != typelib_TypeClass_DOUBLE) ||
- p->ppTypeRefs[i]->eTypeClass != p->ppTypeRefs[0]->eTypeClass)
- return false;
- }
- return true;
- }
-
- bool return_in_x8( typelib_TypeDescriptionReference *pTypeRef )
- {
- if (bridges::cpp_uno::shared::isSimpleType(pTypeRef))
- return false;
- else if (pTypeRef->eTypeClass == typelib_TypeClass_STRUCT ||
pTypeRef->eTypeClass == typelib_TypeClass_EXCEPTION)
- {
- typelib_TypeDescription * pTypeDescr = 0;
- TYPELIB_DANGER_GET( &pTypeDescr, pTypeRef );
-
- // A Composite Type not larger than 16 bytes is returned in x0, x1
- bool bRet = pTypeDescr->nSize > 16;
-
- if (is_hfa_struct(pTypeDescr))
- bRet = false;
-
- TYPELIB_DANGER_RELEASE( pTypeDescr );
- return bRet;
- }
- return true;
- }
-}
-
-void MapReturn(sal_uInt64 x0, sal_uInt64 x1, double d0,
typelib_TypeDescriptionReference *pReturnType, sal_uInt64 *pRegisterReturn)
+namespace bridges::cpp_uno::shared
{
- switch( pReturnType->eTypeClass )
- {
- case typelib_TypeClass_HYPER:
- case typelib_TypeClass_UNSIGNED_HYPER:
- pRegisterReturn[1] = x1;
- [[fallthrough]];
- case typelib_TypeClass_LONG:
- case typelib_TypeClass_UNSIGNED_LONG:
- case typelib_TypeClass_ENUM:
- case typelib_TypeClass_CHAR:
- case typelib_TypeClass_SHORT:
- case typelib_TypeClass_UNSIGNED_SHORT:
- case typelib_TypeClass_BOOLEAN:
- case typelib_TypeClass_BYTE:
- pRegisterReturn[0] = x0;
- break;
- case typelib_TypeClass_FLOAT:
- *(float*)pRegisterReturn = *(float*)&d0;
- break;
- case typelib_TypeClass_DOUBLE:
- *(double*)pRegisterReturn = d0;
- break;
- case typelib_TypeClass_STRUCT:
- case typelib_TypeClass_EXCEPTION:
- if (!arm::return_in_x8(pReturnType))
- {
- pRegisterReturn[0] = x0;
- pRegisterReturn[1] = x1;
- }
- break;
- default:
- break;
- }
-}
-
-namespace
-{
-void callVirtualMethod(
- void *pThis,
- sal_Int32 nVtableIndex,
- void *pRegisterReturn,
- typelib_TypeDescriptionReference *pReturnType,
- sal_uInt64 *pStack,
- int nStack,
- sal_uInt64 *pGPR,
- double *pFPR)
-{
- // never called
- if (! pThis)
- CPPU_CURRENT_NAMESPACE::dummy_can_throw_anything("xxx"); // address
something
-
- if ( nStack )
- {
- // 16-bytes aligned
- sal_uInt32 nStackBytes = ( ( nStack + 3 ) >> 2 ) * 16;
- sal_uInt32 *stack = (sal_uInt32 *) alloca( nStackBytes );
- memcpy( stack, pStack, nStackBytes );
- }
-
- sal_uInt64 pMethod = *((sal_uInt64*)pThis);
- pMethod += 8 * nVtableIndex;
- pMethod = *((sal_uInt64 *)pMethod);
-
- // For value returned in registers
- sal_uInt64 x0;
- sal_uInt64 x1;
- double d0;
-
- // TODO: this is all dummy
-
- MapReturn(x0, x1, d0, pReturnType, (sal_uInt64 *) pRegisterReturn);
-}
-}
-
-#define INSERT_INT64( pSV, nr, pGPR, pDS ) \
- if ( nr < arm::MAX_GPR_REGS ) \
- pGPR[nr++] = *reinterpret_cast<sal_uInt64 *>( pSV ); \
- else \
- *pDS++ = *reinterpret_cast<sal_uInt64 *>( pSV );
-
-#define INSERT_INT32( pSV, nr, pGPR, pDS ) \
- if ( nr < arm::MAX_GPR_REGS ) \
- pGPR[nr++] = *reinterpret_cast<sal_uInt32 *>( pSV ); \
- else \
- *pDS++ = *reinterpret_cast<sal_uInt32 *>( pSV );
-
-#define INSERT_INT16( pSV, nr, pGPR, pDS ) \
- if ( nr < arm::MAX_GPR_REGS ) \
- pGPR[nr++] = *reinterpret_cast<sal_uInt16 *>( pSV ); \
- else \
- *pDS++ = *reinterpret_cast<sal_uInt16 *>( pSV );
-
-#define INSERT_INT8( pSV, nr, pGPR, pDS ) \
- if ( nr < arm::MAX_GPR_REGS ) \
- pGPR[nr++] = *reinterpret_cast<sal_uInt8 *>( pSV ); \
- else \
- *pDS++ = *reinterpret_cast<sal_uInt8 *>( pSV );
-
-#define INSERT_DOUBLE( pSV, nr, pFPR, pDS ) \
- if ( nr < arm::MAX_FPR_REGS ) \
- pFPR[nr++] = *reinterpret_cast<double *>( pSV ); \
- else \
- *pDS++ = *reinterpret_cast<double *>( pSV );
-
-#define INSERT_FLOAT( pSV, nr, pFPR, pDS ) \
- INSERT_DOUBLE( pSV, nr, pGPR, pDS )
-
-namespace {
-static void cpp_call(
- bridges::cpp_uno::shared::UnoInterfaceProxy * pThis,
- bridges::cpp_uno::shared::VtableSlot aVtableSlot,
- typelib_TypeDescriptionReference * pReturnTypeRef,
- sal_Int32 nParams, typelib_MethodParameter * pParams,
- void * pUnoReturn, void * pUnoArgs[], uno_Any ** ppUnoExc )
-{
- // max space for: values|ptr ...
- sal_uInt64 * pStack = (sal_uInt64 *)alloca( (nParams+2) *
sizeof(sal_Int64) );
- sal_uInt64 * pStackStart = pStack;
-
- sal_uInt64 pGPR[arm::MAX_GPR_REGS];
- int nGPR = 0;
-
- // storage and counter for SIMD/FP registers
- double pFPR[arm::MAX_FPR_REGS];
- int nFPR = 0;
-
- // return
- typelib_TypeDescription * pReturnTypeDescr = 0;
- TYPELIB_DANGER_GET( &pReturnTypeDescr, pReturnTypeRef );
- assert( pReturnTypeDescr);
-
- void * pCppReturn = 0; // if != 0 && != pUnoReturn, needs reconversion
-
- if (pReturnTypeDescr)
- {
- if (!arm::return_in_x8( pReturnTypeRef ) )
- pCppReturn = pUnoReturn; // direct way for simple types
- else
- {
- // complex return via x8
- pCppReturn = (bridges::cpp_uno::shared::relatesToInterfaceType(
pReturnTypeDescr )
- ? alloca( pReturnTypeDescr->nSize )
- : pUnoReturn); // direct way
- }
- }
- // push this
- void * pAdjustedThisPtr = reinterpret_cast< void ** >(pThis->getCppI())
- + aVtableSlot.offset;
- INSERT_INT64( &pAdjustedThisPtr, nGPR, pGPR, pStack );
-
- // stack space
- // args
- void ** pCppArgs = (void **)alloca( sizeof(void *) * nParams );
-
- // indices of values this have to be converted (interface conversion
cpp<=>uno)
- int * pTempIndices = (int *)alloca( sizeof(int) * nParams );
-
- // type descriptions for reconversions
- typelib_TypeDescription ** ppTempParamTypeDescr = (typelib_TypeDescription
**)alloca( sizeof(void *) * nParams );
-
- sal_Int32 nTempIndices = 0;
-
- for ( sal_Int32 nPos = 0; nPos < nParams; ++nPos )
- {
- const typelib_MethodParameter & rParam = pParams[nPos];
- typelib_TypeDescription * pParamTypeDescr = 0;
- TYPELIB_DANGER_GET( &pParamTypeDescr, rParam.pTypeRef );
-
- if (!rParam.bOut && bridges::cpp_uno::shared::isSimpleType(
pParamTypeDescr ))
- {
- uno_copyAndConvertData( pCppArgs[nPos] = alloca(8), pUnoArgs[nPos],
- pParamTypeDescr, pThis->getBridge()->getUno2Cpp() );
-
- switch (pParamTypeDescr->eTypeClass)
- {
- case typelib_TypeClass_HYPER:
- case typelib_TypeClass_UNSIGNED_HYPER:
- INSERT_INT64( pCppArgs[nPos], nGPR, pGPR, pStack );
- break;
- case typelib_TypeClass_LONG:
- case typelib_TypeClass_UNSIGNED_LONG:
- case typelib_TypeClass_ENUM:
- INSERT_INT32( pCppArgs[nPos], nGPR, pGPR, pStack );
- break;
- case typelib_TypeClass_SHORT:
- case typelib_TypeClass_CHAR:
- case typelib_TypeClass_UNSIGNED_SHORT:
- INSERT_INT16( pCppArgs[nPos], nGPR, pGPR, pStack );
- break;
- case typelib_TypeClass_BOOLEAN:
- case typelib_TypeClass_BYTE:
- INSERT_INT8( pCppArgs[nPos], nGPR, pGPR, pStack );
- break;
- case typelib_TypeClass_FLOAT:
- INSERT_FLOAT( pCppArgs[nPos], nFPR, pFPR, pStack );
- break;
- case typelib_TypeClass_DOUBLE:
- INSERT_DOUBLE( pCppArgs[nPos], nFPR, pFPR, pStack );
- break;
- default:
- break;
- }
- // no longer needed
- TYPELIB_DANGER_RELEASE( pParamTypeDescr );
- }
- else // ptr to complex value | ref
- {
- if (! rParam.bIn) // is pure out
- {
- // cpp out is constructed mem, uno out is not!
- uno_constructData(
- pCppArgs[nPos] = alloca( pParamTypeDescr->nSize ),
- pParamTypeDescr );
- pTempIndices[nTempIndices] = nPos; // default constructed for
cpp call
- // will be released at reconversion
- ppTempParamTypeDescr[nTempIndices++] = pParamTypeDescr;
- }
- // is in/inout
- else if (bridges::cpp_uno::shared::relatesToInterfaceType(
pParamTypeDescr ))
- {
- uno_copyAndConvertData(
- pCppArgs[nPos] = alloca( pParamTypeDescr->nSize ),
- pUnoArgs[nPos], pParamTypeDescr,
pThis->getBridge()->getUno2Cpp() );
-
- pTempIndices[nTempIndices] = nPos; // has to be reconverted
- // will be released at reconversion
- ppTempParamTypeDescr[nTempIndices++] = pParamTypeDescr;
- }
- else // direct way
- {
- pCppArgs[nPos] = pUnoArgs[nPos];
- // no longer needed
- TYPELIB_DANGER_RELEASE( pParamTypeDescr );
- }
- INSERT_INT64( &(pCppArgs[nPos]), nGPR, pGPR, pStack );
- }
- }
-
- assert( nGPR <= arm::MAX_GPR_REGS );
- assert( nFPR <= arm::MAX_FPR_REGS );
-
- try
- {
- try {
- callVirtualMethod(
- pAdjustedThisPtr, aVtableSlot.index,
- pCppReturn, pReturnTypeRef,
- pStackStart,
- (pStack - pStackStart),
- pGPR,
- pFPR);
- } catch (css::uno::Exception &) {
- throw;
- } catch (std::exception & e) {
- throw css::uno::RuntimeException(
- "C++ code threw " + o3tl::runtimeToOUString(typeid(e).name())
+ ": "
- + o3tl::runtimeToOUString(e.what()));
- } catch (...) {
- throw css::uno::RuntimeException("C++ code threw unknown
exception");
- }
-
- // NO exception occurred...
- *ppUnoExc = 0;
-
- // reconvert temporary params
- for ( ; nTempIndices--; )
- {
- sal_Int32 nIndex = pTempIndices[nTempIndices];
- typelib_TypeDescription * pParamTypeDescr =
ppTempParamTypeDescr[nTempIndices];
-
- if (pParams[nIndex].bIn)
- {
- if (pParams[nIndex].bOut) // inout
- {
- uno_destructData( pUnoArgs[nIndex], pParamTypeDescr, 0 );
// destroy uno value
- uno_copyAndConvertData( pUnoArgs[nIndex],
pCppArgs[nIndex], pParamTypeDescr,
- pThis->getBridge()->getCpp2Uno() );
- }
- }
- else // pure out
- {
- uno_copyAndConvertData( pUnoArgs[nIndex], pCppArgs[nIndex],
pParamTypeDescr,
- pThis->getBridge()->getCpp2Uno() );
- }
- // destroy temp cpp param => cpp: every param was constructed
- uno_destructData( pCppArgs[nIndex], pParamTypeDescr, cpp_release );
-
- TYPELIB_DANGER_RELEASE( pParamTypeDescr );
- }
- // return value
- if (pCppReturn && pUnoReturn != pCppReturn)
- {
- uno_copyAndConvertData( pUnoReturn, pCppReturn, pReturnTypeDescr,
- pThis->getBridge()->getCpp2Uno() );
- uno_destructData( pCppReturn, pReturnTypeDescr, cpp_release );
- }
- }
- catch (...)
- {
- // fill uno exception
- CPPU_CURRENT_NAMESPACE::fillUnoException(*ppUnoExc,
pThis->getBridge()->getCpp2Uno());
-
- // temporary params
- for ( ; nTempIndices--; )
- {
- sal_Int32 nIndex = pTempIndices[nTempIndices];
- // destroy temp cpp param => cpp: every param was constructed
- uno_destructData( pCppArgs[nIndex],
ppTempParamTypeDescr[nTempIndices], cpp_release );
- TYPELIB_DANGER_RELEASE( ppTempParamTypeDescr[nTempIndices] );
- }
-
- // return type
- if (pReturnTypeDescr)
- TYPELIB_DANGER_RELEASE( pReturnTypeDescr );
- }
-}
-}
-
-namespace bridges::cpp_uno::shared {
-
-void unoInterfaceProxyDispatch(
- uno_Interface * pUnoI, const typelib_TypeDescription * pMemberDescr,
- void * pReturn, void * pArgs[], uno_Any ** ppException )
+void unoInterfaceProxyDispatch(uno_Interface* pUnoI, const
typelib_TypeDescription* pMemberDescr,
+ void* pReturn, void* pArgs[], uno_Any**
ppException)
{
- // is my surrogate
- bridges::cpp_uno::shared::UnoInterfaceProxy * pThis
- = static_cast< bridges::cpp_uno::shared::UnoInterfaceProxy *
>(pUnoI);
-#if OSL_DEBUG_LEVEL > 0
- typelib_InterfaceTypeDescription * pTypeDescr = pThis->pTypeDescr;
-#endif
+ bridges::cpp_uno::shared::UnoInterfaceProxy* pThis
+ = static_cast<bridges::cpp_uno::shared::UnoInterfaceProxy*>(pUnoI);
switch (pMemberDescr->eTypeClass)
{
- case typelib_TypeClass_INTERFACE_ATTRIBUTE:
- {
-#if OSL_DEBUG_LEVEL > 0
- // determine vtable call index
- sal_Int32 nMemberPos = ((typelib_InterfaceMemberTypeDescription
*)pMemberDescr)->nPosition;
- assert( nMemberPos < pTypeDescr->nAllMembers && "### member pos out of
range!");
-#endif
-
- VtableSlot aVtableSlot(
- getVtableSlot(
- reinterpret_cast<typelib_InterfaceAttributeTypeDescription const *>
- (pMemberDescr)));
-
- if (pReturn)
+ case typelib_TypeClass_INTERFACE_ATTRIBUTE:
{
- // dependent dispatch
- cpp_call(
- pThis, aVtableSlot,
- ((typelib_InterfaceAttributeTypeDescription
*)pMemberDescr)->pAttributeTypeRef,
- 0, 0, // no params
- pReturn, pArgs, ppException );
+ std::abort();
+ break;
}
- else
+ case typelib_TypeClass_INTERFACE_METHOD:
{
- // is SET
- typelib_MethodParameter aParam;
- aParam.pTypeRef =
- ((typelib_InterfaceAttributeTypeDescription
*)pMemberDescr)->pAttributeTypeRef;
- aParam.bIn = sal_True;
- aParam.bOut = sal_False;
-
- typelib_TypeDescriptionReference * pReturnTypeRef = 0;
- OUString aVoidName("void");
- typelib_typedescriptionreference_new(
- &pReturnTypeRef, typelib_TypeClass_VOID, aVoidName.pData );
-
- // dependent dispatch
- aVtableSlot.index += 1;
- cpp_call(
- pThis, aVtableSlot, // get, then set method
- pReturnTypeRef,
- 1, &aParam,
- pReturn, pArgs, ppException );
+ VtableSlot aVtableSlot(getVtableSlot(
+ reinterpret_cast<typelib_InterfaceMethodTypeDescription
const*>(pMemberDescr)));
- typelib_typedescriptionreference_release( pReturnTypeRef );
- }
-
- break;
- }
- case typelib_TypeClass_INTERFACE_METHOD:
- {
-#if OSL_DEBUG_LEVEL > 0
- // determine vtable call index
- sal_Int32 nMemberPos = ((typelib_InterfaceMemberTypeDescription
*)pMemberDescr)->nPosition;
- assert(nMemberPos < pTypeDescr->nAllMembers && "### member pos out of
range!");
-#endif
-
- VtableSlot aVtableSlot(
- getVtableSlot(
- reinterpret_cast<typelib_InterfaceMethodTypeDescription const *>
- (pMemberDescr)));
-
- switch (aVtableSlot.index)
- {
- // standard calls
- case 1: // acquire uno interface
- (*pUnoI->acquire)( pUnoI );
- *ppException = 0;
- break;
- case 2: // release uno interface
- (*pUnoI->release)( pUnoI );
- *ppException = 0;
- break;
- case 0: // queryInterface() opt
- {
- typelib_TypeDescription * pTD = 0;
- TYPELIB_DANGER_GET( &pTD, reinterpret_cast< Type * >( pArgs[0]
)->getTypeLibType() );
- if (pTD)
+ switch (aVtableSlot.index)
{
- uno_Interface * pInterface = 0;
- (*pThis->getBridge()->getUnoEnv()->getRegisteredInterface)(
- pThis->getBridge()->getUnoEnv(),
- (void **)&pInterface, pThis->oid.pData,
(typelib_InterfaceTypeDescription *)pTD );
-
- if (pInterface)
- {
- ::uno_any_construct(
- reinterpret_cast< uno_Any * >( pReturn ),
- &pInterface, pTD, 0 );
- (*pInterface->release)( pInterface );
- TYPELIB_DANGER_RELEASE( pTD );
+ case 1: // acquire uno interface
+ (*pUnoI->acquire)(pUnoI);
*ppException = 0;
break;
- }
- TYPELIB_DANGER_RELEASE( pTD );
+ case 2: // release uno interface
+ (*pUnoI->release)(pUnoI);
+ *ppException = 0;
+ break;
+ case 0: // queryInterface() opt
+ {
+ typelib_TypeDescription* pTD = 0;
+ TYPELIB_DANGER_GET(&pTD,
reinterpret_cast<Type*>(pArgs[0])->getTypeLibType());
+ if (pTD)
+ {
+ uno_Interface* pInterface = 0;
+
(*pThis->getBridge()->getUnoEnv()->getRegisteredInterface)(
+ pThis->getBridge()->getUnoEnv(),
(void**)&pInterface, pThis->oid.pData,
+ (typelib_InterfaceTypeDescription*)pTD);
+
+ if (pInterface)
+ {
+
::uno_any_construct(reinterpret_cast<uno_Any*>(pReturn), &pInterface,
+ pTD, 0);
+ (*pInterface->release)(pInterface);
+ TYPELIB_DANGER_RELEASE(pTD);
+ *ppException = 0;
+ break;
+ }
+ TYPELIB_DANGER_RELEASE(pTD);
+ }
+ } // else perform queryInterface()
+ [[fallthrough]];
+ default:
+ std::abort();
}
- } // else perform queryInterface()
- [[fallthrough]];
- default:
- // dependent dispatch
- cpp_call(
- pThis, aVtableSlot,
- ((typelib_InterfaceMethodTypeDescription
*)pMemberDescr)->pReturnTypeRef,
- ((typelib_InterfaceMethodTypeDescription
*)pMemberDescr)->nParams,
- ((typelib_InterfaceMethodTypeDescription
*)pMemberDescr)->pParams,
- pReturn, pArgs, ppException );
+ break;
}
- break;
- }
- default:
- {
- ::com::sun::star::uno::RuntimeException aExc(
- "illegal member type description!",
- ::com::sun::star::uno::Reference<
::com::sun::star::uno::XInterface >() );
+ default:
+ {
+ ::com::sun::star::uno::RuntimeException aExc(
+ "illegal member type description!",
+
::com::sun::star::uno::Reference<::com::sun::star::uno::XInterface>());
- Type const & rExcType = cppu::UnoType<decltype(aExc)>::get();
- // binary identical null reference
- ::uno_type_any_construct( *ppException, &aExc,
rExcType.getTypeLibType(), 0 );
- }
+ Type const& rExcType = cppu::UnoType<decltype(aExc)>::get();
+ // binary identical null reference
+ ::uno_type_any_construct(*ppException, &aExc,
rExcType.getTypeLibType(), 0);
+ }
}
}
-}
+} // namespace bridges::cpp_uno::shared
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/bridges/source/cpp_uno/gcc3_wasm/unwind-cxx.h
b/bridges/source/cpp_uno/gcc3_wasm/unwind-cxx.h
deleted file mode 100644
index 8b81d9f4aa7a..000000000000
--- a/bridges/source/cpp_uno/gcc3_wasm/unwind-cxx.h
+++ /dev/null
@@ -1,283 +0,0 @@
-// -*- C++ -*- Exception handling and frame unwind runtime interface routines.
-// Copyright (C) 2001 Free Software Foundation, Inc.
-//
-// This file is part of GCC.
-//
-// GCC is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2, or (at your option)
-// any later version.
-//
-// GCC is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with GCC; see the file COPYING. If not, write to
-// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
-// Boston, MA 02110-1301, USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction. Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file does not by itself cause the resulting executable to be covered by
-// the GNU General Public License. This exception does not however
-// invalidate any other reasons why the executable file might be covered by
-// the GNU General Public License.
-
-// This is derived from the C++ ABI for IA-64. Where we diverge
-// for cross-architecture compatibility are noted with "@@@".
-
-#ifndef _UNWIND_CXX_H
-#define _UNWIND_CXX_H 1
-
-// Level 2: C++ ABI
-
-#include <typeinfo>
-#include <exception>
-
-#include <stddef.h>
-#include "unwind.h"
-
-
-typedef unsigned _Unwind_Word __attribute__((__mode__(__word__)));
-typedef signed _Unwind_Sword __attribute__((__mode__(__word__)));
-typedef unsigned _Unwind_Word __attribute__((__mode__(__word__)));
-//typedef unsigned _Unwind_Ptr __attribute__((__mode__(__pointer__)));
-typedef unsigned _Unwind_Exception_Class __attribute__((__mode__(__DI__)));
-//typedef unsigned _Unwind_Internal_Ptr __attribute__((__mode__(__pointer__)));
-
-#pragma GCC visibility push(default)
-
-namespace __cxxabiv1
-{
-
-// A C++ exception object consists of a header, which is a wrapper around
-// an unwind object header with additional C++ specific information,
-// followed by the exception object itself.
-
-struct __cxa_exception
-{
-#if __LP64__
-#if 0
- // This is a new field added with LLVM 10
- //
<https://github.com/llvm/llvm-project/commit/674ec1eb16678b8addc02a4b0534ab383d22fa77>
- // "[libcxxabi] Insert padding in __cxa_exception struct for
compatibility". The HACK in
- // fillUnoException (bridges/source/cpp_uno/gcc3_macosx_x86-64/except.cxx)
tries to find out at
- // runtime whether a __cxa_exception has this member. Once we can be sure
that we only run
- // against new libcxxabi that has this member, we can drop the "#if 0"
here and drop the hack
- // in fillUnoException.
-
- // Now _Unwind_Exception is marked with __attribute__((aligned)),
- // which implies __cxa_exception is also aligned. Insert padding
- // in the beginning of the struct, rather than before unwindHeader.
- void *reserve;
-#endif
-
- // This is a new field to support C++ 0x exception_ptr.
- // For binary compatibility it is at the start of this
- // struct which is prepended to the object thrown in
- // __cxa_allocate_exception.
- size_t referenceCount;
-#endif
- // Manage the exception object itself.
- std::type_info *exceptionType;
- void (*exceptionDestructor)(void *);
-
- // The C++ standard has entertaining rules wrt calling set_terminate
- // and set_unexpected in the middle of the exception cleanup process.
- void (*unexpectedHandler)(); // std::unexpected_handler dropped from C++17
- std::terminate_handler terminateHandler;
-
- // The caught exception stack threads through here.
- __cxa_exception *nextException;
-
- // How many nested handlers have caught this exception. A negated
- // value is a signal that this object has been rethrown.
- int handlerCount;
-
-#ifdef __ARM_EABI_UNWINDER__
- // Stack of exceptions in cleanups.
- __cxa_exception* nextPropagatingException;
-
- // The number of active cleanup handlers for this exception.
- int propagationCount;
-#else
- // Cache parsed handler data from the personality routine Phase 1
- // for Phase 2 and __cxa_call_unexpected.
- int handlerSwitchValue;
- const unsigned char *actionRecord;
- const unsigned char *languageSpecificData;
- _Unwind_Ptr catchTemp;
- void *adjustedPtr;
-#endif
-#if !__LP64__
- // This is a new field to support C++ 0x exception_ptr.
- // For binary compatibility it is placed where the compiler
- // previously adding padded to 64-bit align unwindHeader.
- size_t referenceCount;
-#endif
-
- // The generic exception header. Must be last.
- _Unwind_Exception unwindHeader;
-};
-
-// Each thread in a C++ program has access to a __cxa_eh_globals object.
-struct __cxa_eh_globals
-{
- __cxa_exception *caughtExceptions;
- unsigned int uncaughtExceptions;
-#ifdef __ARM_EABI_UNWINDER__
- __cxa_exception* propagatingExceptions;
-#endif
-};
-
-
-// The __cxa_eh_globals for the current thread can be obtained by using
-// either of the following functions. The "fast" version assumes at least
-// one prior call of __cxa_get_globals has been made from the current
-// thread, so no initialization is necessary.
-extern "C" __cxa_eh_globals *__cxa_get_globals () throw();
-extern "C" __cxa_eh_globals *__cxa_get_globals_fast () throw();
-
-// Allocate memory for the exception plus the thrown object.
-extern "C" void *__cxa_allocate_exception(size_t thrown_size) throw();
-
-// Free the space allocated for the exception.
-extern "C" void __cxa_free_exception(void *thrown_exception) throw();
-
-#pragma GCC visibility push(hidden)
-extern "C" void *__cxa_allocate_dependent_exception() throw();
-extern "C" void __cxa_free_dependent_exception(void *thrown_exception) throw();
-#pragma GCC visibility pop
-
-// Throw the exception.
-extern "C" void __cxa_throw (void *thrown_exception,
- std::type_info *tinfo,
- void (*dest) (void *))
- __attribute__((noreturn));
-
-// Used to implement exception handlers.
-extern "C" void *__cxa_get_exception_ptr (void *) throw();
-extern "C" void *__cxa_begin_catch (void *) throw();
-extern "C" void __cxa_end_catch ();
-extern "C" void __cxa_rethrow () __attribute__((noreturn));
-
-// These facilitate code generation for recurring situations.
-extern "C" void __cxa_bad_cast ();
-extern "C" void __cxa_bad_typeid ();
-
-// @@@ These are not directly specified by the IA-64 C++ ABI.
-
-// Handles re-checking the exception specification if unexpectedHandler
-// throws, and if bad_exception needs to be thrown. Called from the
-// compiler.
-extern "C" void __cxa_call_unexpected (void *) __attribute__((noreturn));
-extern "C" void __cxa_call_terminate (void*) __attribute__((noreturn));
-
-#ifdef __ARM_EABI_UNWINDER__
-// Arm EABI specified routines.
-typedef enum {
- ctm_failed = 0,
- ctm_succeeded = 1,
- ctm_succeeded_with_ptr_to_base = 2
-} __cxa_type_match_result;
-extern "C" bool __cxa_type_match(_Unwind_Exception*, const std::type_info*,
- bool, void**);
-extern "C" void __cxa_begin_cleanup (_Unwind_Exception*);
-extern "C" void __cxa_end_cleanup (void);
-#endif
-
-// These are explicitly GNU C++ specific.
-
-// Acquire the C++ exception header from the C++ object.
-static inline __cxa_exception *
-__get_exception_header_from_obj (void *ptr)
-{
- return reinterpret_cast<__cxa_exception *>(ptr) - 1;
-}
-
-// Acquire the C++ exception header from the generic exception header.
-static inline __cxa_exception *
-__get_exception_header_from_ue (_Unwind_Exception *exc)
-{
- return reinterpret_cast<__cxa_exception *>(exc + 1) - 1;
-}
-
-#ifdef __ARM_EABI_UNWINDER__
-static inline bool
-__is_gxx_exception_class(_Unwind_Exception_Class c)
-{
- // TODO: Take advantage of the fact that c will always be word aligned.
- return c[0] == 'G'
- && c[1] == 'N'
- && c[2] == 'U'
- && c[3] == 'C'
- && c[4] == 'C'
- && c[5] == '+'
- && c[6] == '+';
-}
-
-static inline void
-__GXX_INIT_EXCEPTION_CLASS(_Unwind_Exception_Class c)
-{
- c[0] = 'G';
- c[1] = 'N';
- c[2] = 'U';
- c[3] = 'C';
- c[4] = 'C';
- c[5] = '+';
- c[6] = '+';
- c[7] = '\0';
-}
-
-static inline void*
-__gxx_caught_object(_Unwind_Exception* eo)
-{
- return (void*)eo->barrier_cache.bitpattern[0];
-}
-#else // !__ARM_EABI_UNWINDER__
-// This is the exception class we report -- "GNUCC++\0".
-const _Unwind_Exception_Class __gxx_exception_class
-= ((((((((_Unwind_Exception_Class) 'G'
- << 8 | (_Unwind_Exception_Class) 'N')
- << 8 | (_Unwind_Exception_Class) 'U')
- << 8 | (_Unwind_Exception_Class) 'C')
- << 8 | (_Unwind_Exception_Class) 'C')
- << 8 | (_Unwind_Exception_Class) '+')
- << 8 | (_Unwind_Exception_Class) '+')
- << 8 | (_Unwind_Exception_Class) '\0');
-
-static inline bool
-__is_gxx_exception_class(_Unwind_Exception_Class c)
-{
- return (c & ((_Unwind_Exception_Class)~0 << 8)) == __gxx_exception_class;
-}
-
-#define __GXX_INIT_EXCEPTION_CLASS(c) c = __gxx_exception_class
-
-// GNU C++ personality routine, Version 0.
-extern "C" _Unwind_Reason_Code __gxx_personality_v0
- (int, _Unwind_Action, _Unwind_Exception_Class,
- struct _Unwind_Exception *, struct _Unwind_Context *);
-
-// GNU C++ sjlj personality routine, Version 0.
-extern "C" _Unwind_Reason_Code __gxx_personality_sj0
- (int, _Unwind_Action, _Unwind_Exception_Class,
- struct _Unwind_Exception *, struct _Unwind_Context *);
-
-static inline void*
-__gxx_caught_object(_Unwind_Exception* eo)
-{
- __cxa_exception* header = __get_exception_header_from_ue (eo);
- return header->adjustedPtr;
-}
-#endif // !__ARM_EABI_UNWINDER__
-
-} /* namespace __cxxabiv1 */
-
-#pragma GCC visibility pop
-
-#endif // _UNWIND_CXX_H
commit fd70abbf5c49716d709bbfa154d5aa06eecdb86f
Author: Jan-Marek Glogowski <[email protected]>
AuthorDate: Thu Oct 28 13:10:37 2021 +0200
Commit: Jan-Marek Glogowski <[email protected]>
CommitDate: Fri Oct 29 20:42:00 2021 +0200
Group per-locale functions instead by type
... and also sort them.
Gets rid of a lot of #ifdef cpp macro lines.
Also unifies the macros as "MACRO( id )" for easier readability.
Additionally drops the "// add here new services !!" comment at
the end of the transliteration instance list, as items were added
all other the place in various patches.
Change-Id: I040b3b0952ec2aef2d1d10e7282cfd11afa6b702
diff --git a/i18npool/source/registerservices/registerservices.cxx
b/i18npool/source/registerservices/registerservices.cxx
index f382caadd038..18695c70a443 100644
--- a/i18npool/source/registerservices/registerservices.cxx
+++ b/i18npool/source/registerservices/registerservices.cxx
@@ -104,219 +104,154 @@ i18npool_##ImplName##_get_implementation( \
// -Wl,--gc_sections. It's mainly for iOS and Android that the
// --with-locales option is intended anyway.
-IMPL_UNO_CONSTRUCTOR_CTX( IndexEntrySupplier )
-IMPL_UNO_CONSTRUCTOR_CTX( IndexEntrySupplier_asian )
-#if WITH_LOCALE_ALL || WITH_LOCALE_ja
-IMPL_UNO_CONSTRUCTOR_CTX(
IndexEntrySupplier_ja_phonetic_alphanumeric_first_by_syllable )
-IMPL_UNO_CONSTRUCTOR_CTX(
IndexEntrySupplier_ja_phonetic_alphanumeric_first_by_consonant )
-IMPL_UNO_CONSTRUCTOR_CTX(
IndexEntrySupplier_ja_phonetic_alphanumeric_last_by_syllable )
-IMPL_UNO_CONSTRUCTOR_CTX(
IndexEntrySupplier_ja_phonetic_alphanumeric_last_by_consonant )
-#endif
-IMPL_UNO_CONSTRUCTOR_CTX( IndexEntrySupplier_Unicode )
-IMPL_UNO_CONSTRUCTOR_CTX( CalendarImpl )
+IMPL_CREATEINSTANCE( ignoreDiacritics_CTL )
+IMPL_CREATEINSTANCE( ignoreKashida_CTL )
+IMPL_CREATEINSTANCE( NumToCharIndic_ar )
+IMPL_CREATEINSTANCE( NumToTextCircledNumber )
+IMPL_CREATEINSTANCE( Transliteration_l2u )
+IMPL_CREATEINSTANCE( Transliteration_sentencecase )
+IMPL_CREATEINSTANCE( Transliteration_titlecase )
+IMPL_CREATEINSTANCE( Transliteration_togglecase )
+IMPL_CREATEINSTANCE( Transliteration_u2l )
+IMPL_UNO_CONSTRUCTOR( Calendar_buddhist )
+IMPL_UNO_CONSTRUCTOR( Calendar_dangi )
+IMPL_UNO_CONSTRUCTOR( Calendar_gengou )
IMPL_UNO_CONSTRUCTOR( Calendar_gregorian )
IMPL_UNO_CONSTRUCTOR( Calendar_hanja )
IMPL_UNO_CONSTRUCTOR( Calendar_hanja_yoil )
-IMPL_UNO_CONSTRUCTOR( Calendar_gengou )
-IMPL_UNO_CONSTRUCTOR( Calendar_ROC )
-IMPL_UNO_CONSTRUCTOR( Calendar_dangi )
IMPL_UNO_CONSTRUCTOR( Calendar_hijri )
IMPL_UNO_CONSTRUCTOR( Calendar_jewish )
-IMPL_UNO_CONSTRUCTOR( Calendar_buddhist )
-#if WITH_LOCALE_ALL || WITH_LOCALE_ja
- IMPL_UNO_CONSTRUCTOR( BreakIterator_ja )
-#endif
-#if WITH_LOCALE_ALL || WITH_LOCALE_zh
-IMPL_UNO_CONSTRUCTOR( BreakIterator_zh )
-IMPL_UNO_CONSTRUCTOR( BreakIterator_zh_TW )
-#endif
-#if WITH_LOCALE_ALL || WITH_LOCALE_ko
-IMPL_UNO_CONSTRUCTOR( BreakIterator_ko )
-#endif
-#if WITH_LOCALE_ALL || WITH_LOCALE_th
-IMPL_UNO_CONSTRUCTOR( BreakIterator_th )
-#endif
-IMPL_UNO_CONSTRUCTOR_CTX( ChapterCollator )
+IMPL_UNO_CONSTRUCTOR( Calendar_ROC )
+IMPL_UNO_CONSTRUCTOR( CharToNumEastIndic_ar )
+IMPL_UNO_CONSTRUCTOR( CharToNumIndic_ar )
IMPL_UNO_CONSTRUCTOR( Collator_Unicode )
+IMPL_UNO_CONSTRUCTOR_CTX( CalendarImpl )
+IMPL_UNO_CONSTRUCTOR_CTX( ChapterCollator )
+IMPL_UNO_CONSTRUCTOR_CTX( IndexEntrySupplier )
+IMPL_UNO_CONSTRUCTOR_CTX( IndexEntrySupplier_asian )
+IMPL_UNO_CONSTRUCTOR_CTX( IndexEntrySupplier_Unicode )
+IMPL_UNO_CONSTRUCTOR( NumToCharEastIndic_ar )
-#if WITH_LOCALE_ALL || WITH_LOCALE_th
-IMPL_UNO_CONSTRUCTOR( InputSequenceChecker_th )
-#endif
#if WITH_LOCALE_ALL || WITH_LOCALE_hi
+IMPL_CREATEINSTANCE( NumToCharIndic_hi )
+IMPL_UNO_CONSTRUCTOR( CharToNumIndic_hi )
IMPL_UNO_CONSTRUCTOR( InputSequenceChecker_hi )
#endif
-#if WITH_LOCALE_ALL || WITH_LOCALE_ko
-IMPL_UNO_CONSTRUCTOR_CTX( TextConversion_ko )
-#endif
-#if WITH_LOCALE_ALL || WITH_LOCALE_zh
-IMPL_UNO_CONSTRUCTOR_CTX( TextConversion_zh )
-#endif
-IMPL_CREATEINSTANCE( Transliteration_u2l )
-IMPL_CREATEINSTANCE( Transliteration_l2u )
-IMPL_CREATEINSTANCE( Transliteration_sentencecase )
-IMPL_CREATEINSTANCE( Transliteration_titlecase )
-IMPL_CREATEINSTANCE( Transliteration_togglecase )
#if WITH_LOCALE_ALL || WITH_LOCALE_ja
-IMPL_CREATEINSTANCE( hiraganaToKatakana )
-IMPL_CREATEINSTANCE( katakanaToHiragana )
IMPL_CREATEINSTANCE( fullwidthToHalfwidth )
IMPL_CREATEINSTANCE( halfwidthToFullwidth )
-#endif
-
-#if WITH_LOCALE_ALL || WITH_LOCALE_ja
-IMPL_CREATEINSTANCE( smallToLarge_ja_JP)
-IMPL_CREATEINSTANCE( largeToSmall_ja_JP)
-IMPL_CREATEINSTANCE( ignoreTraditionalKanji_ja_JP)
-IMPL_CREATEINSTANCE( ignoreTraditionalKana_ja_JP)
-IMPL_CREATEINSTANCE( ignoreMinusSign_ja_JP)
-IMPL_CREATEINSTANCE( ignoreIterationMark_ja_JP)
-IMPL_CREATEINSTANCE( ignoreSeparator_ja_JP)
-IMPL_CREATEINSTANCE( ignoreZiZu_ja_JP)
-IMPL_CREATEINSTANCE( ignoreBaFa_ja_JP)
-IMPL_CREATEINSTANCE( ignoreTiJi_ja_JP)
-IMPL_CREATEINSTANCE( ignoreHyuByu_ja_JP)
-IMPL_CREATEINSTANCE( ignoreSeZe_ja_JP)
-IMPL_CREATEINSTANCE( ignoreIandEfollowedByYa_ja_JP)
-IMPL_CREATEINSTANCE( ignoreKiKuFollowedBySa_ja_JP)
-IMPL_CREATEINSTANCE( ignoreSize_ja_JP)
-IMPL_CREATEINSTANCE( ignoreProlongedSoundMark_ja_JP)
-IMPL_CREATEINSTANCE( ignoreMiddleDot_ja_JP)
-IMPL_CREATEINSTANCE( ignoreSpace_ja_JP)
-#endif
-IMPL_CREATEINSTANCE( ignoreDiacritics_CTL)
-IMPL_CREATEINSTANCE( ignoreKashida_CTL)
-
-#if WITH_LOCALE_ALL || WITH_LOCALE_zh
-IMPL_CREATEINSTANCE( TextToChuyin_zh_TW )
-IMPL_CREATEINSTANCE( TextToPinyin_zh_CN )
-#endif
-
-#if WITH_LOCALE_ALL || WITH_LOCALE_zh
-IMPL_CREATEINSTANCE( NumToCharLower_zh_CN )
-IMPL_CREATEINSTANCE( NumToCharUpper_zh_CN )
-IMPL_CREATEINSTANCE( NumToCharLower_zh_TW )
-IMPL_CREATEINSTANCE( NumToCharUpper_zh_TW )
-#endif
-#if WITH_LOCALE_ALL || WITH_LOCALE_ja
-IMPL_CREATEINSTANCE( NumToCharHalfwidth )
+IMPL_CREATEINSTANCE( hiraganaToKatakana )
+IMPL_CREATEINSTANCE( ignoreBaFa_ja_JP )
+IMPL_CREATEINSTANCE( ignoreHyuByu_ja_JP )
+IMPL_CREATEINSTANCE( ignoreIandEfollowedByYa_ja_JP )
+IMPL_CREATEINSTANCE( ignoreIterationMark_ja_JP )
+IMPL_CREATEINSTANCE( ignoreKiKuFollowedBySa_ja_JP )
+IMPL_CREATEINSTANCE( ignoreMiddleDot_ja_JP )
+IMPL_CREATEINSTANCE( ignoreMinusSign_ja_JP )
+IMPL_CREATEINSTANCE( ignoreProlongedSoundMark_ja_JP )
+IMPL_CREATEINSTANCE( ignoreSeparator_ja_JP )
+IMPL_CREATEINSTANCE( ignoreSeZe_ja_JP )
+IMPL_CREATEINSTANCE( ignoreSize_ja_JP )
+IMPL_CREATEINSTANCE( ignoreSpace_ja_JP )
+IMPL_CREATEINSTANCE( ignoreTiJi_ja_JP )
+IMPL_CREATEINSTANCE( ignoreTraditionalKana_ja_JP )
+IMPL_CREATEINSTANCE( ignoreTraditionalKanji_ja_JP )
+IMPL_CREATEINSTANCE( ignoreZiZu_ja_JP )
+IMPL_CREATEINSTANCE( katakanaToHiragana )
+IMPL_CREATEINSTANCE( largeToSmall_ja_JP )
IMPL_CREATEINSTANCE( NumToCharFullwidth )
+IMPL_CREATEINSTANCE( NumToCharHalfwidth )
IMPL_CREATEINSTANCE( NumToCharKanjiShort_ja_JP )
IMPL_CREATEINSTANCE( NumToCharKanjiTraditional_ja_JP )
-#endif
-#if WITH_LOCALE_ALL || WITH_LOCALE_ko
-IMPL_CREATEINSTANCE( NumToCharHangul_ko )
-IMPL_CREATEINSTANCE( NumToCharLower_ko )
-IMPL_CREATEINSTANCE( NumToCharUpper_ko )
-#endif
-IMPL_CREATEINSTANCE( NumToCharIndic_ar )
-IMPL_UNO_CONSTRUCTOR( NumToCharEastIndic_ar )
-#if WITH_LOCALE_ALL || WITH_LOCALE_hi
-IMPL_CREATEINSTANCE( NumToCharIndic_hi )
-#endif
-#if WITH_LOCALE_ALL || WITH_LOCALE_th
-IMPL_CREATEINSTANCE( NumToChar_th )
-#endif
-
-#if WITH_LOCALE_ALL || WITH_LOCALE_zh
-IMPL_UNO_CONSTRUCTOR (CharToNumUpper_zh_CN)
-IMPL_UNO_CONSTRUCTOR (CharToNumLower_zh_CN)
-IMPL_UNO_CONSTRUCTOR (CharToNumUpper_zh_TW)
-IMPL_UNO_CONSTRUCTOR (CharToNumLower_zh_TW)
-#endif
-#if WITH_LOCALE_ALL || WITH_LOCALE_ja
-IMPL_UNO_CONSTRUCTOR( CharToNumFullwidth )
-IMPL_UNO_CONSTRUCTOR( CharToNumKanjiShort_ja_JP )
-IMPL_UNO_CONSTRUCTOR( CharToNumKanjiTraditional_ja_JP )
-#endif
-#if WITH_LOCALE_ALL || WITH_LOCALE_ko
-IMPL_UNO_CONSTRUCTOR( CharToNumHangul_ko )
-IMPL_UNO_CONSTRUCTOR( CharToNumLower_ko )
-IMPL_UNO_CONSTRUCTOR( CharToNumUpper_ko )
-#endif
-IMPL_UNO_CONSTRUCTOR( CharToNumIndic_ar )
-IMPL_UNO_CONSTRUCTOR( CharToNumEastIndic_ar )
-#if WITH_LOCALE_ALL || WITH_LOCALE_hi
-IMPL_UNO_CONSTRUCTOR( CharToNumIndic_hi )
-#endif
-#if WITH_LOCALE_ALL || WITH_LOCALE_th
-IMPL_UNO_CONSTRUCTOR( CharToNum_th )
-#endif
-
-#if WITH_LOCALE_ALL || WITH_LOCALE_zh
-IMPL_UNO_CONSTRUCTOR( NumToTextLower_zh_CN )
-IMPL_UNO_CONSTRUCTOR( NumToTextUpper_zh_CN )
-IMPL_UNO_CONSTRUCTOR( NumToTextLower_zh_TW )
-IMPL_UNO_CONSTRUCTOR( NumToTextUpper_zh_TW )
-IMPL_UNO_CONSTRUCTOR( NumToTextFullwidth_zh_CN )
-IMPL_UNO_CONSTRUCTOR( NumToTextFullwidth_zh_TW )
-#endif
-#if WITH_LOCALE_ALL || WITH_LOCALE_ja
IMPL_CREATEINSTANCE( NumToTextFullwidth_ja_JP )
-#endif
-#if WITH_LOCALE_ALL || WITH_LOCALE_ko
-IMPL_CREATEINSTANCE( NumToTextFullwidth_ko )
-#endif
-#if WITH_LOCALE_ALL || WITH_LOCALE_ja
IMPL_CREATEINSTANCE( NumToTextKanjiLongModern_ja_JP )
IMPL_CREATEINSTANCE( NumToTextKanjiLongTraditional_ja_JP )
IMPL_CREATEINSTANCE( NumToTextKanjiShortModern_ja_JP )
IMPL_CREATEINSTANCE( NumToTextKanjiShortTraditional_ja_JP )
-#endif
-#if WITH_LOCALE_ALL || WITH_LOCALE_ko
-IMPL_UNO_CONSTRUCTOR (NumToTextInformalHangul_ko)
-IMPL_UNO_CONSTRUCTOR (NumToTextInformalLower_ko)
-IMPL_UNO_CONSTRUCTOR (NumToTextInformalUpper_ko)
-IMPL_UNO_CONSTRUCTOR (NumToTextFormalHangul_ko)
-IMPL_UNO_CONSTRUCTOR (NumToTextFormalLower_ko)
-IMPL_UNO_CONSTRUCTOR (NumToTextFormalUpper_ko)
-#endif
-
-#if WITH_LOCALE_ALL || WITH_LOCALE_zh
-IMPL_CREATEINSTANCE( TextToNumLower_zh_CN )
-IMPL_CREATEINSTANCE( TextToNumUpper_zh_CN )
-IMPL_CREATEINSTANCE( TextToNumLower_zh_TW )
-IMPL_CREATEINSTANCE( TextToNumUpper_zh_TW )
-#endif
-#if WITH_LOCALE_ALL || WITH_LOCALE_ja
+IMPL_CREATEINSTANCE( smallToLarge_ja_JP )
IMPL_CREATEINSTANCE( TextToNumKanjiLongModern_ja_JP )
IMPL_CREATEINSTANCE( TextToNumKanjiLongTraditional_ja_JP )
+IMPL_UNO_CONSTRUCTOR( BreakIterator_ja )
+IMPL_UNO_CONSTRUCTOR( CharToNumFullwidth )
+IMPL_UNO_CONSTRUCTOR( CharToNumKanjiShort_ja_JP )
... etc. - the rest is truncated