On Sat, 2 May 2009 01:45:14 +1100 Alexander Klenin <kle...@gmail.com> wrote:
> 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. So far, so good. > 4) If it has setter named "SetP", do the equivalent of "inherited > SetP". Why? "inherited P" should look up P in the ancestor class. The setter of P belongs to the internal implementation of the class. If you want to access the inherited setter, call it with 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 ;-) Mattias _______________________________________________ fpc-devel maillist - fpc-devel@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-devel