[fpc-devel] Need patch for bugs : 0011503 / 0009472
Jonas Maebe
jonas.maebe at elis.ugent.be
Sun Jun 22 23:52:46 CEST 2008
On 22 Jun 2008, at 23:30, Boian Mitov wrote:
> I mean it was not working when the optimization was on. They did not
> have option to turn the optimization off.
No, it can only work when the optimization is on in FPC. To recap:
a) in both FPC and Delphi, temps (regardless of their type) are never
automatically finalized immediately after their last use, so they can
retain references for a while
b) Delphi optimizes (possibly regardless of its optimization switch
state) assignments of (reference counted) function results to local
variables which cannot escape the current scope so that no temps are
used (and hence no invisible references are created)
c) FPC also optimizes these assignments as of 2.2.2, but under a few
less circumstances than Delphi (see the example I posted with the
nested functions)
d) in case of global variables or local variables which escape the
current scope, both Delphi and FPC create temps which hold invisible
references until these temps are reused for another purpose or go out
of scope (per rule a).
Your programs are coded with the assumption that this optimization is
always performed, which
a) is wrong for both Delphi and FPC in case global variables or local
variables accessed outside their defining scope are used (as has been
demonstrated using various programs posted to this mailing list)
b) is wrong for FPC <= 2.2.0
c) is wrong for all current FPC versions in a few cases where the
compiler can theoretically know that a local variable is not used
outside its defining scope, but where it does not know that at this time
You keep however arguing that it is some mysterious optimization in
FPC which causes the difference in behaviour (while it's actually a
lack of a particular optimization that causes it), and that Delphi
always does what you want (which it doesn't, as has been demonstrated
using the example programs posted to this list).
Please understand that it is extremely tiring and frustrating to
discuss in this way, because it gives the impression that you simply
do not care about what causes the problem and/or simply are not
listening to what we are trying to say.
So let me repeat one last time: Delphi optimizes assignments of
reference counted function results to local variables which provably
do not escape their defining scope so that they do not need a temp.
FPC does this now also in most, but not all cases. Delphi, just like
FPC, never automatically finalizes temps immediately after every
statement in which they were used.
And while Delphi's optimization results in the behaviour you want for
the code that you have written (and possibly the same behaviour which
is explicitly defined in a number of other languages), it is pure luck
that it does and it will have guaranteed different behaviour if you
use global variables or local variables which can escape their
defining scope. FPC does not guarantee to perform exactly the same
optimizations as Delphi and therefore may also have different
behaviour in a number of cases.
Jonas
More information about the fpc-devel
mailing list