|
@@ -1895,6 +1895,7 @@ implementation
|
|
procedure gen_load_vmt_register(list:TAsmList;objdef:tobjectdef;selfloc:tlocation;var vmtreg:tregister);
|
|
procedure gen_load_vmt_register(list:TAsmList;objdef:tobjectdef;selfloc:tlocation;var vmtreg:tregister);
|
|
var
|
|
var
|
|
href : treference;
|
|
href : treference;
|
|
|
|
+ selfdef: tdef;
|
|
begin
|
|
begin
|
|
if is_object(objdef) then
|
|
if is_object(objdef) then
|
|
begin
|
|
begin
|
|
@@ -1904,6 +1905,7 @@ implementation
|
|
begin
|
|
begin
|
|
reference_reset_base(href,cg.getaddressregister(list),objdef.vmt_offset,sizeof(pint));
|
|
reference_reset_base(href,cg.getaddressregister(list),objdef.vmt_offset,sizeof(pint));
|
|
cg.a_loadaddr_ref_reg(list,selfloc.reference,href.base);
|
|
cg.a_loadaddr_ref_reg(list,selfloc.reference,href.base);
|
|
|
|
+ selfdef:=getpointerdef(objdef);
|
|
end;
|
|
end;
|
|
else
|
|
else
|
|
internalerror(200305056);
|
|
internalerror(200305056);
|
|
@@ -1914,6 +1916,7 @@ implementation
|
|
and the first "field" of an Objective-C class instance is a pointer
|
|
and the first "field" of an Objective-C class instance is a pointer
|
|
to its "meta-class". }
|
|
to its "meta-class". }
|
|
begin
|
|
begin
|
|
|
|
+ selfdef:=objdef;
|
|
case selfloc.loc of
|
|
case selfloc.loc of
|
|
LOC_REGISTER:
|
|
LOC_REGISTER:
|
|
begin
|
|
begin
|
|
@@ -1941,7 +1944,7 @@ implementation
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
vmtreg:=cg.getaddressregister(list);
|
|
vmtreg:=cg.getaddressregister(list);
|
|
- cg.g_maybe_testself(list,href.base);
|
|
|
|
|
|
+ hlcg.g_maybe_testself(list,selfdef,href.base);
|
|
cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,vmtreg);
|
|
cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,vmtreg);
|
|
|
|
|
|
{ test validity of VMT }
|
|
{ test validity of VMT }
|