Agir maintenantpeut affecter un système en productionLe payload brut ne contient aucun marqueur superseded_by. La plage à éviter repose sur les diffs consécutifs et les sujets de commits intégrés, qui réparent puis réécrivent explicitement les mêmes routines de parsing numérique. Le head upstream est la build 2.4.16844 à la fin de la fenêtre examinée.
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.
14 sur 14 entrées · 14 commits upstream
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.
Mise à jour recommandée
Passez à la build 2.4.16840 ou ultérieure et retestez les champs JSON comportant de nombreux zéros fractionnaires initiaux, y compris les formes signed et avec exposant.
API publique
GetNumericVariantFromJsonbehaviour-changed — Les zéros fractionnaires initiaux ne consomment plus la capacité de chiffres significatifs.
Unités
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.
Mise à jour recommandée
Passez à la série numérique complète en build 2.4.16840 ou ultérieure et ajoutez un cas de régression autour du plus petit décimal non nul accepté par votre application.
API publique
GetExtendedbehaviour-changed — Les longues séries de zéros fractionnaires n’éliminent plus les chiffres significatifs suivants.
Unités
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.
Unités
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.
Unités
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.
Unités
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.
Unités
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.
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.
Mise à jour recommandée
Les utilisateurs de Delphi 7 doivent prendre cette réécriture avec le refactoring GetExtended suivant et les tests numériques complets jusqu’à la build 2.4.16840.
API publique
GetNumericVariantFromJsonbehaviour-changed — L’accumulation interne devient un Int64 signed négatif, rétablissant Delphi 7.
Unités
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.
Unités
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.
Unités
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.
Unités
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.
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.
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.