mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-12 09:29:07 +02:00
* fixed temp leaking after release_unused_return_value_cpu() refactor:
renamed refactored routine to do_release_unused_return_value() which by default releases temps, and if something else needs to be done override (and call inherited if temps may have to be released) git-svn-id: branches/jvmbackend@18327 -
This commit is contained in:
parent
1ace6ec201
commit
e2e32fbbe9
@ -36,7 +36,7 @@ interface
|
|||||||
tjvmcallnode = class(tcgcallnode)
|
tjvmcallnode = class(tcgcallnode)
|
||||||
protected
|
protected
|
||||||
procedure set_result_location(realresdef: tstoreddef); override;
|
procedure set_result_location(realresdef: tstoreddef); override;
|
||||||
procedure release_unused_return_value_cpu;override;
|
procedure do_release_unused_return_value;override;
|
||||||
procedure extra_post_call_code; override;
|
procedure extra_post_call_code; override;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -62,7 +62,7 @@ implementation
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure tjvmcallnode.release_unused_return_value_cpu;
|
procedure tjvmcallnode.do_release_unused_return_value;
|
||||||
begin
|
begin
|
||||||
case resultdef.size of
|
case resultdef.size of
|
||||||
0:
|
0:
|
||||||
|
@ -81,7 +81,7 @@ interface
|
|||||||
{ if an unused return value is in another location than a
|
{ if an unused return value is in another location than a
|
||||||
LOC_REFERENCE, this method will be called to perform the necessary
|
LOC_REFERENCE, this method will be called to perform the necessary
|
||||||
cleanups. By default it does not do anything }
|
cleanups. By default it does not do anything }
|
||||||
procedure release_unused_return_value_cpu;virtual;
|
procedure do_release_unused_return_value;virtual;
|
||||||
public
|
public
|
||||||
procedure pass_generate_code;override;
|
procedure pass_generate_code;override;
|
||||||
destructor destroy;override;
|
destructor destroy;override;
|
||||||
@ -316,9 +316,16 @@ implementation
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure tcgcallnode.release_unused_return_value_cpu;
|
procedure tcgcallnode.do_release_unused_return_value;
|
||||||
begin
|
begin
|
||||||
{ do nothing }
|
case location.loc of
|
||||||
|
LOC_REFERENCE :
|
||||||
|
begin
|
||||||
|
if is_managed_type(resultdef) then
|
||||||
|
hlcg.g_finalize(current_asmdata.CurrAsmList,resultdef,location.reference);
|
||||||
|
tg.ungetiftemp(current_asmdata.CurrAsmList,location.reference);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -437,20 +444,11 @@ implementation
|
|||||||
tree is generated, because that converts the temp from persistent to normal }
|
tree is generated, because that converts the temp from persistent to normal }
|
||||||
if not(cnf_return_value_used in callnodeflags) then
|
if not(cnf_return_value_used in callnodeflags) then
|
||||||
begin
|
begin
|
||||||
case location.loc of
|
do_release_unused_return_value;
|
||||||
LOC_REFERENCE :
|
|
||||||
begin
|
|
||||||
if is_managed_type(resultdef) then
|
|
||||||
hlcg.g_finalize(current_asmdata.CurrAsmList,resultdef,location.reference);
|
|
||||||
tg.ungetiftemp(current_asmdata.CurrAsmList,location.reference);
|
|
||||||
end;
|
|
||||||
else
|
|
||||||
release_unused_return_value_cpu;
|
|
||||||
end;
|
|
||||||
if (retloc.intsize<>0) then
|
if (retloc.intsize<>0) then
|
||||||
paramanager.freecgpara(current_asmdata.CurrAsmList,retloc);
|
paramanager.freecgpara(current_asmdata.CurrAsmList,retloc);
|
||||||
location_reset(location,LOC_VOID,OS_NO);
|
location_reset(location,LOC_VOID,OS_NO);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@ interface
|
|||||||
|
|
||||||
tx86callnode = class(tcgcallnode)
|
tx86callnode = class(tcgcallnode)
|
||||||
protected
|
protected
|
||||||
procedure release_unused_return_value_cpu;override;
|
procedure do_release_unused_return_value;override;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -51,7 +51,7 @@ implementation
|
|||||||
TX86CALLNODE
|
TX86CALLNODE
|
||||||
*****************************************************************************}
|
*****************************************************************************}
|
||||||
|
|
||||||
procedure tx86callnode.release_unused_return_value_cpu;
|
procedure tx86callnode.do_release_unused_return_value;
|
||||||
begin
|
begin
|
||||||
case location.loc of
|
case location.loc of
|
||||||
LOC_FPUREGISTER :
|
LOC_FPUREGISTER :
|
||||||
@ -59,7 +59,9 @@ implementation
|
|||||||
{ release FPU stack }
|
{ release FPU stack }
|
||||||
emit_reg(A_FSTP,S_NO,NR_FPU_RESULT_REG);
|
emit_reg(A_FSTP,S_NO,NR_FPU_RESULT_REG);
|
||||||
tcgx86(cg).dec_fpu_stack;
|
tcgx86(cg).dec_fpu_stack;
|
||||||
end;
|
end
|
||||||
|
else
|
||||||
|
inherited do_release_unused_return_value;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user