mORMot2 Daily每日上游提交速读

极小小数得到修复,TimeSpan 文本支持双向转换

上一期的数值 parser 工作需要两项正确性修复:GetExtended 与 GetNumericVariantFromJson 在小数点后有大量前导零时可能丢失有效数字。随后实现被简化、优化并加入边界测试,覆盖 Delphi 7 与 Delphi Win32 路径。Microsoft TimeSpan 现在可把文本解析回 signed 64-bit tick,并接受安全的 CSV 或 JSON delimiter。

要点

  • 应采用 2.4.16844;build 2.4.16828 至 2.4.16839 包含不完整或仍在变动的数值 parser 实现。
  • GetExtended 与 GetNumericVariantFromJson 现在会保留 0.00000000000000000123 等值的有效数字,不再静默丢失。
  • GetNumericVariantFromJson 现使用负 Int64 accumulator,在保留 Int64、Currency 与 double 边界的同时恢复 Delphi 7 兼容性。
  • TextToTimeSpan 与 TextToTimeSpanBuffer 可将 Microsoft TimeSpan 文本解析为 signed 100 ns tick,精度为毫秒。
  • TSynSystemTime.FromTimeSpan 新增 pointer-based overload,最终 parser 接受 NUL、空白、逗号、分号、单引号或双引号 delimiter。
  • Delphi Win32 对较慢的 64-bit 乘法采用 shift-and-add 路径;其他目标继续使用普通乘法。

升级建议

应完整采用 build 2.4.16844。不要停在 2.4.16828 至 2.4.16839:build 16836 与 16837 修复极小小数,随后 16838 与 16839 再次重写同一 parser 路径,直到 16840 才补全回归覆盖。解析极小科学或金融数值的应用应在升级后重跑边界测试。

版本号2.4.16828 → 2.4.16844
提交14
行数+518 -338
阅读1 分钟

14 条中的 14 条 · 上游 14 次提交

主题
# 条目 类别 单元
1 高 JSON variant 在长串小数零后保留有效数字 GetNumericVariantFromJson 现在跳过小数点后的前导零,但不消耗有效数字预算;每个被跳过的零仍会递减小数指数。 修复 mormot.core.variants ca07dda2+12-8

core: fixed GetNumericVariantFromJson() long-standing issue

影响

解析 0.00000000000000000123 等极小 JSON 数的 backend 不再静默丢失非零数字或返回错误数值 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 代码,不再因大量小数零而得到被静默截断的值。

公开 API

  • GetExtendedbehaviour-changed — 长串小数零不再丢弃后续有效数字。

Arnaud Bouchez · 16:39 UTC · 在 GitHub 上查看该提交 →

3 中 TSynSystemTime 新增文本 TimeSpan parser mormot.core.datetime 新增 MAX_TIMESPAN,并为 TSynSystemTime.FromTimeSpan 增加从 PUtf8Char 解析天数、时间及可选小数的 overload。它返回结束 pointer,并分别输出天数与符号。 新功能 mormot.core.datetime 9b3f2566+107-4

core: new TSynSystemTime.FromTimeSpan() overload

影响

低层 Delphi 与 FPC parser 可解码 TimeSpanToText 输出的同一紧凑格式。无效天数或时间范围返回 nil 并清空 record。

值得一看

公开 API

  • MAX_TIMESPANadded — signed 64-bit TimeSpan 可表示的最大整天数。
  • TSynSystemTime.FromTimeSpan(PUtf8Char, PtrInt, PtrInt)added — 解析紧凑 TimeSpan 文本,并返回结束 pointer、天数和符号。

Arnaud Bouchez · 20:10 UTC · 在 GitHub 上查看该提交 →

4 中 Microsoft TimeSpan 文本可转换回 tick mormot.core.datetime 新增 TextToTimeSpanBuffer 与 TextToTimeSpan。它们将解析出的天、时、分、秒和毫秒组合为 Microsoft 100 ns tick 的 signed Int64 计数。 新功能 mormot.core.datetime b6bef042+29-2

core: new TextToTimeSpan/TextToTimeSpanBuffer() functions

影响

Delphi 与 FPC backend 可无需自定义 parser 即可往返转换目录或 .NET duration 文本。低于毫秒精度的数字会被接受但按设计丢弃。

值得一看

公开 API

  • TextToTimeSpanBufferadded — 返回解析后首个 byte,出错时返回 nil。
  • TextToTimeSpanadded — 将 RawUtf8 TimeSpan 文本转换为 signed 100 ns tick。

Arnaud Bouchez · 20:11 UTC · 在 GitHub 上查看该提交 →

5 中 TimeSpan 解析可在常见数据 delimiter 处正确停止 mormot.core.datetime 调整 TSynSystemTime.FromTimeSpan(PUtf8Char, days, neg),使解析值可在 NUL、空白、逗号、分号、单引号或双引号处结束。小数秒仍要求至少三位数字。 新功能 mormot.core.datetime a2908ede+7-6

core: refined TextToTimeSpanBuffer() function

影响

Delphi 与 FPC parser 可直接从 CSV、类 JSON 或 tokenized buffer 读取 TimeSpan,并从返回的 delimiter 继续处理。这扩大了本批次新 API 接受的输入。

值得一看

公开 API

  • TSynSystemTime.FromTimeSpan(PUtf8Char, PtrInt, PtrInt)behaviour-changed — 有效值后可接受 NUL、空白及常见 CSV/JSON delimiter。

Arnaud Bouchez · 20:19 UTC · 在 GitHub 上查看该提交 →

6 中 GetInteger 简化 32-bit 与 64-bit 目标的 signed 边界 mormot.core.base 以倒计数替代 pointer distance 位数统计,用 PtrUInt 表示符号,并将显式 32-bit overflow 检查与 64-bit 第 19 位边界分开。仍支持前导空格、符号与零裁剪。 性能 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 乘法路径仅用于 Delphi Win32 Core integer、YAML、Currency 与 HTTP range parser 仅在 HASSLOWMUL64 下使用 shift-and-add 乘十。其他目标使用原生乘法,并统一数值输出断言。 性能 mormot.core.base+3 33638087+16-27

core: optimize Delphi Win32 HASSLOWMUL64 path

影响

Delphi Win32 保留乘法 workaround,而当前 Delphi 与 FPC 目标避免不必要的 shift-and-add 序列。解析值与公开 API 不变。

Arnaud Bouchez · 12:27 UTC · 在 GitHub 上查看该提交 →

8 中 JSON 数值 variant 恢复 Delphi 7 兼容性 mormot.core.variants 使用负 Int64 accumulator 替代 UInt64 重写 GetNumericVariantFromJson。integer、Currency 与 double 输出路径得到简化,同时保留 PR #579 引入的语法和范围检查。 编译器与平台 mormot.core.variants 41f703b6+92-114

core: rewritten GetNumericVariantFromJson()

影响

Delphi 7 可再次编译强化后的 parser。当前 Delphi 与 FPC backend 保持相同 variant 选择和边界行为,同时缩短常见路径。

公开 API

  • GetNumericVariantFromJsonbehaviour-changed — 内部累积改用负 signed Int64,从而恢复 Delphi 7 支持。

Arnaud Bouchez · 16:41 UTC · 在 GitHub 上查看该提交 →

9 中 GetExtended 完成有界缩放且不改变 API mormot.core.text 将 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 将每个十进制数字缓存为整数用于边界检查与累积,并直接使用一元负号,而不是乘以负的十次幂常量。 性能 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 与错误出口,以紧凑比较替代 Int64 字面边界,使用 HASSLOWMUL64 累积,并在 PtrInt 运算可能溢出前限制指数。 内部重构 mormot.core.text 19d03c62+26-39

core: another pass on GetExtended() after #579

影响

公开 API 不变。Delphi 与 FPC 保留先前增加的 parser 边界,并采用更短实现及架构友好的指数保护。

Arnaud Bouchez · 12:43 UTC · PR #579 · 在 GitHub 上查看该提交 →

12 低 Int64 边界在 parser 与存储中集中定义 mormot.core.base 公开 MAX_INT64 与 MAX_INT64_DIV10。GetExtended、HTTP byte-range 解析、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 边界表达式。

公开 API

  • MAX_INT64added — High(Int64) 的公开别名。
  • MAX_INT64_DIV10added — 预计算的公开 High(Int64) div 10 边界。

Arnaud Bouchez · 16:37 UTC · 在 GitHub 上查看该提交 →

13 低 TimeSpan 往返与无效输入新增边界测试 test.core.base 针对零值、signed 值、天边界、毫秒截断和 Int64 极值验证 TimeSpanToText 与 TextToTimeSpanBuffer 的往返。测试还拒绝不完整字段、越界时分秒、不支持的加号及错误小数。 测试 77e2295f+89-25

tests: enhanced TimeSpan validation coverage

影响

应用代码无需改动。Delphi 与 FPC build 为新 parser 及其毫秒精度约定增加回归覆盖。

Arnaud Bouchez · 20:11 UTC · 在 GitHub 上查看该提交 →

14 低 数值边界与极小小数新增 cross-backend 测试 test.core.base 扩充 Int64、Currency、double、错误数值与极小小数断言。它按不同 TSynExtended layout 检查 double 文本输出,并为受支持的 Delphi/FPC backend 调整溢出测试。 测试 1cff873b+56-32

tests: fixed and completed numerical conversion coverage

影响

应用代码无需改动。稳定后的 parser 行为现在覆盖各编译器特有的浮点表示。

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