mORMot2 DailyLecture quotidienne des commits upstream

Les très petits décimaux sont réparés et TimeSpan devient bidirectionnel

Le travail du précédent numéro sur les parsers numériques a nécessité deux corrections : GetExtended et GetNumericVariantFromJson pouvaient perdre des chiffres significatifs après une longue série de zéros fractionnaires. Leurs implémentations ont ensuite été simplifiées, optimisées et couvertes par des tests de limites, y compris pour Delphi 7 et Delphi Win32. Le support Microsoft TimeSpan reconvertit maintenant le texte en ticks signed 64 bits et accepte des délimiteurs CSV ou JSON sûrs.

En bref

  • Passez à 2.4.16844 ; les builds 2.4.16828 à 2.4.16839 contiennent un travail incomplet ou encore mouvant sur les parsers numériques.
  • GetExtended et GetNumericVariantFromJson conservent maintenant les chiffres significatifs de valeurs comme 0.00000000000000000123 au lieu de les perdre silencieusement.
  • GetNumericVariantFromJson utilise maintenant un accumulateur Int64 négatif, rétablissant la compatibilité Delphi 7 tout en conservant les bornes Int64, Currency et double.
  • TextToTimeSpan et TextToTimeSpanBuffer convertissent le texte Microsoft TimeSpan en ticks signed de 100 ns avec une résolution à la milliseconde.
  • TSynSystemTime.FromTimeSpan gagne un overload fondé sur un pointeur et le parser final accepte les délimiteurs NUL, espace, virgule, point-virgule, apostrophe ou guillemet.
  • Delphi Win32 reçoit des chemins shift-and-add pour la multiplication 64 bits lente ; les autres cibles conservent la multiplication ordinaire.

Conseil de mise à jour

Prenez la build 2.4.16844 comme un ensemble complet. Ne vous arrêtez pas entre 2.4.16828 et 2.4.16839 : les builds 16836 et 16837 réparent les très petites fractions, puis les builds 16838 et 16839 réécrivent les mêmes chemins avant que la build 16840 complète leur couverture de régression. Les applications qui analysent de petites valeurs scientifiques ou financières doivent rejouer leurs tests de limites.

Build2.4.16828 → 2.4.16844
Commits14
Lignes+518 -338
Lecture5 min

14 sur 14 entrées · 14 commits upstream

Sujets
# Entrée Catégorie Unités
1 Élevée Les variants JSON gardent les chiffres significatifs après de longs zéros fractionnaires GetNumericVariantFromJson ignore maintenant les zéros initiaux après le point décimal sans consommer son budget de chiffres significatifs. L’exposant fractionnaire est toujours décrémenté pour chaque zéro ignoré. Correctifs mormot.core.variants ca07dda2+12-8

core: fixed GetNumericVariantFromJson() long-standing issue

Impact

Les backends qui analysent de très petits nombres JSON comme 0.00000000000000000123 ne perdent plus silencieusement les chiffres non nuls et ne retournent plus le mauvais variant numérique. C’est une correction d’intégrité des données pour Delphi et FPC.

API publique

  • GetNumericVariantFromJsonbehaviour-changed — Les zéros fractionnaires initiaux ne consomment plus la capacité de chiffres significatifs.

Arnaud Bouchez · 16:40 UTC · voir le commit sur GitHub →

2 Élevée GetExtended préserve les très petites fractions non nulles mormot.core.text modifie GetExtended afin que les zéros immédiatement après le point décimal ajustent l’échelle sans consommer le budget de l’accumulateur de 19 chiffres avant le premier chiffre significatif. Correctifs mormot.core.text 9e649966+8-2

core: fixed GetExtended() long-standing issue

Impact

Le code Delphi et FPC qui analyse de petites chaînes décimales scientifiques ou financières ne reçoit plus une valeur silencieusement tronquée après de nombreux zéros fractionnaires.

API publique

  • GetExtendedbehaviour-changed — Les longues séries de zéros fractionnaires n’éliminent plus les chiffres significatifs suivants.

Arnaud Bouchez · 16:39 UTC · voir le commit sur GitHub →

3 Moyenne TSynSystemTime gagne un parser pour les valeurs TimeSpan textuelles mormot.core.datetime ajoute MAX_TIMESPAN et un overload de TSynSystemTime.FromTimeSpan qui analyse les jours, l’heure et une fraction optionnelle depuis PUtf8Char. Il retourne le pointeur final et expose séparément le nombre de jours et le signe. Nouveautés mormot.core.datetime 9b3f2566+107-4

core: new TSynSystemTime.FromTimeSpan() overload

Impact

Les parsers bas niveau Delphi et FPC peuvent décoder le même format compact que TimeSpanToText. Les jours ou heures hors limites retournent nil et effacent le record.

À regarder

API publique

  • MAX_TIMESPANadded — Nombre maximal de jours entiers représentable par un TimeSpan signed 64 bits.
  • TSynSystemTime.FromTimeSpan(PUtf8Char, PtrInt, PtrInt)added — Analyse un texte TimeSpan compact et retourne son pointeur final, les jours et le signe.

Arnaud Bouchez · 20:10 UTC · voir le commit sur GitHub →

4 Moyenne Le texte Microsoft TimeSpan peut être reconverti en ticks mormot.core.datetime ajoute TextToTimeSpanBuffer et TextToTimeSpan. Ces fonctions combinent jours, heures, minutes, secondes et millisecondes analysés en un compte Int64 signed de ticks Microsoft de 100 ns. Nouveautés mormot.core.datetime b6bef042+29-2

core: new TextToTimeSpan/TextToTimeSpanBuffer() functions

Impact

Les backends Delphi et FPC peuvent faire un round trip des durées d’annuaire ou .NET sans parser personnalisé. Les chiffres sous la milliseconde sont acceptés mais volontairement ignorés.

À regarder

API publique

  • TextToTimeSpanBufferadded — Retourne le premier octet après le TimeSpan analysé ou nil en cas d’erreur.
  • TextToTimeSpanadded — Convertit un texte TimeSpan RawUtf8 en ticks signed de 100 ns.

Arnaud Bouchez · 20:11 UTC · voir le commit sur GitHub →

5 Moyenne Le parsing TimeSpan s’arrête proprement aux délimiteurs de données courants mormot.core.datetime affine TSynSystemTime.FromTimeSpan(PUtf8Char, days, neg) afin qu’une valeur analysée puisse se terminer par NUL, un espace, une virgule, un point-virgule, une apostrophe ou un guillemet. Les fractions de seconde exigent toujours au moins trois chiffres. Nouveautés mormot.core.datetime a2908ede+7-6

core: refined TextToTimeSpanBuffer() function

Impact

Les parsers Delphi et FPC peuvent lire un TimeSpan directement dans des buffers CSV, proches de JSON ou tokenisés, puis reprendre au délimiteur retourné. Cela élargit les entrées acceptées par les API du même lot.

À regarder

API publique

  • TSynSystemTime.FromTimeSpan(PUtf8Char, PtrInt, PtrInt)behaviour-changed — Accepte NUL, les espaces et les délimiteurs CSV ou JSON courants après une valeur valide.

Arnaud Bouchez · 20:19 UTC · voir le commit sur GitHub →

6 Moyenne GetInteger simplifie les bornes signed sur les cibles 32 et 64 bits mormot.core.base remplace le comptage des chiffres par distance de pointeur par un compte à rebours, représente le signe en PtrUInt et sépare les contrôles explicites d’overflow 32 bits de la limite du dix-neuvième chiffre en 64 bits. Les espaces initiaux, signes et zéros restent pris en charge. Performance mormot.core.base b1187b83+27-30

core: refactored/optimized GetInteger() after PR #579

Impact

Les appelants Delphi et FPC gardent le même contrat GetInteger et les mêmes limites signed. Il s’agit d’une optimisation d’implémentation après la précédente correction d’overflow.

Arnaud Bouchez · 07:36 UTC · PR #579 · voir le commit sur GitHub →

7 Moyenne Les chemins de multiplication 64 bits lente sont limités à Delphi Win32 Les parsers core integer, YAML, Currency et HTTP range utilisent maintenant le shift-and-add par dix uniquement sous HASSLOWMUL64. Les autres cibles utilisent la multiplication native, et les assertions de sortie numérique sont normalisées. Performance mormot.core.base+3 33638087+16-27

core: optimize Delphi Win32 HASSLOWMUL64 path

Impact

Delphi Win32 conserve le contournement de multiplication tandis que les cibles Delphi récentes et FPC évitent les séquences shift-and-add inutiles. Les valeurs analysées et API publiques ne changent pas.

Arnaud Bouchez · 12:27 UTC · voir le commit sur GitHub →

8 Moyenne Les variants numériques JSON retrouvent la compatibilité Delphi 7 mormot.core.variants réécrit GetNumericVariantFromJson autour d’un accumulateur Int64 négatif au lieu de UInt64. Les chemins de sortie integer, Currency et double sont simplifiés tout en conservant les contrôles de grammaire et de limites introduits par la PR #579. Compilateur & plateforme mormot.core.variants 41f703b6+92-114

core: rewritten GetNumericVariantFromJson()

Impact

Delphi 7 peut de nouveau compiler le parser renforcé. Les backends Delphi récents et FPC conservent la même sélection de variant et le même comportement aux limites avec un chemin courant plus court.

API publique

  • GetNumericVariantFromJsonbehaviour-changed — L’accumulation interne devient un Int64 signed négatif, rétablissant Delphi 7.

Arnaud Bouchez · 16:41 UTC · voir le commit sur GitHub →

9 Moyenne GetExtended finalise un scaling borné sans changer son API mormot.core.text réorganise le scaling de GetExtended en chemins rapides -31..31, très petits et très grands. Il conserve les contrôles explicites d’underflow et d’overflow et applique le signe après la multiplication bornée. Sous le capot mormot.core.text 30e95e50+30-33

core: refactored GetExtended() after #579

Impact

Les appelants Delphi et FPC gardent la même API. L’implémentation finale réduit le travail du cas courant tout en conservant le comportement corrigé pour les petites fractions et valeurs extrêmes.

Arnaud Bouchez · 16:43 UTC · PR #579 · voir le commit sur GitHub →

10 Faible GetExtended réduit le coût par chiffre et du signe mormot.core.text met chaque chiffre décimal en cache comme entier pour le contrôle de limites et l’accumulation, puis applique un moins unaire direct au lieu de multiplier par une constante puissance de dix négative. Performance mormot.core.text 5bca2b43+6-5

core: optimized GetExtended() after last PR

Impact

Aucun changement du code applicatif. GetExtended effectue légèrement moins de travail sous Delphi et FPC tout en conservant le comportement du parser issu de la correction précédente.

Arnaud · 09:24 UTC · voir le commit sur GitHub →

11 Faible GetExtended simplifie les limites et les valeurs spéciales mormot.core.text regroupe les sorties NaN, Infinity et erreur, remplace les limites Int64 littérales par une comparaison compacte, utilise HASSLOWMUL64 pour l’accumulation et borne les exposants avant un dépassement de l’arithmétique PtrInt. Sous le capot mormot.core.text 19d03c62+26-39

core: another pass on GetExtended() after #579

Impact

Aucun changement d’API publique. Delphi et FPC conservent les limites de parser ajoutées précédemment avec une implémentation plus courte et une garde d’exposant adaptée aux architectures.

Arnaud Bouchez · 12:43 UTC · PR #579 · voir le commit sur GitHub →

12 Faible Les limites Int64 sont centralisées dans les parsers et le stockage mormot.core.base publie MAX_INT64 et MAX_INT64_DIV10. GetExtended, le parsing des byte ranges HTTP, les constantes OpenSSL et les limites d’identifiants ORM les réutilisent, tandis que GetNextRange conserve son clamp à High(Int64). Sous le capot mormot.core.base+4 a5b75dde+13-11

core: refactored GetNextRange() and other Int64 clamp code

Impact

Aucun changement de comportement applicatif n’est visible dans le diff. Le code Delphi et FPC peut réutiliser les nouvelles constantes publiques au lieu de répéter les expressions de limites signed 64 bits.

API publique

  • MAX_INT64added — Alias public de High(Int64).
  • MAX_INT64_DIV10added — Limite publique précalculée High(Int64) div 10.

Arnaud Bouchez · 16:37 UTC · voir le commit sur GitHub →

13 Faible Les round trips TimeSpan et entrées invalides gagnent des tests de limites test.core.base compare TimeSpanToText à TextToTimeSpanBuffer pour zéro, les valeurs signed, les limites de jours, la troncature des millisecondes et les extrêmes Int64. Il rejette aussi les champs incomplets, heures, minutes et secondes hors limites, le signe plus non pris en charge et les fractions mal formées. Tests 77e2295f+89-25

tests: enhanced TimeSpan validation coverage

Impact

Aucun changement du code applicatif. Les builds Delphi et FPC gagnent une couverture de régression pour le nouveau parser et son contrat à la milliseconde.

Arnaud Bouchez · 20:11 UTC · voir le commit sur GitHub →

14 Faible Les limites numériques et petites fractions gagnent des tests cross-backend test.core.base étend les assertions Int64, Currency, double, nombres mal formés et petites fractions. Il vérifie la sortie texte des doubles selon les layouts TSynExtended et ajuste les tests de dépassement pour les backends Delphi et FPC pris en charge. Tests 1cff873b+56-32

tests: fixed and completed numerical conversion coverage

Impact

Aucun changement du code applicatif. Le comportement stabilisé des parsers est maintenant exercé selon les représentations flottantes propres aux compilateurs.

Arnaud Bouchez · 16:44 UTC · voir le commit sur GitHub →

Activité upstream commits par jour · 60 derniers jours
Commits977
Jours actifs44/60
Plus chargé2026-09-30
Pic60
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