在 Squeak 中向对象发送消息时,运行时调用算法类似于
doesNotUnderstand:
在 self
现在,
respondsTo:
使用了非常相似的算法。方法,确实可以通过检查respondsTo:
看到的代码。 我试图找到的是用于调用的上述算法的代码位置 .我知道
perform:
做了类似的事情,但我相信它不用于常规方法调用,而仅用作类似反射的方法调用机制(例如,当程序员直到运行时才知道方法名称时)。如果上面的代码也隐藏为原始指令,我在哪里可以找到原始调用?如果不是,我在哪里可以找到代码本身?
最佳答案
您可能想查看 VMMaker .它的 Interpreter 类是执行 CompiledMethod 字节码的人,并将实际将消息发送到您的对象。
例如,如果您查看 Object>>respondsTo: 的字节码,您将看到
17 <70> self
18 <C7> send: class
19 <10> pushTemp: 0
20 <E0> send: canUnderstand:
21 <7C> returnTop
解释器读入字节码,在其 BytecodeTable(在解释器类>>initialiseBytecodeTable 中初始化)中查找该字节码并执行适当的方法。所以 <70> (#pushReceiverByteCode) 将 self 插入解释器的内部堆栈。然后 (#bytecodePrimClass) 归结为“找到自己的类(class)”。 <10> (#pushTemporaryVariableBytecode) 将#respondsTo: 的参数压入堆栈。有趣的部分发生在 (#sendLiteralSelectorBytecode),它调用
self normalSend
. #normalSend 依次计算出接收者的类别(在本例中为 self class
),然后调用 self commonSend
,它会找到我们想要运行的实际方法,然后运行它。我是虚拟机新手;以上可能不是查看算法运行等的绝对最佳位置(甚至不是最好的解释),但我希望这是一个很好的起点。
VM 用于实际发送消息的算法与您在问题中概述的一样。该算法的实际实现在
Interpreter>>commonSend
中定义。 .查找算法在 Interpreter>>lookupMethodInClass:
中和执行算法在 Interpreter>>internalExecuteNewMethod
.前者的工作原理与您描述的一样:
后者的工作方式如下:
关于reflection - 在 Squeak 中,我在哪里可以找到消息处理算法的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3333290/