mORMot2 DailyLecture quotidienne des commits upstream

Les parseurs numériques Pascal sont réécrits autour de chemins entiers plus rapides

Les implémentations Pascal derrière GetExtended et GetNumericVariantFromJson maintiennent désormais les entiers courants et les décimaux courts dans des boucles plus resserrées, tout en conservant des contrôles pour les longues mantisses, les exposants et les limites Int64. Les tests GetExtended rendent aussi explicites la normalisation du signe de zéro et plusieurs fractions de 18 à 20 chiffres. Aucune migration de signature n’est requise, mais les applications dépendant du type numérique exact des variants ou de cas limites flottants doivent valider la build 2.4.16865.

En bref

  • Passez à la build 2.4.16865 et retestez les conversions numériques qui dépendent du type variant exact ou de l’arrondi aux limites.
  • Le chemin Pascal hors Win32 de GetExtended a été simplifié deux fois, avec des boucles distinctes pour les 18 premiers chiffres, la suite contrôlée contre les débordements, les fractions et les exposants.
  • GetExtended normalise maintenant volontairement -0 et -0e400 en zéro numérique sur son chemin Pascal, conformément au comportement fixé par les nouveaux tests.
  • GetNumericVariantFromJson déroule ses premiers chiffres et réécrit la sélection Int64, Currency et Double sans modifier sa signature publique.
  • mormot.core.base ajoute la constante publique MIN_INT64 et le membre overlay TSynVarData.VPtrInt.

Conseil de mise à jour

Prenez la build 2.4.16865 comme séquence complète des parseurs. Le payload brut n’identifie aucune plage intermédiaire cassée, mais les quatre commits sont étroitement liés : le parseur JSON final utilise MIN_INT64 ajouté juste avant. Relancez les tests pour -0, les extrêmes Int64, les longues mantisses décimales, les valeurs Currency jusqu’à quatre décimales, la notation scientifique et les nombres JSON invalides sur chaque backend Delphi et FPC livré.

Build2.4.16861 → 2.4.16865
Commits4
Lignes+307 -204
Lecture3 min

4 sur 4 entrées · 4 commits upstream

Sujets
# Entrée Catégorie Unités
1 Moyenne Les variants numériques JSON reçoivent un parseur déroulé des chiffres courants GetNumericVariantFromJson déroule maintenant l’accumulation initiale des chiffres, traite les suivants par paires et dans des boucles contrôlées contre les débordements, gère MIN_INT64 avec une sentinelle explicite et sépare la validation des fractions et exposants. La phase de résultat est réécrite autour de magnitudes positives pour varInteger, varInt64, varCurrency et varDouble, y compris l’initialisation de zéro de taille pointeur via TSynVarData.VPtrInt. Performance mormot.core.variants c88c4ad7+170-93

core: rewritten GetNumericVariantFromJson()

Impact

Tous les appelants Delphi et FPC de la fonction publique utilisent la nouvelle implémentation Pascal. La signature et la grammaire JSON acceptée ne changent pas dans le diff, mais le code choisissant le stockage exact integer, Currency ou Double a été largement remplacé ; les consommateurs inspectant TVarData.VType doivent retester des limites représentatives. Le payload ne contient aucun résultat de benchmark.

À regarder

Testez le VType et la valeur renvoyés autour des limites 32 bits, Int64 et Currency, ainsi que les longues mantisses et les formes d’exposant signées.

Arnaud Bouchez · 21:15 UTC · voir le commit sur GitHub →

2 Moyenne GetExtended réduit le travail des chemins courants entiers et décimaux Le parseur GetExtended hors WIN32DELPHI remplace plusieurs compteurs signés et valeurs flottantes temporaires par un traitement des chiffres en PtrUInt, renvoie directement les entiers et zéro, et regroupe la mise à l’échelle par puissances de dix en moins d’opérations. Son contrôle NAN/INF lit maintenant un préfixe de deux octets avant de vérifier le troisième caractère. Le même commit documente pourquoi le parseur numérique JSON divise par des puissances exactes pour les exposants négatifs courts. Performance mormot.core.text+1 700177da+64-74

core: slightly optimized GetExtended() code

Impact

Les builds FPC et Delphi hors Win32 utilisent le chemin Pascal simplifié ; Delphi Win32 continue d’utiliser son implémentation assembleur x87. Les signatures publiques restent inchangées. Le chemin direct de zéro normalise le zéro négatif, comportement rendu explicite par les tests du commit suivant.

À regarder

Incluez le zéro signé et des limites d’exposant représentatives dans les tests de régression du parseur avant la mise à niveau.

API publique

  • GetExtendedbehaviour-changed — Le chemin Pascal normalise -0 et zéro avec exposant en zéro numérique ; les signatures ne changent pas.

Arnaud Bouchez · 08:21 UTC · voir le commit sur GitHub →

3 Moyenne GetExtended sépare les chiffres rapides du parsing protégé contre les débordements L’implémentation Pascal de GetExtended est de nouveau réécrite : les 18 premiers chiffres entiers sont accumulés sans contrôle de débordement, les suivants utilisent une boucle protégée, les chiffres significatifs excédentaires sont ignorés tout en conservant leur position décimale, et la syntaxe des fractions et exposants dispose de validations dédiées. Les tests ajoutent de longues fractions aux limites, les entrées invalides -e1 et .e2, ainsi que la normalisation attendue de -0e400. Performance mormot.core.text 71129606+66-33

core: rewritten GetExtended() pascal

Impact

Il s’agit de l’implémentation GetExtended finale de l’édition, avec une couverture de régression élargie autour de 18 à 20 chiffres significatifs. Elle affecte les performances et résultats limites du parsing FPC et Delphi hors Win32 ; Delphi Win32 conserve son chemin assembleur. Aucun changement de source appelante n’est requis.

À regarder

Relancez les tests de conversion bit à bit pour les longues mantisses, les subnormaux et les limites d’exposant sur les cibles hors Win32.

Arnaud Bouchez · 09:47 UTC · voir le commit sur GitHub →

4 Faible MIN_INT64 et un overlay variant de taille pointeur deviennent publics mormot.core.base ajoute MIN_INT64 à côté de MAX_INT64 et VPtrInt dans la branche varOleInt de TSynVarData. TRestStorageInMemory.FindMax utilise la constante nommée au lieu de low(Int64), et un commentaire GetExtended explique pourquoi sa boucle Pascal n’est pas déroulée comme celle du parseur JSON. Nouveautés mormot.core.base+2 e5746e2f+7-4

core: minor refactoring including new MIN_INT64 constant

Impact

Le comportement ORM existant ne change pas. Le code de bibliothèque et d’application peut désormais utiliser un minimum signé 64 bits nommé et effacer ou accéder directement au stockage entier de taille pointeur de TSynVarData. Les ajouts suivent la largeur PtrInt sous Delphi et FPC.

API publique

  • MIN_INT64added — Constante publique égale à low(Int64).
  • TSynVarData.VPtrIntadded — Vue entière de taille pointeur ajoutée à la branche overlay varOleInt.

Arnaud Bouchez · 15:04 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