[fpc-devel] QueryInterface on linux/i386 - adding 'in' parameter type?

Michael Van Canneyt michael at freepascal.org
Sun Aug 29 16:41:45 CEST 2010



On Sun, 29 Aug 2010, Jonas Maebe wrote:

>
> On 29 Aug 2010, at 16:10, Michael Van Canneyt wrote:
>
>> What does stdcall calling convention currently do on non-windows platforms ?
>
> The same as on Windows.

But we are under no obligation to have this so ?

Does a C compiler (gcc) under linux understand 'stdcall' ?

>> I think that having to write
>>  {$ifdef windows}const{$else}constref{$endif} myarg: mytype
>> for possibly thousands of arguments in an interface description is simply not
>> an option.
>
> That would not be necessary:
> a) constref would be correct both for Windows and non-Windows

Yes, but is unusable in the cases where source code is shared between Delphi and FPC, such as the Gecko sources.

I simplified the example, maybe the following would have been more clear:

{$ifndef fpc}const{$else}constref{$endif} myarg: mytype

I implicitly assumed that FPC would be used for any non-windows platform.

> b) I'm not aware of a single routine that uses stdcall on non-Windows, other than the AddRef and ReleaseRef routines mentioned at the start of this discussion

Well, there are in the Gecko interface:

sEnumerators.pas:    function HasMoreElements(out _retval: PRBool): nsresult; stdcall;
nsEnumerators.pas:    function GetNext(out _retval: nsISupports_std19): nsresult; stdcall;
nsErrorUtils.pas:                aStringBundleURL: PAnsiChar): nsresult; stdcall;
nsErrorUtils.pas:                aErrorModule: PRInt16): nsresult; stdcall;
nsErrorUtils.pas:                out aResult: PAnsiChar): nsresult; stdcall;
nsErrorUtils.pas:                aStringBundleKey: PAnsiChar): nsresult; stdcall;
nsErrorUtils.pas:                aError: nsresult): nsresult; stdcall;
nsErrorUtils.pas:                out aResult: PAnsiChar): nsresult; stdcall;
nsInit.pas:    function CallMethod(aMethodIndex: PRUint16; const aInfo: XPTMethodDescriptor; aParams: PXPTCMiniVariantArray): nsresult; stdcall;
nsInit.pas:  XPCOMExitRoutine = function : Longword; stdcall;
nsInit.pas:  nsIDirectoryServiceProvider_stdcall = interface(nsISupports)
nsInit.pas:    function GetFile(const prop: PAnsiChar; out persistent: PRBool; out AFile: nsIFile): nsresult; stdcall;
nsInit.pas:                                  nsIDirectoryServiceProvider_stdcall)
nsInit.pas:    function GetFile(const prop: PAnsiChar; out persistent: PRBool; out AFile: nsIFile): nsresult; stdcall;
nsThreadUtils.pas:    function acceptEvent(aEvent: nsIRunnable): PRBool; stdcall;
nsXPCOM.pas:                                out aWriteCount: PRUint32): nsresult; stdcall;
nsXPCOM.pas:                               out aReadCount: PRUint32): nsresult; stdcall;
nsXPCOM.pas:    function Alloc(size: size_t): Pointer; stdcall;
nsXPCOM.pas:    function Realloc(ptr: Pointer; newSize: size_t): Pointer; stdcall;
nsXPCOM.pas:

>
> If you want to apply a custom calling convention to an entire file, that is also already supported using {$calling xxx} (which I'm not very fond of either).

But that is only if none is specified explicitly ?

In each case, a question to Joost is: Why does he need to change IInterface calling convention ?
I see no code in the Gecko/XPCom units that would require this ? Because if it doesn't need to be 
changed, the whole discussion is academic.

Michael.



More information about the fpc-devel mailing list