Предыстория: CamelBones регистрирует классы Perl в среде выполнения Objective-C.
Для этого каждый метод Perl регистрируется в одном IMP.
функция; эта функция проверяет свои аргументы self
& _cmd
, чтобы найти
какой метод Perl вызывать.
Он достаточно хорошо работал в течение нескольких лет для сообщений, которые были
отправлено с objc_msgSend
. Но теперь я хочу добавить поддержку
возвращение типов структур с плавающей запятой и больших структур из методов Perl.
С плавающей точкой несложно; Я просто напишу еще один IMP, который вернет
double, чтобы обрабатывать сообщения, отправленные с помощью objc_msgSend_fpret
.
Вопрос в том, что делать с objc_msgSend_stret
. Написание
отдельный IMP
для всех возможных структурных возвращаемых типов нецелесообразно, для
две причины: во-первых, потому что даже если бы я сделал это только для типов структур
которые известны во время компиляции, это абсурдное количество функций.
И, во-вторых, поскольку мы говорим о фреймворке, который может быть связан с любым произвольным кодом Objective-C и Perl, мы не знаем все возможные типы структур при компиляции фреймворка.
Я надеюсь написать один IMP
, который может обрабатывать любой возврат
тип, отправленный через objc_msgSend_stret
. Могу я написать это как
возврат void
и принятие аргумента указателя в буфер возврата, например
объявлен старый objc_msgSend_stret
? Даже если это случилось с
работать сейчас, могу ли я рассчитывать, что он продолжит работать в будущем?
Спасибо за любой совет - я ломал голову над этим. : -)
Обновление:
Вот совет, который я получил от одного из инженеров среды выполнения Apple в их списке рассылки на языке objc:
Вы должны написать ассемблерный код для обработки этот случай.
Ваше предложение терпит неудачу в некоторых архитектуры, где ABI для "функции" возврат void с указателем на структура в качестве первого аргумента "отличается из «функция, возвращающая структуру». (На i386 выскакивает адрес структуры из стека вызывающим за один случае и вызываемым в другом случае.) Вот почему прототип для
objc_msgSend_stret
был изменен.Ассемблерный код будет фиксировать адрес возврата структуры, переправьте его в вызов функции C без возврата структуры не мешая остальным параметры, а затем правильно Очистка ABI при выходе (
ret $ 4
на i386). В качестве альтернативы сборка код может захватить все параметры. Транспортно-экспедиционная техника делает что-то вроде этого. Этот код может быть в CoreFoundation с открытым исходным кодом если вы хотите увидеть, какие методы выглядит так.
Я оставлю этот вопрос открытым, на случай, если кто-то придумает лучшую идею, но, учитывая, что это идет непосредственно от собственного «обработчика времени выполнения» Apple, я полагаю, что это, вероятно, столь же авторитетный ответ, как я, вероятно, получу . Пора стереть пыль со справочных руководств по x86 и стереть ржавчину с моего ассемблерного фу, я думаю ...