delphi中as,is关键字是如何工作的?

我的问题是delphi中as,is关键字是如何工作的?特别是as,它可以把一个类转换成另一个类我从delphi中的system。pas中截取as关键字代码请求给与讲解,再次感谢!!

procedure _AsClass
asm
{_> EAX left operand(class)
{ EDX VMT of right operand
{<_ EAX if left is derived from right ,else runtime
error }
TEST EAX,EAX
JE @@exit
MOV ECX,EAX
@@loop
MOV ECX,[ECX]
CMP ECX,EDX
JE @@exit
MOV ECX,[ECX].vmtParent
TEST ECX,ECX
JNE @@loop
{ do runtime error}
MOV AL,reInvalidCast
JMP error
@@exit:
end;

 

procedure _AsClass
asm
{_> EAX left operand(class)
{ EDX VMT of right operand
{<_ EAX if left is derived from right ,else runtime
error }
//上面的注释已经说的很清楚了:进入这个procedure后,eax放左值,edx放右值的vmt地址
//举个例子:假设: TA As TB
//编译后,就是把ta类的实例地址放到eax中,而tb的地址放在edx中好比较
//在system.pas中也有tobject的结构,这是vcl类库的基本结构,你自己去看看,有一个vmt
//4个字节一个记录,放的是地址

TEST EAX,EAX //首先判断eax是否为空,就是类的实例是否有效
JE @@exit
MOV ECX,EAX //如果有,把地址转移到ecx中,以好继续比较

@@loop
MOV ECX,[ECX]
CMP ECX,EDX
JE @@exit
MOV ECX,[ECX].vmtParent
TEST ECX,ECX
JNE @@loop
{ do runtime error}
//这就是一个循环,先判断ta是不是tb,如果不是,再看ta的父类是不是tb,循环比较,但
//tobject是没有父类的,所以比较到它就结束了
MOV AL,reInvalidCast
JMP error
//返回一个错误值,这样,这个as语句就返回0
@@exit:
end;
//整个比较过程,就是沿继承树上朔,不停的比较
回复 
 
 
faint!
别人问具体实现机制
 
这样一段汇编只会让人一头雾水啊大哥,我来给你讲讲:
假设现在有一个tspeedbutton,一个tbutton
(1)as:
if tspeedbutton as tbutton then bless else damn
(2)is:
if tspeedbutton is tbutton then bless else damn
在(1)中,程序会bless,因为delphi会把tspeedbutton强化转换为tbutton。
在(2)中,程序会damn,因为tspeedbutton不是tbutton。
为什么我选tspeedbutton和tbutton做例子呢,因为前者是后者的子类(派生出来的),tspeedbutton可以转化为tbutton。
其实也很简单,从英文字面上就可以看懂了,as/is,不是吗?

posted on 2021-09-16 11:08  癫狂编程  阅读(157)  评论(0编辑  收藏  举报

导航

好的代码像粥一样,都是用时间熬出来的