Стоит взглянутьисправление или функция, которая может пригодитьсяВ исходном payload нет отметок superseded_by и уведомлений о deprecation. Переписывание GetExtended затрагивает Pascal-реализацию вне WIN32DELPHI; Delphi Win32 сохраняет отдельную x87 assembly-реализацию. Выводы о производительности основаны на структуре кода и цели commits, а не на benchmark data в payload.
Числовые парсеры Pascal переписаны вокруг более быстрых целочисленных путей
Pascal-реализации GetExtended и GetNumericVariantFromJson теперь проводят обычные целые числа и короткие десятичные значения через более компактные циклы, сохраняя проверки длинных мантисс, экспонент и границ Int64. Тесты GetExtended также явно фиксируют нормализацию знака нуля и несколько дробей длиной 18–20 цифр. Миграция signature не требуется, но приложениям, зависящим от точного типа numeric variant или граничного поведения floating point, следует проверить build 2.4.16865.
Коротко
- Переходите на build 2.4.16865 и проведите regression tests числовых преобразований, зависящих от точного variant type или граничного округления.
- Pascal-путь GetExtended вне Win32 был дважды упрощён: отдельные быстрые циклы обрабатывают первые 18 цифр, продолжение с проверкой overflow, дроби и экспоненты.
- Pascal-путь GetExtended теперь намеренно нормализует -0 и -0e400 в числовой ноль, как зафиксировано новыми тестами.
- GetNumericVariantFromJson разворачивает первые цифры и переписывает выбор Int64, Currency и Double без изменения публичной signature.
- mormot.core.base добавляет публичную константу MIN_INT64 и overlay member TSynVarData.VPtrInt.
Рекомендации по обновлению
Берите build 2.4.16865 как полную последовательность изменений парсеров. Исходный payload не отмечает сломанный промежуточный диапазон, но четыре commits тесно связаны: финальный JSON parser использует MIN_INT64, добавленный непосредственно перед ним. Повторите тесты -0, границ Int64, длинных десятичных мантисс, Currency с четырьмя дробными знаками, scientific notation и некорректных JSON numbers на всех поставляемых backend Delphi и FPC.
4 из 4 записей · 4 коммитов в апстриме
1
Средний
JSON numeric variants получили развёрнутый parser обычных цифр
GetNumericVariantFromJson теперь разворачивает начальное накопление цифр, обрабатывает последующие цифры парами и в циклах с проверкой overflow, использует явный sentinel для MIN_INT64 и отдельно проверяет дробь и экспоненту. Формирование результата переписано вокруг положительной magnitude для varInteger, varInt64, varCurrency и varDouble, включая pointer-sized инициализацию нуля через TSynVarData.VPtrInt.
Производительность
mormot.core.variants
c88c4ad7+170-93
core: rewritten GetNumericVariantFromJson()
Влияние
Все Delphi- и FPC-вызовы публичной функции используют новую Pascal-реализацию. Signature и принимаемая JSON grammar в diff не изменены, однако код выбора точного хранения integer, Currency или Double существенно заменён; consumers, проверяющим TVarData.VType, следует провести regression tests характерных границ. Benchmark results в payload отсутствуют.
Стоит взглянуть
Проверьте возвращаемые VType и значение на границах 32-bit, Int64 и Currency, а также для длинных мантисс и экспонент со знаком.
Модули
2
Средний
GetExtended сокращает работу на обычных целых и десятичных путях
Parser GetExtended вне WIN32DELPHI заменяет несколько signed counters и временных floating-point значений обработкой цифр через PtrUInt, напрямую возвращает целые числа и ноль и выполняет масштабирование степенями десяти меньшим числом операций. Проверка NAN/INF теперь читает двухбайтовый префикс перед третьим символом. Тот же commit поясняет деление JSON numeric parser на точные степени при коротких отрицательных экспонентах.
Производительность
mormot.core.text+1
700177da+64-74
core: slightly optimized GetExtended() code
Влияние
Builds FPC и Delphi вне Win32 используют упрощённый Pascal-путь; Delphi Win32 продолжает применять x87 assembly-реализацию. Публичные signatures не изменены. Прямой путь нуля нормализует отрицательный ноль, что явно закреплено тестами следующего commit.
Стоит взглянуть
Перед обновлением включите signed zero и характерные границы экспонент в regression tests парсера.
Публичный API
GetExtendedbehaviour-changed — Pascal-путь нормализует -0 и ноль с экспонентой в числовой ноль; signatures не изменены.
3
Средний
GetExtended отделяет быстрые цифры от parsing с контролем overflow
Pascal-реализация GetExtended переписана ещё раз: первые 18 целых цифр накапливаются без проверки overflow, последующие проходят защищённый цикл, лишние значащие цифры пропускаются с сохранением десятичной позиции, а синтаксис дроби и экспоненты проверяется отдельно. Тесты добавляют длинные граничные дроби, неверные -e1 и .e2 и ожидаемую нормализацию -0e400.
Производительность
mormot.core.text
71129606+66-33
core: rewritten GetExtended() pascal
Влияние
Это финальная реализация GetExtended в выпуске; regression coverage расширено для 18–20 значащих цифр. Изменяются производительность и граничные результаты parsing на FPC и Delphi вне Win32; Delphi Win32 сохраняет assembly-путь. Изменения исходного кода вызывающей стороны не нужны.
Стоит взглянуть
Повторите tests точного битового преобразования длинных мантисс, subnormal и границ экспонент на целях вне Win32.
Модули
4
Низкий
MIN_INT64 и pointer-sized overlay variant стали публичными
mormot.core.base добавляет MIN_INT64 рядом с MAX_INT64 и VPtrInt в ветку varOleInt структуры TSynVarData. TRestStorageInMemory.FindMax использует именованную константу вместо low(Int64), а комментарий GetExtended объясняет, почему его Pascal-цикл не развёрнут как JSON parser.
Новые возможности
mormot.core.base+2
e5746e2f+7-4
core: minor refactoring including new MIN_INT64 constant
Влияние
Существующее поведение ORM не изменено. Код библиотеки и приложений теперь может использовать именованный минимум signed 64-bit и напрямую очищать или читать pointer-sized integer storage TSynVarData. Добавления компилируются согласно ширине PtrInt на Delphi и FPC.
Публичный API
MIN_INT64added — Публичная константа, равная low(Int64).TSynVarData.VPtrIntadded — В overlay-ветку varOleInt добавлено pointer-sized integer представление.