She*_*ley 59 perl objective-c objective-c-runtime
背景:CamelBones使用Objective-C运行时注册Perl类.为此,每个Perl方法都注册了相同的IMP函数; 该函数检查其self&_cmd参数以查找要调用的Perl方法.
对于已发送的消息,这已经好几年了objc_msgSend.但是现在我想添加对从Perl方法返回浮点和大型结构类型的支持.浮点并不难; 我只需编写另一个返回double的IMP,来处理调度的消息objc_msgSend_fpret.
问题是该怎么做objc_msgSend_stret.IMP为每个可能的结构返回类型编写一个单独的是不切实际的,原因有两个:首先,因为即使我这样做只是为了在编译时已知的结构类型,这是一个荒谬的函数数量.第二,因为我们讨论的是可以与任意Objective-C和Perl代码链接的框架,所以在编译框架时我们并不知道所有可能的结构类型.
我希望做的是编写一个IMP可以处理通过调度发送的任何返回类型的单个objc_msgSend_stret.我可以把它写成返回void,并将指针参数传递给返回缓冲区,就像旧的objc_msgSend_stret声明一样吗?即使这件事现在正常工作,我还能继续在将来继续工作吗?
感谢您的任何建议 - 我一直在讨论这个问题.:-)
更新:
以下是我从Apple的运行工程师那里收到的关于他们的objc语言邮件列表的建议:
您必须编写汇编代码来处理这种情况.
您的建议在某些体系结构上失败,其中"函数返回void以指向结构作为第一个参数的指针"的ABI与"返回结构的函数"不同.(在i386上,结构地址在一种情况下由调用者从堆栈中弹出,在另一种情况下由被调用者弹出.)这就是原型的
objc_msgSend_stret更改.汇编代码将捕获struct返回地址,将其走私到非struct-return C函数调用中而不会干扰其余参数,然后在退出时执行正确的ABI特定清理(
ret $4在i386上).或者,汇编代码可以捕获所有参数.转发机械做这样的事情.如果你想看看这些技术是什么样的,那么该代码可能在开源CoreFoundation中.
我会把这个问题保持开放,以防有人集体讨论更好的想法,但直接来自Apple自己的"运行时争吵者",我认为这可能是我可能得到的权威答案.是时候把x86参考手册上的灰尘弄掉,然后把我的装配工的铁锈搞得一团糟,我猜...