Skip to content
Projeler
Gruplar
Parçacıklar
Yardım
Yükleniyor...
Oturum aç / Kaydol
Gezinmeyi değiştir
C
core
Proje
Proje
Ayrıntılar
Etkinlik
Cycle Analytics
Depo (repository)
Depo (repository)
Dosyalar
Kayıtlar (commit)
Dallar (branch)
Etiketler
Katkıda bulunanlar
Grafik
Karşılaştır
Grafikler
Konular (issue)
0
Konular (issue)
0
Liste
Pano
Etiketler
Kilometre Taşları
Birleştirme (merge) Talepleri
0
Birleştirme (merge) Talepleri
0
CI / CD
CI / CD
İş akışları (pipeline)
İşler
Zamanlamalar
Grafikler
Paketler
Paketler
Wiki
Wiki
Parçacıklar
Parçacıklar
Üyeler
Üyeler
Collapse sidebar
Close sidebar
Etkinlik
Grafik
Grafikler
Yeni bir konu (issue) oluştur
İşler
Kayıtlar (commit)
Konu (issue) Panoları
Kenar çubuğunu aç
LibreOffice
core
Commits
f49ff3f5
Kaydet (Commit)
f49ff3f5
authored
Eki 01, 2014
tarafından
Tor Lillqvist
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Eposta Yamaları
Sade Fark
We always build 64-bit OS X code
Change-Id: I527c66c7be1372ab5ddf86625667d2f315e9b5d3
üst
ec147012
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
0 additions
and
1786 deletions
+0
-1786
Library_cpp_uno.mk
bridges/Library_cpp_uno.mk
+0
-4
call.s
bridges/source/cpp_uno/gcc3_macosx_intel/call.s
+0
-318
cpp2uno.cxx
bridges/source/cpp_uno/gcc3_macosx_intel/cpp2uno.cxx
+0
-525
except.cxx
bridges/source/cpp_uno/gcc3_macosx_intel/except.cxx
+0
-360
share.hxx
bridges/source/cpp_uno/gcc3_macosx_intel/share.hxx
+0
-94
uno2cpp.cxx
bridges/source/cpp_uno/gcc3_macosx_intel/uno2cpp.cxx
+0
-481
configure.ac
configure.ac
+0
-4
No files found.
bridges/Library_cpp_uno.mk
Dosyayı görüntüle @
f49ff3f5
...
@@ -71,10 +71,6 @@ bridges_SELECTED_BRIDGE := gcc3_linux_intel
...
@@ -71,10 +71,6 @@ bridges_SELECTED_BRIDGE := gcc3_linux_intel
bridge_asm_objects := call
bridge_asm_objects := call
bridge_exception_objects := cpp2uno except uno2cpp
bridge_exception_objects := cpp2uno except uno2cpp
bridge_noncallexception_objects := callvirtualmethod
bridge_noncallexception_objects := callvirtualmethod
else ifeq ($(OS),MACOSX)
bridges_SELECTED_BRIDGE := gcc3_macosx_intel
bridge_asm_objects := call
bridge_exception_objects := cpp2uno except uno2cpp
else ifeq ($(OS),SOLARIS)
else ifeq ($(OS),SOLARIS)
bridges_SELECTED_BRIDGE := gcc3_solaris_intel
bridges_SELECTED_BRIDGE := gcc3_solaris_intel
bridge_exception_objects := cpp2uno except uno2cpp
bridge_exception_objects := cpp2uno except uno2cpp
...
...
bridges/source/cpp_uno/gcc3_macosx_intel/call.s
deleted
100644 → 0
Dosyayı görüntüle @
ec147012
/*
* 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 .
*/
.text
.align 1, 0x90
.globl _privateSnippetExecutorGeneral
_privateSnippetExecutorGeneral:
LFBg:
movl %esp,%ecx
pushl %ebp # proper stack frame needed for exception handling
LCFIg0:
movl %esp,%ebp
LCFIg1:
subl $0x8,%esp # padding + 32bit returnValue
pushl %esp # 32bit &returnValue
pushl %ecx # 32bit pCallStack
pushl %edx # 32bit nVtableOffset
pushl %eax # 32bit nFunctionIndex
call L_cpp_vtable_call$stub
movl 16(%esp),%eax # 32bit returnValue
leave
ret
LFEg:
.long .-_privateSnippetExecutorGeneral
.align 1, 0x90
.globl _privateSnippetExecutorVoid
_privateSnippetExecutorVoid:
LFBv:
movl %esp,%ecx
pushl %ebp # proper stack frame needed for exception handling
LCFIv0:
movl %esp,%ebp
LCFIv1:
sub $8,%esp # padding
pushl $0 # 32bit null pointer (returnValue not used)
pushl %ecx # 32bit pCallStack
pushl %edx # 32bit nVtableOffset
pushl %eax # 32bit nFunctionIndex
call L_cpp_vtable_call$stub
leave
ret
LFEv:
.long .-_privateSnippetExecutorVoid
.align 1, 0x90
.globl _privateSnippetExecutorHyper
_privateSnippetExecutorHyper:
LFBh:
movl %esp,%ecx
pushl %ebp # proper stack frame needed for exception handling
LCFIh0:
movl %esp,%ebp
LCFIh1:
subl $0x8,%esp # 64bit returnValue
pushl %esp # 32bit &returnValue
pushl %ecx # 32bit pCallStack
pushl %edx # 32bit nVtableOffset
pushl %eax # 32bit nFunctionIndex
call L_cpp_vtable_call$stub
movl 16(%esp),%eax # 64bit returnValue, lower half
movl 20(%esp),%edx # 64bit returnValue, upper half
leave
ret
LFEh:
.long .-_privateSnippetExecutorHyper
.align 1, 0x90
.globl _privateSnippetExecutorFloat
_privateSnippetExecutorFloat:
LFBf:
movl %esp,%ecx
pushl %ebp # proper stack frame needed for exception handling
LCFIf0:
movl %esp,%ebp
LCFIf1:
subl $0x8,%esp # padding + 32bit returnValue
pushl %esp # 32bit &returnValue
pushl %ecx # 32bit pCallStack
pushl %edx # 32bit nVtableOffset
pushl %eax # 32bit nFunctionIndex
call L_cpp_vtable_call$stub
flds 16(%esp) # 32bit returnValue
leave
ret
LFEf:
.long .-_privateSnippetExecutorFloat
.align 1, 0x90
.globl _privateSnippetExecutorDouble
_privateSnippetExecutorDouble:
LFBd:
movl %esp,%ecx
pushl %ebp # proper stack frame needed for exception handling
LCFId0:
movl %esp,%ebp
LCFId1:
subl $0x8,%esp # 64bit returnValue
pushl %esp # 32bit &returnValue
pushl %ecx # 32bit pCallStack
pushl %edx # 32bit nVtableOffset
pushl %eax # 32bit nFunctionIndex
call L_cpp_vtable_call$stub
fldl 16(%esp) # 64bit returnValue
leave
ret
LFEd:
.long .-_privateSnippetExecutorDouble
.align 1, 0x90
.globl _privateSnippetExecutorClass
_privateSnippetExecutorClass:
LFBc:
movl %esp,%ecx
pushl %ebp # proper stack frame needed for exception handling
LCFIc0:
movl %esp,%ebp
LCFIc1:
subl $0x8,%esp # padding + 32bit returnValue
pushl %esp # 32bit &returnValue
pushl %ecx # 32bit pCallStack
pushl %edx # 32bit nVtableOffset
pushl %eax # 32bit nFunctionIndex
call L_cpp_vtable_call$stub
movl 16(%esp),%eax # 32bit returnValue
leave
ret $4
LFEc:
.long .-_privateSnippetExecutorClass
.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
EH_frame1:
.set L$set$frame1,LECIE1-LSCIE1
.long L$set$frame1 # length
LSCIE1:
.long 0 # CIE_ID
.byte 1 # version
.ascii "zPR\0" # augmentation
.byte 1 # code_alignment_factor (.uleb128 1)
.byte 0x7c # data_alignment_factor (.sleb128 -4)
.byte 8 # return_address_register
.byte 0x6 # augmentation size 7:
.byte 0x9b # ???
.long L___gxx_personality_v0$non_lazy_ptr-.
.byte 0x10
# initial_instructions:
.byte 0x0C # DW_CFA_def_cfa %esp, 4
.byte 5
.byte 4
.byte 0x88 # DW_CFA_offset ret, 1
.byte 1
.align 2
LECIE1:
.globl _privateSnippetExecutorGeneral.eh
_privateSnippetExecutorGeneral.eh:
LSFDEg:
.set L$set$g1,LEFDEg-LASFDEg
.long L$set$g1 # length
LASFDEg:
.long LASFDEg-EH_frame1 # CIE_pointer
.long LFBg-. # initial_location
.long LFEg-LFBg # address_range
.byte 0 # augmentation size 0
# instructions:
.byte 0x04 # DW_CFA_advance_loc4
.long LCFIg0-LFBg
.byte 0x0E # DW_CFA_def_cfa_offset 8
.byte 8
.byte 0x84 # DW_CFA_offset %ebp, 2
.byte 2
.byte 0x04 # DW_CFA_advance_loc4
.long LCFIg1-LCFIg0
.byte 0x0D # DW_CFA_def_cfa_register %ebp
.byte 4
.align 2
LEFDEg:
.globl _privateSnippetExecutorVoid.eh
_privateSnippetExecutorVoid.eh:
LSFDEv:
.set L$set$v1,LEFDEv-LASFDEv
.long L$set$v1 # length
LASFDEv:
.long LASFDEv-EH_frame1 # CIE_pointer
.long LFBv-. # initial_location
.long LFEv-LFBv # address_range
.byte 0 # augmentation size 0
# instructions:
.byte 0x04 # DW_CFA_advance_loc4
.long LCFIv0-LFBv
.byte 0x0E # DW_CFA_def_cfa_offset 8
.byte 8
.byte 0x84 # DW_CFA_offset %ebp, 2
.byte 2
.byte 0x04 # DW_CFA_advance_loc4
.long LCFIv1-LCFIv0
.byte 0x0D # DW_CFA_def_cfa_register %ebp
.byte 4
.align 2
LEFDEv:
.globl _privateSnippetExecutorHyper.eh
_privateSnippetExecutorHyper.eh:
LSFDEh:
.set L$set$h1,LEFDEh-LASFDEh
.long L$set$h1 # length
LASFDEh:
.long LASFDEh-EH_frame1 # CIE_pointer
.long LFBh-. # initial_location
.long LFEh-LFBh # address_range
.byte 0 # augmentation size 0
# instructions:
.byte 0x04 # DW_CFA_advance_loc4
.long LCFIh0-LFBh
.byte 0x0E # DW_CFA_def_cfa_offset 8
.byte 8
.byte 0x84 # DW_CFA_offset %ebp, 2
.byte 2
.byte 0x04 # DW_CFA_advance_loc4
.long LCFIh1-LCFIh0
.byte 0x0D # DW_CFA_def_cfa_register %ebp
.byte 4
.align 2
LEFDEh:
.globl _privateSnippetExecutorFloat.eh
_privateSnippetExecutorFloat.eh:
LSFDEf:
.set L$set$f1,LEFDEf-LASFDEf
.long L$set$f1 # length
LASFDEf:
.long LASFDEf-EH_frame1 # CIE_pointer
.long LFBf-. # initial_location
.long LFEf-LFBf # address_range
.byte 0 # augmentation size 0
# instructions:
.byte 0x04 # DW_CFA_advance_loc4
.long LCFIf0-LFBf
.byte 0x0E # DW_CFA_def_cfa_offset 8
.byte 8
.byte 0x84 # DW_CFA_offset %ebp, 2
.byte 2
.byte 0x04 # DW_CFA_advance_loc4
.long LCFIf1-LCFIf0
.byte 0x0D # DW_CFA_def_cfa_register %ebp
.byte 4
.align 2
LEFDEf:
.globl _privateSnippetExecutorDouble.eh
_privateSnippetExecutorDouble.eh:
LSFDEd:
.set L$set$d1,LEFDEd-LASFDEd
.long L$set$d1 # length
LASFDEd:
.long LASFDEd-EH_frame1 # CIE_pointer
.long LFBd-. # initial_location
.long LFEd-LFBd # address_range
.byte 0 # augmentation size 0
# instructions:
.byte 0x04 # DW_CFA_advance_loc4
.long LCFId0-LFBd
.byte 0x0E # DW_CFA_def_cfa_offset 8
.byte 8
.byte 0x84 # DW_CFA_offset %ebp, 2
.byte 2
.byte 0x04 # DW_CFA_advance_loc4
.long LCFId1-LCFId0
.byte 0x0D # DW_CFA_def_cfa_register %ebp
.byte 4
.align 2
LEFDEd:
.globl _privateSnippetExecutorClass.eh
_privateSnippetExecutorClass.eh:
LSFDEc:
.set L$set$c1,LEFDEc-LASFDEc
.long L$set$c1 # length
LASFDEc:
.long LASFDEc-EH_frame1 # CIE_pointer
.long LFBc-. # initial_location
.long LFEc-LFBc # address_range
.byte 0 # augmentation size 0
# instructions:
.byte 0x04 # DW_CFA_advance_loc4
.long LCFIc0-LFBc
.byte 0x0E # DW_CFA_def_cfa_offset 8
.byte 8
.byte 0x84 # DW_CFA_offset %ebp, 2
.byte 2
.byte 0x04 # DW_CFA_advance_loc4
.long LCFIc1-LCFIc0
.byte 0x0D # DW_CFA_def_cfa_register %ebp
.byte 4
.align 2
LEFDEc:
.section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5
L_cpp_vtable_call$stub:
.indirect_symbol _cpp_vtable_call
hlt ; hlt ; hlt ; hlt ; hlt
.section __IMPORT,__pointers,non_lazy_symbol_pointers
L___gxx_personality_v0$non_lazy_ptr:
.indirect_symbol ___gxx_personality_v0
.long 0
.constructor
.destructor
.align 1
.subsections_via_symbols
bridges/source/cpp_uno/gcc3_macosx_intel/cpp2uno.cxx
deleted
100644 → 0
Dosyayı görüntüle @
ec147012
/* -*- 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 .
*/
#include <com/sun/star/uno/genfunc.hxx>
#include "com/sun/star/uno/RuntimeException.hpp"
#include "com/sun/star/uno/Sequence.hxx"
#include <uno/data.h>
#include <typelib/typedescription.hxx>
#include "bridges/cpp_uno/shared/bridge.hxx"
#include "bridges/cpp_uno/shared/cppinterfaceproxy.hxx"
#include "bridges/cpp_uno/shared/types.hxx"
#include "bridges/cpp_uno/shared/vtablefactory.hxx"
#include "share.hxx"
#include "boost/static_assert.hpp"
#include <stdio.h>
using
namespace
::
com
::
sun
::
star
::
uno
;
namespace
{
void
cpp2uno_call
(
bridges
::
cpp_uno
::
shared
::
CppInterfaceProxy
*
pThis
,
const
typelib_TypeDescription
*
pMemberTypeDescr
,
typelib_TypeDescriptionReference
*
pReturnTypeRef
,
// 0 indicates void return
sal_Int32
nParams
,
typelib_MethodParameter
*
pParams
,
void
**
pCallStack
,
void
*
pReturnValue
)
{
// pCallStack: ret, [return ptr], this, params
char
*
pCppStack
=
(
char
*
)(
pCallStack
+
1
);
// return
typelib_TypeDescription
*
pReturnTypeDescr
=
0
;
if
(
pReturnTypeRef
)
TYPELIB_DANGER_GET
(
&
pReturnTypeDescr
,
pReturnTypeRef
);
void
*
pUnoReturn
=
0
;
void
*
pCppReturn
=
0
;
// complex return ptr: if != 0 && != pUnoReturn, reconversion need
if
(
pReturnTypeDescr
)
{
// xxx todo: test PolyStructy<STRUCT<long>> foo()
if
(
CPPU_CURRENT_NAMESPACE
::
isSimpleReturnType
(
pReturnTypeDescr
))
{
pUnoReturn
=
pReturnValue
;
// direct way for simple types
}
else
// complex return via ptr (pCppReturn)
{
pCppReturn
=
*
(
void
**
)
pCppStack
;
pCppStack
+=
sizeof
(
void
*
);
pUnoReturn
=
(
bridges
::
cpp_uno
::
shared
::
relatesToInterfaceType
(
pReturnTypeDescr
)
?
alloca
(
pReturnTypeDescr
->
nSize
)
:
pCppReturn
);
// direct way
}
}
// pop this
pCppStack
+=
sizeof
(
void
*
);
// stack space
OSL_ENSURE
(
sizeof
(
void
*
)
==
sizeof
(
sal_Int32
),
"### unexpected size!"
);
// parameters
void
**
pUnoArgs
=
(
void
**
)
alloca
(
4
*
sizeof
(
void
*
)
*
nParams
);
void
**
pCppArgs
=
pUnoArgs
+
nParams
;
// indices of values this have to be converted (interface conversion cpp<=>uno)
sal_Int32
*
pTempIndices
=
(
sal_Int32
*
)(
pUnoArgs
+
(
2
*
nParams
));
// type descriptions for reconversions
typelib_TypeDescription
**
ppTempParamTypeDescr
=
(
typelib_TypeDescription
**
)(
pUnoArgs
+
(
3
*
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
))
// value
{
pCppArgs
[
nPos
]
=
pCppStack
;
pUnoArgs
[
nPos
]
=
pCppStack
;
switch
(
pParamTypeDescr
->
eTypeClass
)
{
case
typelib_TypeClass_HYPER
:
case
typelib_TypeClass_UNSIGNED_HYPER
:
case
typelib_TypeClass_DOUBLE
:
pCppStack
+=
sizeof
(
sal_Int32
);
// extra long
default
:
break
;
}
// no longer needed
TYPELIB_DANGER_RELEASE
(
pParamTypeDescr
);
}
else
// ptr to complex value | ref
{
pCppArgs
[
nPos
]
=
*
(
void
**
)
pCppStack
;
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
),
*
(
void
**
)
pCppStack
,
pParamTypeDescr
,
pThis
->
getBridge
()
->
getCpp2Uno
()
);
pTempIndices
[
nTempIndices
]
=
nPos
;
// has to be reconverted
// will be released at reconversion
ppTempParamTypeDescr
[
nTempIndices
++
]
=
pParamTypeDescr
;
}
else
// direct way
{
pUnoArgs
[
nPos
]
=
*
(
void
**
)
pCppStack
;
// no longer needed
TYPELIB_DANGER_RELEASE
(
pParamTypeDescr
);
}
}
pCppStack
+=
sizeof
(
sal_Int32
);
// standard parameter length
}
// 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
--
;
)
{
sal_Int32
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
}
else
// else no exception occurred...
{
// temporary params
for
(
;
nTempIndices
--
;
)
{
sal_Int32
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
);
}
if
(
pReturnValue
!=
pCppReturn
)
{
// complex return ptr is set to eax if return value
// is not transferred via eax[/edx]:
*
static_cast
<
void
**
>
(
pReturnValue
)
=
pCppReturn
;
}
}
if
(
pReturnTypeDescr
)
{
TYPELIB_DANGER_RELEASE
(
pReturnTypeDescr
);
}
}
}
extern
"C"
void
cpp_vtable_call
(
int
nFunctionIndex
,
int
nVtableOffset
,
void
**
pCallStack
,
void
*
pReturnValue
)
{
OSL_ENSURE
(
sizeof
(
sal_Int32
)
==
sizeof
(
void
*
),
"### unexpected!"
);
// pCallStack: ret adr, [ret *], this, params
void
*
pThis
;
if
(
nFunctionIndex
&
0x80000000
)
{
nFunctionIndex
&=
0x7fffffff
;
pThis
=
pCallStack
[
2
];
}
else
{
pThis
=
pCallStack
[
1
];
}
pThis
=
static_cast
<
char
*
>
(
pThis
)
-
nVtableOffset
;
bridges
::
cpp_uno
::
shared
::
CppInterfaceProxy
*
pCppI
=
bridges
::
cpp_uno
::
shared
::
CppInterfaceProxy
::
castInterfaceToProxy
(
pThis
);
#if OSL_DEBUG_LEVEL > 1
fprintf
(
stderr
,
"%p %p %p pThis=%p, pCppI=%p, function index=%d, vtable offset=%d
\n
"
,
pCallStack
[
0
],
pCallStack
[
1
],
pCallStack
[
2
],
pThis
,
pCppI
,
nFunctionIndex
,
nVtableOffset
);
#endif
typelib_InterfaceTypeDescription
*
pTypeDescr
=
pCppI
->
getTypeDescr
();
#if OSL_DEBUG_LEVEL > 1
fprintf
(
stderr
,
"name=%s
\n
"
,
OUStringToOString
(
pTypeDescr
->
aBase
.
pTypeName
,
RTL_TEXTENCODING_UTF8
).
getStr
()
);
#endif
if
(
nFunctionIndex
>=
pTypeDescr
->
nMapFunctionIndexToMemberIndex
)
{
SAL_WARN
(
"bridges"
,
"illegal "
<<
OUString
::
unacquired
(
&
pTypeDescr
->
aBase
.
pTypeName
)
<<
" vtable index "
<<
nFunctionIndex
<<
"/"
<<
pTypeDescr
->
nMapFunctionIndexToMemberIndex
);
throw
RuntimeException
(
(
"illegal "
+
OUString
::
unacquired
(
&
pTypeDescr
->
aBase
.
pTypeName
)
+
" vtable index "
+
OUString
::
number
(
nFunctionIndex
)
+
"/"
+
OUString
::
number
(
pTypeDescr
->
nMapFunctionIndexToMemberIndex
)),
(
XInterface
*
)
pThis
);
}
// determine called method
sal_Int32
nMemberPos
=
pTypeDescr
->
pMapFunctionIndexToMemberIndex
[
nFunctionIndex
];
OSL_ENSURE
(
nMemberPos
<
pTypeDescr
->
nAllMembers
,
"### illegal member index!"
);
TypeDescription
aMemberDescr
(
pTypeDescr
->
ppAllMembers
[
nMemberPos
]
);
#if OSL_DEBUG_LEVEL > 1
fprintf
(
stderr
,
"calling %s
\n
"
,
OUStringToOString
(
aMemberDescr
.
get
()
->
pTypeName
,
RTL_TEXTENCODING_UTF8
).
getStr
());
#endif
switch
(
aMemberDescr
.
get
()
->
eTypeClass
)
{
case
typelib_TypeClass_INTERFACE_ATTRIBUTE
:
{
if
(
pTypeDescr
->
pMapMemberIndexToFunctionIndex
[
nMemberPos
]
==
nFunctionIndex
)
{
// is GET method
cpp2uno_call
(
pCppI
,
aMemberDescr
.
get
(),
((
typelib_InterfaceAttributeTypeDescription
*
)
aMemberDescr
.
get
())
->
pAttributeTypeRef
,
0
,
0
,
// no params
pCallStack
,
pReturnValue
);
}
else
{
// is SET method
typelib_MethodParameter
aParam
;
aParam
.
pTypeRef
=
((
typelib_InterfaceAttributeTypeDescription
*
)
aMemberDescr
.
get
())
->
pAttributeTypeRef
;
aParam
.
bIn
=
sal_True
;
aParam
.
bOut
=
sal_False
;
cpp2uno_call
(
pCppI
,
aMemberDescr
.
get
(),
0
,
// indicates void return
1
,
&
aParam
,
pCallStack
,
pReturnValue
);
}
break
;
}
case
typelib_TypeClass_INTERFACE_METHOD
:
{
// is METHOD
switch
(
nFunctionIndex
)
{
case
1
:
// acquire()
pCppI
->
acquireProxy
();
// non virtual call!
break
;
case
2
:
// release()
pCppI
->
releaseProxy
();
// non virtual call!
break
;
case
0
:
// queryInterface() opt
{
typelib_TypeDescription
*
pTD
=
0
;
TYPELIB_DANGER_GET
(
&
pTD
,
reinterpret_cast
<
Type
*
>
(
pCallStack
[
3
]
)
->
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
[
1
]
),
&
pInterface
,
pTD
,
cpp_acquire
);
pInterface
->
release
();
TYPELIB_DANGER_RELEASE
(
pTD
);
*
static_cast
<
void
**
>
(
pReturnValue
)
=
pCallStack
[
1
];
break
;
}
TYPELIB_DANGER_RELEASE
(
pTD
);
}
}
// else perform queryInterface()
default
:
cpp2uno_call
(
pCppI
,
aMemberDescr
.
get
(),
((
typelib_InterfaceMethodTypeDescription
*
)
aMemberDescr
.
get
())
->
pReturnTypeRef
,
((
typelib_InterfaceMethodTypeDescription
*
)
aMemberDescr
.
get
())
->
nParams
,
((
typelib_InterfaceMethodTypeDescription
*
)
aMemberDescr
.
get
())
->
pParams
,
pCallStack
,
pReturnValue
);
}
break
;
}
default
:
{
throw
RuntimeException
(
"no member description found!"
,
(
XInterface
*
)
pThis
);
}
}
}
extern
"C"
typedef
void
(
*
PrivateSnippetExecutor
)();
int
const
codeSnippetSize
=
16
;
unsigned
char
*
codeSnippet
(
const
typelib_InterfaceTypeDescription
*
type
,
const
typelib_TypeDescription
*
member
,
unsigned
char
*
code
,
sal_Int32
functionIndex
,
sal_Int32
vtableOffset
,
typelib_TypeDescriptionReference
*
pReturnTypeRef
)
{
PrivateSnippetExecutor
exec
;
if
(
pReturnTypeRef
==
0
)
{
exec
=
privateSnippetExecutorVoid
;
}
else
{
switch
(
pReturnTypeRef
->
eTypeClass
)
{
case
typelib_TypeClass_VOID
:
exec
=
privateSnippetExecutorVoid
;
break
;
case
typelib_TypeClass_HYPER
:
case
typelib_TypeClass_UNSIGNED_HYPER
:
exec
=
privateSnippetExecutorHyper
;
break
;
case
typelib_TypeClass_FLOAT
:
exec
=
privateSnippetExecutorFloat
;
break
;
case
typelib_TypeClass_DOUBLE
:
exec
=
privateSnippetExecutorDouble
;
break
;
case
typelib_TypeClass_STRUCT
:
case
typelib_TypeClass_EXCEPTION
:
{
typelib_TypeDescription
*
pReturnTypeDescr
=
0
;
TYPELIB_DANGER_GET
(
&
pReturnTypeDescr
,
pReturnTypeRef
);
bool
const
bSimpleReturnStruct
=
CPPU_CURRENT_NAMESPACE
::
isSimpleReturnType
(
pReturnTypeDescr
);
sal_Int32
const
nRetSize
=
pReturnTypeDescr
->
nSize
;
TYPELIB_DANGER_RELEASE
(
pReturnTypeDescr
);
if
(
bSimpleReturnStruct
&&
nRetSize
<=
8
)
{
exec
=
privateSnippetExecutorGeneral
;
// fills eax
if
(
nRetSize
>
4
)
exec
=
privateSnippetExecutorHyper
;
// fills eax/edx
break
;
}
}
case
typelib_TypeClass_STRING
:
case
typelib_TypeClass_TYPE
:
case
typelib_TypeClass_SEQUENCE
:
case
typelib_TypeClass_INTERFACE
:
case
typelib_TypeClass_ANY
:
functionIndex
|=
0x80000000
;
exec
=
privateSnippetExecutorClass
;
break
;
default:
exec
=
privateSnippetExecutorGeneral
;
break
;
}
}
unsigned
char
*
p
=
code
;
OSL_ASSERT
(
sizeof
(
sal_Int32
)
==
4
);
// mov function_index, %eax:
*
p
++
=
0xB8
;
*
reinterpret_cast
<
sal_Int32
*
>
(
p
)
=
functionIndex
;
p
+=
sizeof
(
sal_Int32
);
// mov vtable_offset, %edx:
*
p
++
=
0xBA
;
*
reinterpret_cast
<
sal_Int32
*
>
(
p
)
=
vtableOffset
;
p
+=
sizeof
(
sal_Int32
);
// jmp privateSnippetExecutor:
*
p
++
=
0xE9
;
*
reinterpret_cast
<
sal_Int32
*
>
(
p
)
=
((
unsigned
char
*
)
exec
)
-
p
-
sizeof
(
sal_Int32
);
p
+=
sizeof
(
sal_Int32
);
OSL_ASSERT
(
p
-
code
<=
codeSnippetSize
);
SAL_INFO
(
"bridges.osx"
,
"codeSnippet("
<<
OUString
(
type
->
aBase
.
pTypeName
)
<<
"::"
<<
OUString
(
member
->
pTypeName
)
<<
"): ["
<<
(
functionIndex
&
~
0x80000000
)
<<
((
functionIndex
&
0x80000000
)
?
"|0x80000000"
:
""
)
<<
","
<<
vtableOffset
<<
","
<<
(
exec
==
privateSnippetExecutorGeneral
?
"General"
:
(
exec
==
privateSnippetExecutorVoid
?
"Void"
:
(
exec
==
privateSnippetExecutorHyper
?
"Hyper"
:
(
exec
==
privateSnippetExecutorFloat
?
"Float"
:
(
exec
==
privateSnippetExecutorDouble
?
"Double"
:
(
exec
==
privateSnippetExecutorClass
?
"Class"
:
"???"
))))))
<<
"]="
<<
(
void
*
)(
code
+
codeSnippetSize
)
);
return
code
+
codeSnippetSize
;
}
}
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
;
}
sal_Size
bridges
::
cpp_uno
::
shared
::
VtableFactory
::
getBlockSize
(
sal_Int32
slotCount
)
{
return
(
slotCount
+
2
)
*
sizeof
(
Slot
)
+
slotCount
*
codeSnippetSize
;
}
bridges
::
cpp_uno
::
shared
::
VtableFactory
::
Slot
*
bridges
::
cpp_uno
::
shared
::
VtableFactory
::
initializeBlock
(
void
*
block
,
sal_Int32
slotCount
,
sal_Int32
,
typelib_InterfaceTypeDescription
*
)
{
Slot
*
slots
=
mapBlockToVtable
(
block
);
slots
[
-
2
].
fn
=
0
;
slots
[
-
1
].
fn
=
0
;
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
]);
OSL_ASSERT
(
member
!=
0
);
switch
(
member
->
eTypeClass
)
{
case
typelib_TypeClass_INTERFACE_ATTRIBUTE
:
// Getter:
(
s
++
)
->
fn
=
code
;
code
=
codeSnippet
(
type
,
member
,
code
,
functionOffset
++
,
vtableOffset
,
reinterpret_cast
<
typelib_InterfaceAttributeTypeDescription
*
>
(
member
)
->
pAttributeTypeRef
);
// Setter:
if
(
!
reinterpret_cast
<
typelib_InterfaceAttributeTypeDescription
*
>
(
member
)
->
bReadOnly
)
{
(
s
++
)
->
fn
=
code
;
code
=
codeSnippet
(
type
,
member
,
code
,
functionOffset
++
,
vtableOffset
,
0
/* indicates VOID */
);
}
break
;
case
typelib_TypeClass_INTERFACE_METHOD
:
(
s
++
)
->
fn
=
code
;
code
=
codeSnippet
(
type
,
member
,
code
,
functionOffset
++
,
vtableOffset
,
reinterpret_cast
<
typelib_InterfaceMethodTypeDescription
*
>
(
member
)
->
pReturnTypeRef
);
break
;
default
:
OSL_ASSERT
(
false
);
break
;
}
TYPELIB_DANGER_RELEASE
(
member
);
}
return
code
;
}
void
bridges
::
cpp_uno
::
shared
::
VtableFactory
::
flushCode
(
unsigned
char
const
*
,
unsigned
char
const
*
)
{}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
bridges/source/cpp_uno/gcc3_macosx_intel/except.cxx
deleted
100644 → 0
Dosyayı görüntüle @
ec147012
/* -*- 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 .
*/
#include "sal/config.h"
#include <cassert>
#include <new>
#include <stdio.h>
#include <string.h>
#include <typeinfo>
#include <dlfcn.h>
#include "boost/static_assert.hpp"
#include "boost/unordered_map.hpp"
#include "com/sun/star/uno/RuntimeException.hpp"
#include "com/sun/star/uno/genfunc.hxx"
#include "osl/diagnose.h"
#include "osl/mutex.hxx"
#include "rtl/strbuf.hxx"
#include "rtl/ustrbuf.hxx"
#include "typelib/typedescription.h"
#include "uno/any2.h"
#include "share.hxx"
using
namespace
::
osl
;
using
namespace
::
com
::
sun
::
star
::
uno
;
namespace
CPPU_CURRENT_NAMESPACE
{
namespace
{
struct
Fake_type_info
{
virtual
~
Fake_type_info
()
{}
char
const
*
name
;
};
struct
Fake_class_type_info
:
Fake_type_info
{};
struct
Fake_si_class_type_info
:
Fake_class_type_info
{
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
));
}
}
void
dummy_can_throw_anything
(
char
const
*
)
{
}
static
OUString
toUNOname
(
char
const
*
p
)
{
#if OSL_DEBUG_LEVEL > 1
char
const
*
start
=
p
;
#endif
// example: N3com3sun4star4lang24IllegalArgumentExceptionE
OUStringBuffer
buf
(
64
);
OSL_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
boost
::
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
(
0
,
RTLD_LAZY
)
)
{
}
RTTI
::~
RTTI
()
{
dlclose
(
m_hApp
);
}
std
::
type_info
*
RTTI
::
getRTTI
(
typelib_CompoundTypeDescription
*
pTypeDescr
)
{
std
::
type_info
*
rtti
;
OUString
const
&
unoName
=
*
(
OUString
const
*
)
&
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
=
(
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
==
0
)
{
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
(
(
typelib_CompoundTypeDescription
*
)
pTypeDescr
->
pBaseTypeDescription
);
rtti
=
createFake_si_class_type_info
(
rttiName
,
base_rtti
);
}
else
{
rtti
=
createFake_class_type_info
(
rttiName
);
}
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
;
}
return
rtti
;
}
static
void
deleteException
(
void
*
pExc
)
{
__cxa_exception
const
*
header
=
((
__cxa_exception
const
*
)
pExc
-
1
);
typelib_TypeDescription
*
pTD
=
0
;
OUString
unoName
(
toUNOname
(
header
->
exceptionType
->
name
()
)
);
::
typelib_typedescription_getByName
(
&
pTD
,
unoName
.
pData
);
OSL_ENSURE
(
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 OSL_DEBUG_LEVEL > 1
OString
cstr
(
OUStringToOString
(
*
reinterpret_cast
<
OUString
const
*
>
(
&
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
=
0
;
TYPELIB_DANGER_GET
(
&
pTypeDescr
,
pUnoExc
->
pType
);
OSL_ASSERT
(
pTypeDescr
);
if
(
!
pTypeDescr
)
{
throw
RuntimeException
(
OUString
(
"cannot get typedescription for type "
)
+
*
reinterpret_cast
<
OUString
const
*
>
(
&
pUnoExc
->
pType
->
pTypeName
)
);
}
pCppExc
=
__cxa_allocate_exception
(
pTypeDescr
->
nSize
);
::
uno_copyAndConvertData
(
pCppExc
,
pUnoExc
->
pData
,
pTypeDescr
,
pUno2Cpp
);
// destruct uno exception
::
uno_any_destruct
(
pUnoExc
,
0
);
// avoiding locked counts
static
RTTI
*
s_rtti
=
0
;
if
(
!
s_rtti
)
{
MutexGuard
guard
(
Mutex
::
getGlobalMutex
()
);
if
(
!
s_rtti
)
{
#ifdef LEAK_STATIC_DATA
s_rtti
=
new
RTTI
();
#else
static
RTTI
rtti_data
;
s_rtti
=
&
rtti_data
;
#endif
}
}
rtti
=
s_rtti
->
getRTTI
(
(
typelib_CompoundTypeDescription
*
)
pTypeDescr
);
TYPELIB_DANGER_RELEASE
(
pTypeDescr
);
OSL_ENSURE
(
rtti
,
"### no rtti for throwing exception!"
);
if
(
!
rtti
)
{
throw
RuntimeException
(
OUString
(
"no rtti for type "
)
+
*
reinterpret_cast
<
OUString
const
*
>
(
&
pUnoExc
->
pType
->
pTypeName
)
);
}
}
__cxa_throw
(
pCppExc
,
rtti
,
deleteException
);
}
void
fillUnoException
(
__cxa_exception
*
header
,
uno_Any
*
pUnoExc
,
uno_Mapping
*
pCpp2Uno
)
{
if
(
!
header
)
{
RuntimeException
aRE
(
"no exception header!"
);
Type
const
&
rType
=
::
getCppuType
(
&
aRE
);
uno_type_any_constructAndConvert
(
pUnoExc
,
&
aRE
,
rType
.
getTypeLibType
(),
pCpp2Uno
);
#if OSL_DEBUG_LEVEL > 0
OString
cstr
(
OUStringToOString
(
aRE
.
Message
,
RTL_TEXTENCODING_ASCII_US
)
);
OSL_FAIL
(
cstr
.
getStr
()
);
#endif
return
;
}
typelib_TypeDescription
*
pExcTypeDescr
=
0
;
OUString
unoName
(
toUNOname
(
header
->
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
(
0
==
pExcTypeDescr
)
{
RuntimeException
aRE
(
OUString
(
"exception type not found: "
)
+
unoName
);
Type
const
&
rType
=
::
getCppuType
(
&
aRE
);
uno_type_any_constructAndConvert
(
pUnoExc
,
&
aRE
,
rType
.
getTypeLibType
(),
pCpp2Uno
);
#if OSL_DEBUG_LEVEL > 0
OString
cstr
(
OUStringToOString
(
aRE
.
Message
,
RTL_TEXTENCODING_ASCII_US
)
);
OSL_FAIL
(
cstr
.
getStr
()
);
#endif
}
else
{
// construct uno exception any
uno_any_constructAndConvert
(
pUnoExc
,
header
->
adjustedPtr
,
pExcTypeDescr
,
pCpp2Uno
);
typelib_typedescription_release
(
pExcTypeDescr
);
}
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
bridges/source/cpp_uno/gcc3_macosx_intel/share.hxx
deleted
100644 → 0
Dosyayı görüntüle @
ec147012
/* -*- 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 .
*/
#ifndef INCLUDED_BRIDGES_SOURCE_CPP_UNO_GCC3_MACOSX_INTEL_SHARE_HXX
#define INCLUDED_BRIDGES_SOURCE_CPP_UNO_GCC3_MACOSX_INTEL_SHARE_HXX
#include "uno/mapping.h"
#include <typeinfo>
#include <exception>
#include <cstddef>
namespace
CPPU_CURRENT_NAMESPACE
{
bool
isSimpleReturnType
(
typelib_TypeDescription
*
pTD
,
bool
recursive
=
false
);
void
dummy_can_throw_anything
(
char
const
*
);
// ----- following decl from libstdc++-v3/libsupc++/unwind-cxx.h and unwind.h
struct
_Unwind_Exception
{
unsigned
exception_class
__attribute__
((
__mode__
(
__DI__
)));
void
*
exception_cleanup
;
unsigned
private_1
__attribute__
((
__mode__
(
__word__
)));
unsigned
private_2
__attribute__
((
__mode__
(
__word__
)));
}
__attribute__
((
__aligned__
));
struct
__cxa_exception
{
::
std
::
type_info
*
exceptionType
;
void
(
*
exceptionDestructor
)(
void
*
);
::
std
::
unexpected_handler
unexpectedHandler
;
::
std
::
terminate_handler
terminateHandler
;
__cxa_exception
*
nextException
;
int
handlerCount
;
int
handlerSwitchValue
;
const
unsigned
char
*
actionRecord
;
const
unsigned
char
*
languageSpecificData
;
void
*
catchTemp
;
void
*
adjustedPtr
;
_Unwind_Exception
unwindHeader
;
};
extern
"C"
void
*
__cxa_allocate_exception
(
std
::
size_t
thrown_size
)
throw
();
extern
"C"
void
__cxa_throw
(
void
*
thrown_exception
,
std
::
type_info
*
tinfo
,
void
(
*
dest
)
(
void
*
)
)
__attribute__
((
noreturn
));
struct
__cxa_eh_globals
{
__cxa_exception
*
caughtExceptions
;
unsigned
int
uncaughtExceptions
;
};
extern
"C"
__cxa_eh_globals
*
__cxa_get_globals
()
throw
();
void
raiseException
(
uno_Any
*
pUnoExc
,
uno_Mapping
*
pUno2Cpp
);
void
fillUnoException
(
__cxa_exception
*
header
,
uno_Any
*
,
uno_Mapping
*
pCpp2Uno
);
}
extern
"C"
void
privateSnippetExecutorGeneral
();
extern
"C"
void
privateSnippetExecutorVoid
();
extern
"C"
void
privateSnippetExecutorHyper
();
extern
"C"
void
privateSnippetExecutorFloat
();
extern
"C"
void
privateSnippetExecutorDouble
();
extern
"C"
void
privateSnippetExecutorClass
();
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
bridges/source/cpp_uno/gcc3_macosx_intel/uno2cpp.cxx
deleted
100644 → 0
Dosyayı görüntüle @
ec147012
/* -*- 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 .
*/
#include <stdio.h>
#include <com/sun/star/uno/genfunc.hxx>
#include "com/sun/star/uno/RuntimeException.hpp"
#include <uno/data.h>
#include "bridges/cpp_uno/shared/bridge.hxx"
#include "bridges/cpp_uno/shared/types.hxx"
#include "bridges/cpp_uno/shared/unointerfaceproxy.hxx"
#include "bridges/cpp_uno/shared/vtables.hxx"
#include "share.hxx"
using
namespace
::
rtl
;
using
namespace
::
com
::
sun
::
star
::
uno
;
namespace
{
// The call instruction within the asm section of callVirtualMethod may throw
// exceptions. So that the compiler handles this correctly, it is important
// that (a) callVirtualMethod might call dummy_can_throw_anything (although this
// never happens at runtime), which in turn can throw exceptions, and (b)
// callVirtualMethod is not inlined at its call site (so that any exceptions are
// caught which are thrown from the instruction calling callVirtualMethod):
void
callVirtualMethod
(
void
*
pAdjustedThisPtr
,
sal_Int32
nVtableIndex
,
void
*
pRegisterReturn
,
typelib_TypeDescription
*
pReturnTypeDescr
,
bool
bSimpleReturn
,
sal_Int32
*
pStackLongs
,
sal_Int32
nStackLongs
)
__attribute__
((
noinline
));
void
callVirtualMethod
(
void
*
pAdjustedThisPtr
,
sal_Int32
nVtableIndex
,
void
*
pRegisterReturn
,
typelib_TypeDescription
*
pReturnTypeDescr
,
bool
bSimpleReturn
,
sal_Int32
*
pStackLongs
,
sal_Int32
nStackLongs
)
{
// parameter list is mixed list of * and values
// reference parameters are pointers
OSL_ENSURE
(
pStackLongs
&&
pAdjustedThisPtr
,
"### null ptr!"
);
OSL_ENSURE
(
(
sizeof
(
void
*
)
==
4
)
&&
(
sizeof
(
sal_Int32
)
==
4
),
"### unexpected size of int!"
);
OSL_ENSURE
(
nStackLongs
&&
pStackLongs
,
"### no stack in callVirtualMethod !"
);
// never called
if
(
!
pAdjustedThisPtr
)
CPPU_CURRENT_NAMESPACE
::
dummy_can_throw_anything
(
"xxx"
);
// address something
long
edx
,
eax
;
// for register returns
void
*
stackptr
;
asm
volatile
(
"mov %%esp, %2
\n\t
"
"mov %3, %%eax
\n\t
"
"mov %%eax, %%edx
\n\t
"
// stack padding to keep stack aligned:
"shl $2, %%eax
\n\t
"
"neg %%eax
\n\t
"
"add %%esp, %%eax
\n\t
"
"and $0xf, %%eax
\n\t
"
"sub %%eax, %%esp
\n\t
"
// copy:
"mov %%edx, %%eax
\n\t
"
"dec %%edx
\n\t
"
"shl $2, %%edx
\n\t
"
"add %4, %%edx
\n
"
"Lcopy:
\n\t
"
"pushl 0(%%edx)
\n\t
"
"sub $4, %%edx
\n\t
"
"dec %%eax
\n\t
"
"jne Lcopy
\n\t
"
// do the actual call
"mov %5, %%edx
\n\t
"
"mov 0(%%edx), %%edx
\n\t
"
"mov %6, %%eax
\n\t
"
"shl $2, %%eax
\n\t
"
"add %%eax, %%edx
\n\t
"
"mov 0(%%edx), %%edx
\n\t
"
"call *%%edx
\n\t
"
// save return registers
"mov %%eax, %0
\n\t
"
"mov %%edx, %1
\n\t
"
// cleanup stack
"mov %2, %%esp
\n\t
"
:
"=m"
(
eax
),
"=m"
(
edx
),
"=m"
(
stackptr
)
:
"m"
(
nStackLongs
),
"m"
(
pStackLongs
),
"m"
(
pAdjustedThisPtr
),
"m"
(
nVtableIndex
)
:
"eax"
,
"ecx"
,
"edx"
);
switch
(
pReturnTypeDescr
->
eTypeClass
)
{
case
typelib_TypeClass_VOID
:
break
;
case
typelib_TypeClass_HYPER
:
case
typelib_TypeClass_UNSIGNED_HYPER
:
((
long
*
)
pRegisterReturn
)[
1
]
=
edx
;
case
typelib_TypeClass_LONG
:
case
typelib_TypeClass_UNSIGNED_LONG
:
case
typelib_TypeClass_CHAR
:
case
typelib_TypeClass_ENUM
:
((
long
*
)
pRegisterReturn
)[
0
]
=
eax
;
break
;
case
typelib_TypeClass_SHORT
:
case
typelib_TypeClass_UNSIGNED_SHORT
:
*
(
unsigned
short
*
)
pRegisterReturn
=
eax
;
break
;
case
typelib_TypeClass_BOOLEAN
:
case
typelib_TypeClass_BYTE
:
*
(
unsigned
char
*
)
pRegisterReturn
=
eax
;
break
;
case
typelib_TypeClass_FLOAT
:
asm
(
"fstps %0"
:
"=m"
(
*
(
char
*
)
pRegisterReturn
)
);
break
;
case
typelib_TypeClass_DOUBLE
:
asm
(
"fstpl %0
\n\t
"
:
"=m"
(
*
(
char
*
)
pRegisterReturn
)
);
break
;
default:
{
sal_Int32
const
nRetSize
=
pReturnTypeDescr
->
nSize
;
if
(
bSimpleReturn
&&
nRetSize
<=
8
&&
nRetSize
>
0
)
{
if
(
nRetSize
>
4
)
static_cast
<
long
*>
(
pRegisterReturn
)[
1
]
=
edx
;
static_cast
<
long
*>
(
pRegisterReturn
)[
0
]
=
eax
;
}
break
;
}
}
}
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: [complex ret ptr], values|ptr ...
char
*
pCppStack
=
(
char
*
)
alloca
(
sizeof
(
sal_Int32
)
+
((
nParams
+
2
)
*
sizeof
(
sal_Int64
))
);
char
*
pCppStackStart
=
pCppStack
;
// return
typelib_TypeDescription
*
pReturnTypeDescr
=
0
;
TYPELIB_DANGER_GET
(
&
pReturnTypeDescr
,
pReturnTypeRef
);
OSL_ENSURE
(
pReturnTypeDescr
,
"### expected return type description!"
);
void
*
pCppReturn
=
0
;
// if != 0 && != pUnoReturn, needs reconversion
bool
bSimpleReturn
=
true
;
if
(
pReturnTypeDescr
)
{
bSimpleReturn
=
CPPU_CURRENT_NAMESPACE
::
isSimpleReturnType
(
pReturnTypeDescr
);
if
(
bSimpleReturn
)
{
pCppReturn
=
pUnoReturn
;
// direct way for simple types
}
else
{
pCppReturn
=
(
bridges
::
cpp_uno
::
shared
::
relatesToInterfaceType
(
pReturnTypeDescr
)
?
alloca
(
pReturnTypeDescr
->
nSize
)
:
pUnoReturn
);
// direct way
// complex return via ptr
*
(
void
**
)
pCppStack
=
pCppReturn
;
pCppStack
+=
sizeof
(
void
*
);
}
}
// push this
void
*
pAdjustedThisPtr
=
reinterpret_cast
<
void
**
>
(
pThis
->
getCppI
())
+
aVtableSlot
.
offset
;
*
(
void
**
)
pCppStack
=
pAdjustedThisPtr
;
pCppStack
+=
sizeof
(
void
*
);
// stack space
OSL_ENSURE
(
sizeof
(
void
*
)
==
sizeof
(
sal_Int32
),
"### unexpected size!"
);
// args
void
**
pCppArgs
=
(
void
**
)
alloca
(
3
*
sizeof
(
void
*
)
*
nParams
);
// indices of values this have to be converted (interface conversion cpp<=>uno)
sal_Int32
*
pTempIndices
=
(
sal_Int32
*
)(
pCppArgs
+
nParams
);
// type descriptions for reconversions
typelib_TypeDescription
**
ppTempParamTypeDescr
=
(
typelib_TypeDescription
**
)(
pCppArgs
+
(
2
*
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
]
=
pCppStack
,
pUnoArgs
[
nPos
],
pParamTypeDescr
,
pThis
->
getBridge
()
->
getUno2Cpp
()
);
switch
(
pParamTypeDescr
->
eTypeClass
)
{
case
typelib_TypeClass_HYPER
:
case
typelib_TypeClass_UNSIGNED_HYPER
:
case
typelib_TypeClass_DOUBLE
:
pCppStack
+=
sizeof
(
sal_Int32
);
// extra long
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
(
*
(
void
**
)
pCppStack
=
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
(
*
(
void
**
)
pCppStack
=
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
{
*
(
void
**
)
pCppStack
=
pCppArgs
[
nPos
]
=
pUnoArgs
[
nPos
];
// no longer needed
TYPELIB_DANGER_RELEASE
(
pParamTypeDescr
);
}
}
pCppStack
+=
sizeof
(
sal_Int32
);
// standard parameter length
}
try
{
OSL_ENSURE
(
!
(
(
pCppStack
-
pCppStackStart
)
&
3
),
"UNALIGNED STACK !!! (Please DO panic)"
);
callVirtualMethod
(
pAdjustedThisPtr
,
aVtableSlot
.
index
,
pCppReturn
,
pReturnTypeDescr
,
bSimpleReturn
,
(
sal_Int32
*
)
pCppStackStart
,
(
pCppStack
-
pCppStackStart
)
/
sizeof
(
sal_Int32
)
);
// 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
(...)
{
#if OSL_DEBUG_LEVEL > 1
fprintf
(
stderr
,
"caught C++ exception
\n
"
);
#endif
// fill uno exception
fillUnoException
(
CPPU_CURRENT_NAMESPACE
::
__cxa_get_globals
()
->
caughtExceptions
,
*
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
CPPU_CURRENT_NAMESPACE
{
bool
isSimpleReturnType
(
typelib_TypeDescription
*
pTD
,
bool
recursive
)
{
if
(
bridges
::
cpp_uno
::
shared
::
isSimpleType
(
pTD
))
return
true
;
// Only structs of exactly 1, 2, 4, or 8 bytes are returned through
// registers, see <http://developer.apple.com/documentation/DeveloperTools/
// Conceptual/LowLevelABI/Articles/IA32.html>:
if
(
pTD
->
eTypeClass
==
typelib_TypeClass_STRUCT
&&
(
recursive
||
pTD
->
nSize
<=
2
||
pTD
->
nSize
==
4
||
pTD
->
nSize
==
8
))
{
typelib_CompoundTypeDescription
*
const
pCompTD
=
(
typelib_CompoundTypeDescription
*
)
pTD
;
for
(
sal_Int32
pos
=
pCompTD
->
nMembers
;
pos
--
;
)
{
typelib_TypeDescription
*
pMemberTD
=
0
;
TYPELIB_DANGER_GET
(
&
pMemberTD
,
pCompTD
->
ppTypeRefs
[
pos
]
);
bool
const
b
=
isSimpleReturnType
(
pMemberTD
,
true
);
TYPELIB_DANGER_RELEASE
(
pMemberTD
);
if
(
!
b
)
return
false
;
}
return
true
;
}
return
false
;
}
}
namespace
bridges
{
namespace
cpp_uno
{
namespace
shared
{
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
);
switch
(
pMemberDescr
->
eTypeClass
)
{
case
typelib_TypeClass_INTERFACE_ATTRIBUTE
:
{
VtableSlot
aVtableSlot
(
getVtableSlot
(
reinterpret_cast
<
typelib_InterfaceAttributeTypeDescription
const
*
>
(
pMemberDescr
)));
if
(
pReturn
)
{
// dependent dispatch
cpp_call
(
pThis
,
aVtableSlot
,
((
typelib_InterfaceAttributeTypeDescription
*
)
pMemberDescr
)
->
pAttributeTypeRef
,
0
,
0
,
// no params
pReturn
,
pArgs
,
ppException
);
}
else
{
// 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
;
// get, then set method
cpp_call
(
pThis
,
aVtableSlot
,
pReturnTypeRef
,
1
,
&
aParam
,
pReturn
,
pArgs
,
ppException
);
typelib_typedescriptionreference_release
(
pReturnTypeRef
);
}
break
;
}
case
typelib_TypeClass_INTERFACE_METHOD
:
{
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
)
{
uno_Interface
*
pInterface
=
0
;
(
*
pThis
->
pBridge
->
getUnoEnv
()
->
getRegisteredInterface
)(
pThis
->
pBridge
->
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()
default
:
// dependent dispatch
cpp_call
(
pThis
,
aVtableSlot
,
((
typelib_InterfaceMethodTypeDescription
*
)
pMemberDescr
)
->
pReturnTypeRef
,
((
typelib_InterfaceMethodTypeDescription
*
)
pMemberDescr
)
->
nParams
,
((
typelib_InterfaceMethodTypeDescription
*
)
pMemberDescr
)
->
pParams
,
pReturn
,
pArgs
,
ppException
);
}
break
;
}
default
:
{
::
com
::
sun
::
star
::
uno
::
RuntimeException
aExc
(
OUString
(
"illegal member type description!"
),
::
com
::
sun
::
star
::
uno
::
Reference
<
::
com
::
sun
::
star
::
uno
::
XInterface
>
()
);
Type
const
&
rExcType
=
::
getCppuType
(
&
aExc
);
// binary identical null reference
::
uno_type_any_construct
(
*
ppException
,
&
aExc
,
rExcType
.
getTypeLibType
(),
0
);
}
}
}
}
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
configure.ac
Dosyayı görüntüle @
f49ff3f5
...
@@ -3946,10 +3946,6 @@ darwin*)
...
@@ -3946,10 +3946,6 @@ darwin*)
;;
;;
i*86)
i*86)
AC_MSG_ERROR([Can't build 64-bit code in 32-bit OS])
AC_MSG_ERROR([Can't build 64-bit code in 32-bit OS])
CPUNAME=INTEL
RTL_ARCH=x86
PLATFORMID=macosx_x86
OUTPATH=unxmacxi
;;
;;
x86_64)
x86_64)
CPUNAME=X86_64
CPUNAME=X86_64
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment