summaryrefslogtreecommitdiff
path: root/bridges/source/cpp_uno/cc5_solaris_sparc64/exceptions.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'bridges/source/cpp_uno/cc5_solaris_sparc64/exceptions.cxx')
-rw-r--r--bridges/source/cpp_uno/cc5_solaris_sparc64/exceptions.cxx462
1 files changed, 0 insertions, 462 deletions
diff --git a/bridges/source/cpp_uno/cc5_solaris_sparc64/exceptions.cxx b/bridges/source/cpp_uno/cc5_solaris_sparc64/exceptions.cxx
deleted file mode 100644
index 5e694c09d..000000000
--- a/bridges/source/cpp_uno/cc5_solaris_sparc64/exceptions.cxx
+++ /dev/null
@@ -1,462 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org 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 Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#include "precompiled_bridges.hxx"
-#include "sal/config.h"
-
-#include <cstddef>
-#include <cstring>
-#include <map>
-#include <utility>
-#include <vector>
-
-#include "bridges/cpp_uno/shared/arraypointer.hxx"
-#include "com/sun/star/uno/Reference.hxx"
-#include "com/sun/star/uno/RuntimeException.hpp"
-#include "com/sun/star/uno/XInterface.hpp"
-#include "com/sun/star/uno/genfunc.hxx"
-#include "osl/diagnose.h"
-#include "osl/mutex.hxx"
-#include "rtl/strbuf.hxx"
-#include "rtl/string.hxx"
-#include "rtl/textenc.h"
-#include "rtl/ustring.h"
-#include "rtl/ustring.hxx"
-#include "sal/types.h"
-#include "typelib/typeclass.h"
-#include "typelib/typedescription.h"
-#include "uno/any2.h"
-#include "uno/data.h"
-#include "uno/mapping.h"
-
-#include "exceptions.hxx"
-#include "flushcode.hxx"
-
-namespace {
-
-namespace css = com::sun::star;
-
-typedef void (* Function)(void *);
-
-Function toFunction(void * pointer) {
-#pragma disable_warn
- return reinterpret_cast< Function >(pointer);
-#pragma enable_warn
-}
-
-bool toUnoName(char const * rttiName, rtl::OUString * unoName) {
- rtl::OStringBuffer buf;
- for (;;) {
- char const * p = std::strchr(rttiName, ':');
- if (p == NULL) {
- buf.append(rttiName);
- break;
- }
- if (p - rttiName > SAL_MAX_INT32) {
- return false;
- }
- buf.append(rttiName, sal::static_int_cast< sal_Int32 >(p - rttiName));
- buf.append(".");
- while (*p == ':') {
- ++p;
- }
- rttiName = p;
- }
- *unoName = rtl::OStringToOUString(
- buf.makeStringAndClear(), RTL_TEXTENCODING_UTF8);
- //TODO: check conversion failure
- return true;
-}
-
-class NistHash {
-public:
- NistHash(rtl::OString const & text);
-
- sal_uInt32 hashdata[5];
-
-private:
- static sal_uInt32 f1(sal_uInt32 x, sal_uInt32 y, sal_uInt32 z)
- { return z ^ (x & (y ^ z)); }
-
- static sal_uInt32 f2(sal_uInt32 x, sal_uInt32 y, sal_uInt32 z)
- { return x ^ y ^ z; }
-
- static sal_uInt32 f3(sal_uInt32 x, sal_uInt32 y, sal_uInt32 z)
- { return (x & y) + (z & (x ^ y)); }
-
- static sal_uInt32 rotl(sal_uInt32 value, sal_uInt32 bits)
- { return (value << bits) | (value >> (32 - bits)); }
-
- sal_uInt32 expand_nostore(sal_uInt32 index) {
- return data[index & 15] ^ data[(index - 14) & 15] ^
- data[(index - 8) & 15] ^ data[(index - 3) & 15];
- }
-
- sal_uInt32 expand_store(sal_uInt32 index) {
- return data[index & 15] ^= data[(index - 14) & 15] ^
- data[(index - 8) & 15] ^ data[(index - 3) & 15];
- }
-
- void subRound(
- sal_uInt32 a, sal_uInt32 & b, sal_uInt32 c, sal_uInt32 d,
- sal_uInt32 & e, sal_uInt32 constant, sal_uInt32 datum,
- sal_uInt32 function)
- {
- e += rotl(a, 5);
- switch (function) {
- case 1:
- e += f1(b, c, d);
- break;
- case 2:
- case 4:
- e += f2(b, c, d);
- break;
- case 3:
- e += f3(b, c, d);
- break;
- }
- e += constant + datum;
- b = rotl(b, 30);
- }
-
- void transform();
-
- sal_uInt32 data[16];
-};
-
-NistHash::NistHash(rtl::OString const & text) {
- hashdata[0] = 0x67452301;
- hashdata[1] = 0xefcdab89;
- hashdata[2] = 0x98badcfe;
- hashdata[3] = 0x10325476;
- hashdata[4] = 0xc3d2e1f0;
- char const * p = text.getStr();
- sal_Int32 n = text.getLength();
- while (n >= sizeof data) {
- std::memcpy(data, p, sizeof data);
- p += sizeof data;
- n -= sizeof data;
- transform();
- }
- std::memcpy(data, p, n);
- reinterpret_cast< unsigned char *>(data)[n++] = 0x80;
- if (n > sizeof data - 8) {
- std::memset(reinterpret_cast< char * >(data) + n, 0, sizeof data - n);
- transform();
- std::memset(data, 0, sizeof data - 8);
- } else {
- std::memset(
- reinterpret_cast< char * >(data) + n, 0, sizeof data - 8 - n);
- }
- data[14] = 0;
- data[15] = text.getLength() << 3;
- transform();
-}
-
-void NistHash::transform() {
- sal_uInt32 const K2 = 0x5A827999;
- sal_uInt32 const K3 = 0x6ED9EBA1;
- sal_uInt32 const K5 = 0x8F1BBCDC;
- sal_uInt32 const K10 = 0xCA62C1D6;
- sal_uInt32 a = hashdata[0];
- sal_uInt32 b = hashdata[1];
- sal_uInt32 c = hashdata[2];
- sal_uInt32 d = hashdata[3];
- sal_uInt32 e = hashdata[4];
- subRound(a, b, c, d, e, K2, data[ 0], 1);
- subRound(e, a, b, c, d, K2, data[ 1], 1);
- subRound(d, e, a, b, c, K2, data[ 2], 1);
- subRound(c, d, e, a, b, K2, data[ 3], 1);
- subRound(b, c, d, e, a, K2, data[ 4], 1);
- subRound(a, b, c, d, e, K2, data[ 5], 1);
- subRound(e, a, b, c, d, K2, data[ 6], 1);
- subRound(d, e, a, b, c, K2, data[ 7], 1);
- subRound(c, d, e, a, b, K2, data[ 8], 1);
- subRound(b, c, d, e, a, K2, data[ 9], 1);
- subRound(a, b, c, d, e, K2, data[10], 1);
- subRound(e, a, b, c, d, K2, data[11], 1);
- subRound(d, e, a, b, c, K2, data[12], 1);
- subRound(c, d, e, a, b, K2, data[13], 1);
- subRound(b, c, d, e, a, K2, data[14], 1);
- subRound(a, b, c, d, e, K2, data[15], 1);
- subRound(e, a, b, c, d, K2, expand_store(16), 1);
- subRound(d, e, a, b, c, K2, expand_store(17), 1);
- subRound(c, d, e, a, b, K2, expand_store(18), 1);
- subRound(b, c, d, e, a, K2, expand_store(19), 1);
- subRound(a, b, c, d, e, K3, expand_store(20), 2);
- subRound(e, a, b, c, d, K3, expand_store(21), 2);
- subRound(d, e, a, b, c, K3, expand_store(22), 2);
- subRound(c, d, e, a, b, K3, expand_store(23), 2);
- subRound(b, c, d, e, a, K3, expand_store(24), 2);
- subRound(a, b, c, d, e, K3, expand_store(25), 2);
- subRound(e, a, b, c, d, K3, expand_store(26), 2);
- subRound(d, e, a, b, c, K3, expand_store(27), 2);
- subRound(c, d, e, a, b, K3, expand_store(28), 2);
- subRound(b, c, d, e, a, K3, expand_store(29), 2);
- subRound(a, b, c, d, e, K3, expand_store(30), 2);
- subRound(e, a, b, c, d, K3, expand_store(31), 2);
- subRound(d, e, a, b, c, K3, expand_store(32), 2);
- subRound(c, d, e, a, b, K3, expand_store(33), 2);
- subRound(b, c, d, e, a, K3, expand_store(34), 2);
- subRound(a, b, c, d, e, K3, expand_store(35), 2);
- subRound(e, a, b, c, d, K3, expand_store(36), 2);
- subRound(d, e, a, b, c, K3, expand_store(37), 2);
- subRound(c, d, e, a, b, K3, expand_store(38), 2);
- subRound(b, c, d, e, a, K3, expand_store(39), 2);
- subRound(a, b, c, d, e, K5, expand_store(40), 3);
- subRound(e, a, b, c, d, K5, expand_store(41), 3);
- subRound(d, e, a, b, c, K5, expand_store(42), 3);
- subRound(c, d, e, a, b, K5, expand_store(43), 3);
- subRound(b, c, d, e, a, K5, expand_store(44), 3);
- subRound(a, b, c, d, e, K5, expand_store(45), 3);
- subRound(e, a, b, c, d, K5, expand_store(46), 3);
- subRound(d, e, a, b, c, K5, expand_store(47), 3);
- subRound(c, d, e, a, b, K5, expand_store(48), 3);
- subRound(b, c, d, e, a, K5, expand_store(49), 3);
- subRound(a, b, c, d, e, K5, expand_store(50), 3);
- subRound(e, a, b, c, d, K5, expand_store(51), 3);
- subRound(d, e, a, b, c, K5, expand_store(52), 3);
- subRound(c, d, e, a, b, K5, expand_store(53), 3);
- subRound(b, c, d, e, a, K5, expand_store(54), 3);
- subRound(a, b, c, d, e, K5, expand_store(55), 3);
- subRound(e, a, b, c, d, K5, expand_store(56), 3);
- subRound(d, e, a, b, c, K5, expand_store(57), 3);
- subRound(c, d, e, a, b, K5, expand_store(58), 3);
- subRound(b, c, d, e, a, K5, expand_store(59), 3);
- subRound(a, b, c, d, e, K10, expand_store(60), 4);
- subRound(e, a, b, c, d, K10, expand_store(61), 4);
- subRound(d, e, a, b, c, K10, expand_store(62), 4);
- subRound(c, d, e, a, b, K10, expand_store(63), 4);
- subRound(b, c, d, e, a, K10, expand_store(64), 4);
- subRound(a, b, c, d, e, K10, expand_store(65), 4);
- subRound(e, a, b, c, d, K10, expand_store(66), 4);
- subRound(d, e, a, b, c, K10, expand_store(67), 4);
- subRound(c, d, e, a, b, K10, expand_store(68), 4);
- subRound(b, c, d, e, a, K10, expand_store(69), 4);
- subRound(a, b, c, d, e, K10, expand_store(70), 4);
- subRound(e, a, b, c, d, K10, expand_store(71), 4);
- subRound(d, e, a, b, c, K10, expand_store(72), 4);
- subRound(c, d, e, a, b, K10, expand_store(73), 4);
- subRound(b, c, d, e, a, K10, expand_store(74), 4);
- subRound(a, b, c, d, e, K10, expand_store(75), 4);
- subRound(e, a, b, c, d, K10, expand_store(76), 4);
- subRound(d, e, a, b, c, K10, expand_nostore(77), 4);
- subRound(c, d, e, a, b, K10, expand_nostore(78), 4);
- subRound(b, c, d, e, a, K10, expand_nostore(79), 4);
- hashdata[0] += a;
- hashdata[1] += b;
- hashdata[2] += c;
- hashdata[3] += d;
- hashdata[4] += e;
-}
-
-class RttiMap {
-public:
- static __Crun::static_type_info const * get(
- typelib_CompoundTypeDescription const * type);
-
-private:
- RttiMap(); // not defined
- RttiMap(RttiMap &); // not defined
- ~RttiMap(); // not defined
- void operator =(RttiMap &); // not defined
-
- struct Data {
- __Crun::static_type_info * info;
- rtl::OString cppName;
- std::vector< __Crun::class_base_descr > bases;
- };
- typedef std::map< rtl::OUString, Data > Map;
-
- static void toCppNames(
- rtl::OUString const & unoName, rtl::OString * cppName,
- rtl::OString * rttiName);
-
- static Data const & get_(typelib_CompoundTypeDescription const * type);
-
- static osl::Mutex m_mutex;
- static Map * m_map;
-};
-
-osl::Mutex RttiMap::m_mutex;
-RttiMap::Map * RttiMap::m_map;
-
-__Crun::static_type_info const * RttiMap::get(
- typelib_CompoundTypeDescription const * type)
-{
- osl::MutexGuard g(m_mutex);
- if (m_map == NULL) {
- m_map = new Map; // leaked
- }
- return get_(type).info;
-}
-
-void RttiMap::toCppNames(
- rtl::OUString const & unoName, rtl::OString * cppName,
- rtl::OString * rttiName)
-{
- OSL_ASSERT(cppName != NULL && rttiName != NULL);
- rtl::OStringBuffer bc;
- rtl::OStringBuffer br;
- br.append("__1n");
- for (sal_Int32 i = 0; i != -1;) {
- rtl::OUString tok(unoName.getToken(0, '.', i));
- bc.append(rtl::OUStringToOString(tok, RTL_TEXTENCODING_UTF8));
- // conversion should never fail, as tok should be well-formed ASCII
- if (i != -1) {
- bc.append("::");
- }
- sal_Int32 len = tok.getLength();
- sal_Int32 pos = br.getLength();
- for (sal_Int32 n = len / 26; n > 0; n /= 26) {
- br.insert(pos, static_cast< char >('a' + (n % 26)));
- }
- br.append(static_cast< char >('A' + (len % 26)));
- for (sal_Int32 j = 0; j < len; ++j) {
- sal_Unicode c = tok[j];
- OSL_ASSERT(
- c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' ||
- c >= 'a' && c <= 'z');
- if (c == 'Q') {
- br.append("QdD");
- } else {
- br.append(static_cast< char >(c));
- }
- }
- }
- br.append('_');
- *cppName = bc.makeStringAndClear();
- *rttiName = br.makeStringAndClear();
-}
-
-RttiMap::Data const & RttiMap::get_(
- typelib_CompoundTypeDescription const * type)
-{
- rtl::OUString name(type->aBase.pTypeName);
- Map::iterator it(m_map->find(name));
- if (it == m_map->end()) {
- it = m_map->insert(std::make_pair(name, Data())).first;
- Data & data = it->second;
- rtl::OString rttiName;
- toCppNames(name, &data.cppName, &rttiName);
- data.info = new __Crun::static_type_info;
- data.info->ty_name = data.cppName.getStr() -
- reinterpret_cast< char * >(&data.info->ty_name);
- data.info->reserved = 0;
- NistHash hash(rttiName);
- data.info->type_hash[0] = hash.hashdata[0];
- data.info->type_hash[1] = hash.hashdata[1];
- data.info->type_hash[2] = hash.hashdata[2];
- data.info->type_hash[3] = hash.hashdata[3];
- data.info->flags = 0;
- data.info->cv_qualifiers = 0;
- if (type->pBaseTypeDescription != NULL) {
- data.bases = get_(type->pBaseTypeDescription).bases;
- OSL_ASSERT(!data.bases.empty());
- data.bases.back().offset = 0;
- }
- __Crun::class_base_descr last;
- last.type_hash[0] = data.info->type_hash[0];
- last.type_hash[1] = data.info->type_hash[1];
- last.type_hash[2] = data.info->type_hash[2];
- last.type_hash[3] = data.info->type_hash[3];
- last.offset = 0x8000000000000000;
- data.bases.push_back(last);
- data.info->base_table = reinterpret_cast< char * >(&data.bases[0]) -
- reinterpret_cast< char * >(&data.info->base_table);
- }
- return it->second;
-}
-
-void deleteException(
- void * exception, unsigned int * thunk, typelib_TypeDescription * type)
-{
- uno_destructData(
- exception, type,
- reinterpret_cast< uno_ReleaseFunc >(css::uno::cpp_release));
- typelib_typedescription_release(type);
- delete[] thunk;
-}
-
-}
-
-namespace bridges { namespace cpp_uno { namespace cc5_solaris_sparc64 {
-
-void raiseException(uno_Any * exception, uno_Mapping * unoToCpp) {
- bridges::cpp_uno::shared::ArrayPointer< unsigned long > thunkPtr(
- new unsigned long[4]);
- typelib_TypeDescription * type = NULL;
- typelib_typedescriptionreference_getDescription(&type, exception->pType);
- __Crun::static_type_info const * rtti = RttiMap::get(
- reinterpret_cast< typelib_CompoundTypeDescription * >(type));
- void * exc = __Crun::ex_alloc(type->nSize);
- uno_copyAndConvertData(exc, exception->pData, type, unoToCpp);
- uno_any_destruct(exception, NULL);
- unsigned long * thunk = thunkPtr.release();
- // 0*4: rd %pc, %o1:
- // 1*4: ldx %o1, (6-0)*4, %o3:
- thunk[0] = 0x93414000D65A6018;
- // 2*4: jmpl %o3, %g0, %g0:
- // 3*4: ldx %o1, (4-0)*4, %o2:
- thunk[1] = 0x81C2C000D45A6010;
- // 4*4: .xword type:
- thunk[2] = reinterpret_cast< unsigned long >(type);
- // 6*4: .xword deleteException:
- thunk[3] = reinterpret_cast< unsigned long >(deleteException);
- flushCode(thunk, thunk + 4);
- __Crun::ex_throw(exc, rtti, toFunction(thunk));
-}
-
-void fillUnoException(
- void * cppException, char const * cppName, uno_Any * unoException,
- uno_Mapping * cppToUno)
-{
- rtl::OUString name;
- typelib_TypeDescription * type = NULL;
- if (toUnoName(cppName, &name)) {
- typelib_typedescription_getByName(&type, name.pData);
- }
- if (type == NULL || type->eTypeClass != typelib_TypeClass_EXCEPTION) {
- css::uno::RuntimeException exc(
- (rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM("Not a UNO exception type: ")) +
- name),
- css::uno::Reference< css::uno::XInterface >());
- uno_type_any_constructAndConvert(
- unoException, &exc, getCppuType(&exc).getTypeLibType(), cppToUno);
- } else {
- uno_any_constructAndConvert(unoException, cppException, type, cppToUno);
- }
- if (type != NULL) {
- typelib_typedescription_release(type);
- }
-}
-
-} } }
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */