Неправильная передача параметров при SafeCall

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Неправильная передача параметров при SafeCall

Сообщение Max Rusov » 13.04.2011 11:18:04

Есть 2 процедуры:

Код: Выделить всё
procedure ProcVar1(const A :OleVariant); stdcall;
procedure ProcVar2(const A :OleVariant); safecall;


При вызове первой аргумент передается по ссылке (это правильно) при вызове второй - по значению :(. Это приводит к неработоспособности ADO хидеров.

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
Max Rusov
постоялец
 
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Re: Неправильная передача параметров при SafeCall

Сообщение Sergei I. Gorelkin » 13.04.2011 12:53:50

Нет, не исправлено. Зато там появился модификатор constref, заставляющий таки передавать константу по ссылке.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Неправильная передача параметров при SafeCall

Сообщение Max Rusov » 13.04.2011 14:09:21

Так при stdcall - и так по ссылке. Constref - только для safecall? Как то мутно. Не правильнее ли исправить, ведь это явная ошибка?...
Max Rusov
постоялец
 
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Re: Неправильная передача параметров при SafeCall

Сообщение Sergei I. Gorelkin » 13.04.2011 14:54:18

Да, это довольно мутный вопрос. Модификатор const не обязывает передавать параметр по ссылке (он с вызывающей стороны вообще ничего не обязывает), а safecall "внутри" является stdcall только в win32. В linux32 он превращается в cdecl, а для cdecl все, что <=16 байт передается по значению вне зависимости от наличия const. А в 64-битных системах нет ни cdecl, ни stdcall, там отдельная история.

Так что исправить это можно, но исправится при этом только win32. Для кроссплатформенности предполагается применение constref, в том числе и с stdcall.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Неправильная передача параметров при SafeCall

Сообщение Max Rusov » 13.04.2011 15:03:33

Sergei I. Gorelkin писал(а):Так что исправить это можно, но исправится при этом только win32.

Это было бы логично. В режиме {$Mode Delphi} как то не ждешь подобных граблей...
Max Rusov
постоялец
 
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Re: Неправильная передача параметров при SafeCall

Сообщение Sergei I. Gorelkin » 15.04.2011 16:11:25

Исправил в ревизии 17323.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 1

Рейтинг@Mail.ru
cron