|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
01.06.2022, 14:18 | #1 |
Новичок
Джуниор
Регистрация: 27.10.2016
Сообщений: 4
|
Баги компилятора Delphi
С каждой новой версии вылезают новые глюки... Некоторые, типа internal error, обходятся танцами с бубном, а с некоторыми сложнее.
Может кому поможет, кто-то добавит |
01.06.2022, 14:25 | #2 |
Новичок
Джуниор
Регистрация: 27.10.2016
Сообщений: 4
|
Передача параметра типа OBJECT размером 8 байт в x64 как адрес, обработка как значение.
Структуры размером 8 байт для x64 и 4 байта для x86 всегда передавались как значение, при без модификатора или с const (var и out конечно по адресу), а вот в 11-ой версии и только для x64 передаются по адресу, но обрабатываются как значений. Конечно, object сейчас использовать коряво, но есть ведь старые рабочие куски кода... type TTestObject= object ni:NativeInt; End; function Get(V:TObject):NativeInt; begin Result := V.ni; end; var O:TTestObject; begin O.ni := $12345678; Assert(O.ni=Get(O)); end. Последний раз редактировалось zur; 01.06.2022 в 14:37. |
01.06.2022, 14:30 | #3 |
Новичок
Джуниор
Регистрация: 27.10.2016
Сообщений: 4
|
Delphi 11
передача ShortString с модификатором CONST с копированием на стек. В предыдущих версиях ( да и в хелпе так написано) просто передавался адрес, компилятор типа следил, чтобы переменную не меняли. В Delphi 11 в начале функции копируется на стек, как если бы не было модификатора CONST и трюк с получением адреса не прокатывает... function GetAddr(const s:ShortString)ointer; begin Result := @s; end; var s:ShortString; begin Assert( GetAddr(s)=@s ); end. |
01.06.2022, 14:35 | #4 |
Новичок
Джуниор
Регистрация: 27.10.2016
Сообщений: 4
|
1. Дебагер сбивается в нумерах строк
- обращение к функции inline, которая вызывает property с функцией read - обращение к полю (в том числе через inline) типа OpenArray<T> (локальная переменная) из потомков в локальной процедуре. Лечится обращением через нормальную функцию 2. Internal error при компиляции - обращение к property, если функция read в другом модуле 3. FillChar в x64 - третий параметр. Если это константа, передается как Word (r8w), а в реализации используется r8. Значит если вдруг во время вызова FillChar в старших разрядах r8 что-то было, то все плохо. Если третий параметр переменная, то нормально - movzx r8, Byte Var |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Директивы компилятора, jedi.inc и Delphi XE3 | Pcrepair | Общие вопросы Delphi | 2 | 16.01.2013 21:13 |
Настройки компилятора Delphi по умолчанию | Александр Павлович | Общие вопросы Delphi | 1 | 28.11.2012 10:22 |
Нетривиальный глюк компилятора Delphi 7 | alexdelphi | Общие вопросы Delphi | 0 | 12.03.2012 17:29 |
проверить на баги | serckesh | Помощь студентам | 1 | 05.02.2010 19:54 |
Установки для компилятора Delphi | Terran | Общие вопросы Delphi | 2 | 11.08.2009 13:45 |