mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-17 06:39:34 +02:00
* factored out the loading the function result from the parentfpstruct into
its original location so it can be reused elsewhere too git-svn-id: trunk@34304 -
This commit is contained in:
parent
8760a6fbf8
commit
a31ca58593
@ -55,6 +55,13 @@ interface
|
|||||||
{ idem for finalization }
|
{ idem for finalization }
|
||||||
class function force_final: boolean; virtual;
|
class function force_final: boolean; virtual;
|
||||||
|
|
||||||
|
{ if the funcretsym was moved to the parentfpstruct, use this method to
|
||||||
|
move its value back back into the funcretsym before the function exit, as
|
||||||
|
the code generator is hardcoded to use to use the funcretsym when loading
|
||||||
|
the value to be returned; replacing it with an absolutevarsym that
|
||||||
|
redirects to the field in the parentfpstruct doesn't work, as the code
|
||||||
|
generator cannot deal with such symbols }
|
||||||
|
class procedure load_parentfpstruct_nested_funcret(pd: tprocdef; var stat: tstatementnode);
|
||||||
{ called after parsing a routine with the code of the entire routine
|
{ called after parsing a routine with the code of the entire routine
|
||||||
as argument; can be used to modify the node tree. By default handles
|
as argument; can be used to modify the node tree. By default handles
|
||||||
insertion of code for systems that perform the typed constant
|
insertion of code for systems that perform the typed constant
|
||||||
@ -464,11 +471,26 @@ implementation
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
class procedure tnodeutils.load_parentfpstruct_nested_funcret(pd: tprocdef; var stat: tstatementnode);
|
||||||
|
var
|
||||||
|
target: tnode;
|
||||||
|
begin
|
||||||
|
target:=cloadnode.create(pd.funcretsym, pd.funcretsym.owner);
|
||||||
|
{ ensure the target of this assignment doesn't translate the
|
||||||
|
funcretsym also to its alias in the parentfpstruct }
|
||||||
|
include(target.flags, nf_internal);
|
||||||
|
addstatement(stat,
|
||||||
|
cassignmentnode.create(
|
||||||
|
target, cloadnode.create(pd.funcretsym, pd.funcretsym.owner)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
class function tnodeutils.wrap_proc_body(pd: tprocdef; n: tnode): tnode;
|
class function tnodeutils.wrap_proc_body(pd: tprocdef; n: tnode): tnode;
|
||||||
var
|
var
|
||||||
stat: tstatementnode;
|
stat: tstatementnode;
|
||||||
block,
|
block: tnode;
|
||||||
target: tnode;
|
|
||||||
psym: tsym;
|
psym: tsym;
|
||||||
begin
|
begin
|
||||||
result:=maybe_insert_trashing(pd,n);
|
result:=maybe_insert_trashing(pd,n);
|
||||||
@ -541,26 +563,12 @@ implementation
|
|||||||
end;
|
end;
|
||||||
if target_info.system in systems_fpnestedstruct then
|
if target_info.system in systems_fpnestedstruct then
|
||||||
begin
|
begin
|
||||||
{ if the funcretsym was moved to the parentfpstruct, move its value
|
|
||||||
back into the funcretsym now, as the code generator is hardcoded
|
|
||||||
to use the funcretsym when loading the value to be returned;
|
|
||||||
replacing it with an absolutevarsym that redirects to the field in
|
|
||||||
the parentfpstruct doesn't work, as the code generator cannot deal
|
|
||||||
with such symbols }
|
|
||||||
if assigned(pd.funcretsym) and
|
if assigned(pd.funcretsym) and
|
||||||
tabstractnormalvarsym(pd.funcretsym).inparentfpstruct then
|
tabstractnormalvarsym(pd.funcretsym).inparentfpstruct then
|
||||||
begin
|
begin
|
||||||
block:=internalstatements(stat);
|
block:=internalstatements(stat);
|
||||||
addstatement(stat,result);
|
addstatement(stat,result);
|
||||||
target:=cloadnode.create(pd.funcretsym,pd.funcretsym.owner);
|
load_parentfpstruct_nested_funcret(pd,stat);
|
||||||
{ ensure the target of this assignment doesn't translate the
|
|
||||||
funcretsym also to its alias in the parentfpstruct }
|
|
||||||
include(target.flags,nf_internal);
|
|
||||||
addstatement(stat,
|
|
||||||
cassignmentnode.create(
|
|
||||||
target,cloadnode.create(pd.funcretsym,pd.funcretsym.owner)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
result:=block;
|
result:=block;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
Loading…
Reference in New Issue
Block a user