On 06 Jun 2010, at 19:28, José Mejuto wrote:

I had found the problem, after a lot of debuging and trying to
understand the underlayed COM interface the bug is in the mozilla
XPCOM or in the fpc undertanding of COM interfaces in Linux. Aside the
fact that under safecall in linux fpc does not call
"fpc_safecallcheck" which I think it should be done to test the EAX
register for errors,

safecall is not supported (= ignored) on non-Windows platforms, because it is completely Windows-specific. Afaik, GCC does not support any safecall calling convention on Linux either.

fpc uses the same exact code under Windows and
Linux but mozilla's XPCOM and I think that finally GCC uses a hybird
calling convention, it is the same as in Linux but the stack must be
cleaned by the caller, not the callee.

That's actually the standard C calling convention, not a hybrid calling convention (= cdecl, as you mention below).

So the same code to work in
Linux (XPCOM) and in Windows:

asm
   mov eax, [TheCOMInterface];
   mov eax,[eax]
   push Intf;
   push IID;
   push ContractID;
   push TheCOMInterface;
   Call [eax]+16;
{$IFDEF LINUX}
   add esp,16;
{$ENDIF}
   call fpc_safecallcheck;
end;

Are you certain when using XPCOM with GCC, it automatically transforms every function so that
a) the result is passed as a hidden parameter by reference
b) the actual function results becomes an error code
c) a check is inserted after every call that checks this error code

?

cdecl that fails (Linux):
-----------------

procedure GetServiceByContractID(const aContractID: PAnsiChar;
                                const aIID: TGUID;
                                out _result); cdecl;

cdecl that works as expected (Linux):
-------------------------------------

procedure GetServiceByContractID(const aContractID: PAnsiChar;
                                const aIID: PGUID;
                                out _result); cdecl;

Changing the TGUID to PGUID and in the call changing the IID by @IID
it works fine.

Could this be considered a bug in fpc interfaces ?

Yes, it is always wrong to assume that "const" enforces passing by reference (except when using the mwpascal calling convention).


Jonas_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to