[Libreoffice-commits] core.git: Branch 'libreoffice-7-1' - fpicker/source

Tor Lillqvist (via logerrit) logerrit at kemper.freedesktop.org
Mon Dec 7 00:41:00 UTC 2020


 fpicker/source/aqua/AquaFilePickerDelegate.hxx |    2 +-
 fpicker/source/aqua/SalAquaFilePicker.mm       |    8 +-------
 2 files changed, 2 insertions(+), 8 deletions(-)

New commits:
commit 43c572fa90e26bd9b47a9eecfd67f6e2220095b1
Author:     Tor Lillqvist <tml at iki.fi>
AuthorDate: Sat Dec 5 17:25:30 2020 +0200
Commit:     Tor Lillqvist <tml at collabora.com>
CommitDate: Mon Dec 7 01:40:19 2020 +0100

    Fix crash or hang on macOS on arm64 when opening a file picker
    
    There is no reason to not mention the NSOpenSavePanelDelegate protocol
    that AquaFilePickerDelegate implements.
    
    The way we used objc_msgSend() caused a crash or hang. (I saw both,
    depending on whether the code was built for debugging or not). For
    some reason we used to cast it to a function with variadic parameters
    like:
    
        reinterpret_cast<id (*)(id, SEL, ...)>(objc_msgSend)(
            m_pDialog, @selector(setDelegate:), m_pDelegate);
    
    This does not work in arm64 code on macOS. (See
    https://developer.apple.com/documentation/apple_silicon/addressing_architectural_differences_in_your_macos_code?language=objc
    , the "Don't Redeclare a Function to Have Variable Parameters"
    section.)
    
    We could have replaced the ellipsis with the actual type of the first
    real parameter in this call, or just "id" would have worked fine. But
    it is much simpler to just do what we mean directly:
    
        [m_pDialog setDelegate:m_pDelegate];
    
    I need to look through the code for other places where we have used
    objc_msgSend() in a similar fashion.
    
    Change-Id: Ia93b2007ed8f263eaf99d604a3c88e857efbb421
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/107257
    Tested-by: Jenkins
    Reviewed-by: Tor Lillqvist <tml at collabora.com>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/107323

diff --git a/fpicker/source/aqua/AquaFilePickerDelegate.hxx b/fpicker/source/aqua/AquaFilePickerDelegate.hxx
index eb7e1ce402e6..fb158cd67633 100644
--- a/fpicker/source/aqua/AquaFilePickerDelegate.hxx
+++ b/fpicker/source/aqua/AquaFilePickerDelegate.hxx
@@ -27,7 +27,7 @@
 class SalAquaFilePicker;
 class FilterHelper;
 
- at interface AquaFilePickerDelegate : NSObject
+ at interface AquaFilePickerDelegate : NSObject <NSOpenSavePanelDelegate>
 {
     SalAquaFilePicker* filePicker;
     FilterHelper* filterHelper;
diff --git a/fpicker/source/aqua/SalAquaFilePicker.mm b/fpicker/source/aqua/SalAquaFilePicker.mm
index deff8783bbe9..069a2411f6a5 100644
--- a/fpicker/source/aqua/SalAquaFilePicker.mm
+++ b/fpicker/source/aqua/SalAquaFilePicker.mm
@@ -154,13 +154,7 @@ sal_Int16 SAL_CALL SalAquaFilePicker::execute()
 
     //Set the delegate to be notified of certain events
 
-    // I don't know why, but with gcc 4.2.1, this line results in the warning:
-    // class 'AquaFilePickerDelegate' does not implement the 'NSOpenSavePanelDelegate' protocol
-    // So instead of:
-    // [m_pDialog setDelegate:m_pDelegate];
-    // do:
-    reinterpret_cast<id (*)(id, SEL, ...)>(objc_msgSend)(
-        m_pDialog, @selector(setDelegate:), m_pDelegate);
+    [m_pDialog setDelegate:m_pDelegate];
 
     int nStatus = runandwaitforresult();
 


More information about the Libreoffice-commits mailing list