From 254636ab84fdf920fa8c96ee94b319a75dab9454 Mon Sep 17 00:00:00 2001 From: Jonas Maebe Date: Sat, 20 Aug 2011 07:58:09 +0000 Subject: [PATCH] * don't create (useless) temporary array/record/... for the result of functions at the caller side, since these will already be allocated at the callee side * added comment to cpupara explaining why we never allocate the function result on the caller side and then pass it as an invisible parameter, but instead always let the callee allocate it git-svn-id: branches/jvmbackend@18420 - --- compiler/jvm/cpupara.pas | 4 ++++ compiler/jvm/njvmcal.pas | 7 ++++++- 2 files changed, 10 insertions(+), 1 deletion(-) 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;