编译器创建vmt,从vmt中vmtSelfPtr表项中读取vmt地址,将vmt的地址送到临时寄存器中,然后分配对象内存,并初始化,将对象的前4个字节初始化为vmt地址,对于类方法,将self编译为vmt地址,然后根据vmt表项计算.
vmt表项(system单元)
{ Virtual method table entries }
vmtSelfPtr = -88;
vmtIntfTable = -84;
vmtAutoTable = -80;
vmtInitTable = -76;
vmtTypeInfo = -72;
vmtFieldTable = -68;
vmtMethodTable = -64;
vmtDynamicTable = -60;
vmtClassName = -56;
vmtInstanceSize = -52;
vmtParent = -48;
vmtEquals = -44 deprecated 'Use VMTOFFSET in asm code';
vmtGetHashCode = -40 deprecated 'Use VMTOFFSET in asm code';
vmtToString = -36 deprecated 'Use VMTOFFSET in asm code';
vmtSafeCallException = -32 deprecated 'Use VMTOFFSET in asm code';
vmtAfterConstruction = -28 deprecated 'Use VMTOFFSET in asm code';
vmtBeforeDestruction = -24 deprecated 'Use VMTOFFSET in asm code';
vmtDispatch = -20 deprecated 'Use VMTOFFSET in asm code';
vmtDefaultHandler = -16 deprecated 'Use VMTOFFSET in asm code';
vmtNewInstance = -12 deprecated 'Use VMTOFFSET in asm code';
vmtFreeInstance = -8 deprecated 'Use VMTOFFSET in asm code';
vmtDestroy = -4 deprecated 'Use VMTOFFSET in asm code';
vmtQueryInterface = 0 deprecated 'Use VMTOFFSET in asm code';
vmtAddRef = 4 deprecated 'Use VMTOFFSET in asm code';
vmtRelease = 8 deprecated 'Use VMTOFFSET in asm code';
vmtCreateObject = 12 deprecated 'Use VMTOFFSET in asm code';
vmt表项(system单元)
{ Virtual method table entries }
vmtSelfPtr = -88;
vmtIntfTable = -84;
vmtAutoTable = -80;
vmtInitTable = -76;
vmtTypeInfo = -72;
vmtFieldTable = -68;
vmtMethodTable = -64;
vmtDynamicTable = -60;
vmtClassName = -56;
vmtInstanceSize = -52;
vmtParent = -48;
vmtEquals = -44 deprecated 'Use VMTOFFSET in asm code';
vmtGetHashCode = -40 deprecated 'Use VMTOFFSET in asm code';
vmtToString = -36 deprecated 'Use VMTOFFSET in asm code';
vmtSafeCallException = -32 deprecated 'Use VMTOFFSET in asm code';
vmtAfterConstruction = -28 deprecated 'Use VMTOFFSET in asm code';
vmtBeforeDestruction = -24 deprecated 'Use VMTOFFSET in asm code';
vmtDispatch = -20 deprecated 'Use VMTOFFSET in asm code';
vmtDefaultHandler = -16 deprecated 'Use VMTOFFSET in asm code';
vmtNewInstance = -12 deprecated 'Use VMTOFFSET in asm code';
vmtFreeInstance = -8 deprecated 'Use VMTOFFSET in asm code';
vmtDestroy = -4 deprecated 'Use VMTOFFSET in asm code';
vmtQueryInterface = 0 deprecated 'Use VMTOFFSET in asm code';
vmtAddRef = 4 deprecated 'Use VMTOFFSET in asm code';
vmtRelease = 8 deprecated 'Use VMTOFFSET in asm code';
vmtCreateObject = 12 deprecated 'Use VMTOFFSET in asm code';