[fpc-devel] Assigning to inherited property calls setter of the child class
Alexander Klenin
klenin at gmail.com
Fri May 1 16:45:14 CEST 2009
This mail is to discuss issue http://bugs.freepascal.org/view.php?id=13630.
>From the issue description:
Given the definitions:
type
T1 = class
procedure SetP(AP: Integer); virtual;
property P: Integer read FP write SetP;
end;
T2 = class(T1)
procedure SetP(AP: Integer); override;
end;
procedure T1.SetP(AP: Integer);
begin Writeln('T1.SetP'); end;
procedure T2.SetP(AP: Integer);
begin Writeln('T2.SetP'); inherited P := AP; end;
the assignment t2obj.P := 1 causes infinite recursion,
because "inherited P := AP" calls T2.SetP instead of T1.SetP.
This problem was already reported, fixed, but the fix was reverted:
http://bugs.freepascal.org/view.php?id=10927
http://bugs.freepascal.org/view.php?id=10979
(sorry for not searching the Mantis myself before posting the issue).
However, I believe that the problem in issue 10979 was caused by
incorrect fix to 10927 and it is actually possible (and desirable)
to fix both.
inherited P := V
Should:
1) Search base classes to find the definition of P in some class B.
2) If it is not writable, error out.
3) If it writes to a field, do that.
4) If it has setter named "SetP", do the equivalent of "inherited SetP".
it is the presence vs. absence "inherited" in step 4 that should have
been changed
to fix 10927, but it sounds like a "B.SetP" was used instead, which
caused issue 10979.
Regarding Delphi compatibility -- note that current behavior leads to
stack overflow in both Delphi and FPC, so I doubt there are many programs
relying on it ;-)
--
Alexander S. Klenin
More information about the fpc-devel
mailing list