mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-04 03:59:42 +01: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