Ne kadar büyük bir yapı türü çalışma zamanında belirlenen döndüren IMP bir fonksiyonu gerçekleştirmek için?
Arka plan: CamelBones kaydeder dersleri Perl Objective-C çalışma zamanı.
Bunu yapmak için, her Perl yöntem aynı IMP kayıtlıdır
fonksiyonu self & _cmd bağımsız değişkenleri bulmak için inceler fonksiyonu;
yöntem aramak Perl.
Bu yeterince iletileri için birkaç yıl boyunca çalıştı
objc_msgSend ile gönderilir. Ama şu an için destek eklemek istiyorum
kayan noktalı dönen ve Perl yöntemleri büyük yapı türleri.
Kayan noktalı sabit; sadece döndüren bir IMP yazacağım değil mi
mesajlar objc_msgSend_fpret ile gönderilir işlemek için çift.
Soru objc_msgSend_stret hakkında ne olduğunu. Yazı
IMP mümkün olan her yapı, dönüş için ayrı, yazın için pratik değildir
iki sebebi vardır: birincisi, yapı türleri için eğer yaptıysam bile, çünkü bunu sadece
bu fonksiyonların saçma bir dizi bu derleme, de bilinir.
Objective-C Ve Perl herhangi bir rasgele kod karşı bağlanabilen bir çerçeve bahsediyoruz çünkü ikincisi, bizyokçerçeve derleniyor tüm potansiyel yapı türleri.
Benim yapmak istediğim herhangi bir geri dönüş kullanabilen IMP Bir tek şey yazmak.
gönderilen bu tür objc_msgSend_stret). Olarak yazma ... ...
void, dönen ve geri arabellek için işaretçi değişkeni, gibi alarak
eski objc_msgSend_stret ilan edildi? Eğer öyle olsaydı bile
şimdi iş, güvenmek gelecekte de çalışmaya devam edebilir miyim?
Herhangi bir tavsiye için teşekkürler - bu benim kafayı yiyordum. :-)
Güncelleme:
İşte objc-dil kendi e-posta listesine Apple'ın zamanı mühendisleri,: alınan tavsiye
Montaj işlemek için kod yazmak gerekir bu durum.
Tavsiyen üzerine biraz başarısız "işlev için ABİ mimarileri nerede dönen bir işaretçi geçersiz ilk argüman olarak" farklı yapı "işlevi bir yapı döndüren". (İ386, yapı adresi attı. bir arayan tarafından yığından dava ve diğer tarafından aranan durumda.) Bu yüzden prototipi.
objc_msgSend_stretdeğiştirildi.Derleme kod kazanacaklardı yapı dönüş adresi, içine gizlice non-yapı-dönüş C işlev çağrısı geri kalanını rahatsız etmeden parametreleri, ve sonra doğru yap ABİ özel temizleme exit (
ret $4i386). Alternatif olarak, Kurul kod tüm yakalayabilir parametreleri. İletme makinaları böyle bir şey yok. Bu kodu açık kaynak CoreFoundation olabilir eğer bu teknikleri ne görmek istiyorsanız benziyor.
Bırakıyorum bu soruyu açın diye birisi beyin fırtınaları daha iyi bir fikir, ama bu önümüzdeki doğrudan Apple'ın kendi "çalışma zamanı wrangler," ben rakam muhtemelen yetkili olarak bir cevap olarak oldum olası. Off 86 referans kılavuzları toz ve benim kapalı pas çevirici-fu vurmak için zaman, sanırım
CEVAP
Apple Mühendisi doğru gibi görünüyor: aferin tek assembly kodu. Burada başlamak için bazı yararlı işaretçiler:
- Objective-C çalışma zamanı kodu: el yapımı messenger assmbly taslakları çeşitli mesajlaşma yöntemleri için The i386 x86_64.
- Gönderen genel bir bakış sağlar An SO answer.
- Derleme kod satırı-by-line analiz Gönderen mekanizmalarını A in-depth review
Umarım yardımcı olur.

Ne kadar büyük bir dize değiştirmek iç...
Ne kadar büyük dosya okumak için pytho...
Ne kadar numaralandırılmış türü (numar...
Arşivler Organizatörü kadar böyle büyü...
ne kadar güçlü parametreleri ile bir d...