aboutsummaryrefslogtreecommitdiff
path: root/editors/openoffice-3-devel/files/patch-i76115
blob: f090b4337b09f0842c92b929874e45894317ae97 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
Sync amd64 bridge with sixtyfour10 CWS.

--- bridges/source/cpp_uno/gcc3_freebsd_x86-64/uno2cpp.cxx.orig	Sat Sep 16 11:47:13 2006
+++ bridges/source/cpp_uno/gcc3_freebsd_x86-64/uno2cpp.cxx	Tue Apr  3 20:36:13 2007
@@ -49,6 +49,7 @@
 #include "bridges/cpp_uno/shared/unointerfaceproxy.hxx"
 #include "bridges/cpp_uno/shared/vtables.hxx"
 
+#include "abi.hxx"
 #include "share.hxx"
 
 using namespace ::rtl;
@@ -122,7 +123,7 @@
                 // value verbatim, as a double without conversion.
 				pFPR[nr_fpr++] = *reinterpret_cast<double *>( pSV++ );
 			else
-				*pDS++ = *reinterpret_cast<double *>( pSV++ );
+				*pDS++ = *pSV++;
 			break;
 
 		case 'H': // 64-bit Word
@@ -165,7 +166,7 @@
 
 //==================================================================================================
 static void callVirtualMethod(void * pThis, sal_uInt32 nVtableIndex,
-							  void * pRegisterReturn, typelib_TypeClass eReturnType,
+							  void * pRegisterReturn, typelib_TypeDescription * pReturnTypeDescr, bool bSimpleReturn,
 							  char * pPT, sal_uInt64 * pStackLongs, sal_uInt32 nStackLongs)
 {
 	sal_uInt32 nr_gpr, nr_fpr, nr_stack;
@@ -175,8 +176,6 @@
 	if (nr_stack)
 		nr_stack = (nr_stack + 1) & ~1;
 	
-	bool bReturnsSimpleType = bridges::cpp_uno::shared::isSimpleType( eReturnType );
-
 #if OSL_DEBUG_LEVEL > 1
 	// Let's figure out what is really going on here
 	fprintf(stderr,"callVirtualMethod() parameters string is %s\n", pPT);
@@ -244,7 +243,7 @@
 #undef ARG_GPR
     }
 
-	if ( bReturnsSimpleType )
+	if ( bSimpleReturn )
 		a0 = (sal_uInt64) pThis;
 	else
 		a1 = (sal_uInt64) pThis;
@@ -275,7 +274,7 @@
 	// Perform the call
 	ReturnValue aRet = ( ( FunctionCall ) pMethod )( a0, a1, a2, a3, a4, a5 );
 
-	switch (eReturnType)
+	switch (pReturnTypeDescr->eTypeClass)
 	{
 	case typelib_TypeClass_HYPER:
 	case typelib_TypeClass_UNSIGNED_HYPER:
@@ -301,6 +300,15 @@
 	case typelib_TypeClass_DOUBLE:
 		*reinterpret_cast<double *>( pRegisterReturn ) = *reinterpret_cast<double*>( &aRet.f.xmm0 );
 		break;
+    default: {
+        sal_Int32 const nRetSize = pReturnTypeDescr->nSize;
+        if (bSimpleReturn && nRetSize <= 16 && nRetSize > 0) {
+            if (nRetSize > 8)
+                static_cast<sal_uInt64 *>(pRegisterReturn)[1] = aRet.i.rdx;
+            static_cast<sal_uInt64 *>(pRegisterReturn)[0] = aRet.i.rax;
+        }
+        break;
+    }
 	}
 }
 
@@ -327,13 +335,15 @@
 	OSL_ENSURE( pReturnTypeDescr, "### expected return type description!" );
 	
 	void * pCppReturn = 0; // if != 0 && != pUnoReturn, needs reconversion
-	
+
+	bool bSimpleReturn = true;	
 	if (pReturnTypeDescr)
 	{
-		if (bridges::cpp_uno::shared::isSimpleType( pReturnTypeDescr ))
-		{
+		if ( x86_64::return_in_hidden_param( pReturnTypeRef ) )
+			bSimpleReturn = false;
+
+		if (bSimpleReturn)
 			pCppReturn = pUnoReturn; // direct way for simple types
-		}
 		else
 		{
 			// complex return via ptr
@@ -458,7 +468,7 @@
 		OSL_ENSURE( !( (pCppStack - pCppStackStart ) & 7), "UNALIGNED STACK !!! (Please DO panic)" );
 		callVirtualMethod(
 			pAdjustedThisPtr, aVtableSlot.index,
-			pCppReturn, pReturnTypeDescr->eTypeClass, pParamType,
+			pCppReturn, pReturnTypeDescr, bSimpleReturn, pParamType,
 			(sal_uInt64 *)pCppStackStart, (pCppStack - pCppStackStart) / sizeof(sal_uInt64) );
 		// NO exception occured...
 		*ppUnoExc = 0;