mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-14 09:09:19 +02:00
* made second_proc_to_procvar type safe
git-svn-id: trunk@32553 -
This commit is contained in:
parent
9fd4531e79
commit
d6fb458129
@ -515,6 +515,7 @@ interface
|
|||||||
|
|
||||||
procedure tcgtypeconvnode.second_proc_to_procvar;
|
procedure tcgtypeconvnode.second_proc_to_procvar;
|
||||||
var
|
var
|
||||||
|
href: treference;
|
||||||
tmpreg: tregister;
|
tmpreg: tregister;
|
||||||
begin
|
begin
|
||||||
if tabstractprocdef(resultdef).is_addressonly then
|
if tabstractprocdef(resultdef).is_addressonly then
|
||||||
@ -543,9 +544,10 @@ interface
|
|||||||
case left.location.loc of
|
case left.location.loc of
|
||||||
LOC_REFERENCE,LOC_CREFERENCE:
|
LOC_REFERENCE,LOC_CREFERENCE:
|
||||||
begin
|
begin
|
||||||
location.register:=hlcg.getaddressregister(current_asmdata.CurrAsmList,voidcodepointertype);
|
location.register:=hlcg.getaddressregister(current_asmdata.CurrAsmList,resultdef);
|
||||||
{ code field is the first one }
|
{ code field is the first one }
|
||||||
hlcg.a_load_ref_reg(current_asmdata.CurrAsmList,voidcodepointertype,voidcodepointertype,left.location.reference,location.register);
|
hlcg.g_ptrtypecast_ref(current_asmdata.CurrAsmList,left.resultdef,resultdef,left.location.reference);
|
||||||
|
hlcg.a_load_ref_reg(current_asmdata.CurrAsmList,resultdef,resultdef,left.location.reference,location.register);
|
||||||
end;
|
end;
|
||||||
LOC_REGISTER,LOC_CREGISTER:
|
LOC_REGISTER,LOC_CREGISTER:
|
||||||
begin
|
begin
|
||||||
@ -571,20 +573,15 @@ interface
|
|||||||
internalerror(2013031503);
|
internalerror(2013031503);
|
||||||
location_reset_ref(location,LOC_REFERENCE,int_cgsize(resultdef.size),sizeof(pint));
|
location_reset_ref(location,LOC_REFERENCE,int_cgsize(resultdef.size),sizeof(pint));
|
||||||
tg.gethltemp(current_asmdata.CurrAsmList,resultdef,resultdef.size,tt_normal,location.reference);
|
tg.gethltemp(current_asmdata.CurrAsmList,resultdef,resultdef.size,tt_normal,location.reference);
|
||||||
|
href:=location.reference;
|
||||||
|
hlcg.g_ptrtypecast_ref(current_asmdata.CurrAsmList,cpointerdef.getreusable(resultdef),cpointerdef.getreusable(methodpointertype),href);
|
||||||
tmpreg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,voidcodepointertype);
|
tmpreg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,voidcodepointertype);
|
||||||
hlcg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,left.resultdef,voidcodepointertype,left.location.reference,tmpreg);
|
hlcg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,tprocdef(left.resultdef),voidcodepointertype,left.location.reference,tmpreg);
|
||||||
hlcg.a_load_reg_ref(current_asmdata.CurrAsmList,voidcodepointertype,voidcodepointertype,tmpreg,location.reference);
|
hlcg.g_load_reg_field_by_name(current_asmdata.CurrAsmList,voidcodepointertype,trecorddef(methodpointertype),tmpreg,'proc',href);
|
||||||
{ setting the frame pointer to nil is not strictly necessary
|
{ setting the frame pointer to nil is not strictly necessary
|
||||||
since the global procedure won't use it, but it can help with
|
since the global procedure won't use it, but it can help with
|
||||||
debugging }
|
debugging }
|
||||||
inc(location.reference.offset,voidcodepointertype.size);
|
hlcg.g_load_const_field_by_name(current_asmdata.CurrAsmList,trecorddef(methodpointertype),'self',0,href);
|
||||||
if (resultdef.typ=procvardef) and is_nested_pd(tprocvardef(resultdef)) then
|
|
||||||
hlcg.a_load_const_ref(current_asmdata.CurrAsmList,parentfpvoidpointertype,0,location.reference)
|
|
||||||
else if tabstractprocdef(resultdef).is_methodpointer then
|
|
||||||
hlcg.a_load_const_ref(current_asmdata.CurrAsmList,voidpointertype,0,location.reference)
|
|
||||||
else
|
|
||||||
internalerror(2014052301);
|
|
||||||
dec(location.reference.offset,voidcodepointertype.size);
|
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
Loading…
Reference in New Issue
Block a user