mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-08 11:19:36 +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)
|
||||
protected
|
||||
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;
|
||||
end;
|
||||
|
||||
@ -62,7 +62,7 @@ implementation
|
||||
end;
|
||||
|
||||
|
||||
procedure tjvmcallnode.release_unused_return_value_cpu;
|
||||
procedure tjvmcallnode.do_release_unused_return_value;
|
||||
begin
|
||||
case resultdef.size of
|
||||
0:
|
||||
|
@ -81,7 +81,7 @@ interface
|
||||
{ if an unused return value is in another location than a
|
||||
LOC_REFERENCE, this method will be called to perform the necessary
|
||||
cleanups. By default it does not do anything }
|
||||
procedure release_unused_return_value_cpu;virtual;
|
||||
procedure do_release_unused_return_value;virtual;
|
||||
public
|
||||
procedure pass_generate_code;override;
|
||||
destructor destroy;override;
|
||||
@ -316,9 +316,16 @@ implementation
|
||||
end;
|
||||
|
||||
|
||||
procedure tcgcallnode.release_unused_return_value_cpu;
|
||||
procedure tcgcallnode.do_release_unused_return_value;
|
||||
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;
|
||||
|
||||
|
||||
@ -437,20 +444,11 @@ implementation
|
||||
tree is generated, because that converts the temp from persistent to normal }
|
||||
if not(cnf_return_value_used in callnodeflags) then
|
||||
begin
|
||||
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;
|
||||
else
|
||||
release_unused_return_value_cpu;
|
||||
end;
|
||||
do_release_unused_return_value;
|
||||
if (retloc.intsize<>0) then
|
||||
paramanager.freecgpara(current_asmdata.CurrAsmList,retloc);
|
||||
location_reset(location,LOC_VOID,OS_NO);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
|
@ -36,7 +36,7 @@ interface
|
||||
|
||||
tx86callnode = class(tcgcallnode)
|
||||
protected
|
||||
procedure release_unused_return_value_cpu;override;
|
||||
procedure do_release_unused_return_value;override;
|
||||
end;
|
||||
|
||||
|
||||
@ -51,7 +51,7 @@ implementation
|
||||
TX86CALLNODE
|
||||
*****************************************************************************}
|
||||
|
||||
procedure tx86callnode.release_unused_return_value_cpu;
|
||||
procedure tx86callnode.do_release_unused_return_value;
|
||||
begin
|
||||
case location.loc of
|
||||
LOC_FPUREGISTER :
|
||||
@ -59,7 +59,9 @@ implementation
|
||||
{ release FPU stack }
|
||||
emit_reg(A_FSTP,S_NO,NR_FPU_RESULT_REG);
|
||||
tcgx86(cg).dec_fpu_stack;
|
||||
end;
|
||||
end
|
||||
else
|
||||
inherited do_release_unused_return_value;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user