diff --git a/compiler/jvm/cpupara.pas b/compiler/jvm/cpupara.pas index ff7c95a57a..cb5be514fa 100644 --- a/compiler/jvm/cpupara.pas +++ b/compiler/jvm/cpupara.pas @@ -147,6 +147,10 @@ implementation function TJVMParaManager.ret_in_param(def: tdef; calloption: tproccalloption): boolean; begin + { not as efficient as returning in param for jvmimplicitpointertypes, + but in the latter case the routines are harder to use from Java + (especially for arrays), because the caller then manually has to + allocate the instance/array of the right size } Result:=false; end; diff --git a/compiler/jvm/njvmcal.pas b/compiler/jvm/njvmcal.pas index 5502f60ea9..ef004b3731 100644 --- a/compiler/jvm/njvmcal.pas +++ b/compiler/jvm/njvmcal.pas @@ -80,7 +80,12 @@ implementation procedure tjvmcallnode.set_result_location(realresdef: tstoreddef); begin location_reset_ref(location,LOC_REFERENCE,def_cgsize(realresdef),1); - tg.gethltemp(current_asmdata.CurrAsmList,realresdef,realresdef.size,tt_normal,location.reference); + { in case of jvmimplicitpointertype(), the function will have allocated + it already and we don't have to allocate it again here } + if not jvmimplicitpointertype(realresdef) then + tg.gethltemp(current_asmdata.CurrAsmList,realresdef,realresdef.size,tt_normal,location.reference) + else + tg.gethltemp(current_asmdata.CurrAsmList,java_jlobject,java_jlobject.size,tt_normal,location.reference); end;