From c163a327d709d046d8d299f45db6197d8b838ec9 Mon Sep 17 00:00:00 2001 From: Jonas Maebe Date: Wed, 31 Aug 2011 19:20:59 +0000 Subject: [PATCH] * fixed abstract method accounting for external Objective-C/Java classes: in that case if an "override" directive is missing but we interpret the declaration as an "override" anyway, make sure to replace the vmtpd with the overriding definition or child classes will keep seeing the abstract method in the base class and keep decreasing their abstract method count below zero * only decrease the abstract method count in case we're not processing category methods git-svn-id: branches/jvmbackend@18923 - --- compiler/nobj.pas | 39 +++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/compiler/nobj.pas b/compiler/nobj.pas index cd71c13bb3..6a14f69652 100644 --- a/compiler/nobj.pas +++ b/compiler/nobj.pas @@ -356,16 +356,23 @@ implementation { no new entry, but copy the message name if any from the procdef in the parent class } check_msg_str(vmtpd,pd); - { in case of Java, copy the real name from the parent, - since overriding "Destroy" with "destroy" is not - going to work very well } - if is_java_class_or_interface(_class) and - (pd.procsym.realname<>vmtpd.procsym.realname) then - pd.procsym.realname:=vmtpd.procsym.realname; - { in case we are overriding an abstract method, - decrease the number of abstract methods in this class } - if (po_abstractmethod in vmtpd.procoptions) then - dec(tobjectdef(pd.owner.defowner).abstractcnt); + if updatevalues then + begin + { in case of Java, copy the real name from the parent, + since overriding "Destroy" with "destroy" is not + going to work very well } + if is_java_class_or_interface(_class) and + (pd.procsym.realname<>vmtpd.procsym.realname) then + pd.procsym.realname:=vmtpd.procsym.realname; + { in case we are overriding an abstract method, + decrease the number of abstract methods in this class } + if (po_abstractmethod in vmtpd.procoptions) then + dec(tobjectdef(pd.owner.defowner).abstractcnt); + if (vmtpd.extnumber<>i) then + internalerror(2011083101); + pd.extnumber:=vmtpd.extnumber; + vmtpd:=pd; + end; result:=true; exit; {$ifdef jvm} @@ -424,15 +431,15 @@ implementation vmtentryvis:=pd.visibility; end; - { in case we are overriding an abstract method, - decrease the number of abstract methods in this class } - if (po_overridingmethod in pd.procoptions) and - (po_abstractmethod in vmtpd.procoptions) then - dec(tobjectdef(pd.owner.defowner).abstractcnt); - { override old virtual method in VMT } if updatevalues then begin + { in case we are overriding an abstract method, + decrease the number of abstract methods in this class } + if (po_overridingmethod in pd.procoptions) and + (po_abstractmethod in vmtpd.procoptions) then + dec(tobjectdef(pd.owner.defowner).abstractcnt); + if (vmtpd.extnumber<>i) then internalerror(200611084); pd.extnumber:=vmtpd.extnumber;