Как реализовать функцию IMP, которая возвращает большой тип структуры, определенный во время выполнения?

Предыстория: 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 и стереть ржавчину с моего ассемблерного фу, я думаю ...

59
задан Sherm Pendley 30 March 2011 в 04:40
поделиться