立即处理可能影响正在运行的系统原始 payload 不含 superseded_by 标记。应避开的范围依据内嵌的连续 diff 与 commit subject;它们明确修复并随后重写同一数值 parser 例程。审查窗口结束时 upstream head 为 build 2.4.16844。
极小小数得到修复,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 才补全回归覆盖。解析极小科学或金融数值的应用应在升级后重跑边界测试。
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 的数据正确性修复。
建议升级
升级到 build 2.4.16840 或更高版本,并重新测试含大量小数前导零的 JSON 字段,包括 signed 与指数形式。
公开 API
GetNumericVariantFromJsonbehaviour-changed — 小数前导零不再消耗有效数字容量。
2
高
GetExtended 保留极小非零小数
mormot.core.text 修改 GetExtended:小数点后的零会调整 scale,但在首个有效数字出现前不消耗 19 位 accumulator 预算。
修复
mormot.core.text
9e649966+8-2
core: fixed GetExtended() long-standing issue
影响
解析极小科学或金融小数字符串的 Delphi 与 FPC 代码,不再因大量小数零而得到被静默截断的值。
建议升级
升级到完成数值系列的 build 2.4.16840 或更高版本,并围绕应用接受的最小非零小数加入回归用例。
公开 API
GetExtendedbehaviour-changed — 长串小数零不再丢弃后续有效数字。
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、天数和符号。
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。
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。
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 修复后的实现优化。
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 不变。
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 选择和边界行为,同时缩短常见路径。
建议升级
Delphi 7 用户应同时采用此重写、后续 GetExtended refactor 以及直到 build 2.4.16840 的完整数值测试。
公开 API
GetNumericVariantFromJsonbehaviour-changed — 内部累积改用负 signed Int64,从而恢复 Delphi 7 支持。
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。最终实现减少常见路径开销,并保留修复后的极小小数与极值行为。
10
低
GetExtended 降低逐位与符号处理开销
mormot.core.text 将每个十进制数字缓存为整数用于边界检查与累积,并直接使用一元负号,而不是乘以负的十次幂常量。
性能
mormot.core.text
5bca2b43+6-5
core: optimized GetExtended() after last PR
影响
应用代码无需改动。GetExtended 在 Delphi 与 FPC 上减少少量开销,并保留前一修复的 parser 行为。
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 边界,并采用更短实现及架构友好的指数保护。
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 边界。
13
低
TimeSpan 往返与无效输入新增边界测试
test.core.base 针对零值、signed 值、天边界、毫秒截断和 Int64 极值验证 TimeSpanToText 与 TextToTimeSpanBuffer 的往返。测试还拒绝不完整字段、越界时分秒、不支持的加号及错误小数。
测试
77e2295f+89-25
tests: enhanced TimeSpan validation coverage
影响
应用代码无需改动。Delphi 与 FPC build 为新 parser 及其毫秒精度约定增加回归覆盖。
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 行为现在覆盖各编译器特有的浮点表示。