From 8634aa8ad200e09786e033c711a87b66cd5081ad Mon Sep 17 00:00:00 2001 From: Jonas Maebe Date: Sat, 14 Jun 2014 10:35:35 +0000 Subject: [PATCH] * fixes for the support for overriding properties on the JVM target: o only create an accessor wrapping the inherited accessor at a potentially lower visibility level if the overriding property itself does not specify a different accessor to use o simplified code o tests git-svn-id: trunk@27954 - --- .gitattributes | 2 ++ compiler/jvm/symcpu.pas | 60 ++++++++++++++------------------------ compiler/pdecvar.pas | 8 +++-- compiler/symsym.pas | 10 ++++++- tests/test/jvm/testall.bat | 4 +++ tests/test/jvm/testall.sh | 4 +++ tests/test/jvm/tprop6.pp | 40 +++++++++++++++++++++++++ tests/test/jvm/tprop6a.pp | 16 ++++++++++ 8 files changed, 103 insertions(+), 41 deletions(-) create mode 100644 tests/test/jvm/tprop6.pp create mode 100644 tests/test/jvm/tprop6a.pp diff --git a/.gitattributes b/.gitattributes index 607265ddc1..c4db6b0968 100644 --- a/.gitattributes +++ b/.gitattributes @@ -10908,6 +10908,8 @@ tests/test/jvm/tprop3.pp svneol=native#text/plain tests/test/jvm/tprop4.pp svneol=native#text/plain tests/test/jvm/tprop5.pp svneol=native#text/plain tests/test/jvm/tprop5a.pp svneol=native#text/plain +tests/test/jvm/tprop6.pp svneol=native#text/plain +tests/test/jvm/tprop6a.pp svneol=native#text/plain tests/test/jvm/tptrdynarr.pp svneol=native#text/plain tests/test/jvm/tpvar.pp svneol=native#text/plain tests/test/jvm/tpvardelphi.pp svneol=native#text/plain diff --git a/compiler/jvm/symcpu.pas b/compiler/jvm/symcpu.pas index 573bd03a73..0c9290c995 100644 --- a/compiler/jvm/symcpu.pas +++ b/compiler/jvm/symcpu.pas @@ -187,10 +187,11 @@ type visibility, then we have to create a getter and/or setter with that same higher visibility to make sure that using the property does not result in JVM verification errors } - function create_getter_or_setter_for_property(orgaccesspd: tprocdef; getter: boolean): tprocdef; + procedure create_getter_or_setter_for_property(orgaccesspd: tprocdef; getter: boolean); procedure finalize_getter_or_setter_for_sym(getset: tpropaccesslisttypes; sym: tsym; fielddef: tdef; accessordef: tprocdef); override; - procedure register_override(overriddenprop: tpropertysym); override; procedure maybe_create_overridden_getter_or_setter(getset: tpropaccesslisttypes); + public + procedure inherit_accessor(getset: tpropaccesslisttypes); override; end; tcpupropertysymclass = class of tcpupropertysym; @@ -224,7 +225,7 @@ implementation tcpuproptertysym ****************************************************************************} - function tcpupropertysym.create_getter_or_setter_for_property(orgaccesspd: tprocdef; getter: boolean): tprocdef; + procedure tcpupropertysym.create_getter_or_setter_for_property(orgaccesspd: tprocdef; getter: boolean); var obj: tabstractrecorddef; ps: tprocsym; @@ -311,7 +312,6 @@ implementation parentpd.visibility:=visibility; include(parentpd.procoptions,po_auto_raised_visibility); end; - result:=parentpd; { we are done, no need to create a wrapper } exit end @@ -344,7 +344,10 @@ implementation finish_copied_procdef(pd,parentpd.procsym.realname,obj.symtable,obj); exclude(pd.procoptions,po_external); pd.synthetickind:=tsk_anon_inherited; - result:=pd; + { set the accessor in the property } + propaccesslist[accesstyp].clear; + propaccesslist[accesstyp].addsym(sl_call,pd.procsym); + propaccesslist[accesstyp].procdef:=pd; exit; end; end; @@ -400,7 +403,6 @@ implementation pd.procoptions:=pd.procoptions+procoptions; { visibility } pd.visibility:=visibility; - result:=pd; { new procsym? } if not assigned(sym) or @@ -501,7 +503,7 @@ implementation procedure tcpupropertysym.finalize_getter_or_setter_for_sym(getset: tpropaccesslisttypes; sym: tsym; fielddef: tdef; accessordef: tprocdef); var - orgaccesspd, newaccesspd: tprocdef; + orgaccesspd: tprocdef; pprefix: pshortstring; wrongvisibility: boolean; begin @@ -510,7 +512,6 @@ implementation pprefix:=@prop_auto_getter_prefix else pprefix:=@prop_auto_setter_prefix; - newaccesspd:=nil; case sym.typ of procsym: begin @@ -523,7 +524,7 @@ implementation if wrongvisibility or ((pprefix^<>'') and (sym.RealName<>pprefix^+RealName)) then - newaccesspd:=create_getter_or_setter_for_property(orgaccesspd,getset=palt_read) + create_getter_or_setter_for_property(orgaccesspd,getset=palt_read) end; fieldvarsym: begin @@ -533,43 +534,17 @@ implementation which the property is visibile } if (pprefix^<>'') or (tfieldvarsym(sym).visibilityprocsym then - internalerror(2014061201); - propaccesslist[getset].procdef:=newaccesspd; - propaccesslist[getset].firstsym^.sym:=newaccesspd.procsym; - end; - end; - - - procedure tcpupropertysym.register_override(overriddenprop: tpropertysym); - var - sym: tsym; - begin - inherited; - { new property has higher visibility than previous one -> maybe override - the getters/setters } - if (overriddenprop.visibility=visibility then exit; - fielddef:=nil; end; fieldvarsym: begin if sym.visibility>=visibility then exit; accessordef:=nil; - fielddef:=tfieldvarsym(sym).vardef; end; else internalerror(2014061102); @@ -607,6 +580,17 @@ implementation end; + procedure tcpupropertysym.inherit_accessor(getset: tpropaccesslisttypes); + begin + inherited; + { new property has higher visibility than previous one -> maybe override + the getters/setters } + if assigned(overriddenpropsym) and + (overriddenpropsym.visibility4 then + halt(1); + d:=tderivedclassprop6.create; + d.level:=5; + halt(d.level-6); +end.