- Код: Выделить всё
procedure ProcVar1(const A :OleVariant); stdcall;
procedure ProcVar2(const A :OleVariant); safecall;
При вызове первой аргумент передается по ссылке (это правильно) при вызове второй - по значению

FPC 2.4. Исправлено ли это в последующих версиях?
Тест:
- Код: Выделить всё
{$AppType Console}
{$Mode Delphi}
program SafecallTest;
uses
Variants;
procedure ProcVar1(const A :OleVariant); stdcall;
begin
end;
procedure ProcVar2(const A :OleVariant); safecall;
begin
end;
procedure Test;
begin
ProcVar1(EmptyParam);
ProcVar2(EmptyParam);
end;
begin
Test;
end.
- Код: Выделить всё
P$SAFECALLTEST_TEST:
# Temps allocated between ebp-8 and ebp+0
# [19] begin
pushl %ebp
movl %esp,%ebp
subl $8,%esp
movl %esi,-8(%ebp)
movl %edi,-4(%ebp)
# [20] ProcVar1(EmptyParam);
pushl $U_VARIANTS_EMPTYPARAM
call P$SAFECALLTEST_PROCVAR1$OLEVARIANT
# [21] ProcVar2(EmptyParam);
subl $16,%esp
movl %esp,%edi
movl $U_VARIANTS_EMPTYPARAM,%esi
cld
movl $4,%ecx
rep
movsl
call P$SAFECALLTEST_PROCVAR2$OLEVARIANT
call FPC_SAFECALLCHECK
# [22] end;
movl -8(%ebp),%esi
movl -4(%ebp),%edi
leave
ret