На официальном сайте FPC с 1 января 2012 г. доступна новая версия компилятора: http://freepascal.org/download.var
Приведу список новых возможностей...
Изменения в языке
1. Добавлена поддержка вложенных типов (в том числе - классов), классовых переменных и локальных констант.
То есть, теперь можно написать так:
type TA = class strict private const Value = 1; // Константа для внутреннего использования
type innerA = class // Вложенный класс, невидимый снаружи // ... end;
public var myVariable : Integer; // Статическая переменная // (принадлежит типу, а не экземпляру) type availableA = class // Вложенный класс, доступный извне // ... end; end;
2. Расширенный синтаксис записей.
То, что в Дельфи называется advanced record syntax, теперь есть и в FPC. В записях можно использовать спецификаторы private/public, можно описывать вложенные типы, конструкторы, статические поля, свойства, классовые конструкторы, классовые деструкторы и классовые операторы (конструкторы записей пока не поддерживаются). На всякий случай, отличия таких расширенных записей от классов: 1) не поддерживается наследование; 2) записи могут содержать вариантные части, классы - нет; 3) записи - это не ссылки, а значения, в отличие от классов.
3. Энумераторы записей.
В предыдущих версиях FPC энумераторы (перечислители) могли быть классами, объектами или интерфейсами. Теперь они могут быть также и расширенными записями.
4. Поддержка хелперов классов и записей.
Это позволяет добавлять методы, свойства и перечислители к классам и записям, не прибегая к наследованию. Пример использования хелпера:
type TObjectHelper = class helper for TObject function ToString(const aFormat: String): String; overload; end;
function TObjectHelper.ToString(const aFormat: String): String; begin Result := Format(aFormat, [ToString]); end;
var Obj: TObject; begin Writeln(Obj.ToString('The object''s name is %s')); end.
Подробное описание - http://wiki.freepascal.org/Helper_types
5. Дженерики: записи, массивы и процедурные типы.
В предыдущих версиях FPC поддерживались только шаблонные (вернее, обобщенные) классы, объекты и интерфейсы. Теперь стало возможным делать обобщенными всё вышеперечисленное.
6. Поддержка локальных перечислений.
В режиме {$SCOPEDENUMS ON} перечисления не добавляются в глобальную область видимости:
begin WriteLn(Integer(Foo)); WriteLn(Integer(A)); // Выводится TFoo.A WriteLn(Integer(TBar.B)); WriteLn(Integer(TBar.Bar)); WriteLn(Integer(Bar)); // Ошибка: нет глобального Bar end;
7. Поддержка собственных сообщений об устаревших элементах.
unit OldUnit deprecated 'Use NewUnit instead';
interface
implementation
procedure OldRoutine; deprecated 'Use NewRoutine instead'; begin end;
end.
(также допустимо использовать с константами)
8. Поддержка диалекта Objective Pascal
Для большего удобства работы в MacOS X. (В настоящее время этот диалект поддерживается только на Darwin-платформах, включая iOS). Основы языка Objective Pascal http://wiki.freepascal.org/FPC_PasCocoa
9. Добавлен режим, поддерживающий стандарт ISO 7185
{$MODE ISO}, или -Miso из командной строки
10. Поддержка вложенных процедурных переменных.
Теперь возможно определить переменную процедурного типа, которая совместима по присваиванию с вложенными процедурами/функциями. Эта фича включена по умолчанию в режимах {$mode MacPas} и {$mode ISO}, в остальных режимах ее надо включить явно: {$modeswitch NestedProcVar}. Возможно также присвоить обычную (не вложенную) подпрограмму подобной переменной, и вызывать ее таким образом.
Разрешение этой фичи изменяет соглашение вызова вложенной подпрограммы. Это "сломает" код времен Турбо-Паскаля, который использует вложенные процедуры/функции как Callback-и при работе с коллекциями из модуля Objects.
Тип процедурной переменной может хранить ссылку на вложенную подпрограмму в двух случаях: а) когда он описан внутри списка параметров другой процедуры (описание в стиле ISO:
procedure caller(procedure ToBeCalled); begin ToBeCalled; end;
procedure Main;
procedure InnerToMain; begin // ... end;
begin { Main } Caller(@InnerToMain); end; { Main }
begin Main; end.
) б) когда в объявлении присутствует "is nested" (подобно описанию "of object" для методов класса):
type NestedProc = procedure is nested; var T : NestedProc;
procedure Caller(p : NestedProc); begin T := p; T; end;
procedure Main;
procedure InnerToMain; begin // ... end;
begin Caller(@InnerToMain); end;
begin Main; end.
При использовании этого способа надо быть внимательным, поскольку очень просто написать неправильный код: если присвоить ссылку на вложенную процедуру соответствующей переменной, выйти из области видимости внешней функции, и только потом попытаться вызвать вложенную - подобный вызов приведет к UB (неопределенному поведению)
11. Поддержка нелокальных Goto (я просто описываю нововведение, нравится оно мне или нет - это другой вопрос)
Теперь возможно перейти по Goto на метку в другой подпрограмме, т.е., быстро выйти из глубоко вложенной подпрограммы в менее вложенную. Эта возможность включена по умолчанию в режимах ISO/MacPas, в остальных - ее надо (а лучше - не надо) включить: {$modeswitch NonLocalGoto}. Невозможно обойти нелокальным Goto стековые фреймы, требующие финализации (во избежание проблем с подсчетом ссылок).
12. Поддержка & для экранирования ключевых слов.
Можно использовать экранированные служебные слова как идентификаторы:
var &do: string; &in: boolean; begin &do:='abc'; &in:=true; end.
13. Поддержка параметров univ для режима MacPas
Предыдущие версии компилятора просто игнорировали квалификатор univ для параметров. Теперь FPC его нормально парсит и интерпретирует как и все другие компиляторы MacPascal-я: то есть, разрешает передачу любых фактических параметров, если их размер соответствует размеру формального параметра подпрограммы. Эта возможность - только для режима {$mode macpas}. Пользоваться ей нужно с большой осторожностью, так как она вообще предназначена для портирования Legacy-кода.
14. Вещественный тип CExtended
С точки зрения точности этот тип аналогичен типу Extended, но он соответствует свойствам/поведению эквивалентного Extended типа в C. С практической точки зрения это означает, что на платформах i386/x86_64 тип CExtended соответствует типу long double, а на остальных платформах - типу double. В основном это необходимо в случаях, когда с С переводятся описания структур, чтобы гарантировать правильное выравнивание, и для описания параметров к Сишным подпрограммам.
Внимание: на данный момент FPC не поддерживает эквивалент long double на других платформах (кроме вышеперечисленных).
15. Встроенный SAR (shift arithmetic right)
В отличие от SHL/SHR, SAR реализован не как оператор, а как встроенная функция. Она имеет разные имена для разных целочисленных типов (SarInt64/SarLongint/SarSmallint) чтобы избежать проблем при присваивании результата функции в выражении.
16. Встроенные ROL/ROR
Вместе с SAR добавлена поддержка и для ROL (Rotate Overflow Left) и ROR (Rotate Overflow Right). Также как и в случае SAR, функции реализованы под разными именами для разных типов параметров.
17. Встроенные функции Bit Scan.
Добавлена поддержка еще двух функций: BSF (Bit Scan Forward) и BSR (Bit Scan Reverse).
18. Типы Boolean16, Boolean32 и Boolean64.
Эти 3 типа аналогичны по поведению стандартному типу Boolean, за исключением того, что их размеры - соответственно 2, 4 и 8 байт. Очень удобно в случае организации интерфейса с библиотеками.
Внимание: существующие типы WordBool/LongBool/QWordBool подразумевают, что False = 0, а True <> 0. В случае использования новых типов False = 0, True = 1, а все остальные значения - не валидны.
Изменения в языке
1. Поддержка VFPv2/VFPv3
Была добавлена поддержка модулей Vector Floating Point (VFP) второй и третьей версии. Эти модули обычно включаются на процессорах семейств Cortex-A8 и Cortex-A9, а также на устройствах, основанных на iOS.
2. Поддержка Thumb-2
Была добавлена поддержка для генерации Thumb-2 кода для ARMv7-M так же, как это реализовано в семействе Cortex-M3.
На данный момент эта архитектура поддерживается только для встроенных (embedded) систем, она еще не работает ни для Linux ни для iOS.
(продолжение следует. Есть еще немало изменений на уровне использования - usage changes - с описаниями, как было, как стало и почему внесено изменение. Чуть позже опишу их тоже подробно)
Автор: IUnknown 5.01.2012 0:50
Продолжаем
Все системы
Изменения в использовании конструкций языка
1. Ключевое слово static теперь разрешено использовать по умолчанию во всех режимах совместимости(Показать/Скрыть)
Раньше: Для использования static нужно было либо компилировать программу с ключом -St, либо использовать директиву {$static on} Теперь: static доступен по умолчанию. Эффект: Ключ -St является устаревшим, а директивы {$static on/off} больше не существуют. Причина: Компилятор теперь в состоянии определить, используется ли static в качестве модификатора или в качестве имени поля. Кроме того, последние версии Дельфи также позволяют использовать этот модификатор безо всяких переключателей. Исправления: поправьте скрипты для сборки и исходники - удалите ключ компилятора -St и директиву {$static}
2. Переключатель режимов POINTERARITHMETICS заменен на директиву POINTERMATH(Показать/Скрыть)
Раньше: Адресная арифметика включалась в режимах FPC/ObjFPC и (частично) Delphi по умолчанию. Для того, чтобы включить использование адресной арифметики в других режимах - нужно было использовать {$modeswitch POINTERARITHMETICS} Теперь: Адресная арифметика включена в режимах FPC/ObjFPC и выключена в Delphi. Для переключения этого режима можно пользоваться новой директивой компилятора {$POINTERMATH on/off}. Типы, описанные при {$POINTERMATH on} также поддерживают адресную арифметику. Эффект: Переключателя POINTERARITHMETICS больше не существует. В режиме Дельфи по молчанию адресная арифметика не работает. Причина: Совместимость с Дельфи Исправления: Проверьте исходники на наличие ключа POINTERARITHMETICS и замените его на директиву POINTERMATH. При работе в режиме совместимости с Дельфи (и необходимости использовать адресную арифметику) не забудьте ее включить.
3. Компилятор больше не ищет утилиты в текущей папке.(Показать/Скрыть)
Раньше: Компилятор сначала осуществлял поиск внешних программ (ассемблер, линкер, компилятор ресурсов, и т.д.) в текущей папке, и только потом переходил к поиску в других местах (папки, указанные в настройках компилятора, попки в переменной PATH) Теперь: Поиск в текущей папке больше не осуществляется, если компилятору не указано явным образом сделать это (при помощи ключа -FD, или включением текущей папки в PATH) Эффект: Причина: Старое поведение было небезопасным, так как подставной модуль с тем же именем, что и вспомогательная утилита, размещенный в текущей папке, мог подвергнуть опасности ваш аккаунт. Исправления: Вынесите служебные утилиты в определенную папку на вашей системе, и добавьте путь к этой папке в PATH. На большинстве систем это дефолтное поведение, так что обычно никаких шагов по этому пункту предпринимать не нужно.
Изменения в языке
1. Передача производных классов через var- и out- параметры(Показать/Скрыть)
Раньше: Если формальным var- или out- параметром подпрограммы был класс, то подпрограмма также принимала через этот параметр экземпляры производных классов. Теперь: Типы классов, передаваемых через var/out параметры должны соответствовать типу формального параметра подпрограммы. Эффект:
procedure test(var a: ta); begin a:=ta.create; // b содержит экземпляр типа ta end;
begin b:=nil; test(b); // следующий вызов может привести к AV // или другим трудно отлаживаемым ошибкам b.dosomething; end.
Несмотря на то, что раньше подобный код прекрасно компилировался, теперь он компилироваться не будет. Причина: Как показано в примере выше, разрешение подобного поведения обходит проверку типов. Это изменение является Дельфи-совместимым. Исправления: Переписывайте весь затронутый код так, чтобы типы формальных/фактических параметров совпадали полностью. Существует способ обхода проверки типов при помощи явного приведения, но использование подобных хаков настоятельно не рекомендуется: полученный код не является типобезопасным
2. Параметры array of const и подпрограммы cdecl(Показать/Скрыть)
Раньше: Можно было иметь не внешние подпрограммы с соглашением cdecl и параметром array of const Теперь: Подпрограммы с соглашением cdecl и указанным типом параметров обязаны быть внешними (external) Эффект: Причина: В FPC добавление параметра array of const к подпрограмме с соглашением вызова cdecl аналогично добавлению модификатора varargs. Это значит, что процедура получает переменное количество аргументов в стиле С. Однако, в Паскале вообще (и в FPC в частности) невозможно получить доступ к этим параметрам на вызываемой стороне. Исправления: Либо уберите соглашение cdecl и используйте Паскалевский array of const, либо реализуйте подпрограмму на С, и добавьте external к объявлению в Паскале.
Раньше: Подобные строки в некоторых случаях тихо отсекались до длины в 255 символов Теперь: Строковые константы длиннее 255 символов либо приводят к ошибке компиляции (при работе в режиме {$H-}), либо генерируется константа типа AnsiString (в режиме {$H+}) Эффект: Причина: Отсекание части строки "втихую" - нежелательное поведение. Исправления: Либо самостоятельно усекайте длинные строковые константы до 255 символов, либо используйте режим {$H+}
Раньше: Компилятор позволял описывать типизированные (ShortString или AnsiString) константы, которым присваивались константы типов WideString или UnicodeString (т.е., символьные константы в форме #$xxx, #$xxxx, #yyy где yyy > 255, или символьные литералы вне диапазона ASCII) Теперь: Компилятор отвергает подобные описания. Эффект:
{$codepage utf8} { Исходник сохранен в кодировке utf-8 }
Все три описания раньше были совершенно легальными, сейчас все три будут отвергнуты. Причины: 1) строка, присвоенная s1 закодирована как UTF8, и содержит не-ASCII символы. 2) строка, присвоенная s2 содержит Hex коды из более чем двух цифр 3) строка, присвоенная s3 содержит символы с кодами > 255 Причина: Кодировка ShortString и AnsiString - всегда системная (ANSI) в рантайме. Системная кодировка может различаться при разных запусках программы, из-за этого она не определяется на этапе компиляции. Поэтому компилятор не в состоянии сконвертировать константу типа WideString/UnicodeString в AnsiString/ShortString на этапе компиляции. Исправления: Если вам требуется, чтобы строка содержала определенную последовательность символов, опишите строковую константу как последовательность байтовых значений (т.е., значений, меньших 255. В случае 16-ричных кодов - только двухсимвольные) или не используйте ни директиву {$codepage} ни UTF BOM. Во всех остальных случаях описывайте константу как WideString/UnicodeString
5. Неявная переменная Result в режиме MacPas(Показать/Скрыть)
Раньше: В этом режиме все функции могли иметь доступ к результату функции через неявно описанный псевдоним Result (как и в режимах Delphi/ObjFPC) Теперь: Псевдоним Result больше не доступен по умолчанию в режиме MacPas. Эффект: Причина: Этот псевдоним также недоступен в компиляторах Mac Pascal-я, и может перекрыть другие идентификаторы, что изменит поведение кода. Исправления: Можно принудительно включить возможность использования псевдонима (либо переключателем {$modeswitch Result} после директивы {$mode MacPas} либо ключом компилятора -Mresult, после ключа -Mmacpas, убедившись что директив {$mode XXX} в исходнике нет)
6. Тип результата оператора Addr()(Показать/Скрыть)
Раньше: Тип результата этого оператора был таким же, как и тип результата операции @: обычный указатель в случае {$T-} и указатель на тип аргумента в случае {$T+} Теперь: Независимо от состояния переключателя {$T}, тип результата Addr() - обычный указатель. Эффект: Причина: Совместимость с Дельфи Исправления: Замените использование Addr() на @ только если код компилируется в режиме {$T+}, поскольку в противоположном случае подобная замена может нарушить работу перегруженных подпрограмм.
7. Недоступные символы и свойства(Показать/Скрыть)
Раньше: Компилятор допускал открытие недоступных символов (например, strict private полей) из унаследованного класса через свойства. Теперь: Свойства подчиняются всем правилам видимости класса. Эффект: Причина: Последовательность, совместимость с Дельфи Исправления: Либо измените родительский класс, и сделайте поле/метод защищенными, или используйте методы доступа, предоставляемые классом-родителем.
8. <ordinal> запрещено в <set type>(Показать/Скрыть)
Раньше: Предыдущие версии FPC разрешали
type tset = 1 .. 5; // ... if i in tset then // ...
Теперь: Подобное использование запрещено Эффект: Причина: Возможно, раньше такое было разрешено случайно; это не соответствует стандартному Паскалю, и никакой другой Паскаль-компилятор подобных вещей не поддерживает. Исправления: Измените приведенный выше код на
if i in [low(tset) .. high(tset)] then //...
9. Поддержка хелперов для записи и класса(Показать/Скрыть)
Раньше: Была возможность назвать первое поле записи/класса helper:
{$mode delphi} type TSomeRecord = class helper: integer; end;
TSomeRecord = record helper: integer; end;
Теперь: Компилятор интерпретирует слово helper (если оно непосредственно следует за ключевым словом class/record) как описание хелпера. Эффект: Вышеприведенный код компилироваться не будет. Причина: Helper - это метод определения хелперов класса/записи. Дельфи-совместимый. Исправления: Разделите ключевые слова class/record и helper секцией видимости (public/private/protected/published) или вынесите описание другого поля в начало записи/класса
10. Анонимный вызов Inherited(Показать/Скрыть)
Раньше: Анонимный вызов Inherited мог вызывать в предке любой метод, параметры которого совпадали с параметрами текущего метода. Теперь: Анонимный вызов Inherited гарантирует вызов именно того метода родительского класса, который был перекрыт (overridden) текущим методом. Эффект: Причина: Соответствие документации. Совместимость с Дельфи. Исправления: Если вы хотите, чтобы компилятор решил, какой метод вызывать в зависимости от параметров, как было раньше - вызывайте Inherited не анонимно, а с полным указанием имени вызываемого метода.
11. Получение адреса поля в свойстве-записи.(Показать/Скрыть)
Раньше: Возможно было передать поле свойства-записи как var- параметр и взять его адрес разными способами. Теперь: Получение адреса полей у свойств-записей не допускается. Эффект: Причина: Свойства (http://forum.pascalnet.ru/index.php?s=&showtopic=25378&view=findpost&p=142135) могут быть реализованы не только через функцию, но могут отображаться непосредственно на записи. Исправления: Измените код так, чтобы не было никаких попыток взять адрес свойства.
12. Синтаксис Generic-ов в режиме Delphi(Показать/Скрыть)
Раньше: Поддержка дженериков в Дельфи создавалась параллельно с дельфийской, и эти 2 реализации имели разный синтаксис. FPC поддерживал свой синтаксис дженериков и в режиме Дельфи и во всех остальных режимах. Теперь: Добавлена поддержка Дельфийского синтаксиса дженериков, т.о., в режиме совместимости с Дельфи, FPC теперь поддерживает только дельфийские дженерики. Эффект: Причина: Совместимость с Дельфи Исправления: Либо измените режим совместимости на {$mode ObjFPC}, либо измените синтаксис дженериков на Дельфи-совместимый.
Изменения в реализации
1. Порядок параметров в RTTI(Показать/Скрыть)
Раньше: Порядок, в котором информация о параметрах функции хранилась в RTTI, зависел от соглашения о вызове этой самой функции. Если соглашение на i386 передавало параметры слева направо, то и параметры хранились слева направо (вне зависимости от действительной платформы, что само по себе являлось багом), иначе они хранились справа налево. Теперь: Параметры всегда хранятся слева направо в RTTI, т.е. так, как они расположены в исходном коде. Эффект: Код, который парсит RTTI информацию для того, чтобы узнать, в каком порядке передаются параметры, больше работать не будет. Причина: Совместимость с Дельфи, предоставление более юзабельной информации для IDE Исправления: Измените код так, чтобы он всегда ожидал параметры от RTTI слева направо. В будущем, к RTTI будет добавлено также само соглашение о вызовах (как в Дельфи), тогда вы сможете использовать эту информацию для реорганизации параметров в случае необходимости.
2. Размер множеств в режиме TP/Delphi(Показать/Скрыть)
Раньше: {$packset fixed} выбирался по умолчанию для всех режимов совместимости. Таким образом множества размером до 32 элементов упаковывались в 4 байта, а все остальные - в 32 байта. Теперь: {$packset 1} устанавливается по умолчанию в режимах совместимости TP/Delphi. Эффект: В этих режимах совместимости размер множества, содержащего 1..8 элементов будет равен 1 байту, размер множества, хранящего 9..16 элементов - 2 байтам, множества с 17..32 элементами останутся четырехбайтовыми, а потом каждые 8 дополнительных элементов будут увеличивать размер на 1 байт, в итоге хранение 249..256 элементов будет осуществляться в 32 байтах. Причина: Совместимость с Дельфи/TP Исправления: Если у вас есть код, написанный в режимах совместимости с Дельфи/TP, который зависит от старых установок {$packset}, добавьте {$packset fixed} после установки {$mode XXX}.
3. Константы в смешанных (знаковых/беззнаковых) 64-битных выражениях(Показать/Скрыть)
Раньше: В случае некоторых сравнений отрицательные 64-битные константы и беззнаковые 64-битные переменные обрабатывались компилятором некорректно: отрицательная константа принудительно приводилась к беззнаковому типу. Теперь: Компилятор правильно использует порядковое значение отрицательной константы. Эффект: Некоторые выражение, которые вычислялись как True в рантайме, теперь на этапе компиляции вычисляются как False:
const // 64-битные 16-ричные выражения ВСЕГДА парсятся как int64 // (также и предыдущими версиями FPC) BIG_A = $AB09CD87EF653412; var q : qword; begin q := qword(BIG_A); if (q = BIG_A) then writeln('same') else writeln('different'); end.
Раньше подобная программа выводила "same", сейчас она выводит "different" Причина: Компилятор не должен подобным образом приводить отрицательную константу к беззнаковому типу Исправления: Явно приводите все константы, которые должны быть беззнаковыми 64-битными константами, к типу QWord. В примере выше:
BIG_A = QWord($AB09CD87EF653412);
4. Переполнение/Проверка границ для вещественных констант(Показать/Скрыть)
Раньше: Когда константа NaN присваивалась переменной в режиме {$R+} или {$Q+}, компилятор сообщал об ошибке. Теперь: Ни {$R+}, ни {$Q+} больше не являются причиной ошибки при присвоении значения NaN переменной. Новая настройка {$IEEEerrors} может использоваться для выбора: нужно или нет выдавать ошибку при подобном присвоении. Эффект: Причина: Последовательность, совместимость с Дельфи (там не поддерживается {$IEEEerrors}, но и ошибки присваивания в любом случае не возникает, при любом состоянии $R/$Q) Исправления: Добавьте {$IEEEerrors +} или ключ компилятора -C3 в командной строке.
5. Новый элемент перечисления TTypeKind(Показать/Скрыть)
Раньше: Перечисление TTypeKind содержало 26 элементов (от tkUnknown до tkUChar) Теперь: Теперь добавлен 27-ой элемент (tkHelper) Эффект: Константный массив, использующий TTypeKind в качестве индекса, выдаст ошибку, поскольку в нем теперь недостаточно элементов. Причина: Хелперам нужен свой собственный тип в RTTI, т.к. они реализованы иначе чем в Дельфи. Исправления: Добавьте новый элемент в конец вашего массива, соответствующий типу tkHelper
6. Выравнивание (padding) типов Object/Class(Показать/Скрыть)
Раньше: Реализовывалось только выравнивание для записей. Для объектов и классов этого сделано не было. Теперь: Выравнивание реализовано также для объектов/классов. Эффект: По большому счету, это должно затрагивать только код, который одним блоком записывает содержимое объекта на диск, а потом - читает с диска. Причина: Совместимость с Дельфи, соответствие ABI (двоичному интерфейсу приложений) Objective C Исправления: Описывайте типы объектов, которые хотите читать/писать как "packed". Для классов это изменение не должно затронуть существующий код.
7. Декорирование имен переменных, типизированных констант, и внутренних символов.(Показать/Скрыть)
Раньше: Переменная "a_varname" модуля "test" декорировалась в U_TEST_A_VARNAME Теперь: Переменная с тем же именем из того же модуля декорируется в U$_TEST_A$_VARNAME Эффект: Причина: Старая схема не обеспечивала уникальности имени: переменная "varname" модуля "test_a" и переменная "varname_a" модуля "test" декорировались в одинаковые имена. Исправления: Это изменение не повлияет на ваш код, если только вы не используете декорированное имя для прямого доступа к переменной из ассемблера (чего настоятельно не рекомендуется делать). В таком случае вы должны явно объявить псевдонимы имен к которым нужен доступ.
(новая схема декорирования еще не совсем стабильна)
8. Использование ResourceString для инициализации типизированных строковых констант.(Показать/Скрыть)
Раньше: Типизированная строковая константа, инициализированная ResourceString содержит начальное значение, которое не изменяется, когда был вызов SetResourceStrings или SetUnitResourceStrings. Теперь: Значение констант типа AnsiString теперь синхронизируется с соответствующими ResourceString-ами, и текущее значение изменяется при вызове вышеперечисленных функций. Поведение констант типа ShortString оставлено без изменений. Эффект: Причина: Совместимость с Дельфи. Исправления: Если новое поведение нежелательно - измените описание константы:
1. SysUtils.GetAppConfigDir() теперь использует VendorName(Показать/Скрыть)
Раньше: SysUtils.GetAppConfigDir() игнорировал VendorName Теперь: VendorName принимается во внимание, если его значение установлено. Эффект: Причина: В соответствии с указаниями Microsoft по установке путей файла. Исправления: Если вы хотите перенести данные со старого места на новое, вам может понадобиться временно очистить VendorName перед вызовом GetAppConfigDir(), чтобы получить путь к старому пути.
2. IniFiles.WriteString() больше не удаляет пустые строки(Показать/Скрыть)
Раньше: WriteString() удаляла ключ если его значение было пустым Теперь: WriteString() записывает пустую строку. Эффект: Причина: Совместимость с поведением TMemIniFile в Дельфи и IniFile из WinAPI Исправления: Используйте DeleteKey() для удаления ключа.
3. IniFilesDeleteKey() больше не удаляет пустые секции(Показать/Скрыть)
Раньше: IniFilesDeleteKey() удаляла секцию, если удалялся последний ключ Теперь: IniFilesDeleteKey() оставляет пустую секцию в покое. Эффект: Причина:Совместимость с поведением TMemIniFile в Дельфи и IniFile из WinAPI Исправления: Используйте EraseSection() для удаления секции
4. Модуль и утилиты xmlrpc удалены(Показать/Скрыть)
Раньше: Существовал модуль xmlrpc и демо-программа для него, которая называлась mkxmlrpc Теперь: Эти исходники были удалены в svn 2.6.0, и помечены как устаревшие в ветке svn fixes Эффект: Причина: Код не поддерживался годами, и был заменен новым функционалом в fcl-web и fcl-json Исправления: Используйте fcl-web, или, если адаптация кода неосуществима, получите исходники xmlrpc из старых версий FPC
5. Определения IInterface.QueryInterface, ._AddRef и ._Release изменились.(Показать/Скрыть)
Раньше: Методы IInterface.QueryInterface, ._AddRef и ._Release были объявлены как stdcall, и IID передавался как константа. Теперь: Эти методы объявлены как stdcall под Windows, и cdecl под другими ОС. Параметр IID передается как constref. Эффект: Причина: Указанные методы используются для взаимодействия с COM под Windows. Внесенные изменения делают возможным взаимодействие с XPCom от Mozilla, который является кроссплатформенным (и подобен COM/Corba) Исправления: Если какой-либо из этих методов переопределен, они должны быть определены так:
function QueryInterface(constref IID: TGUID; out Obj): HResult; {$ifndef windows}cdecl{$else}stdcall{$ifend}; override; function _AddRef: Integer; {$ifndef windows}cdecl{$else}stdcall{$ifend}; override; function _Release: Integer; {$ifndef windows}cdecl{$else}stdcall{$ifend}; override;
Разумеется, можно использовать следующую, более многословную альтернативу:
function QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} IID: TGUID; out Obj): HResult; {$IF (not defined(WINDOWS)) AND (FPC_FULLVERSION>=20501)}cdecl{$ELSE}stdcall{$IFEND}; override; function _AddRef: Integer; {$IF (not defined(WINDOWS)) AND (FPC_FULLVERSION>=20501)}cdecl{$ELSE}stdcall{$IFEND}; override; function _Release: Integer; {$IF (not defined(WINDOWS)) AND (FPC_FULLVERSION>=20501)}cdecl{$ELSE}stdcall{$IFEND}; override;
, чтобы гарантировать компилируемость как новой, так и предыдущими версиями FPC.
6. Переменная thread_count удалена из модуля system (win32, win64, wince, symbian, nativent)(Показать/Скрыть)
Раньше: Была переменная thread_count в модуле System для перечисленных целевых ОС Теперь: Эта переменная удалена. Эффект: Причина: Поведение переменной было неверным, и это нельзя было исправить. Исправления: Поскольку значение переменной было непредсказуемым, она, вероятно, не использовалась вообще.
7. Глобальные переменные для локали объявлены устаревшими.(Показать/Скрыть)
Раньше: Для каждой конфигурации локали существовал псевдоним переменной, использующий модификатор Absolute Теперь: Теперь все эти переменные помечены как Deprecated, с предупреждением, вываливающимся при попытке использования. Эффект: Причина: FPC поддерживало использование этих переменных в записи, еще до 2000-ного года называвшейся DefaultFormatSettings. Теперь DelphiXE рекомендует использовать FormatSettings, и помечает все остальное как Deprecated. Исправления: Используйте (Default)FormatSettings где только возможно. И помните, что пройдет еще достаточно времени до окончательного удаления этих переменных.
8. Изменено логгирование CustApp(Показать/Скрыть)
Раньше: Метод TCustomApplication.Log был виртуальным, и для реализации логгирования должен был переопределяться. Теперь: Процедура Log теперь не виртуальная, а статическая Эффект: Причина: Новое свойство EventLogFilter. Это множество типа TEventType, которое определяет, какие события в действительности логгируются. Фильтрация осуществляется в процедуре Log. Исправления: Наследники должны переопределять процедуру DoLog (вместо Log) для реализации логгирования.
Раньше: В TFPWebModule было свойство Template. Теперь: Оно переименовано в ModuleTemplate. Эффект: Причина: T(Custom)FPWebModule.Template переименовано в ModuleTemplate во избежание путаницы со свойством Template в обработчиках событий для действий (actions) Исправления: Просто переименуйте Template в ModuleTemplate там, где нужно.
10. Изменения в модуле HTTP (Apache)(Показать/Скрыть)
Раньше: Переводы заголовков для версий 1.3, 2.0, 2.2 были собраны и установлены по умолчанию. Теперь: Теперь собраны и установлены только заголовки Apache 2.2 Эффект: Причина: Достаточно часто модули компилировались с неправильными заголовками, что оканчивалось крэшем Apache Исправления: Скомпилируйте и установите требуемые модули отдельно: перейдите в нужную папку, запустите make install, и пересоберите fcl-web
11. fcl-image теперь использует другое сжатие по умолчанию при записи PNG-файлов(Показать/Скрыть)
Раньше: Сжатие при записи PNG устанавливалось в best Теперь: Сжатие устанавливается в default Эффект: Причина: Добавление свойства CompressionLevel позволило пересмотреть значение по умолчанию. CompressionLevel = best значительно медленнее, чем Default, а выгода очень незначительна. Исправления: Пересмотрите необходимость максимального сжатия. Обычно вы будете использовать "max" только при длительном хранении, или когда изображения нарисованы вручную (например, диаграммы, которые не являются фотографиями). В этом случае установите CompressionLevel в нужное значение: (clNone, clFastest, clDefault, clBest)
12. Некоторые поля дженериков в FGL были случайно установлены в Public/Protected(Показать/Скрыть)
Раньше: Некоторые поля имели уровень доступа, который позволял обращаться к ним из пользовательской программы. Теперь: Эти поля теперь приватные, и обращаться к ним больше нельзя. Эффект: Причина: Инкапсуляция Исправления: Весь функционал доступен по-прежнему, через публичные методы.
13. Файл regexpr.pp переименован в oldregexpr.pp(Показать/Скрыть)
Раньше: Был очень маленький исходник \packages\regexpr\src\regexpr.pp Теперь: Этот файл был перенесен в \packages\regexpr\src\oldregexpr.pp Эффект: Причина: Добавление Дельфийского модуля регулярных выражений от Сорокина Исправления: Если вы используете модуль RegExpr - просто переименуйте все его упоминания в секции Uses с RegExpr на OldRegExpr
Unix платформы
1. SysUtils.FileAge больше не работает для папок(Показать/Скрыть)
Раньше: SysUtils.FileAge работал как для файлов, так и для папок под *nix-ами Теперь: Эта функция работает только для файлов Эффект: Причина: Согласованность с другими платформами, совместимость с Дельфи. Исправления: Вызывайте BaseUnix.fpstat() для папок.
x86 платформы
1. Размер операции pushf/popf/pusha/popa во встроенном ассемблере (стиль Intel)(Показать/Скрыть)
Раньше: Размер этих операций был нативным (32 бита на i386, 64 бита на x86-64) Теперь: Размер этих опкодов всегда равен 16 бит (для стиля Intel). При использовании стиля AT&T размер остается нативным Эффект: Причина: Так описано поведение этих опкодов в мануалах Intel-а, кроме того это совместимо с Дельфи. Для синтаксиса AT&T размер не был изменен, т.к. этот диалект определяет размер перечисленных операций как нативный. Исправления: Явно указывайте размер при использовании таких операций, т.е., pushfd, popfq, pushad, ... Учтите, что под x86-64 не существует pusha/popa, так же как и pushfd/popfd (предыдущие версии компилятора принимали эти опкоды по ошибке и при компиляции под x86-64)
x86-64 платформы
1. Передача параметров и возврат результата на x86-64 (за исключением Win64)(Показать/Скрыть)
Раньше: Компилятор неправильно реализовывал официальный x86-64 ABI для передачи параметров и возврата результатов функции. В частности, записи всегда передавались или через память, или через целочисленные регистры Теперь: Компилятор корректно выполняет требования x86-64 ABI во всех случаях и на всех платформах, которые этого требуют. В частности, некоторые записи передаются/возвращаются через SSE-регистры Эффект: Подпрограммы на чистом ассемблере, основанные на старых соглашениях, могут перестать работать на не-Win64 платформах. Win64 следует собственному варианту x86-64 ABI от Microsoft, поддержка которого уже была корректно реализована в компиляторе, и поэтому изменению не подверглась. Причина: Взаимодействие с кодом, сгенерированным другими компиляторами Исправления: Поправьте свой ассемблерный код так, чтобы передача параметров соответствовала ABI
2. Передача константных параметров под не-Win64 платформами(Показать/Скрыть)
Раньше: Все параметры-записи, описанные как const, передавались по значению Теперь: Для соглашений вызова, отличных от cdecl/cppdecl, константные параметры-записи передаются по ссылке, если они должны быть переданы через память согласно x86-64 ABI. Учтите, что для соглашений кроме cdecl/cppdecl, поведение const не определено, и может измениться в любой момент Эффект: Причина: Производительность Исправления: В большинстве случаев это изменение не потребует переработки исходного кода. Единственное исключение - если у вас есть ассемблерные подпрограммы с константными параметрами-записями. Тогда ассемблерный код должен быть изменен для случаев, описанных выше. Лучшая возможная модификация - вообще убрать const изо всех ассемблерных подпрограмм, и использовать либо передачу значения, либо модификатор constref, что гарантирует, соответственно, передачу по значению/по ссылке
Автор: TarasBer 5.01.2012 22:35
> 15. Встроенный SAR (shift arithmetic right)
> В отличие от SHL/SHR, SAR реализован не как оператор, а как встроенная функция. Она имеет разные имена для разных целочисленных типов (SarInt64/SarLongint/SarSmallint) чтобы избежать проблем при присваивании результата функции в выражении.
А чё, слабо было просто сделать так, чтобы shr учитывал знаковость типа? Этот косяк ещё с ботланда тянется, пора бы и убрать.