'Type is not automatable' — не баг ли?

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

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

'Type is not automatable' — не баг ли?

Сообщение Иван Шихалев » 09.11.2010 08:59:59

Нижеследующий код не компилируется. Строковый литерал почему-то не воспринимается как ansistring. Более того, ничего не дает и приведение «ansistring('dummy')», хотя переменная воспринимается нормально. Это я что не так делаю, или баг компилятора?

Код: Выделить всё
{$mode objfpc}

program VError;

var
   v : variant;
   s : ansistring;

begin
  v.lalala(11);       // compiled
  v.blabla(s);        // compiled
  v.ololo('dummy');   // verror.pp(12,17) Error: Type is not automatable: "WideString"
end.


Добавлено спустя 13 минут 9 секунд:
Компилятор 2.5.1 из SVN.
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Re: 'Type is not automatable' — не баг ли?

Сообщение devels » 09.11.2010 09:26:21

ЭЭЭ, значит 2.5.1 компилит строковые константы в WideString типе. Может быть есть какие-то директивы, чтобы поменять это. А Variant видимо не поддерживает widestring.
devels
постоялец
 
Сообщения: 137
Зарегистрирован: 01.09.2010 12:14:38

Re: 'Type is not automatable' — не баг ли?

Сообщение Иван Шихалев » 09.11.2010 10:25:15

Все немного хуже. Он ее внутри воспринимает и не как ansistring и не как widestring (это я малость по исходникам компилятора полазил). Причем, widestring по идее должна автоматизироваться...

К тому же — не срабатывает прямое приведение.
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Re: 'Type is not automatable' — не баг ли?

Сообщение Sergei I. Gorelkin » 09.11.2010 11:01:41

А у меня не получается воспроизвести баг - все компилируется. Компилятор собран из svn 9 дней назад.

Добавлено спустя 1 минуту 33 секунды:
p.s. платформа Win32
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: 'Type is not automatable' — не баг ли?

Сообщение Иван Шихалев » 09.11.2010 11:04:02

Linux 64. Компилятор свежайший...

Добавлено спустя 2 минуты 47 секунд:
Sergei I. Gorelkin писал(а):Компилятор собран из svn 9 дней назад

А номер ревизии какой?
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Re: 'Type is not automatable' — не баг ли?

Сообщение Sergei I. Gorelkin » 09.11.2010 11:13:58

Какой номер ревизии - точно не знаю, но это одна из тех ревизий, которые были 1 ноября, а были 16283, 16287, 16288.

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

Re: 'Type is not automatable' — не баг ли?

Сообщение Иван Шихалев » 09.11.2010 11:25:16

На более ранней 16259 — абсолютно то же самое.
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Re: 'Type is not automatable' — не баг ли?

Сообщение Sergei I. Gorelkin » 09.11.2010 12:00:01

Ага, в linux воспроизводится, с компилятором от июня месяца. И я даже начинаю смутно догадываться о причине...

В линуксе тип WideString идентичен типу UnicodeString, который как раз не automatable ни разу. Оно и в винде ругается при попытке передать аргумент типа UnicodeString.

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

Re: 'Type is not automatable' — не баг ли?

Сообщение Иван Шихалев » 09.11.2010 12:07:02

Однако непонятно, с какой радости строковый литерал — это WideString. А уж тем более, чего вдруг стало WideString'ом выражение «ansistring('ololo')»...
Вообще, сам по себе WideString под Linux не особо актуален.
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Re: 'Type is not automatable' — не баг ли?

Сообщение Max Rusov » 09.11.2010 12:18:35

А что вообще значит 'automation' под linux? Для общего развития...
Max Rusov
постоялец
 
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Re: 'Type is not automatable' — не баг ли?

Сообщение Иван Шихалев » 09.11.2010 12:20:50

Что реализуем, то и значит. Можно реализовать IDispatch, или Custom Variant...
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Re: 'Type is not automatable' — не баг ли?

Сообщение Sergei I. Gorelkin » 09.11.2010 13:01:55

При вызове методов у variant всё, что хотя бы отдаленно напоминает строки, приводится к widestring. А к widestring оно приводится потому, что для них винда предоставляет общий менеджер памяти, так что вызываемая сторона может правильно освободить занимаемую ими память. Вообще используются только такие типы, управление памятью которых "понятно" вызываемой стороне. AnsiString передать нельзя, потому что для ее освобождения нужно вызвать внутреннюю процедуру RTL, которая к тому же своя отдельная для каждого процесса.

То есть изначально язык (Delphi) был завязан на определенную технологию (OLE), потом FPC добросовестно скопировал фичи языка, а потом уходим от винды и получается упс... OLE-то и нету. Есть аналогичные по функциональности библиотеки, но у каждой из них свой собственный тип, аналогичный WideString.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: 'Type is not automatable' — не баг ли?

Сообщение Иван Шихалев » 09.11.2010 14:00:38

Однако AnsiString передать можно.

Добавлено спустя 55 секунд:
В смысле, переменная типа AnsiString вполне себе передается.
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Re: 'Type is not automatable' — не баг ли?

Сообщение Sergei I. Gorelkin » 09.11.2010 14:20:26

Да, действительно. Блин. То есть, правильнее было бы сказать, что не возникает ошибки компиляции, а что там на самом деле передается - отдельный вопрос.

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

Re: 'Type is not automatable' — не баг ли?

Сообщение Иван Шихалев » 09.11.2010 14:25:22

Попробую разобраться, что именно там передается. Если получится. А вообще, ограничение какое-то надуманное — ведь, вообще говоря, в Variant можно завернуть много чего, и никак принимающая сторона не узнает, как там у него память управляется. Возможно, корректный вариант — передавать в автоматизации исключительно как «const ref»... Ну, то есть, документировать так, а как уж принимающая сторона распорядится — ее проблемы :)

Добавлено спустя 5 минут 10 секунд:
Кстати, насчет «что передается»... А где искать структуру последнего параметра DispInvoke?
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

След.

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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru