This is an automated email from the ASF dual-hosted git repository.

leginee pushed a commit to branch bazel-migration
in repository https://gitbox.apache.org/repos/asf/openoffice.git

commit c671a9c6a1eeb5154ea2990db985535761436919
Author: Peter Kovacs <[email protected]>
AuthorDate: Mon Jul 27 07:06:55 2026 +0200

    bridges/msvc_win64: pass simple argument values, not the temp's address
    
    uno2cpp.cxx converts each simple by-value argument into an 8-byte alloca
    temp and stores the pointer in pCppArgs[nPos]:
    
        uno_copyAndConvertData( pCppArgs[nPos] = alloca( 8 ), ... );
    
    Copying the value into the outgoing slot therefore has to dereference that
    pointer.  The marshalling switch used &pCppArgs[nPos] instead, which reads
    the pCppArgs array slot itself, i.e. the temp's address -- so every HYPER,
    LONG, ENUM, SHORT, CHAR, BOOLEAN, BYTE, FLOAT and DOUBLE parameter reached
    the callee as a stack address (or its low 16/32 bits) rather than a value.
    
    The same expression is correct in the complex/ref branch, where the pointer
    IS the argument; written there as (sal_uInt64)pCppArgs[nPos] to make the
    difference between the two branches obvious.
    
    This only affects calls that cross between the uno and cpp environments, so
    a pure-C++ session never trips it; it surfaces via pyuno and the invocation
    adapters.
    
    Co-Authored-By: Claude Opus 5 <[email protected]>
---
 .../source/cpp_uno/msvc_win64_x86-64/uno2cpp.cxx       | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/main/bridges/source/cpp_uno/msvc_win64_x86-64/uno2cpp.cxx 
b/main/bridges/source/cpp_uno/msvc_win64_x86-64/uno2cpp.cxx
index 2f8e80ca4d..b9e43adb45 100644
--- a/main/bridges/source/cpp_uno/msvc_win64_x86-64/uno2cpp.cxx
+++ b/main/bridges/source/cpp_uno/msvc_win64_x86-64/uno2cpp.cxx
@@ -105,29 +105,34 @@ static void cpp_call(
                        uno_copyAndConvertData( pCppArgs[nPos] = alloca( 8 ), 
pUnoArgs[nPos], pParamTypeDescr,
                                                                        
pThis->getBridge()->getUno2Cpp() );
 
+                       // pCppArgs[nPos] is the alloca(8) temp above, i.e. a 
POINTER to the
+                       // converted value -- the value is *pCppArgs[nPos].  
Using
+                       // &pCppArgs[nPos] would read the array slot instead, 
passing the
+                       // temp's address as the argument.  (That form is 
correct only in the
+                       // complex/ref branch below, where the pointer IS the 
argument.)
                        switch (pParamTypeDescr->eTypeClass)
                        {
                        case typelib_TypeClass_HYPER:
                        case typelib_TypeClass_UNSIGNED_HYPER:
-                               *pStack++ = *(sal_uInt64*)&pCppArgs[nPos];
+                               *pStack++ = *(sal_uInt64*)pCppArgs[nPos];
                                break;
                        case typelib_TypeClass_LONG:
                        case typelib_TypeClass_UNSIGNED_LONG:
                        case typelib_TypeClass_ENUM:
-                               *pStack++ = *(sal_uInt32*)&pCppArgs[nPos];
+                               *pStack++ = *(sal_uInt32*)pCppArgs[nPos];
                                break;
                        case typelib_TypeClass_SHORT:
                        case typelib_TypeClass_UNSIGNED_SHORT:
                        case typelib_TypeClass_CHAR:
-                               *pStack++ = *(sal_uInt16*)&pCppArgs[nPos];
+                               *pStack++ = *(sal_uInt16*)pCppArgs[nPos];
                                break;
                        case typelib_TypeClass_BOOLEAN:
                        case typelib_TypeClass_BYTE:
-                               *pStack++ = *(sal_uInt8*)&pCppArgs[nPos];
+                               *pStack++ = *(sal_uInt8*)pCppArgs[nPos];
                                break;
                        case typelib_TypeClass_FLOAT:
                        case typelib_TypeClass_DOUBLE:
-                               *pStack++ = *(sal_uInt64*)&pCppArgs[nPos]; // 
verbatim!
+                               *pStack++ = *(sal_uInt64*)pCppArgs[nPos]; // 
verbatim!
                 break;
             default:
                 break;
@@ -164,7 +169,8 @@ static void cpp_call(
                                // no longer needed
                                TYPELIB_DANGER_RELEASE( pParamTypeDescr );
                        }
-                       *pStack++ = *(sal_uInt64*)&pCppArgs[nPos];
+                       // here the POINTER is the argument (complex value 
passed by ref)
+                       *pStack++ = (sal_uInt64)pCppArgs[nPos];
                }
        }
 

Reply via email to