Auto merge of #38146 - kali:master, r=alexcrichton
fix objc ABI in std::env::args iOS use different calling convention for `objc_msgSend` depending on the platform. armv7 expect good old variadic arguments, but aarch64 wants "normal" convention: `objc_msgSend` has to be called mimicking the actual callee prototype. https://developer.apple.com/library/content/documentation/General/Conceptual/CocoaTouch64BitGuide/ConvertingYourAppto64-Bit/ConvertingYourAppto64-Bit.html#//apple_ref/doc/uid/TP40013501-CH3-SW26 This currently breaks std::env:args() on aarch64 iOS devices. As far as I can tell, in the standard library, this is the only occurrence of ObjectiveC dispatching.
This commit is contained in:
commit
816a34aca2
1 changed files with 15 additions and 2 deletions
|
@ -172,10 +172,23 @@ mod imp {
|
||||||
|
|
||||||
extern {
|
extern {
|
||||||
fn sel_registerName(name: *const libc::c_uchar) -> Sel;
|
fn sel_registerName(name: *const libc::c_uchar) -> Sel;
|
||||||
fn objc_msgSend(obj: NsId, sel: Sel, ...) -> NsId;
|
|
||||||
fn objc_getClass(class_name: *const libc::c_uchar) -> NsId;
|
fn objc_getClass(class_name: *const libc::c_uchar) -> NsId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(target_arch="aarch64")]
|
||||||
|
extern {
|
||||||
|
fn objc_msgSend(obj: NsId, sel: Sel) -> NsId;
|
||||||
|
#[link_name="objc_msgSend"]
|
||||||
|
fn objc_msgSend_ul(obj: NsId, sel: Sel, i: libc::c_ulong) -> NsId;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(not(target_arch="aarch64"))]
|
||||||
|
extern {
|
||||||
|
fn objc_msgSend(obj: NsId, sel: Sel, ...) -> NsId;
|
||||||
|
#[link_name="objc_msgSend"]
|
||||||
|
fn objc_msgSend_ul(obj: NsId, sel: Sel, ...) -> NsId;
|
||||||
|
}
|
||||||
|
|
||||||
#[link(name = "Foundation", kind = "framework")]
|
#[link(name = "Foundation", kind = "framework")]
|
||||||
#[link(name = "objc")]
|
#[link(name = "objc")]
|
||||||
#[cfg(not(cargobuild))]
|
#[cfg(not(cargobuild))]
|
||||||
|
@ -199,7 +212,7 @@ mod imp {
|
||||||
|
|
||||||
let cnt: usize = mem::transmute(objc_msgSend(args, count_sel));
|
let cnt: usize = mem::transmute(objc_msgSend(args, count_sel));
|
||||||
for i in 0..cnt {
|
for i in 0..cnt {
|
||||||
let tmp = objc_msgSend(args, object_at_sel, i);
|
let tmp = objc_msgSend_ul(args, object_at_sel, i as libc::c_ulong);
|
||||||
let utf_c_str: *const libc::c_char =
|
let utf_c_str: *const libc::c_char =
|
||||||
mem::transmute(objc_msgSend(tmp, utf8_sel));
|
mem::transmute(objc_msgSend(tmp, utf8_sel));
|
||||||
let bytes = CStr::from_ptr(utf_c_str).to_bytes();
|
let bytes = CStr::from_ptr(utf_c_str).to_bytes();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue