* 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:
Jonas Maebe 2011-08-20 07:46:31 +00:00
parent 1ace6ec201
commit e2e32fbbe9
3 changed files with 19 additions and 19 deletions

View File

@ -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:

View File

@ -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;

View File

@ -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;