[fpc-pascal] Sigsegv with refcounting interface
Joao Morais
jcmoraisjr at gmail.com
Sun Mar 10 19:47:54 CET 2013
On Sat, Mar 9, 2013 at 8:33 AM, Jonas Maebe <jonas.maebe at elis.ugent.be> wrote:
>
> On 09 Mar 2013, at 02:37, Joao Morais wrote:
>>
>> On Fri, Mar 8, 2013 at 4:09 PM, Flávio Etrusco <flavio.etrusco at gmail.com>
>> wrote:
>>>
>>> [...]
>>>
>>
>> You are suggesting that this unlikely coincidente which causes a
>> sigsegv should be the programmer's responsibility. No thanks, I much
>> more prefer the Delphi compatibility =)
>
> It indeed only works by accident in your Delphi code.
I see your point and this helped me find what's helping delphi work by
accident, thanks for that. It's nice to see that the code bellow also
fails when compiled with delphi. =)
> We don't aim for compatibility as far as providing the same behaviour
> for code of which the result is undefined.
I fully agree with you: code which results in an undefined behavior is
a programmer's responsibility. I was talking about some refcounting
management which doesn't exist. It's clear now that this scenario is
like memory leak because of circular references: another issue of
refcounted objects.
Anyway I'd like to see some fixes in the rtl, not because of
compatibility but because of performance improvement: not declaring
refcounted parameters such as ansi strings and com interfaces will
lead to useless calls to incref and decref. Should I open a bug report
for this improvement for some popular classes (ie this may be changed
in thunk)?
Joao Morais
=====================
program project1;
{$ifdef fpc}{$mode objfpc}{$H+}{$endif}
// declare "breakcode" to break the code =)
{.$define breakcode}
uses
{$ifdef fpc}heaptrc{$else}fastmm4{$endif},
sysutils, Classes;
{$ifndef fpc}
type
PtrUInt = longint;
{$endif}
procedure stuff({$ifndef breakcode}const{$endif} v: IUnknown);
begin
writeln('current: ', PtrUInt(v));
end;
var
vintfl: TInterfaceList;
procedure addintf(const aintf: IUnknown);
begin
writeln('calling stuff...');
stuff(aintf);
writeln('calling indexOf');
if vintfl.IndexOf(aintf) = -1 then
begin
writeln('adding to intflist...');
vintfl.Add(aintf);
end;
end;
begin
vintfl := TInterfaceList.Create;
try
writeln('starting...');
addintf(TInterfacedObject.Create);
writeln('success!');
finally
FreeAndNil(vintfl);
end;
end.
More information about the fpc-pascal
mailing list