problem with interface (OOP not widget)

classic Classic list List threaded Threaded
16 messages Options
Reply | Threaded
Open this post in threaded view
|

problem with interface (OOP not widget)

Bee-6
Hi all,

I got problem with the code below.

--->8--- begin code --->8---

program test_intf_query;

{$IFDEF FPC}
   {$MODE OBJFPC}{$H+}
{$ENDIF}

uses
   Classes;

type
   TPLFieldType = (plftUnknown, plftString, plftSmallint, plftInteger,
     plftWord, plftBoolean, plftFloat, plftCurrency, plftBCD, plftDate,
     plftTime, plftDateTime, plftBytes, plftVarBytes, plftAutoInc,
     plftBlob, plftMemo, plftGraphic, plftFmtMemo, plftParadoxOle,
     plftDBaseOle, plftTypedBinary, plftCursor, plftFixedChar,
     plftWideString, plftLargeint, plftADT, plftArray, plftReference,
     plftDataSet, plftOraBlob, plftOraClob, plftVariant, plftInterface,
     plftIDispatch, plftGuid, plftTimeStamp, plftFMTBcd,
     plftFixedWideChar, plftWideMemo, plftOraTimeStamp, plftOraInterval);

   ISimple = interface
   ['{24811FF3-4F01-4601-AC5C-22A5B5D46928}']
     function ShowSomething: Integer; cdecl;
     function GetIsBlob: Boolean; cdecl;
   end;

   TSimple = class(TInterfacedObject, ISimple)
   private
     FDataType: TPLFieldType;
   protected
     { ISimple implementation }
     function ShowSomething: Integer; cdecl;
     function GetIsBlob: Boolean; cdecl;
   end;

{ query ISimple }
function QuerySimple(const OnChange: TNotifyEvent = nil): ISimple;
   cdecl;
begin
   Result := TSimple.Create;
end;

{*** TSimple ***}

function TSimple.ShowSomething: Integer; cdecl;
begin
   Writeln('Message from ISimple');
   Result := 0;
end;

function TSimple.GetIsBlob: Boolean; cdecl;
begin
   Result := FDataType in [
             plftBytes, plftVarBytes, plftBlob, plftMemo, plftGraphic,
             plftFmtMemo, plftParadoxOle, plftDBaseOle, plftTypedBinary,
             plftOraClob, plftOraClob, plftWideMemo
             ];
end;

{*** main program ***}

var
   FSimple: ISimple;

begin
   FSimple := QuerySimple(nil);
   //FSimple := TSimple.Create;

   FSimple.ShowSomething;
end.

--->8--- end code --->8---

FPC failed to compile it. The compiler complained with this message:

test_intf_query.pas(56,26) Error: range check error in set constructor
or duplicate set element

With wonder, I commented line 56. Then the compiler complained with this
message:

test_intf_query.pas(66,14) Fatal: Internal error 200408162

Weird. So, I commented line 66 and uncommented line 67 (just to make it
compilable). It compiled fine. But when it's executed, it ended up with
AV. Here's the output:

bee@simba:~/Programs$ ./test_intf_query
Message from ISimple
An unhandled exception occurred at $0804816C :
EAccessViolation : Access violation
   $0804816C

I'm using FPC 2.2.0, 2.2.1, and 2.3.1 on Ubuntu Gutsy i386. I thought it
was the problem with FPC for Linux, so I tried it with FPC 2.2.0 on
Windows (on exact machine). But, same errors persist on all FPC versions. :(

IMHO, the above code (before modifications to make it compilable) should
be fine. I can't see nothing wrong with it. To make sure, I compiled the
code using Delphi 7 and Turbo Delphi Explorer. Both Delphi compiled fine
and the executable output run without problem.

The actual program actually much bigger than the above, it's a part of a
big framework I've been working on. I cut it and made much simpler to
isolate the problem. FYI, the framework itself initially written using
Delphi 7 and works well. Now, I'm trying to port it to FPC.

Hints? TIA.

-Bee-

has Bee.ography at:
http://beeography.wordpress.com
_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: problem with interface (OOP not widget)

Michael Van Canneyt


On Wed, 23 Jan 2008, Bee wrote:

> Hi all,
>
> I got problem with the code below.
>
> --->8--- begin code --->8---
>
> program test_intf_query;
>
> {$IFDEF FPC}
>   {$MODE OBJFPC}{$H+}
> {$ENDIF}
>
> uses
>   Classes;
>
> type
>   TPLFieldType = (plftUnknown, plftString, plftSmallint, plftInteger,
>     plftWord, plftBoolean, plftFloat, plftCurrency, plftBCD, plftDate,
>     plftTime, plftDateTime, plftBytes, plftVarBytes, plftAutoInc,
>     plftBlob, plftMemo, plftGraphic, plftFmtMemo, plftParadoxOle,
>     plftDBaseOle, plftTypedBinary, plftCursor, plftFixedChar,
>     plftWideString, plftLargeint, plftADT, plftArray, plftReference,
>     plftDataSet, plftOraBlob, plftOraClob, plftVariant, plftInterface,
>     plftIDispatch, plftGuid, plftTimeStamp, plftFMTBcd,
>     plftFixedWideChar, plftWideMemo, plftOraTimeStamp, plftOraInterval);
>
>   ISimple = interface
>   ['{24811FF3-4F01-4601-AC5C-22A5B5D46928}']
>     function ShowSomething: Integer; cdecl;
>     function GetIsBlob: Boolean; cdecl;
>   end;
>
>   TSimple = class(TInterfacedObject, ISimple)
>   private
>     FDataType: TPLFieldType;
>   protected
>     { ISimple implementation }
>     function ShowSomething: Integer; cdecl;
>     function GetIsBlob: Boolean; cdecl;
>   end;
>
> { query ISimple }
> function QuerySimple(const OnChange: TNotifyEvent = nil): ISimple;
>   cdecl;
> begin
>   Result := TSimple.Create;
> end;
>
> {*** TSimple ***}
>
> function TSimple.ShowSomething: Integer; cdecl;
> begin
>   Writeln('Message from ISimple');
>   Result := 0;
> end;
>
> function TSimple.GetIsBlob: Boolean; cdecl;
> begin
>   Result := FDataType in [
>             plftBytes, plftVarBytes, plftBlob, plftMemo, plftGraphic,
>             plftFmtMemo, plftParadoxOle, plftDBaseOle, plftTypedBinary,
>             plftOraClob, plftOraClob, plftWideMemo
You have
  plftOraClob, plftOraClob

2 times the same element. This is not allowed.

Michael.
_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: problem with interface (OOP not widget)

Bee-6
In reply to this post by Bee-6
> I'm using FPC 2.2.0, 2.2.1, and 2.3.1 on Ubuntu Gutsy i386. I thought it
> was the problem with FPC for Linux, so I tried it with FPC 2.2.0 on
> Windows (on exact machine). But, same errors persist on all FPC
> versions. :(

If it is a bug of FPC, I'll file it to Mantis ASAP. Just to make sure
it's not my fault in the first place. :-D

-Bee-

has Bee.ography at:
http://beeography.wordpress.com

_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: problem with interface (OOP not widget)

Bee-6
In reply to this post by Michael Van Canneyt
> You have
>   plftOraClob, plftOraClob
>
> 2 times the same element. This is not allowed.

Arrggghhhh... what a stupid mistake! How can I didn't notice that?! It
should be plftOraClob, plftOraBlob (clob and blob)! Thank you, Michael!
Thank you again for the ultra fast response! :-D

-Bee-

has Bee.ography at:
http://beeography.wordpress.com

_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: problem with interface (OOP not widget)

Bee-6
> Arrggghhhh... what a stupid mistake! How can I didn't notice that?! It
> should be plftOraClob, plftOraBlob (clob and blob)! Thank you, Michael!
> Thank you again for the ultra fast response! :-D

FYI, the fatal internal error still persist. :)

-Bee-

has Bee.ography at:
http://beeography.wordpress.com

_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: problem with interface (OOP not widget)

Bee-6
In reply to this post by Bee-6
> Arrggghhhh... what a stupid mistake! How can I didn't notice that?! It
> should be plftOraClob, plftOraBlob (clob and blob)! Thank you, Michael!
> Thank you again for the ultra fast response! :-D

I must slipped my fingers and eyes during conversion to FPC. I saw the
code in Delphi doesn't have the mistake. How did I do that? I feel so
silly. :-D

-Bee-

has Bee.ography at:
http://beeography.wordpress.com

_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: problem with interface (OOP not widget)

Paul Nicholls
In reply to this post by Bee-6
Hi Bee, perhaps you could try using {$MODE Delphi} instead of {$MODE OBJFPC} since you seem to want Delphi compatibility.

cheers,
Paul

On 23/01/2008, Bee <[hidden email]> wrote:
Hi all,

I got problem with the code below.

--->8--- begin code --->8---

program test_intf_query;

{$IFDEF FPC}
   {$MODE OBJFPC}{$H+}
{$ENDIF}

<SNIP>

 


_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: problem with interface (OOP not widget)

Bee-6
In reply to this post by Bee-6
> With wonder, I commented line 56. Then the compiler complained with this
> message:
>
> test_intf_query.pas(66,14) Fatal: Internal error 200408162

So, may I made a conclusion that this is a bug?

-Bee-

has Bee.ography at:
http://beeography.wordpress.com

_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: problem with interface (OOP not widget)

Bee-6
In reply to this post by Paul Nicholls
> Hi Bee, perhaps you could try using {$MODE Delphi} instead of {$MODE
> OBJFPC} since you seem to want Delphi compatibility.

Problem still persists. :(

-Bee-

has Bee.ography at:
http://beeography.wordpress.com

_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: problem with interface (OOP not widget)

Bee-6
In reply to this post by Bee-6
> So, may I made a conclusion that this is a bug?

http://bugs.freepascal.org/view.php?id=10684

Is there any feasible workaround for this before the bug is fixed? TIA.

-Bee-

has Bee.ography at:
http://beeography.wordpress.com

_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: problem with interface (OOP not widget)

Giuliano Colla
In reply to this post by Bee-6
Bee ha scritto:
>> Hi Bee, perhaps you could try using {$MODE Delphi} instead of {$MODE
>> OBJFPC} since you seem to want Delphi compatibility.
>
> Problem still persists. :(
>
> -Bee-

FWIW. I've met from time to time a Fatal Internal Error with some number
  which might match yours, in perfectly clean code, which used to
compile flawlessly (both when building Lazarus, or building my
applications). It was happening with pfc 2.0.4, it happens now with fpc
2.2.0. With a given release of Lazarus it happens quite frequently, with
the next much less frequently, at random. I didn't report it, because I
was unable to create a reproducible pattern. In my case, just launching
again the compilation (one or two times) without touching anything else
fixed the problem. A variable not properly initialized somewhere in fpc?
I stopped worrying and when the error pops up I just press F9 again, and
it works.
Did you try such a brute force approach?

Giuliano

--
Giuliano Colla

Whenever people agree with me, I always feel I must be wrong (O. Wilde)
_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: problem with interface (OOP not widget)

Bee-6
> Did you try such a brute force approach?

Yup, but with no luck. It's very reproducable, see my report at mantis.
I almost sure that it's about interface things since that it starts the
problem since the beginning. :(

-Bee-

has Bee.ography at:
http://beeography.wordpress.com

_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re[2]: problem with interface (OOP not widget)

José Mejuto
In reply to this post by Bee-6
Hello Bee,

Tuesday, January 29, 2008, 7:44:14 AM, you wrote:

>> So, may I made a conclusion that this is a bug?

B> http://bugs.freepascal.org/view.php?id=10684

B> Is there any feasible workaround for this before the bug is fixed? TIA.

I wrote some small changes to your code and the bug only raises when
calling convention is cdecl and optional parameter default value is
set, but mostly related to "cdecl" and interfaces because as I remove
the "cdecl" everything seens to compile fine in all situations,
meanwhile removing optional parameter can also rise the "bug" if I
perform some type conversions "brute forced".

To workaround I wrote it in this way, adding a new wrapper function:

----------------
function QuerySimple2(const OnChange: TNotifyEvent): ISimple; cdecl;
begin
  Result :=TSimple.Create;
end;

function QuerySimple(const OnChange: TNotifyEvent =nil): ISimple;
begin
  Result :=QuerySimple2(OnChange);
end;
----------------

It is not very elegant, I know :)

--
Best regards,
 JoshyFun                            mailto:[hidden email]

_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: problem with interface (OOP not widget)

Bee-6
In reply to this post by Bee-6
http://bugs.freepascal.org/view.php?id=10684

> Hints? TIA.

I'm currently using a not too elegant workaround to solve this problem.
With some IFDEFs because the workaround is for FPC only.

Nobody seems interested to this bug since there's no response for this
issue in the mantis. I wonder because IMO it's some kind of basic
operation for interface. Or aren't there much pascal developers that
using this technique? Any other better technique for this? TIA.

-Bee-

has Bee.ography at:
http://beeography.wordpress.com

_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: problem with interface (OOP not widget)

Jonas Maebe-2

On 12 Mar 2008, at 05:41, Bee wrote:

> http://bugs.freepascal.org/view.php?id=10684
>
>> Hints? TIA.
>
> I'm currently using a not too elegant workaround to solve this  
> problem. With some IFDEFs because the workaround is for FPC only.

There is no support for passing nil as a constant to a "procedure of  
object" parameter of a cdecl procedure at this time. You can work  
around it by using two overloads (one with a tnotify parameter, one  
without). That should work both in FPC and in Delphi.


Jonas
_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: problem with interface (OOP not widget)

Jonas Maebe-2

On 12 Mar 2008, at 11:02, Jonas Maebe wrote:

> On 12 Mar 2008, at 05:41, Bee wrote:
>
>> http://bugs.freepascal.org/view.php?id=10684
>>
>>> Hints? TIA.
>>
>> I'm currently using a not too elegant workaround to solve this  
>> problem. With some IFDEFs because the workaround is for FPC only.
>
> There is no support for passing nil as a constant to a "procedure of  
> object" parameter of a cdecl procedure at this time. You can work  
> around it by using two overloads (one with a tnotify parameter, one  
> without). That should work both in FPC and in Delphi.

Actually, this is more or less the same as what JoshyFun suggested  
earlier.


Jonas
_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal