mORMot2 DailyЕжедневный обзор коммитов апстрима

Числовые парсеры 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.

Сборка2.4.16861 → 2.4.16865
Коммиты4
Строки+307 -204
Чтение2 мин

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, а также для длинных мантисс и экспонент со знаком.

Arnaud Bouchez · 21:15 UTC · открыть коммит на GitHub →

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 не изменены.

Arnaud Bouchez · 08:21 UTC · открыть коммит на GitHub →

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.

Модули

Arnaud Bouchez · 09:47 UTC · открыть коммит на GitHub →

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 представление.

Arnaud Bouchez · 15:04 UTC · открыть коммит на GitHub →

Активность апстрима коммитов в день · последние 60 дней
Коммиты977
Активных дней44/60
Пик активности2026-09-30
Максимум60
2026-08-15: 0 commits2026-08-16: 0 commits2026-08-17: 0 commits2026-08-18: 0 commits2026-08-19: 0 commits2026-08-20: 0 commits2026-08-21: 0 commits2026-08-22: 0 commits2026-08-23: 0 commits2026-08-24: 0 commits2026-08-25: 0 commits2026-08-26: 0 commits2026-08-27: 26 commits2026-08-28: 11 commits2026-08-29: 10 commits2026-08-30: 1 commit2026-08-31: 23 commits2026-09-01: 0 commits2026-09-02: 20 commits2026-09-03: 29 commits2026-09-04: 35 commits2026-09-05: 13 commits2026-09-06: 0 commits2026-09-07: 0 commits2026-09-08: 23 commits2026-09-09: 10 commits2026-09-10: 17 commits2026-09-11: 23 commits2026-09-12: 14 commits2026-09-13: 9 commits2026-09-14: 7 commits2026-09-15: 4 commits2026-09-16: 24 commits2026-09-17: 26 commits2026-09-18: 21 commits2026-09-19: 59 commits2026-09-20: 13 commits2026-09-21: 5 commits2026-09-22: 34 commits2026-09-23: 17 commits2026-09-24: 57 commits2026-09-25: 22 commits2026-09-26: 26 commits2026-09-27: 0 commits2026-09-28: 2 commits2026-09-29: 19 commits2026-09-30: 60 commits2026-10-01: 26 commits2026-10-02: 30 commits2026-10-03: 32 commits2026-10-04: 15 commits2026-10-05: 1 commit2026-10-06: 26 commits2026-10-07: 37 commits2026-10-08: 27 commits2026-10-09: 35 commits2026-10-10: 33 commits2026-10-11: 9 commits2026-10-12: 11 commits2026-10-13: 35 commits
2026-08-152026-10-13