summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Lillqvist <tml@iki.fi>2020-12-05 17:25:30 +0200
committerTor Lillqvist <tml@iki.fi>2020-12-13 17:24:49 +0200
commit5dc5a0c362788d265aadde77f855306e7c07fc7a (patch)
treede32fd66de672698f47541408d6ad4217da60c1b
parent22da09f764a9df524207df0bbb2a274f9924fd58 (diff)
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@collabora.com>
-rw-r--r--fpicker/source/aqua/AquaFilePickerDelegate.hxx2
-rw-r--r--fpicker/source/aqua/SalAquaFilePicker.mm8
2 files changed, 2 insertions, 8 deletions
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;
-@interface AquaFilePickerDelegate : NSObject
+@interface AquaFilePickerDelegate : NSObject <NSOpenSavePanelDelegate>
{
SalAquaFilePicker* filePicker;
FilterHelper* filterHelper;
diff --git a/fpicker/source/aqua/SalAquaFilePicker.mm b/fpicker/source/aqua/SalAquaFilePicker.mm
index ac54fca0cc98..3fbe8e7c949a 100644
--- a/fpicker/source/aqua/SalAquaFilePicker.mm
+++ b/fpicker/source/aqua/SalAquaFilePicker.mm
@@ -155,13 +155,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();