Swift 方法调度
1.方法调度
- 结构体方法是静态调用(直接调用)
- 类方法是通过V_table来调用的
V-Table
在
SIL
中的表示是这样的:
1 decl ::= sil-vtable
2 sil-vtable ::= 'sil_vtable' identifier '{' sil-vtable-entry* '}'
3 sil-vtable-entry ::= sil-decl-ref ':' sil-linkage? sil-function-na
me
接下来我们通过断点来直观的看⼀下,⾸先我们需要明确⼏个指令:
ARM64汇编指令
blr ;
带返回的跳转指令,跳转到指令后边跟随寄存器中保存的地址
mov:
将某⼀寄存器的值复制到另⼀寄存器
(
只能⽤于寄存器与寄存器或者寄存器 与常量之
间传值,不能⽤于内存地址
)
,如
:
mov x1, x0
将寄存器
x0
的值复制到寄存器
x1
中
ldr:
将内存中的值读取到寄存器中,如
:
ldr x0, [x1, x2]
将寄存器
x1
和寄存器
x2
相加作为地址,取该内存
地址的值放⼊寄存器
x0
中
str :
将寄存器中的值写⼊到内存中,如
:
str x0, [x0, x8]
, 将寄存器
x0
的值保存到内存
[x0 + x8]
处
bl:
跳转到某地址
函数声明位置的不同也会导致派发⽅式的不同。如果我们在类的扩展中声明的函数,这⾥就是⼀个直接调
⽤。