mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-04 04:39:28 +01:00 
			
		
		
		
	+ stubbed formal const/var/out support
git-svn-id: branches/jvmbackend@18552 -
This commit is contained in:
		
							parent
							
								
									d7e78b9f95
								
							
						
					
					
						commit
						58d7a86252
					
				@ -27,7 +27,7 @@ interface
 | 
			
		||||
 | 
			
		||||
    uses
 | 
			
		||||
      cgbase,
 | 
			
		||||
      symdef,
 | 
			
		||||
      symtype,symdef,
 | 
			
		||||
      ncgcal;
 | 
			
		||||
 | 
			
		||||
    type
 | 
			
		||||
@ -35,7 +35,10 @@ interface
 | 
			
		||||
       tjvmcallparanode = class(tcgcallparanode)
 | 
			
		||||
        protected
 | 
			
		||||
         outcopybasereg: tregister;
 | 
			
		||||
         procedure push_formal_para; override;
 | 
			
		||||
         procedure push_copyout_para; override;
 | 
			
		||||
 | 
			
		||||
         procedure load_arrayref_para(useparadef: tdef);
 | 
			
		||||
       end;
 | 
			
		||||
 | 
			
		||||
       { tjvmcallnode }
 | 
			
		||||
@ -53,7 +56,7 @@ implementation
 | 
			
		||||
 | 
			
		||||
    uses
 | 
			
		||||
      verbose,globtype,
 | 
			
		||||
      symconst,symtype,defutil,ncal,
 | 
			
		||||
      symconst,defutil,ncal,
 | 
			
		||||
      cgutils,tgobj,procinfo,
 | 
			
		||||
      cpubase,aasmdata,aasmcpu,
 | 
			
		||||
      hlcgobj,hlcgcpu,
 | 
			
		||||
@ -64,23 +67,11 @@ implementation
 | 
			
		||||
                           TJVMCALLPARANODE
 | 
			
		||||
*****************************************************************************}
 | 
			
		||||
 | 
			
		||||
    procedure tjvmcallparanode.push_copyout_para;
 | 
			
		||||
    procedure tjvmcallparanode.load_arrayref_para(useparadef: tdef);
 | 
			
		||||
      var
 | 
			
		||||
        mangledname: string;
 | 
			
		||||
        primitivetype: boolean;
 | 
			
		||||
        opc: tasmop;
 | 
			
		||||
        arrayloc: tlocation;
 | 
			
		||||
        arrayref: treference;
 | 
			
		||||
      begin
 | 
			
		||||
        { create an array with one element of the parameter type }
 | 
			
		||||
        thlcgjvm(hlcg).a_load_const_stack(current_asmdata.CurrAsmList,s32inttype,1,R_INTREGISTER);
 | 
			
		||||
        mangledname:=jvmarrtype(left.resultdef,primitivetype);
 | 
			
		||||
        if primitivetype then
 | 
			
		||||
          opc:=a_newarray
 | 
			
		||||
        else
 | 
			
		||||
          opc:=a_anewarray;
 | 
			
		||||
        { doesn't change stack height: one int replaced by one reference }
 | 
			
		||||
        current_asmdata.CurrAsmList.concat(taicpu.op_sym(opc,current_asmdata.RefAsmSymbol(mangledname)));
 | 
			
		||||
        { cannot be a regular array or record, because those are passed by
 | 
			
		||||
          plain reference (since they are reference types at the Java level,
 | 
			
		||||
          but not at the Pascal level) -> no special initialisation necessary }
 | 
			
		||||
@ -93,7 +84,7 @@ implementation
 | 
			
		||||
          out-parameter; if it's an out-parameter the contents must be nil
 | 
			
		||||
          but that's already ok, since the anewarray opcode takes care of that }
 | 
			
		||||
        if (parasym.varspez<>vs_out) then
 | 
			
		||||
          hlcg.a_load_loc_ref(current_asmdata.CurrAsmList,left.resultdef,left.resultdef,left.location,arrayref);
 | 
			
		||||
          hlcg.a_load_loc_ref(current_asmdata.CurrAsmList,useparadef,useparadef,left.location,arrayref);
 | 
			
		||||
 | 
			
		||||
        { store the array reference into the parameter location (don't change
 | 
			
		||||
          left.location, we may need it for copy-back after the call) }
 | 
			
		||||
@ -103,6 +94,37 @@ implementation
 | 
			
		||||
      end;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    procedure tjvmcallparanode.push_formal_para;
 | 
			
		||||
      var
 | 
			
		||||
        primitivetype: boolean;
 | 
			
		||||
      begin
 | 
			
		||||
        { create an array with one element of JLObject }
 | 
			
		||||
        thlcgjvm(hlcg).a_load_const_stack(current_asmdata.CurrAsmList,s32inttype,1,R_INTREGISTER);
 | 
			
		||||
        { left is either an object-derived type, or has been boxed into one }
 | 
			
		||||
        current_asmdata.CurrAsmList.concat(taicpu.op_sym(a_anewarray,current_asmdata.RefAsmSymbol(jvmarrtype(java_jlobject,primitivetype))));
 | 
			
		||||
        load_arrayref_para(java_jlobject);
 | 
			
		||||
      end;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    procedure tjvmcallparanode.push_copyout_para;
 | 
			
		||||
      var
 | 
			
		||||
        mangledname: string;
 | 
			
		||||
        primitivetype: boolean;
 | 
			
		||||
        opc: tasmop;
 | 
			
		||||
      begin
 | 
			
		||||
        { create an array with one element of the parameter type }
 | 
			
		||||
        thlcgjvm(hlcg).a_load_const_stack(current_asmdata.CurrAsmList,s32inttype,1,R_INTREGISTER);
 | 
			
		||||
        mangledname:=jvmarrtype(left.resultdef,primitivetype);
 | 
			
		||||
        if primitivetype then
 | 
			
		||||
          opc:=a_newarray
 | 
			
		||||
        else
 | 
			
		||||
          opc:=a_anewarray;
 | 
			
		||||
        { doesn't change stack height: one int replaced by one reference }
 | 
			
		||||
        current_asmdata.CurrAsmList.concat(taicpu.op_sym(opc,current_asmdata.RefAsmSymbol(mangledname)));
 | 
			
		||||
        load_arrayref_para(left.resultdef);
 | 
			
		||||
      end;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{*****************************************************************************
 | 
			
		||||
                             TJVMCALLNODE
 | 
			
		||||
*****************************************************************************}
 | 
			
		||||
@ -207,14 +229,26 @@ implementation
 | 
			
		||||
                    pararef.base:=ppn.outcopybasereg;
 | 
			
		||||
                    pararef.indexoffset:=0;
 | 
			
		||||
                    { the value has to be copied back into persistent storage }
 | 
			
		||||
                    case ppn.left.location.loc of
 | 
			
		||||
                      LOC_REFERENCE:
 | 
			
		||||
                        hlcg.a_load_ref_ref(current_asmdata.CurrAsmList,ppn.left.resultdef,ppn.left.resultdef,pararef,ppn.left.location.reference);
 | 
			
		||||
                      LOC_CREGISTER:
 | 
			
		||||
                        hlcg.a_load_ref_reg(current_asmdata.CurrAsmList,ppn.left.resultdef,ppn.left.resultdef,pararef,ppn.left.location.register);
 | 
			
		||||
                    if (ppn.parasym.vardef.typ<>formaldef) then
 | 
			
		||||
                      begin
 | 
			
		||||
                        case ppn.left.location.loc of
 | 
			
		||||
                          LOC_REFERENCE:
 | 
			
		||||
                            hlcg.a_load_ref_ref(current_asmdata.CurrAsmList,ppn.left.resultdef,ppn.left.resultdef,pararef,ppn.left.location.reference);
 | 
			
		||||
                          LOC_CREGISTER:
 | 
			
		||||
                            hlcg.a_load_ref_reg(current_asmdata.CurrAsmList,ppn.left.resultdef,ppn.left.resultdef,pararef,ppn.left.location.register);
 | 
			
		||||
                        else
 | 
			
		||||
                          internalerror(2011051201);
 | 
			
		||||
                        end;
 | 
			
		||||
                      end
 | 
			
		||||
                    else
 | 
			
		||||
                      internalerror(2011051201);
 | 
			
		||||
                    end;
 | 
			
		||||
                      begin
 | 
			
		||||
{$ifndef nounsupported}
 | 
			
		||||
                        { to do: extract value from boxed parameter or load
 | 
			
		||||
                          value back }
 | 
			
		||||
{$else}
 | 
			
		||||
                        internalerror(2011051901);
 | 
			
		||||
{$endif}
 | 
			
		||||
                      end;
 | 
			
		||||
                  end;
 | 
			
		||||
              end;
 | 
			
		||||
            ppn:=tjvmcallparanode(ppn.right);
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user