mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-13 13:09:16 +02:00
* 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 -
This commit is contained in:
parent
1a7c024ad3
commit
c163a327d7
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user