Требует действийможет затронуть работающую системуВ исходном payload нет отметок superseded_by. Диапазон исключения основан на встроенных последовательных diffs и темах commits, которые явно исправляют, а затем переписывают те же routines числового parser. В конце окна обзора upstream head соответствует build 2.4.16844.
Малые дроби исправлены, а TimeSpan text стал двунаправленным
Работа предыдущей редакции над числовыми parsers потребовала двух исправлений: GetExtended и GetNumericVariantFromJson могли терять значащие цифры после длинной последовательности нулей в дробной части. Затем реализации были упрощены, оптимизированы и покрыты граничными тестами, включая пути Delphi 7 и Delphi Win32. Поддержка Microsoft TimeSpan теперь преобразует текст обратно в signed 64-bit ticks и принимает безопасные разделители CSV или JSON.
Коротко
- Переходите на 2.4.16844; builds 2.4.16828–2.4.16839 содержат незавершённую или ещё меняющуюся реализацию числовых parsers.
- GetExtended и GetNumericVariantFromJson теперь сохраняют значащие цифры в значениях вроде 0.00000000000000000123 вместо их тихой потери.
- GetNumericVariantFromJson теперь использует отрицательный accumulator Int64, восстанавливая совместимость с Delphi 7 и сохраняя границы Int64, Currency и double.
- TextToTimeSpan и TextToTimeSpanBuffer преобразуют текст Microsoft TimeSpan в signed ticks по 100 ns с точностью до миллисекунд.
- TSynSystemTime.FromTimeSpan получил pointer-based overload, а финальный parser принимает разделители NUL, whitespace, comma, semicolon, apostrophe или quote.
- Delphi Win32 получил shift-and-add пути для медленного 64-bit multiplication; другие targets сохраняют обычное умножение.
Рекомендации по обновлению
Берите build 2.4.16844 целиком. Не останавливайтесь на 2.4.16828–2.4.16839: builds 16836 и 16837 исправляют малые дробные значения, затем 16838 и 16839 переписывают те же пути parser, а build 16840 завершает regression coverage. Приложениям с малыми научными или финансовыми значениями следует повторить граничные тесты.
14 из 14 записей · 14 коммитов в апстриме
1
Высокий
JSON variants сохраняют значащие цифры после длинной серии дробных нулей
GetNumericVariantFromJson теперь пропускает ведущие нули после десятичной точки, не расходуя бюджет значащих цифр. Дробная экспонента всё равно уменьшается для каждого нуля.
Исправления
mormot.core.variants
ca07dda2+12-8
core: fixed GetNumericVariantFromJson() long-standing issue
Влияние
Backends, разбирающие малые JSON-числа вроде 0.00000000000000000123, больше не теряют ненулевые цифры и не возвращают неверный числовой variant. Это исправление корректности данных для Delphi и FPC.
Рекомендуется обновиться
Обновитесь до build 2.4.16840 или новее и повторно проверьте JSON fields с большим числом ведущих дробных нулей, включая signed и exponent forms.
Публичный API
GetNumericVariantFromJsonbehaviour-changed — Ведущие дробные нули больше не расходуют ёмкость значащих цифр.
Модули
2
Высокий
GetExtended сохраняет очень малые ненулевые дроби
mormot.core.text изменяет GetExtended: нули сразу после десятичной точки корректируют scale, но не расходуют 19-значный бюджет accumulator до первой значащей цифры.
Исправления
mormot.core.text
9e649966+8-2
core: fixed GetExtended() long-standing issue
Влияние
Код Delphi и FPC, разбирающий малые научные или финансовые decimal strings, больше не получает тихо усечённое значение после множества дробных нулей.
Рекомендуется обновиться
Обновитесь до завершённой числовой серии в build 2.4.16840 или новее и добавьте regression case для минимального ненулевого decimal, принимаемого приложением.
Публичный API
GetExtendedbehaviour-changed — Длинные серии дробных нулей больше не отбрасывают последующие значащие цифры.
Модули
3
Средний
TSynSystemTime получил parser текстовых значений TimeSpan
mormot.core.datetime добавляет MAX_TIMESPAN и overload TSynSystemTime.FromTimeSpan, разбирающий дни, время и необязательную дробь из PUtf8Char. Он возвращает конечный pointer, а число дней и знак выдаёт отдельно.
Новые возможности
mormot.core.datetime
9b3f2566+107-4
core: new TSynSystemTime.FromTimeSpan() overload
Влияние
Низкоуровневые parsers Delphi и FPC могут декодировать тот же компактный формат, который выдаёт TimeSpanToText. Неверные диапазоны дней или времени возвращают nil и очищают record.
Стоит взглянуть
Публичный API
MAX_TIMESPANadded — Максимальное целое число дней для signed 64-bit TimeSpan.TSynSystemTime.FromTimeSpan(PUtf8Char, PtrInt, PtrInt)added — Разбирает компактный TimeSpan text и возвращает конечный pointer, дни и знак.
Модули
4
Средний
Microsoft TimeSpan text можно преобразовать обратно в ticks
mormot.core.datetime добавляет TextToTimeSpanBuffer и TextToTimeSpan. Они объединяют разобранные дни, часы, минуты, секунды и миллисекунды в signed Int64 число Microsoft ticks по 100 ns.
Новые возможности
mormot.core.datetime
b6bef042+29-2
core: new TextToTimeSpan/TextToTimeSpanBuffer() functions
Влияние
Backends Delphi и FPC могут выполнять round trip текста directory или .NET duration без собственного parser. Цифры точнее миллисекунд принимаются, но намеренно отбрасываются.
Стоит взглянуть
Публичный API
TextToTimeSpanBufferadded — Возвращает первый byte после TimeSpan или nil при ошибке.TextToTimeSpanadded — Преобразует RawUtf8 TimeSpan text в signed ticks по 100 ns.
Модули
5
Средний
TimeSpan parsing корректно останавливается на обычных разделителях данных
mormot.core.datetime уточняет TSynSystemTime.FromTimeSpan(PUtf8Char, days, neg): разобранное значение может завершаться NUL, whitespace, comma, semicolon, apostrophe или double quote. Дробные секунды по-прежнему требуют минимум три цифры.
Новые возможности
mormot.core.datetime
a2908ede+7-6
core: refined TextToTimeSpanBuffer() function
Влияние
Parsers Delphi и FPC могут читать TimeSpan прямо из CSV, JSON-like или tokenized buffers и продолжать с возвращённого разделителя. Это расширяет ввод API, добавленных в том же наборе.
Стоит взглянуть
Публичный API
TSynSystemTime.FromTimeSpan(PUtf8Char, PtrInt, PtrInt)behaviour-changed — Принимает NUL, whitespace и обычные разделители CSV/JSON после корректного значения.
Модули
6
Средний
GetInteger упрощает signed-границы на 32- и 64-bit targets
mormot.core.base заменяет подсчёт цифр по расстоянию pointers на обратный счётчик, хранит знак как PtrUInt и разделяет явные 32-bit overflow checks и границу девятнадцатой цифры для 64-bit. Ведущие пробелы, знаки и нули остаются поддержаны.
Производительность
mormot.core.base
b1187b83+27-30
core: refactored/optimized GetInteger() after PR #579
Влияние
Вызовы Delphi и FPC сохраняют тот же контракт GetInteger и signed-пределы. Это оптимизация реализации после предыдущего исправления overflow.
Модули
7
Средний
Медленные пути 64-bit multiplication ограничены Delphi Win32
Parsers core integer, YAML, Currency и HTTP range используют shift-and-add умножение на десять только при HASSLOWMUL64. Другие targets используют native multiplication, а проверки числового вывода унифицированы.
Производительность
mormot.core.base+3
33638087+16-27
core: optimize Delphi Win32 HASSLOWMUL64 path
Влияние
Delphi Win32 сохраняет workaround умножения, а современные targets Delphi и FPC избегают лишних shift-and-add последовательностей. Разобранные значения и публичные API не меняются.
8
Средний
Числовые JSON variants снова совместимы с Delphi 7
mormot.core.variants переписывает GetNumericVariantFromJson с отрицательным accumulator Int64 вместо UInt64. Пути вывода integer, Currency и double упрощены с сохранением проверок грамматики и диапазонов из PR #579.
Компилятор и платформы
mormot.core.variants
41f703b6+92-114
core: rewritten GetNumericVariantFromJson()
Влияние
Delphi 7 снова может собрать усиленный parser. Современные backends Delphi и FPC сохраняют выбор variant и поведение на границах при более коротком обычном пути.
Рекомендуется обновиться
Пользователям Delphi 7 следует взять эту реализацию вместе со следующим refactor GetExtended и завершёнными числовыми тестами до build 2.4.16840.
Публичный API
GetNumericVariantFromJsonbehaviour-changed — Внутреннее накопление использует отрицательный signed Int64, восстанавливая Delphi 7.
Модули
9
Средний
GetExtended завершает ограниченный scaling без изменения API
mormot.core.text перестраивает scaling GetExtended на быстрый путь -31..31, очень малые и очень большие значения. Сохраняются явные проверки underflow/overflow, а знак применяется после ограниченного умножения.
Внутреннее устройство
mormot.core.text
30e95e50+30-33
core: refactored GetExtended() after #579
Влияние
Вызовы Delphi и FPC сохраняют тот же API. Финальная реализация ускоряет обычный путь и сохраняет исправленное поведение для малых дробей и крайних значений.
Модули
10
Низкий
GetExtended сокращает затраты на цифры и знак
mormot.core.text кэширует каждую десятичную цифру как integer для проверки границ и накопления, затем применяет прямой unary minus вместо умножения на отрицательную степень десяти.
Производительность
mormot.core.text
5bca2b43+6-5
core: optimized GetExtended() after last PR
Влияние
Изменений прикладного кода нет. GetExtended выполняет немного меньше работы в Delphi и FPC, сохраняя поведение parser после предыдущего исправления.
Модули
11
Низкий
GetExtended упрощает пределы и обработку специальных значений
mormot.core.text объединяет выходы NaN, Infinity и ошибок, заменяет literal-пределы Int64 компактным сравнением, использует HASSLOWMUL64 для накопления и ограничивает exponent до возможного overflow PtrInt.
Внутреннее устройство
mormot.core.text
19d03c62+26-39
core: another pass on GetExtended() after #579
Влияние
Публичный API не меняется. Delphi и FPC сохраняют ранее добавленные границы parser с более короткой реализацией и architecture-friendly guard экспоненты.
Модули
12
Низкий
Границы Int64 централизованы для parsers и storage
mormot.core.base публикует MAX_INT64 и MAX_INT64_DIV10. Их используют GetExtended, HTTP byte-range parsing, константы OpenSSL и пределы ORM database ID; GetNextRange сохраняет clamp до High(Int64).
Внутреннее устройство
mormot.core.base+4
a5b75dde+13-11
core: refactored GetNextRange() and other Int64 clamp code
Влияние
В diff не видно изменения поведения приложения. Код Delphi и FPC может использовать новые публичные константы вместо повторения выражений signed 64-bit limits.
Публичный API
MAX_INT64added — Публичный alias для High(Int64).MAX_INT64_DIV10added — Публичный предварительно вычисленный предел High(Int64) div 10.
13
Низкий
Round trips TimeSpan и неверный ввод получили граничные тесты
test.core.base проверяет round trip TimeSpanToText и TextToTimeSpanBuffer для нуля, signed values, границ дней, усечения миллисекунд и пределов Int64. Также отвергаются неполные поля, выходящие за пределы часы, минуты и секунды, знак плюс и неверные дроби.
Тесты
77e2295f+89-25
tests: enhanced TimeSpan validation coverage
Влияние
Изменений прикладного кода нет. Builds Delphi и FPC получают regression coverage нового parser и его контракта с точностью до миллисекунд.
14
Низкий
Числовые пределы и малые дроби получили cross-backend тесты
test.core.base расширяет проверки Int64, Currency, double, неверных чисел и малых дробей. Проверяется текстовый вывод double для разных layouts TSynExtended и корректируются overflow-тесты для поддерживаемых backend Delphi и FPC.
Тесты
1cff873b+56-32
tests: fixed and completed numerical conversion coverage
Влияние
Изменений прикладного кода нет. Стабилизированное поведение parsers теперь проверяется для compiler-specific floating-point representations.