SORU
29 Mart 2011, Salı


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_stret değ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 $4 i386). 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
23 Mayıs 2011, PAZARTESİ


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BetterCoder

    BetterCoder

    17 Aralık 2012
  • DetroitBORG

    DetroitBORG

    29 Temmuz 2008
  • HouseholdHacker

    HouseholdHac

    6 Kasım 2007