[fpc-devel] Safecall on Linux (and other unices?)

Joost van der Sluis joost at cnoc.nl
Wed Jul 21 12:46:32 CEST 2010


On Wed, 2010-07-21 at 11:58 +0200, José Mejuto wrote:

> Wednesday, July 21, 2010, 11:28:55 AM, you wrote:
> 
> JvdS> I've finally managed to get xpcom/gecko to work (partly) on linux/i386.
> JvdS> The delphi/fpc gecko-headers uses the safecall calling convention a
> JvdS> lot. 
> 
> I get it to work too, but missing safecall (unix version) makes it
> unusable as a lot of assembler is needed.

That's not true. I managed to get it to work without any assembler.
(Only used it to debug and some quick tests)

What you have to do is change definitions like:

function Bla(test: tsometype) : tresulttype; safecall;

to:

function Bla(testl: tsometype; _result: tresulttype) : nsresult;
extdecl;

And define the extdecl macro to stdcall on Windows and cdecl on Linux.
Set the nsresult to the right error code to simulate an exception.

> JvdS> On Windows a safecall is in principle a stdcall with a 'hidden' function
> JvdS> result which contains a value (nsresult) to check if there was any
> JvdS> problem during the call of the procedure/function. 
> JvdS> I had to find out what calling convention is used by xpcom on Linux. And
> JvdS> in fact it's quite logical: it uses cdecl. (As most c-libraries do, use
> JvdS> stdcall on Windows, cdecl on others)
> 
> It is not 100% cdecl, const records in safecall must be passed as
> reference while in cdecl a copy of the record is being passed.

I don't think so. The gecko-port-definitions are wrong in this regard.
They use 'const' but it should be 'var'. That this worked on Windows was
just a coincidence. I've replaced these 'const' parameter definitions to
'var' and now they work on Linux and Windows. The headers just weren't
translated right in this regard.

> Please check my bug report:
> http://bugs.freepascal.org/view.php?id=16685 and some messages in
> mailing list:

> http://lists.freepascal.org/lists/fpc-pascal/2010-June/025605.html
> http://lists.freepascal.org/lists/fpc-pascal/2010-June/025609.html
> http://lists.freepascal.org/lists/fpc-pascal/2010-June/025613.html
> http://lists.freepascal.org/lists/fpc-pascal/2010-June/025615.html

That was a good starting point, to find out what the problem was
precisely. Jonas last comment was where I started. But enabling the
exception-handling wasn't enough. Using Safecall on Linut, the caller
has to clean up the stack (on windows the callee does). I don't know yet
how to the latter. 

I don't think the parameter-passing should be changed. Just don't use
'const'. 

> In the other side, I was unable to make Gecko work correctly (windows)
> using Gecko > 1.9.1.11 all 1.9.2.x versions raise a bunch of
> exceptions mostly related to Javascript :( I can run it removing some
> Javascript initialization scripts and disabling Javascript once
> loaded.

I don't know which version I used. Probably the one from the latest
Firefox release. I'll check at home. (tomorrow)

Joost.








More information about the fpc-devel mailing list