mORMot2 Daily每日上游提交速读

Pascal 数值解析器围绕更快的整数路径完成重写

GetExtended 与 GetNumericVariantFromJson 背后的 Pascal 实现现在让常见整数和短小数走更紧凑的循环,同时继续保护长尾数、指数与 Int64 边界。GetExtended 测试还明确了零符号归一化以及若干 18–20 位小数的结果。公开 signature 无需迁移,但依赖精确 numeric variant type 或浮点边界行为的应用应针对 build 2.4.16865 做验证。

要点

  • 应采用 build 2.4.16865,并回归测试依赖精确 variant type 或边界舍入的数值转换代码。
  • 非 Win32 的 Pascal GetExtended 路径经过两次精简,为前 18 位数字、带溢出检查的后续数字、小数与指数分别设置快速循环。
  • GetExtended 的 Pascal 路径现在会按新增测试明确规定的行为,把 -0 与 -0e400 归一化为数值零。
  • GetNumericVariantFromJson 展开起始数字,并重写 Int64、Currency 与 Double 的选择逻辑,公开 signature 不变。
  • mormot.core.base 新增公开常量 MIN_INT64 与 TSynVarData.VPtrInt overlay member。

升级建议

请把 build 2.4.16865 作为完整解析器序列采用。原始 payload 未标记损坏的中间区间,但四个 commit 紧密关联:最终 JSON parser 使用了紧接着之前新增的 MIN_INT64。请在所有交付的 Delphi 与 FPC backend 上重新测试 -0、Int64 极值、长小数尾数、最多四位小数的 Currency 值、科学计数法和无效 JSON 数字。

版本号2.4.16861 → 2.4.16865
提交4
行数+307 -204
阅读1 分钟

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

主题
# 条目 类别 单元
1 中 JSON 数值 variant 获得展开的常见数字解析器 GetNumericVariantFromJson 现在展开起始数字累积,后续数字以成对和带溢出检查的循环处理,用显式 sentinel 处理 MIN_INT64,并分离小数与指数验证。结果阶段围绕正数幅值重写,覆盖 varInteger、varInt64、varCurrency 与 varDouble,并通过 TSynVarData.VPtrInt 进行指针大小的零初始化。 性能 mormot.core.variants c88c4ad7+170-93

core: rewritten GetNumericVariantFromJson()

影响

公开函数的所有 Delphi 与 FPC 调用方都会使用新的 Pascal 实现。diff 中 signature 与接受的 JSON grammar 不变,但决定精确 integer、Currency 或 Double 存储的代码已大幅替换;检查 TVarData.VType 的 consumer 应回归测试代表性边界。payload 未包含 benchmark 结果。

值得一看

请测试 32 位、Int64 与 Currency 边界附近返回的 VType 和数值,以及长尾数和带符号指数形式。

Arnaud Bouchez · 21:15 UTC · 在 GitHub 上查看该提交 →

2 中 GetExtended 减少常见整数与小数路径的工作量 非 WIN32DELPHI 的 GetExtended parser 以 PtrUInt 数字处理替代多个有符号计数器与临时浮点值,直接返回整数与零,并用更少操作完成十次幂缩放。NAN/INF 探测现在先读取两字节前缀,再检查第三个字符。同一 commit 还说明 JSON 数值 parser 为何在短负指数下除以精确幂。 性能 mormot.core.text+1 700177da+64-74

core: slightly optimized GetExtended() code

影响

FPC 与非 Win32 Delphi build 使用精简后的 Pascal 路径;Delphi Win32 继续使用 x87 assembly 实现。公开 signature 不变。直接零路径会归一化负零,下一 commit 的测试明确记录了这一行为。

值得一看

升级前请在 parser 回归测试中加入有符号零与代表性的指数边界。

公开 API

  • GetExtendedbehaviour-changed — Pascal 路径把 -0 与带指数的零归一化为数值零;signature 不变。

Arnaud Bouchez · 08:21 UTC · 在 GitHub 上查看该提交 →

3 中 GetExtended 将快速数字与溢出感知解析分离 Pascal GetExtended 实现再次重写:前 18 位整数数字无需溢出检查即可累积,后续数字进入保护循环,多余有效数字在保留十进制位置的同时被跳过,小数与指数语法则各自验证。测试新增长小数边界、无效输入 -e1 与 .e2,以及 -0e400 的预期归一化。 性能 mormot.core.text 71129606+66-33

core: rewritten GetExtended() pascal

影响

这是本期最终的 GetExtended 实现,并扩大了对 18–20 位有效数字的回归覆盖。它会影响 FPC 与非 Win32 Delphi 的解析性能和边界结果;Delphi Win32 保留 assembly 路径。调用方无需修改源码。

值得一看

在非 Win32 target 上重新运行长尾数、subnormal 与指数边界的精确位转换测试。

Arnaud Bouchez · 09:47 UTC · 在 GitHub 上查看该提交 →

4 低 MIN_INT64 与指针大小的 variant overlay 成为公开成员 mormot.core.base 在 MAX_INT64 旁新增 MIN_INT64,并在 TSynVarData 的 varOleInt 分支加入 VPtrInt。TRestStorageInMemory.FindMax 改用命名常量而非 low(Int64),GetExtended 注释则说明其 Pascal 循环为何不像 JSON parser 那样展开。 新功能 mormot.core.base+2 e5746e2f+7-4

core: minor refactoring including new MIN_INT64 constant

影响

现有 ORM 行为不变。库与应用代码现在可以使用命名的有符号 64 位最小值,并直接清零或访问 TSynVarData 的指针大小整数存储。这些新增项会按 Delphi 与 FPC 的 PtrInt 宽度编译。

公开 API

  • MIN_INT64added — 等于 low(Int64) 的公开常量。
  • TSynVarData.VPtrIntadded — 在 varOleInt overlay 分支新增指针大小整数视图。

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