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

Малые дроби исправлены, а 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. Приложениям с малыми научными или финансовыми значениями следует повторить граничные тесты.

Сборка2.4.16828 → 2.4.16844
Коммиты14
Строки+518 -338
Чтение4 мин

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.

Публичный API

  • GetNumericVariantFromJsonbehaviour-changed — Ведущие дробные нули больше не расходуют ёмкость значащих цифр.

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

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, больше не получает тихо усечённое значение после множества дробных нулей.

Публичный API

  • GetExtendedbehaviour-changed — Длинные серии дробных нулей больше не отбрасывают последующие значащие цифры.

Модули

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

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, дни и знак.

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

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.

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

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 после корректного значения.

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

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.

Модули

Arnaud Bouchez · 07:36 UTC · PR #579 · открыть коммит на GitHub →

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 не меняются.

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

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 и поведение на границах при более коротком обычном пути.

Публичный API

  • GetNumericVariantFromJsonbehaviour-changed — Внутреннее накопление использует отрицательный signed Int64, восстанавливая Delphi 7.

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

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. Финальная реализация ускоряет обычный путь и сохраняет исправленное поведение для малых дробей и крайних значений.

Модули

Arnaud Bouchez · 16:43 UTC · PR #579 · открыть коммит на GitHub →

10 Низкий GetExtended сокращает затраты на цифры и знак mormot.core.text кэширует каждую десятичную цифру как integer для проверки границ и накопления, затем применяет прямой unary minus вместо умножения на отрицательную степень десяти. Производительность mormot.core.text 5bca2b43+6-5

core: optimized GetExtended() after last PR

Влияние

Изменений прикладного кода нет. GetExtended выполняет немного меньше работы в Delphi и FPC, сохраняя поведение parser после предыдущего исправления.

Модули

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

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 экспоненты.

Модули

Arnaud Bouchez · 12:43 UTC · PR #579 · открыть коммит на GitHub →

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.

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

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 и его контракта с точностью до миллисекунд.

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

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.

Arnaud Bouchez · 16:44 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