[fpc-pascal] Header translation, argument list, array of const?

Sven Barth pascaldragon at googlemail.com
Sat Jun 30 13:59:05 CEST 2012


Am 30.06.2012 12:50 schrieb "Bernd" <prof7bit at gmail.com>:
>
> 2012/6/30 Sven Barth <pascaldragon at googlemail.com>:
>
> > Your explanation is very nice and mostly correct, but in case of
external
> > cdecl functions in FPC the "varargs" modifier and a "array of const"
> > parameter imply the same C compatible parameter passing in the
compiler. See
> > also here:
> > http://freepascal.org/docs-html/ref/refsu77.html#x180-19000014.9.17
> >
> > The only difference is when calling the functions. E.g.:
> >
> > procedure a(args: array of const); cdecl; external;
> > procedure b; cdecl; varargs; external;
> >
> > begin
> >   a([1, 'foo', somevar]);
> >   b(1, 'foo', somevar);
> > end.
>
> This means in my case I declared the external function correctly and
> only need to pass
> [nil]
> to make it a null terminated list? Because I tried this last night and
> looked at the generated assembler and if I for example call it with
>
>   purple_prpl_got_user_status(@self, Pointer(AName),
> Pointer(AStatusID), [1,2,3,nil]);
>
> then it will generate the following code:
>
> 0162EF17 6a00                     push   $0x0
> 0162EF19 6a03                     push   $0x3
> 0162EF1B 6a02                     push   $0x2
> 0162EF1D 6a01                     push   $0x1
> 0162EF1F ff75f8                   pushl  -0x8(%ebp)
> 0162EF22 ff75fc                   pushl  -0x4(%ebp)
> 0162EF25 8b45f4                   mov    -0xc(%ebp),%eax
> 0162EF28 50                       push   %eax
> 0162EF29 e8b20afaff               call   0x15cf9e0
> <purple_prpl_got_user_status at plt>
>
> so its just just pushing the contents of the list onto the stack as
> they are and If I pass [] there would be nothing pushed at all, so the
> right thing for me to do in this case would be to call it with
>
>   purple_prpl_got_user_status(@self, Pointer(AName), Pointer(AStatusID),
[nil]);
>
> 0162EF17 6a00                     push   $0x0
> 0162EF19 ff75f8                   pushl  -0x8(%ebp)
> 0162EF1C ff75fc                   pushl  -0x4(%ebp)
> 0162EF1F 8b45f4                   mov    -0xc(%ebp),%eax
> 0162EF22 50                       push   %eax
> 0162EF23 e8b80afaff               call   0x15cf9e0
> <purple_prpl_got_user_status at plt>
>
> so that it will push exactly one zero onto the stack, so it gets what
> it wants (an empty null-terminated list)? Then my only mistake was to
> assume that [] would automatically generate a null terminated list
> (for automagic[TM]  C-friendlyness) just like strings do?

I have now looked at your mail again. Normally you don't need to explicitly
pass a "Nil" (whatever of the earlier mentioned variants you chose) as e.g.
for printf the following works:

printf("%d %d %d", 1, 2, 3);

or

printf("%d %d %d", [1, 2, 3]);

(depending on the declaration)

But the comment above the original C function you mentioned in your initial
mail explicitly states that you must pass a Null-terminated list, which the
compiler doesn't do by itself. Maybe that is told to GCC by the
G_GNUC_NULL_TERMINATED define (whatever it resolves to...)

Nevertheless passing a Nil at the end should be the correct approach in
your specific case.

Regards,
Sven
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20120630/a2b3c49d/attachment.html>


More information about the fpc-pascal mailing list