<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Forum du club des développeurs et IT Pro - Rust</title>
		<link>https://www.developpez.net/forums/</link>
		<description><![CDATA[Forum d'entraide sur Rust, langage de développement libre et open source développé par Mozilla.]]></description>
		<language>fr</language>
		<lastBuildDate>Sat, 05 Sep 2026 08:53:04 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>15</ttl>
		<image>
			<url>https://forum.developpez.be/images/misc/rss.png</url>
			<title>Forum du club des développeurs et IT Pro - Rust</title>
			<link>https://www.developpez.net/forums/</link>
		</image>
		<item>
			<title>Terminal Rust pour neovim</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2185468&amp;goto=newpost</link>
			<pubDate>Thu, 03 Sep 2026 21:06:19 GMT</pubDate>
			<description>Bonjour ,   si cela vous...</description>
			<content:encoded><![CDATA[<div>Bonjour ,   si cela vous intéresse, j'ai fait un terminal en Rust  pour Neovim.   GTK3 VTE3 <br />
<a rel="nofollow" href="https://github.com/AS400JPLPC/term_rust" target="_blank">https://github.com/AS400JPLPC/term_rust</a><br />
<br />
et  deployer  neovim pour Rust    <br />
<a rel="nofollow" href="https://github.com/AS400JPLPC/my_neovim" target="_blank">https://github.com/AS400JPLPC/my_neovim</a><br />
<br />
Tout est fonctionnel, c'est mon environnement de travail.   <br />
<br />
Simple mais efficace.  pas besoin d'onglet, vous pouvez lancer autant de sessions terminal.<br />
<br />
@bientôt</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f2138/general-developpement/programmation-systeme/rust/">Rust</category>
			<dc:creator>JPLAROCHE</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2185468/general-developpement/programmation-systeme/rust/terminal-rust-neovim/</guid>
		</item>
		<item>
			<title>Rust 1.98 : méthodes algébriques, formatage optimisé et documentation améliorée</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2185318&amp;goto=newpost</link>
			<pubDate>Tue, 25 Aug 2026 10:17:28 GMT</pubDate>
			<description>*La version 1.98 de Rust...</description>
			<content:encoded><![CDATA[<div><b><font size="4">La version 1.98 de Rust introduit des méthodes algébriques pour les nombres à virgule flottante, le formatage des entiers avec mise en mémoire tampon et améliore la documentation de ManuallyDrop</font></b><br />
<br />
<b>La version 1.98 du langage de programmation Rust vient d'être publiée. Réputé pour ses performances, sa sécurité des types, sa concurrence et sa sécurité mémoire, ce langage polyvalent s'enrichit de nouvelles fonctionnalités. Les types à virgule flottante <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">f32</span> et <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">f64</span> disposent désormais de méthodes algébriques pour l'addition, la soustraction, la multiplication, la division et le reste. Tous les types entiers primitifs fournissent une méthode <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">format_into</span> avec un tampon spécialisé pour les conversions rapides en chaînes de caractères. La documentation relative à ManuallyDrop a également été révisée pour garantir un comportement sûr d'une version à l'autre.</b><br />
<br />
Rust est un langage de programmation polyvalent qui met l'accent sur les performances, la sécurité des types, la concurrence et la sécurité de la mémoire. Rust prend en charge plusieurs paradigmes de programmation. Il s'inspire de concepts issus de la programmation fonctionnelle, notamment l'immuabilité, les fonctions d'ordre supérieur, les types de données algébriques et la correspondance de motifs. Il prend également en charge la programmation orientée objet via les structs, les énumérations, les traits et les méthodes. <br />
<br />
Rust 1.98 vient d'être publié. Il s'agit de la dernière version de ce langage de programmation polyvalent, réputé pour ses performances, sa sécurité des types, sa concurrence et sa sécurité mémoire. Parmi les principales nouveautés, les types à virgule flottante <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><font color="#FF0000">f32</font></span> et <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><font color="#FF0000">f64</font></span> disposent désormais de nouvelles méthodes algébriques pour l’addition, la soustraction, la multiplication, la division et le reste. <br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p678413d1787655191/general-developpement/programmation-systeme/rust/rust-1-98-methodes-algebriques-formatage-optimise-documentation-amelioree/rust.png/" border="0" alt="Nom : Rust.png
Affichages : 3089
Taille : 50,8 Ko"  style="float: CONFIG" /></div><br />
Ces méthodes permettent au compilateur d’appliquer des optimisations basées sur les propriétés arithmétiques des nombres réels, même si les limitations de la virgule flottante empêchent certaines propriétés d’être respectées avec précision. Ces méthodes sont non déterministes, ce qui signifie qu’elles peuvent produire des résultats différents en fonction des optimisations du compilateur, mais n’introduisent jamais de comportement indéfini.<br />
<br />
De plus, tous les types entiers primitifs fournissent désormais une méthode <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><font color="#FF0000">format_into</font></span> qui utilise un tampon spécialisé pour produire des représentations sous forme de chaînes décimales. Cette approche contourne une grande partie du dispatch dynamique associé aux macros de formatage avec tampon, offrant ainsi des gains d’efficacité aux développeurs qui ont besoin de conversions rapides d’entiers en chaînes de caractères.<br />
<br />
Dans le cadre des efforts visant à assurer la stabilité du langage, la documentation relative à <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><font color="#FF0000">ManuallyDrop</font></span> a été révisée. Elle garantit désormais que le déplacement d'un <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><font color="#FF0000">ManuallyDrop</font></span> après que la <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><font color="#FF0000">Box</font></span> a été libérée n'entraînera pas de comportement indéfini, conformément à une correction introduite pour la première fois dans Rust 1.96. Ces précisions contribuent à garantir que le code conserve un comportement sûr d'une version à l'autre du langage.<br />
<br />
<div style="text-align: center;">
<div class="video-container"><iframe class="restrain" title="YouTube video player" width="560" height="315" allowfullscreen src="//www.youtube.com/embed/Y9gsehlKrQw?wmode=transparent&amp;fs=1" frameborder="0"></iframe></div>
</div><br />
En mai 2026, Greg Kroah-Hartman, responsable de la maintenance du noyau stable de Linux, a affirmé que <a href="https://linux.developpez.com/actu/383621/-Rust-sauvera-Linux-de-l-IA-affirme-Greg-Kroah-Hartman-dans-le-cadre-d-une-critique-de-l-usage-de-l-intelligence-artificielle-pour-trouver-les-bogues-au-sein-du-code-du-noyau-ecrit-en-langage-C/" target="_blank">Rust peut aider Linux à faire face à un afflux de failles de sécurité détectées par l'IA</a> (notamment Dirty Frag, Copy Fail et Fragnesia) en prévenant les erreurs courantes en C liées à la gestion de la mémoire, au verrouillage, à la gestion des erreurs et aux données non fiables dès la phase de compilation, plutôt que lors de la révision par les mainteneurs. Sa sortie est de nature à donner un coup de neuf au débat sur la comparaison entre les langages Rust et C en matière de programmation système.<br />
<br />
Voici l'annonce de la sortie de Rust 1.98.0 :<br />
<br />
<b><font size="3">Annonce de la version 1.98.0 de Rust</font></b><br />
<br />
L'équipe Rust a le plaisir d'annoncer la sortie d'une nouvelle version de Rust, la 1.98.0. Rust est un langage de programmation qui permet à chacun de créer des logiciels fiables et performants. Si vous disposez déjà d'une version antérieure de Rust installée via rustup, vous pouvez passer à la version 1.98.0 en exécutant la commande suivante : <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">$ rustup update stable</span><b>Nouveautés de la version stable 1.98.0</b><br />
<br />
<ul><li style=""><b>Méthodes algébriques en virgule flottante</b></li></ul><br />
<br />
Les types en virgule flottante <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><font color="#FF0000">f32</font></span> et <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><font color="#FF0000">f64</font></span> disposent désormais de méthodes « <i>algébriques </i>» pour l’addition, la soustraction, la multiplication, la division et le reste. Celles-ci permettent d’optimiser ces opérations en tirant parti des propriétés algébriques des nombres réels, même si ces propriétés ne s’appliquent pas compte tenu des limites des représentations en virgule flottante. L'ensemble exact des optimisations n'est pas précisé, mais il pourrait s'apparenter au type d'optimisation que l'on observe avec l'option <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">-ffast-math</span> dans d'autres langages.<br />
<br />
Par exemple, l'addition en virgule flottante n'est pas associative ; ainsi, une somme telle que <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">a + b + c + d</span> doit être évaluée selon l'ordre associatif de gauche dans lequel elle est analysée, c'est-à-dire <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span class="br0">&#40;</span><span class="br0">&#40;</span>a + b<span class="br0">&#41;</span> + c<span class="br0">&#41;</span> + d</span>. Si vous écrivez la même somme sous la forme d’une chaîne d’appels à <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">algebraic_add</span> , le compilateur est alors libre de la réorganiser, par exemple en <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span class="br0">&#40;</span>a + b<span class="br0">&#41;</span> + <span class="br0">&#40;</span>c + d<span class="br0">&#41;</span></span>, afin d’évaluer les sommes partielles simultanément. L’utilisation de ces méthodes algébriques permet également souvent une vectorisation plus étendue des boucles. Ces méthodes sont non déterministes, puisque le compilateur est libre de choisir différentes optimisations, mais elles n’entraînent jamais de comportement indéfini. <br />
<br />
<ul><li style=""><b>Formatage d’entiers avec tampon</b></li></ul><br />
<br />
Tous les types entiers primitifs disposent désormais d’une méthode <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">format_into</span> qui prend un paramètre de type <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">&amp;<span style="color: #0080ff;">mut</span> NumBuffer&lt;<span style="color: #0000ff;">Self</span>&gt;</span>, c’est-à-dire un tampon suffisamment grand pour contenir le format décimal de n’importe quelle valeur de ce type. Le tampon lui-même est opaque, mais la méthode renvoie le <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">&amp;str</span> formaté dont la durée de vie est empruntée à ce tampon. Cette méthode contourne également une grande partie du dispatch dynamique que l'on obtiendrait avec le formatage « buffered <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0080ff;">write!</span></span> », ce qui peut être un véritable atout en termes de performances. Le dépôt <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">itoa-benchmark</span> montre désormais que <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">format_into</span> offre des performances similaires à celles de <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">itoa</span> lui-même ; cette méthode pourrait donc servir de remplacement standard à cette dépendance et à d'autres similaires.<br />
<br />
<ul><li style=""><b>Correction de l'interaction entre <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">ManuallyDrop</span> et <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Box</span></b></li></ul><br />
<br />
Avant la version 1.96.0 de Rust, un bug dans le compilateur Rust provoquait un comportement indéfini dans le code suivant :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">let</span> <span style="color: #0080ff;">mut</span> x = ManuallyDrop::new<span class="br0">&#40;</span>Box::new<span class="br0">&#40;</span><span style="color: #cc66cc;">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">unsafe</span> <span class="br0">&#123;</span> ManuallyDrop::drop<span class="br0">&#40;</span>&amp;<span style="color: #0080ff;">mut</span> x<span class="br0">&#41;</span> <span class="br0">&#125;</span>;
<span style="color: #0000ff;">let</span> x = x; <span style="color: #808080;">// UB!</span></pre></td></tr></table></code><hr />
</div>En effet, le compilateur considère comme un comportement indéfini (UB) le déplacement d’une <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Box</span> qui a été libérée (déallouée), et la fonction <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">ManuallyDrop</span> propageait auparavant ce comportement, de sorte que le déplacement d’un objet de type <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">ManuallyDrop&lt;Box&lt;_&gt;&gt;</span> dont la <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Box</span> avait été libérée était également considéré comme UB. Dans Rust 1.96.0, nous avons corrigé ce problème, de sorte que ce code n'était plus considéré comme un comportement indéfini. Dans cette version, nous avons mis à jour la documentation de <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">ManuallyDrop</span>, offrant ainsi la garantie que ce code continuera à ne pas être considéré comme un comportement indéfini à l'avenir.<br />
<br />
<b>Source</b> : <a rel="nofollow" href="https://blog.rust-lang.org/2026/08/20/Rust-1.98.0/" target="_blank">Rust</a><br />
<br />
<b>Et vous ?</b><br />
<br />
:fleche: Pensez-vous que cette annonce est crédible ou pertinente ?<br />
:fleche: Quel est votre avis sur le sujet ?<br />
<br />
<b>Voir aussi :</b><br />
<br />
:fleche: <a href="https://rust.developpez.com/actu/385359/Rust-contribuera-au-succes-de-Linux-et-rendra-la-programmation-plus-ludique-car-Rust-est-essentiel-pour-ameliorer-a-la-fois-la-securite-et-la-maintenabilite-du-code-du-noyau-Linux-affirme-Greg-Kroah-Hartman/" target="_blank">Rust contribuera au succès de Linux et rendra la programmation plus ludique, car Rust est essentiel pour améliorer à la fois la sécurité et la maintenabilité du code du noyau Linux, affirme Greg Kroah-Hartman</a><br />
<br />
:fleche: <a href="https://rust.developpez.com/actu/385046/La-version-1-97-du-langage-de-programmation-Rust-est-disponible-et-integre-le-mangling-des-symboles-active-par-defaut-ainsi-qu-une-prise-en-charge-de-Cargo-permettant-de-desactiver-les-avertissements/" target="_blank">La version 1.97 du langage de programmation Rust est disponible et intègre le mangling des symboles activé par défaut ainsi qu'une prise en charge de Cargo permettant de désactiver les avertissements</a><br />
<br />
:fleche: <a href="https://rust.developpez.com/actu/377795/Les-developpeurs-principaux-de-CPython-proposent-d-integrer-Rust-afin-d-ameliorer-la-securite-memoire-et-de-reduire-les-vulnerabilites-dans-le-code-source-C-de-Python-ce-qui-suscite-des-debats/" target="_blank">Les développeurs principaux de CPython proposent d'intégrer Rust afin d'améliorer la sécurité mémoire et de réduire les vulnérabilités dans le code source C de Python, ce qui suscite des débats</a></div>


	<div style="padding:10px">

	

	
		<fieldset class="fieldset">
			<legend>Images attachées</legend>
				<div style="padding:10px">
				<img class="attach" src="https://www.developpez.net/forums/attachments/p678413d1787655191/general-developpement/programmation-systeme/rust/rust-1-98-methodes-algebriques-formatage-optimise-documentation-amelioree/rust.png/" alt="" />&nbsp;
			</div>
		</fieldset>
	

	

	

	</div>
]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f2138/general-developpement/programmation-systeme/rust/">Rust</category>
			<dc:creator>Eliora</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2185318/general-developpement/programmation-systeme/rust/rust-1-98-methodes-algebriques-formatage-optimise-documentation-amelioree/</guid>
		</item>
		<item>
			<title>Canonical finance une thèse de doctorat visant à automatiser la conversion du code C vers le Rust</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2185278&amp;goto=newpost</link>
			<pubDate>Sun, 23 Aug 2026 19:00:47 GMT</pubDate>
			<description>*Canonical finance une thèse...</description>
			<content:encoded><![CDATA[<div><b><font size="4">Canonical finance une thèse de doctorat visant à automatiser la conversion d’anciennes bases de code C vers le langage Rust en utilisant l’intelligence artificielle</font></b><br />
<br />
<b>Le langage Rust a largement gagné en visibilité ces dernières années, au point qu’on le retrouve désormais <a href="https://rust.developpez.com/actu/378426/C-est-desormais-officiel-Rust-dans-le-noyau-Linux-sort-du-cadre-experimental-le-Rust-vient-de-faire-l-objet-d-integration-comme-partie-essentielle-du-kernel-aux-cotes-du-toujours-present-langage-C/" target="_blank">dans le noyau de Linux</a>. Pour de nombreux acteurs de la filière du développement de logiciels, <a href="https://rust.developpez.com/actu/336737/-C-est-le-moment-d-arreter-d-initier-de-nouveaux-projets-en-C-ou-Cplusplus-et-de-passer-a-Rust-selon-Mark-Russinovich-de-Microsoft-qui-recommande-Rust-pour-une-meilleure-securisation-des-logiciels/" target="_blank">c’est le moment d’arrêter d’initier de nouveaux projets en C ou en C++</a> et de passer au Rust compte tenu des avantages qu’il offre en matière de sécurisation des logiciels. Un autre pan des réflexions en cours concerne la conversion des anciennes bases de code C vers le Rust. Canonical annonce le financement d’une thèse de doctorat en la matière. </b><br />
<br />
<b><font size="3">Les chercheurs entendent mettre l’intelligence artificielle à profit pour atteindre leur objectif</font></b> <br />
<br />
L’équipe de recherche propose un modèle neurosymbolique hybride qui combine l'apprentissage automatique avec des méthodes classiques d'analyse, de tests de résistance et de vérification formelle. Le flux de travail se divise en quatre étapes principales :<br />
<ul><li style="">	Primo, la phase de programmation divise le dépôt massif en fragments indépendants, en conservant le fil sémantique nécessaire concernant les types et les dépendances.</li><li style="">	Deuxio, la phase de traduction, qui utilise des modèles de langage optimisés avec des bibliothèques de conversions C vers Rust connues pour générer des abstractions correctes au lieu d'une simple copie syntaxique.</li><li style="">	La troisième étape part du principe que le code généré n'est pas fiable tant que les techniques de fuzzing et les vérifications d'équivalence n'ont pas démontré qu'il se comporte exactement comme le code C original.</li><li style="">	Enfin, un système de débogage localise les échecs de validation et applique des corrections précises à l'aide de techniques de réparation symbolique.</li></ul><br />
L’objectif est de pallier à certaines limitations en matière de conversion de code C vers le Rust. En effet, la réécriture manuelle d'un logiciel écrit en C comporte en réalité un risque technique important. Les projets établis contiennent des décennies de corrections de bogues, d'optimisations de performances et de connaissances opérationnelles qui sont souvent perdues lors du processus de refactorisation.<br />
<br />
Il est vrai que les outils traditionnels de traduction de code source peuvent traiter de grands volumes de données, mais ils génèrent du code Rust non sécurisé qui conserve des structures artificielles héritées du C. D'autre part, les outils d'IA disponibles peuvent générer du code à partir de petits exemples, mais ils échouent à traiter des dépôts entiers en raison de leurs volumes importants et finissent par perdre l'idée centrale, sans pour autant offrir de garanties que le programme résultant conservera le comportement du code original. <br />
<br />
 <blockquote class="twitter-tweet"><p lang="en" dir="ltr">Ubuntu Funding Automated C to Rust Translation Research<br><br>Ubuntu parent Canonical is &quot;funding a [3 year] University of Bristol PhD to translate large C repos into safe, equivalent Rust&quot;. <a rel="nofollow" href="https://t.co/WPJVGqd3UJ">pic.twitter.com/WPJVGqd3UJ</a></p>&mdash; The Lunduke Journal (@LundukeJournal) <a rel="nofollow" href="https://x.com/LundukeJournal/status/2090809237802754463?ref_src=twsrc%5Etfw">August 21, 2026</a></blockquote>  <b><font size="3">L’approche neurosymbolique proposée par les chercheurs de l’université de Bristol entend corriger des tares comme celles observées avec la récente migration de la base de code Bun de C vers le Rust</font></b> <br />
<br />
La plus-value de l’utilisation de l’intelligence artificielle qui est en général mise en avant dans le processus du développement de logiciels est le gain de productivité. Le cas de la migration du code source Bun de Zig vers Rust ne fait pas exception étant donné que la tête derrière l’initiative rapporte que cette transition a été possible en seulement 11 jours contre une année pour une petite équipe d’ingénieurs lancée sur les 535 496 lignes de code de Zig, selon son estimatif.<br />
<br />
Résultat :<br />
<br />
<ul><li style="">	le code en Rust produit par l'IA contient plus de 13 000 blocs unsafe, soit une proportion anormalement élevée comparée aux projets écrits par des humains. Par exemple, la gestion de la mémoire de bas niveau et les allocateurs personnalisés s'interfacent directement avec les pointeurs bruts via des constructions non sécurisées (unsafe). Elle gère la provenance des pointeurs et les appels explicites de désallocation par le biais des tables virtuelles (vtables) des allocateurs standard comme on peut le voir dans la section de code suivante :</li></ul><br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="40"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br />147<br />148<br />149<br />150<br />151<br />152<br />153<br />154<br />155<br />156<br />157<br />158<br />159<br />160<br />161<br />162<br />163<br />164<br />165<br />166<br />167<br />168<br />169<br />170<br />171<br />172<br />173<br />174<br />175<br />176<br />177<br />178<br />179<br />180<br />181<br />182<br />183<br />184<br />185<br />186<br />187<br />188<br />189<br />190<br />191<br />192<br />193<br />194<br />195<br />196<br />197<br />198<br />199<br />200<br />201<br />202<br />203<br />204<br />205<br />206<br />207<br />208<br />209<br />210<br />211<br />212<br />213<br />214<br />215<br />216<br />217<br />218<br />219<br />220<br />221<br />222<br />223<br />224<br />225<br />226<br />227<br />228<br />229<br />230<br />231<br />232<br />233<br />234<br />235<br />236<br />237<br />238<br />239<br />240<br />241<br />242<br />243<br />244<br />245<br />246<br />247<br />248<br />249<br />250<br />251<br />252<br />253<br />254<br />255<br />256<br />257<br />258<br />259<br />260<br />261<br />262<br />263<br />264<br />265<br />266<br />267<br />268<br />269<br />270<br />271<br />272<br />273<br />274<br />275<br />276<br />277<br />278<br />279<br />280<br />281<br />282<br />283<br />284<br />285<br />286<br />287<br />288<br />289<br />290<br />291<br />292<br />293<br />294<br />295<br />296<br />297<br />298<br />299<br />300<br />301<br />302<br />303<br />304<br />305<br />306<br />307<br />308<br />309<br />310<br />311<br />312<br />313<br />314<br />315<br />316<br />317<br />318<br />319<br />320<br />321<br />322<br />323<br />324<br />325<br />326<br />327<br />328<br />329<br />330<br />331<br />332<br />333<br />334<br />335<br />336<br />337<br />338<br />339<br />340<br />341<br />342<br />343<br />344<br />345<br />346<br />347<br />348<br />349<br />350<br />351<br />352<br />353<br />354<br />355<br />356<br />357<br />358<br />359<br />360<br />361<br />362<br />363<br />364<br />365<br />366<br />367<br />368<br />369<br />370<br />371<br />372<br />373<br />374<br />375<br />376<br />377<br />378<br />379<br />380<br />381<br />382<br />383<br />384<br />385<br />386<br />387<br />388<br />389<br />390<br />391<br />392<br />393<br />394<br />395<br />396<br />397<br />398<br />399<br />400<br />401<br />402<br />403<br />404<br />405<br />406<br />407<br />408<br />409<br />410<br />411<br />412<br />413<br />414<br />415<br />416<br />417<br />418<br />419<br />420<br />421<br />422<br />423<br />424<br />425<br />426<br />427<br />428<br />429<br />430<br />431<br />432<br />433<br />434<br />435<br />436<br />437<br />438<br />439<br />440<br />441<br />442<br />443<br />444<br />445<br />446<br />447<br />448<br />449<br />450<br />451<br />452<br />453<br />454<br />455<br />456<br />457<br />458<br />459<br />460<br />461<br />462<br />463<br />464<br />465<br />466<br />467<br />468<br />469<br />470<br />471<br />472<br />473<br />474<br />475<br />476<br />477<br />478<br />479<br />480<br />481<br />482<br />483<br />484<br />485<br />486<br />487<br />488<br />489<br />490<br />491<br />492<br />493<br />494<br />495<br />496<br />497<br />498<br />499<br />500<br />501<br />502<br />503<br />504<br />505<br />506<br />507<br />508<br />509<br />510<br />511<br />512<br />513<br />514<br />515<br />516<br />517<br />518<br />519<br />520<br />521<br />522<br />523<br />524<br />525<br />526<br />527<br />528<br />529<br />530<br />531<br />532<br />533<br />534<br />535<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #808080;">// bun_alloc is the T0 foundation crate that bun_threading and bun_collections</span>
<span style="color: #808080;">// depend on; importing either to satisfy the disallowed-types lint would create</span>
<span style="color: #808080;">// a dependency cycle.</span>
<span style="color: #339933;">#</span><span style="color: #339933;">!<span class="br0">&#91;</span>allow<span class="br0">&#40;</span>clippy::disallowed_types<span class="br0">&#41;</span><span class="br0">&#93;</span></span>
<span style="color: #339933;">#</span><span style="color: #339933;">!<span class="br0">&#91;</span>feature<span class="br0">&#40;</span>arbitrary_self_types_pointers<span class="br0">&#41;</span><span class="br0">&#93;</span></span>
<span style="color: #339933;">#</span><span style="color: #339933;">!<span class="br0">&#91;</span>feature<span class="br0">&#40;</span>allocator_api<span class="br0">&#41;</span><span class="br0">&#93;</span></span>
<span style="color: #808080;">// `#[thread_local]` (vs the `thread_local!` macro) compiles to a bare</span>
<span style="color: #808080;">// `__thread` slot &#151; single `mov reg, fs:[OFFSET]` access, no `LocalKey`</span>
<span style="color: #808080;">// `__getit()` wrapper, no lazy-init flag check, no dtor-registration probe.</span>
<span style="color: #808080;">// Used for the per-allocation hot-path TLS in `ast_alloc::AST_ALLOC`.</span>
<span style="color: #339933;">#</span><span style="color: #339933;">!<span class="br0">&#91;</span>feature<span class="br0">&#40;</span>thread_local<span class="br0">&#41;</span><span class="br0">&#93;</span></span>
&nbsp;
<span style="color: #0000ff;">use</span> core::fmt::Write <span style="color: #0000ff;">as</span> <span style="color: #cc66cc;">_</span>;
<span style="color: #0000ff;">use</span> core::mem::<span class="br0">&#123;</span>MaybeUninit, size_of<span class="br0">&#125;</span>;
<span style="color: #0000ff;">use</span> core::ptr::<span class="br0">&#123;</span>NonNull, addr_of_mut<span class="br0">&#125;</span>;
<span style="color: #0000ff;">use</span> core::sync::atomic::<span class="br0">&#123;</span>AtomicU16, AtomicU32, Ordering<span class="br0">&#125;</span>;
<span style="color: #0000ff;">use</span> std::collections::HashMap;
&nbsp;
<span style="color: #808080;">// &#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;</span>
<span style="color: #808080;">// Re-exports</span>
<span style="color: #808080;">// &#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;</span>
&nbsp;
<span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">use</span> bun_mimalloc_sys::mimalloc;
<span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">mod</span> c_thunks;
&nbsp;
<span style="color: #808080;">// &#9472;&#9472; Allocator vtable &#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;</span>
<span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>repr<span class="br0">&#40;</span>transparent<span class="br0">&#41;</span><span class="br0">&#93;</span></span>
<span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>derive<span class="br0">&#40;</span>Clone, Copy, PartialEq, Eq<span class="br0">&#41;</span><span class="br0">&#93;</span></span>
<span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">struct</span> Alignment<span class="br0">&#40;</span><span style="color: #0000ff;">pub</span> u8<span class="br0">&#41;</span>; <span style="color: #808080;">// log2 of byte alignment</span>
<span style="color: #0000ff;">impl</span> Alignment <span class="br0">&#123;</span>
    <span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>inline<span class="br0">&#93;</span></span>
    <span style="color: #0000ff;">pub</span><span class="br0">&#40;</span><span style="color: #0000ff;">crate</span><span class="br0">&#41;</span> <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">fn</span> to_byte_units<span class="br0">&#40;</span><span style="color: #FF0000;">self</span><span class="br0">&#41;</span> -&gt; usize <span class="br0">&#123;</span>
        <span style="color: #cc66cc;">1</span>usize &lt;&lt; <span style="color: #FF0000;">self</span><span style="color: #cc66cc;">.0</span>
    <span class="br0">&#125;</span>
    <span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>inline<span class="br0">&#93;</span></span>
    <span style="color: #0000ff;">pub</span><span class="br0">&#40;</span><span style="color: #0000ff;">crate</span><span class="br0">&#41;</span> <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">fn</span> from_byte_units<span class="br0">&#40;</span>b: usize<span class="br0">&#41;</span> -&gt; <span style="color: #0000ff;">Self</span> <span class="br0">&#123;</span>
        <span style="color: #0000ff;">Self</span><span class="br0">&#40;</span>b.trailing_zeros<span class="br0">&#40;</span><span class="br0">&#41;</span> <span style="color: #0000ff;">as</span> u8<span class="br0">&#41;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span>
&nbsp;
<span style="color: #808080;">// &#9472;&#9472; `max_align_t` alignment &#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;</span>
<span style="color: #808080;">// The `libc` crate does not expose `max_align_t` on every target Bun ships</span>
<span style="color: #808080;">// (missing on Windows MSVC and on FreeBSD aarch64), so those targets carry a</span>
<span style="color: #808080;">// local mirror of `max_align_t`. Remaining non-Windows targets keep</span>
<span style="color: #808080;">// `libc::max_align_t` (which carries `long double`, align 16 on x86_64/aarch64;</span>
<span style="color: #808080;">// the {f64,i64,*const ()} fallback would silently downgrade to 8).</span>
<span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>cfg<span class="br0">&#40;</span>windows<span class="br0">&#41;</span><span class="br0">&#93;</span></span>
<span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>repr<span class="br0">&#40;</span>C<span class="br0">&#41;</span><span class="br0">&#93;</span></span>
<span style="color: #0000ff;">struct</span> MaxAlignT <span class="br0">&#123;</span>
    _f: f64,
    _i: i64,
    _p: *<span style="color: #0000ff;">const</span> <span class="br0">&#40;</span><span class="br0">&#41;</span>,
<span class="br0">&#125;</span>
<span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>cfg<span class="br0">&#40;</span>windows<span class="br0">&#41;</span><span class="br0">&#93;</span></span>
<span style="color: #0000ff;">pub</span><span class="br0">&#40;</span><span style="color: #0000ff;">crate</span><span class="br0">&#41;</span> <span style="color: #0000ff;">const</span> MAX_ALIGN_T: usize = core::mem::align_of::&lt;MaxAlignT&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span style="color: #808080;">// On AArch64</span>
<span style="color: #808080;">// AAPCS64 `long double` is IEEE binary128, 16-byte aligned. The `libc` crate</span>
<span style="color: #808080;">// only defines `max_align_t` for FreeBSD on x86_64, so hardcode the ABI value</span>
<span style="color: #808080;">// for the aarch64 port.</span>
<span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>cfg<span class="br0">&#40;</span>all<span class="br0">&#40;</span>target_os = <span style="color: #FF0000;">&quot;freebsd&quot;</span>, target_arch = <span style="color: #FF0000;">&quot;aarch64&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#93;</span></span>
<span style="color: #0000ff;">pub</span><span class="br0">&#40;</span><span style="color: #0000ff;">crate</span><span class="br0">&#41;</span> <span style="color: #0000ff;">const</span> MAX_ALIGN_T: usize = <span style="color: #cc66cc;">16</span>;
<span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>cfg<span class="br0">&#40;</span>not<span class="br0">&#40;</span>any<span class="br0">&#40;</span>windows, all<span class="br0">&#40;</span>target_os = <span style="color: #FF0000;">&quot;freebsd&quot;</span>, target_arch = <span style="color: #FF0000;">&quot;aarch64&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#93;</span></span>
<span style="color: #0000ff;">pub</span><span class="br0">&#40;</span><span style="color: #0000ff;">crate</span><span class="br0">&#41;</span> <span style="color: #0000ff;">const</span> MAX_ALIGN_T: usize = core::mem::align_of::&lt;libc::max_align_t&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;
&nbsp;
<span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">struct</span> AllocatorVTable <span class="br0">&#123;</span>
    <span style="color: #0000ff;">pub</span> alloc: <span style="color: #0000ff;">unsafe</span> <span style="color: #0000ff;">fn</span><span class="br0">&#40;</span>*<span style="color: #0080ff;">mut</span> core::ffi::c_void, usize, Alignment, usize<span class="br0">&#41;</span> -&gt; *<span style="color: #0080ff;">mut</span> u8,
    <span style="color: #0000ff;">pub</span> resize: <span style="color: #0000ff;">unsafe</span> <span style="color: #0000ff;">fn</span><span class="br0">&#40;</span>*<span style="color: #0080ff;">mut</span> core::ffi::c_void, &amp;<span style="color: #0080ff;">mut</span> <span class="br0">&#91;</span>u8<span class="br0">&#93;</span>, Alignment, usize, usize<span class="br0">&#41;</span> -&gt; bool,
    <span style="color: #0000ff;">pub</span> remap: <span style="color: #0000ff;">unsafe</span> <span style="color: #0000ff;">fn</span><span class="br0">&#40;</span>*<span style="color: #0080ff;">mut</span> core::ffi::c_void, &amp;<span style="color: #0080ff;">mut</span> <span class="br0">&#91;</span>u8<span class="br0">&#93;</span>, Alignment, usize, usize<span class="br0">&#41;</span> -&gt; *<span style="color: #0080ff;">mut</span> u8,
    <span style="color: #0000ff;">pub</span> free: <span style="color: #0000ff;">unsafe</span> <span style="color: #0000ff;">fn</span><span class="br0">&#40;</span>*<span style="color: #0080ff;">mut</span> core::ffi::c_void, &amp;<span style="color: #0080ff;">mut</span> <span class="br0">&#91;</span>u8<span class="br0">&#93;</span>, Alignment, usize<span class="br0">&#41;</span>,
<span class="br0">&#125;</span>
<span style="color: #0000ff;">impl</span> AllocatorVTable <span class="br0">&#123;</span>
    <span style="color: #808080; font-weight: bold;">/// `alloc` impl that always fails. For vtables that only ever `free` an</span>
    <span style="color: #808080; font-weight: bold;">/// externally-produced buffer (mmap region, plugin-owned memory, refcounted</span>
    <span style="color: #808080; font-weight: bold;">/// foreign string) and never allocate or grow it.</span>
    <span style="color: #0000ff;">pub</span><span class="br0">&#40;</span><span style="color: #0000ff;">crate</span><span class="br0">&#41;</span> <span style="color: #0000ff;">const</span> NO_ALLOC: <span style="color: #0000ff;">unsafe</span> <span style="color: #0000ff;">fn</span><span class="br0">&#40;</span>
        *<span style="color: #0080ff;">mut</span> core::ffi::c_void,
        usize,
        Alignment,
        usize,
    <span class="br0">&#41;</span> -&gt; *<span style="color: #0080ff;">mut</span> u8 = |<span style="color: #cc66cc;">_</span>, <span style="color: #cc66cc;">_</span>, <span style="color: #cc66cc;">_</span>, <span style="color: #cc66cc;">_</span>| core::ptr::null_mut<span class="br0">&#40;</span><span class="br0">&#41;</span>;
    <span style="color: #0000ff;">pub</span><span class="br0">&#40;</span><span style="color: #0000ff;">crate</span><span class="br0">&#41;</span> <span style="color: #0000ff;">const</span> NO_RESIZE: <span style="color: #0000ff;">unsafe</span> <span style="color: #0000ff;">fn</span><span class="br0">&#40;</span>
        *<span style="color: #0080ff;">mut</span> core::ffi::c_void,
        &amp;<span style="color: #0080ff;">mut</span> <span class="br0">&#91;</span>u8<span class="br0">&#93;</span>,
        Alignment,
        usize,
        usize,
    <span class="br0">&#41;</span> -&gt; bool = |<span style="color: #cc66cc;">_</span>, <span style="color: #cc66cc;">_</span>, <span style="color: #cc66cc;">_</span>, <span style="color: #cc66cc;">_</span>, <span style="color: #cc66cc;">_</span>| <span style="color: #FF0000;">false</span>;
    <span style="color: #0000ff;">pub</span><span class="br0">&#40;</span><span style="color: #0000ff;">crate</span><span class="br0">&#41;</span> <span style="color: #0000ff;">const</span> NO_REMAP: <span style="color: #0000ff;">unsafe</span> <span style="color: #0000ff;">fn</span><span class="br0">&#40;</span>
        *<span style="color: #0080ff;">mut</span> core::ffi::c_void,
        &amp;<span style="color: #0080ff;">mut</span> <span class="br0">&#91;</span>u8<span class="br0">&#93;</span>,
        Alignment,
        usize,
        usize,
    <span class="br0">&#41;</span> -&gt; *<span style="color: #0080ff;">mut</span> u8 = |<span style="color: #cc66cc;">_</span>, <span style="color: #cc66cc;">_</span>, <span style="color: #cc66cc;">_</span>, <span style="color: #cc66cc;">_</span>, <span style="color: #cc66cc;">_</span>| core::ptr::null_mut<span class="br0">&#40;</span><span class="br0">&#41;</span>;
&nbsp;
    <span style="color: #808080; font-weight: bold;">/// Build a &quot;free-only&quot; vtable: `alloc`/`resize`/`remap` all no-op/fail and</span>
    <span style="color: #808080; font-weight: bold;">/// only `free` is meaningful. Each call site still gets its own `static`</span>
    <span style="color: #808080; font-weight: bold;">/// (vtable address is an identity tag for `is_instance`).</span>
    <span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">fn</span> free_only<span class="br0">&#40;</span>
        free: <span style="color: #0000ff;">unsafe</span> <span style="color: #0000ff;">fn</span><span class="br0">&#40;</span>*<span style="color: #0080ff;">mut</span> core::ffi::c_void, &amp;<span style="color: #0080ff;">mut</span> <span class="br0">&#91;</span>u8<span class="br0">&#93;</span>, Alignment, usize<span class="br0">&#41;</span>,
    <span class="br0">&#41;</span> -&gt; <span style="color: #0000ff;">Self</span> <span class="br0">&#123;</span>
        <span style="color: #0000ff;">Self</span> <span class="br0">&#123;</span>
            alloc: <span style="color: #0000ff;">Self</span>::NO_ALLOC,
            resize: <span style="color: #0000ff;">Self</span>::NO_RESIZE,
            remap: <span style="color: #0000ff;">Self</span>::NO_REMAP,
            free,
        <span class="br0">&#125;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span>
&nbsp;
<span style="color: #808080; font-weight: bold;">/// Fat allocator handle (ptr + vtable). Distinct from the `Allocator` trait below.</span>
<span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>derive<span class="br0">&#40;</span>Clone, Copy<span class="br0">&#41;</span><span class="br0">&#93;</span></span>
<span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">struct</span> StdAllocator <span class="br0">&#123;</span>
    <span style="color: #0000ff;">pub</span> ptr: *<span style="color: #0080ff;">mut</span> core::ffi::c_void,
    <span style="color: #0000ff;">pub</span> vtable: &amp;<span style="color: #339933;">'static</span> AllocatorVTable,
<span class="br0">&#125;</span>
&nbsp;
<span style="color: #808080;">// SAFETY: `ptr` is an opaque tag/context handle; the vtable is `&amp;'static`.</span>
<span style="color: #808080;">// Thread-safety of dispatch is the implementor's concern (mimalloc is</span>
<span style="color: #808080;">// thread-safe).</span>
<span style="color: #0000ff;">unsafe</span> <span style="color: #0000ff;">impl</span> Send <span style="color: #0000ff;">for</span> StdAllocator <span class="br0">&#123;</span><span class="br0">&#125;</span>
<span style="color: #808080;">// SAFETY: see the `Send` impl directly above.</span>
<span style="color: #0000ff;">unsafe</span> <span style="color: #0000ff;">impl</span> Sync <span style="color: #0000ff;">for</span> StdAllocator <span class="br0">&#123;</span><span class="br0">&#125;</span>
&nbsp;
<span style="color: #0000ff;">impl</span> Default <span style="color: #0000ff;">for</span> StdAllocator <span class="br0">&#123;</span>
    <span style="color: #808080; font-weight: bold;">/// The mimalloc-backed `c_allocator`.</span>
    <span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>inline<span class="br0">&#93;</span></span>
    <span style="color: #0000ff;">fn</span> default<span class="br0">&#40;</span><span class="br0">&#41;</span> -&gt; <span style="color: #0000ff;">Self</span> <span class="br0">&#123;</span>
        basic::C_ALLOCATOR
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span>
&nbsp;
<span style="color: #0000ff;">impl</span> StdAllocator <span class="br0">&#123;</span>
    <span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>inline<span class="br0">&#93;</span></span>
    <span style="color: #0000ff;">pub</span><span class="br0">&#40;</span><span style="color: #0000ff;">crate</span><span class="br0">&#41;</span> <span style="color: #0000ff;">fn</span> raw_free<span class="br0">&#40;</span>&amp;<span style="color: #FF0000;">self</span>, buf: &amp;<span style="color: #0080ff;">mut</span> <span class="br0">&#91;</span>u8<span class="br0">&#93;</span>, alignment: Alignment, ra: usize<span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span style="color: #808080;">// SAFETY: vtable invariant &#151; `free` callee respects the (ptr, buf, alignment, ra) contract.</span>
        <span style="color: #0000ff;">unsafe</span> <span class="br0">&#123;</span> <span class="br0">&#40;</span><span style="color: #FF0000;">self</span>.vtable.free<span class="br0">&#41;</span><span class="br0">&#40;</span><span style="color: #FF0000;">self</span>.ptr, buf, alignment, ra<span class="br0">&#41;</span> <span class="br0">&#125;</span>
    <span class="br0">&#125;</span>
    <span style="color: #808080; font-weight: bold;">/// `raw_free` with `ret_addr = 0`, byte-aligned.</span>
    <span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>inline<span class="br0">&#93;</span></span>
    <span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">fn</span> free<span class="br0">&#40;</span>&amp;<span style="color: #FF0000;">self</span>, bytes: &amp;<span class="br0">&#91;</span>u8<span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span style="color: #0000ff;">if</span> bytes.is_empty<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
            <span style="color: #0000ff;">return</span>;
        <span class="br0">&#125;</span>
        <span style="color: #808080;">// SAFETY: `bytes` is reborrowed mutably only for the vtable signature; the</span>
        <span style="color: #808080;">// callee treats it as opaque.</span>
        <span style="color: #0000ff;">let</span> buf =
            <span style="color: #0000ff;">unsafe</span> <span class="br0">&#123;</span> core::slice::from_raw_parts_mut<span class="br0">&#40;</span>bytes.as_ptr<span class="br0">&#40;</span><span class="br0">&#41;</span>.cast_mut<span class="br0">&#40;</span><span class="br0">&#41;</span>, bytes.len<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#125;</span>;
        <span style="color: #FF0000;">self</span>.raw_free<span class="br0">&#40;</span>buf, Alignment::from_byte_units<span class="br0">&#40;</span><span style="color: #cc66cc;">1</span><span class="br0">&#41;</span>, <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span>;
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span>
&nbsp;
<span style="color: #808080;">// PORTING.md &sect;Allocators: AST crates thread an `Arena`; non-AST use Vec/Box</span>
<span style="color: #808080;">// (global mimalloc). `Arena` is the real per-heap `MimallocArena` &#151; unlike</span>
<span style="color: #808080;">// `bumpalo::Bump`, it supports per-allocation free + realloc, so `ArenaVec`</span>
<span style="color: #808080;">// no longer leaks on grow.</span>
<span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">use</span> mimalloc_arena::MimallocArena;
<span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">type</span> Arena = MimallocArena;
<span style="color: #0000ff;">mod</span> baby_vec;
<span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">use</span> baby_vec::BabyVec;
<span style="color: #808080; font-weight: bold;">/// Arena-backed `Vec` with `u32` length/capacity.</span>
<span style="color: #808080; font-weight: bold;">/// 24 B (vs 32 B for `Vec&lt;T, &amp;'a MimallocArena&gt;`); the</span>
<span style="color: #808080; font-weight: bold;">/// allocator handle is kept inline for lifetime checking. Growth/free route</span>
<span style="color: #808080; font-weight: bold;">/// through `&lt;&amp;MimallocArena as Allocator&gt;` (= `mi_heap_realloc_aligned` /</span>
<span style="color: #808080; font-weight: bold;">/// `mi_free`); reclaimed on arena `reset`/`Drop`.</span>
<span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">type</span> ArenaVec&lt;<span style="color: #339933;">'a</span>, T&gt; = BabyVec&lt;<span style="color: #339933;">'a</span>, T&gt;;
<span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">use</span> mimalloc_arena::<span class="br0">&#123;</span>ArenaString, ArenaVecExt<span class="br0">&#125;</span>;
&nbsp;
<span style="color: #808080; font-weight: bold;">/// `bumpalo::collections::Vec::from_iter_in` parity for [`ArenaVec`].</span>
<span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>inline<span class="br0">&#93;</span></span>
<span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">fn</span> vec_from_iter_in&lt;<span style="color: #339933;">'a</span>, T, I&gt;<span class="br0">&#40;</span>iter: I, arena: &amp;<span style="color: #339933;">'a</span> MimallocArena<span class="br0">&#41;</span> -&gt; ArenaVec&lt;<span style="color: #339933;">'a</span>, T&gt;
<span style="color: #0000ff;">where</span>
    I: IntoIterator&lt;Item = T&gt;,
<span class="br0">&#123;</span>
    <span style="color: #0000ff;">let</span> iter = iter.into_iter<span class="br0">&#40;</span><span class="br0">&#41;</span>;
    <span style="color: #0000ff;">let</span> <span class="br0">&#40;</span>lo, <span style="color: #cc66cc;">_</span><span class="br0">&#41;</span> = iter.size_hint<span class="br0">&#40;</span><span class="br0">&#41;</span>;
    <span style="color: #0000ff;">let</span> <span style="color: #0080ff;">mut</span> v = ArenaVec::with_capacity_in<span class="br0">&#40;</span>lo, arena<span class="br0">&#41;</span>;
    v.extend<span class="br0">&#40;</span>iter<span class="br0">&#41;</span>;
    v
<span class="br0">&#125;</span>
&nbsp;
<span style="color: #808080; font-weight: bold;">/// Re-tag an [`ArenaVec`]'s allocator handle to `dst` without copying data.</span>
<span style="color: #808080; font-weight: bold;">///</span>
<span style="color: #808080; font-weight: bold;">/// Sound because `&lt;&amp;MimallocArena as Allocator&gt;` is heap-agnostic on the</span>
<span style="color: #808080; font-weight: bold;">/// existing buffer:</span>
<span style="color: #808080; font-weight: bold;">/// - `deallocate` &rarr; `mi_free(ptr)`: looks up the owning heap from the pointer's</span>
<span style="color: #808080; font-weight: bold;">///   page metadata; works from any thread on any heap's allocation.</span>
<span style="color: #808080; font-weight: bold;">/// - `grow`/`shrink` &rarr; `mi_heap_realloc_aligned(dst, ptr, ..)`: returns `ptr`</span>
<span style="color: #808080; font-weight: bold;">///   in-place if it fits (read-only `mi_usable_size`), else allocs on `dst`,</span>
<span style="color: #808080; font-weight: bold;">///   `memcpy`s, then `mi_free(ptr)`.</span>
<span style="color: #808080; font-weight: bold;">///</span>
<span style="color: #808080; font-weight: bold;">/// The original arena is never `mi_heap_malloc`-ed from again via this `Vec`,</span>
<span style="color: #808080; font-weight: bold;">/// so the [`MimallocArena`] single-thread-alloc contract is preserved.</span>
<span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>inline<span class="br0">&#93;</span></span>
<span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">fn</span> transfer_arena&lt;<span style="color: #339933;">'a</span>, T&gt;<span class="br0">&#40;</span>v: &amp;<span style="color: #0080ff;">mut</span> ArenaVec&lt;<span style="color: #339933;">'a</span>, T&gt;, dst: &amp;<span style="color: #339933;">'a</span> MimallocArena<span class="br0">&#41;</span> <span class="br0">&#123;</span>
    v.set_allocator<span class="br0">&#40;</span>dst<span class="br0">&#41;</span>;
<span class="br0">&#125;</span>
&nbsp;
<span style="color: #808080; font-weight: bold;">/// `bumpalo::format!` parity &#151; `arena_format!(in arena, &quot;...&quot;, ..)` &rarr;</span>
<span style="color: #808080; font-weight: bold;">/// [`ArenaString`].</span>
<span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>macro_export<span class="br0">&#93;</span></span>
<span style="color: #0080ff;">macro_rules!</span> arena_format <span class="br0">&#123;</span>
    <span class="br0">&#40;</span><span style="color: #0000ff;">in</span> <span style="color: #0080ff;">$arena</span>:expr, $<span class="br0">&#40;</span><span style="color: #0080ff;">$arg</span>:tt<span class="br0">&#41;</span>*<span class="br0">&#41;</span> =&gt; <span class="br0">&#123;</span><span class="br0">&#123;</span>
        <span style="color: #0000ff;">let</span> <span style="color: #0080ff;">mut</span> __s = <span style="color: #0080ff;">$crate</span>::ArenaString::new_in<span class="br0">&#40;</span><span style="color: #0080ff;">$arena</span><span class="br0">&#41;</span>;
        ::core::fmt::Write::write_fmt<span class="br0">&#40;</span>&amp;<span style="color: #0080ff;">mut</span> __s, ::core::<span style="color: #0080ff;">format_args!</span><span class="br0">&#40;</span>$<span class="br0">&#40;</span><span style="color: #0080ff;">$arg</span><span class="br0">&#41;</span>*<span class="br0">&#41;</span><span class="br0">&#41;</span>
            .expect<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;ArenaString::write_fmt is infallible&quot;</span><span class="br0">&#41;</span>;
        __s
    <span class="br0">&#125;</span><span class="br0">&#125;</span>;
<span class="br0">&#125;</span>
&nbsp;
<span style="color: #808080; font-weight: bold;">/// `bun.use_mimalloc` &#151; false under ASAN, where the global allocator is `std::alloc::System`.</span>
<span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">const</span> USE_MIMALLOC: bool = <span style="color: #0080ff;">cfg!</span><span class="br0">&#40;</span>not<span class="br0">&#40;</span>bun_asan<span class="br0">&#41;</span><span class="br0">&#41;</span>;
&nbsp;
<span style="color: #808080;">// &#9472;&#9472; Allocator-vtable modules: per-module disposition (PORTING.md &sect;Allocators) &#9472;&#9472;</span>
<span style="color: #808080;">//</span>
<span style="color: #808080;">//   MimallocArena            &rarr; prefer `bun_alloc::Arena` (= bumpalo::Bump)</span>
<span style="color: #808080;">//   MaxHeapAllocator         &rarr; debug-only cap (single-allocation arena)</span>
<span style="color: #808080;">//   heap_breakdown           &rarr; macOS malloc_zone_* per-tag heaps (debug builds)</span>
<span style="color: #808080;">//   basic                    &rarr; `impl GlobalAlloc for Mimalloc` above is the canonical impl</span>
<span style="color: #808080;">//</span>
<span style="color: #808080;">//   LinuxMemFdAllocator, MimallocArena (the vtable impl)</span>
<span style="color: #808080;">//   import bun_core/sys/runtime/collections and so live in</span>
<span style="color: #808080;">//   `bun_runtime::allocators`; callers import from</span>
<span style="color: #808080;">//   there directly.</span>
<span style="color: #808080;">//</span>
<span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>path = <span style="color: #FF0000;">&quot;MaxHeapAllocator.rs&quot;</span><span class="br0">&#93;</span></span>
<span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">mod</span> max_heap_allocator;
<span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">mod</span> stack_fallback;
&nbsp;
<span style="color: #808080; font-weight: bold;">/// Raw alloc/free matching the `#[global_allocator]` (`mi_*` normally, libc under ASAN).</span>
<span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">mod</span> default_alloc <span class="br0">&#123;</span>
    <span style="color: #0000ff;">use</span> core::ffi::c_void;
&nbsp;
    <span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>inline<span class="br0">&#93;</span></span>
    <span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">fn</span> malloc<span class="br0">&#40;</span>size: usize<span class="br0">&#41;</span> -&gt; *<span style="color: #0080ff;">mut</span> c_void <span class="br0">&#123;</span>
        <span style="color: #0000ff;">if</span> <span style="color: #0080ff;">cfg!</span><span class="br0">&#40;</span>bun_asan<span class="br0">&#41;</span> <span class="br0">&#123;</span>
            <span style="color: #808080;">// SAFETY: `libc::malloc` has no input preconditions; null on failure.</span>
            <span style="color: #0000ff;">unsafe</span> <span class="br0">&#123;</span> libc::malloc<span class="br0">&#40;</span>size<span class="br0">&#41;</span> <span class="br0">&#125;</span>
        <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span>
            <span style="color: #0000ff;">crate</span>::mimalloc::mi_malloc<span class="br0">&#40;</span>size<span class="br0">&#41;</span>
        <span class="br0">&#125;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span style="color: #808080; font-weight: bold;">/// # Safety</span>
    <span style="color: #808080; font-weight: bold;">/// `ptr` must be null or a live allocation from the default allocator.</span>
    <span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>inline<span class="br0">&#93;</span></span>
    <span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">unsafe</span> <span style="color: #0000ff;">fn</span> realloc<span class="br0">&#40;</span>ptr: *<span style="color: #0080ff;">mut</span> c_void, new_size: usize<span class="br0">&#41;</span> -&gt; *<span style="color: #0080ff;">mut</span> c_void <span class="br0">&#123;</span>
        <span style="color: #0000ff;">if</span> <span style="color: #0080ff;">cfg!</span><span class="br0">&#40;</span>bun_asan<span class="br0">&#41;</span> <span class="br0">&#123;</span>
            <span style="color: #808080;">// SAFETY: caller guarantees `ptr` is null or a live libc allocation</span>
            <span style="color: #808080;">// (the default allocator under ASAN).</span>
            <span style="color: #0000ff;">unsafe</span> <span class="br0">&#123;</span> libc::realloc<span class="br0">&#40;</span>ptr, new_size<span class="br0">&#41;</span> <span class="br0">&#125;</span>
        <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span>
            <span style="color: #808080;">// SAFETY: caller guarantees `ptr` is null or a live mimalloc allocation.</span>
            <span style="color: #0000ff;">unsafe</span> <span class="br0">&#123;</span> <span style="color: #0000ff;">crate</span>::mimalloc::mi_realloc<span class="br0">&#40;</span>ptr, new_size<span class="br0">&#41;</span> <span class="br0">&#125;</span>
        <span class="br0">&#125;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span style="color: #808080; font-weight: bold;">/// # Safety</span>
    <span style="color: #808080; font-weight: bold;">/// `ptr` must be null or a live allocation from the default allocator.</span>
    <span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>inline<span class="br0">&#93;</span></span>
    <span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">unsafe</span> <span style="color: #0000ff;">fn</span> free<span class="br0">&#40;</span>ptr: *<span style="color: #0080ff;">mut</span> c_void<span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span style="color: #0000ff;">if</span> <span style="color: #0080ff;">cfg!</span><span class="br0">&#40;</span>bun_asan<span class="br0">&#41;</span> <span class="br0">&#123;</span>
            <span style="color: #808080;">// SAFETY: caller guarantees `ptr` is null or a live libc allocation</span>
            <span style="color: #808080;">// (the default allocator under ASAN).</span>
            <span style="color: #0000ff;">unsafe</span> <span class="br0">&#123;</span> libc::free<span class="br0">&#40;</span>ptr<span class="br0">&#41;</span> <span class="br0">&#125;</span>
        <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span>
            <span style="color: #808080;">// SAFETY: caller guarantees `ptr` is null or a live mimalloc allocation.</span>
            <span style="color: #0000ff;">unsafe</span> <span class="br0">&#123;</span> <span style="color: #0000ff;">crate</span>::mimalloc::mi_free<span class="br0">&#40;</span>ptr<span class="br0">&#41;</span> <span class="br0">&#125;</span>
        <span class="br0">&#125;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span style="color: #808080; font-weight: bold;">/// # Safety</span>
    <span style="color: #808080; font-weight: bold;">/// `ptr` must be null or a live allocation from the default allocator.</span>
    <span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>inline<span class="br0">&#93;</span></span>
    <span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">unsafe</span> <span style="color: #0000ff;">fn</span> usable_size<span class="br0">&#40;</span>ptr: *<span style="color: #0000ff;">const</span> c_void<span class="br0">&#41;</span> -&gt; usize <span class="br0">&#123;</span>
        <span style="color: #0000ff;">if</span> ptr.is_null<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
            <span style="color: #0000ff;">return</span> <span style="color: #cc66cc;">0</span>;
        <span class="br0">&#125;</span>
        <span style="color: #808080;">// Under `bun_asan` the global allocator is `std::alloc::System`, so the</span>
        <span style="color: #808080;">// size must come from libc, not mimalloc &#151; and the symbol differs per</span>
        <span style="color: #808080;">// OS (`malloc_usable_size` on Linux, `malloc_size` on macOS). `bun_asan`</span>
        <span style="color: #808080;">// is only ever set on Linux or macOS, so the catch-all (non-asan, every</span>
        <span style="color: #808080;">// `check-all` target including Windows) stays on mimalloc.</span>
        <span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>cfg<span class="br0">&#40;</span>all<span class="br0">&#40;</span>bun_asan, target_os = <span style="color: #FF0000;">&quot;linux&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#93;</span></span>
        <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">unsafe</span> <span class="br0">&#123;</span> libc::malloc_usable_size<span class="br0">&#40;</span>ptr.cast_mut<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#125;</span>;
        <span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>cfg<span class="br0">&#40;</span>all<span class="br0">&#40;</span>bun_asan, target_os = <span style="color: #FF0000;">&quot;macos&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#93;</span></span>
        <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">unsafe</span> <span class="br0">&#123;</span> libc::malloc_size<span class="br0">&#40;</span>ptr<span class="br0">&#41;</span> <span class="br0">&#125;</span>;
        <span style="color: #808080;">// SAFETY: caller guarantees `ptr` is a live mimalloc allocation (the</span>
        <span style="color: #808080;">// non-null check above already handled null).</span>
        <span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>cfg<span class="br0">&#40;</span>not<span class="br0">&#40;</span>any<span class="br0">&#40;</span>all<span class="br0">&#40;</span>bun_asan, target_os = <span style="color: #FF0000;">&quot;linux&quot;</span><span class="br0">&#41;</span>, all<span class="br0">&#40;</span>bun_asan, target_os = <span style="color: #FF0000;">&quot;macos&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#93;</span></span>
        <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">unsafe</span> <span class="br0">&#123;</span> <span style="color: #0000ff;">crate</span>::mimalloc::mi_usable_size<span class="br0">&#40;</span>ptr<span class="br0">&#41;</span> <span class="br0">&#125;</span>;
    <span class="br0">&#125;</span>
&nbsp;
    <span style="color: #808080;">// The aligned variants are `#[cfg]`-split (not `if cfg!()`) because the</span>
    <span style="color: #808080;">// posix_memalign/malloc_usable_size symbols don't exist on Windows.</span>
&nbsp;
    <span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>cfg<span class="br0">&#40;</span>not<span class="br0">&#40;</span>bun_asan<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#93;</span></span>
    <span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>inline<span class="br0">&#93;</span></span>
    <span style="color: #0000ff;">pub</span><span class="br0">&#40;</span><span style="color: #0000ff;">crate</span><span class="br0">&#41;</span> <span style="color: #0000ff;">fn</span> malloc_aligned<span class="br0">&#40;</span>size: usize, align: usize<span class="br0">&#41;</span> -&gt; *<span style="color: #0080ff;">mut</span> c_void <span class="br0">&#123;</span>
        <span style="color: #0000ff;">crate</span>::mimalloc::mi_malloc_auto_align<span class="br0">&#40;</span>size, align<span class="br0">&#41;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>cfg<span class="br0">&#40;</span>bun_asan<span class="br0">&#41;</span><span class="br0">&#93;</span></span>
    <span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>inline<span class="br0">&#93;</span></span>
    <span style="color: #0000ff;">pub</span><span class="br0">&#40;</span><span style="color: #0000ff;">crate</span><span class="br0">&#41;</span> <span style="color: #0000ff;">fn</span> malloc_aligned<span class="br0">&#40;</span>size: usize, align: usize<span class="br0">&#41;</span> -&gt; *<span style="color: #0080ff;">mut</span> c_void <span class="br0">&#123;</span>
        <span style="color: #0000ff;">if</span> align &lt;= <span style="color: #0000ff;">crate</span>::MAX_ALIGN_T <span class="br0">&#123;</span>
            <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">unsafe</span> <span class="br0">&#123;</span> libc::malloc<span class="br0">&#40;</span>size<span class="br0">&#41;</span> <span class="br0">&#125;</span>;
        <span class="br0">&#125;</span>
        <span style="color: #0000ff;">let</span> <span style="color: #0080ff;">mut</span> p: *<span style="color: #0080ff;">mut</span> c_void = core::ptr::null_mut<span class="br0">&#40;</span><span class="br0">&#41;</span>;
        <span style="color: #0000ff;">let</span> align = align.max<span class="br0">&#40;</span>core::mem::size_of::&lt;*<span style="color: #0080ff;">mut</span> c_void&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
        <span style="color: #0000ff;">if</span> <span style="color: #0000ff;">unsafe</span> <span class="br0">&#123;</span> libc::posix_memalign<span class="br0">&#40;</span>&amp;<span style="color: #0080ff;">mut</span> p, align, size<span class="br0">&#41;</span> <span class="br0">&#125;</span> != <span style="color: #cc66cc;">0</span> <span class="br0">&#123;</span>
            <span style="color: #0000ff;">return</span> core::ptr::null_mut<span class="br0">&#40;</span><span class="br0">&#41;</span>;
        <span class="br0">&#125;</span>
        p
    <span class="br0">&#125;</span>
&nbsp;
    <span style="color: #808080; font-weight: bold;">/// # Safety</span>
    <span style="color: #808080; font-weight: bold;">/// `ptr` must be null or a live allocation from the default allocator with the given `align`.</span>
    <span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>cfg<span class="br0">&#40;</span>not<span class="br0">&#40;</span>bun_asan<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#93;</span></span>
    <span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>inline<span class="br0">&#93;</span></span>
    <span style="color: #0000ff;">pub</span><span class="br0">&#40;</span><span style="color: #0000ff;">crate</span><span class="br0">&#41;</span> <span style="color: #0000ff;">unsafe</span> <span style="color: #0000ff;">fn</span> realloc_aligned<span class="br0">&#40;</span>
        ptr: *<span style="color: #0080ff;">mut</span> c_void,
        new_size: usize,
        align: usize,
    <span class="br0">&#41;</span> -&gt; *<span style="color: #0080ff;">mut</span> c_void <span class="br0">&#123;</span>
        <span style="color: #808080;">// SAFETY: caller guarantees `ptr` is null or a live mimalloc allocation</span>
        <span style="color: #808080;">// with alignment `align`.</span>
        <span style="color: #0000ff;">unsafe</span> <span class="br0">&#123;</span> <span style="color: #0000ff;">crate</span>::mimalloc::mi_realloc_aligned<span class="br0">&#40;</span>ptr, new_size, align<span class="br0">&#41;</span> <span class="br0">&#125;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span style="color: #808080; font-weight: bold;">/// # Safety</span>
    <span style="color: #808080; font-weight: bold;">/// `ptr` must be null or a live allocation from the default allocator with the given `align`.</span>
    <span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>cfg<span class="br0">&#40;</span>bun_asan<span class="br0">&#41;</span><span class="br0">&#93;</span></span>
    <span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>inline<span class="br0">&#93;</span></span>
    <span style="color: #0000ff;">pub</span><span class="br0">&#40;</span><span style="color: #0000ff;">crate</span><span class="br0">&#41;</span> <span style="color: #0000ff;">unsafe</span> <span style="color: #0000ff;">fn</span> realloc_aligned<span class="br0">&#40;</span>
        ptr: *<span style="color: #0080ff;">mut</span> c_void,
        new_size: usize,
        align: usize,
    <span class="br0">&#41;</span> -&gt; *<span style="color: #0080ff;">mut</span> c_void <span class="br0">&#123;</span>
        <span style="color: #0000ff;">if</span> align &lt;= <span style="color: #0000ff;">crate</span>::MAX_ALIGN_T <span class="br0">&#123;</span>
            <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">unsafe</span> <span class="br0">&#123;</span> libc::realloc<span class="br0">&#40;</span>ptr, new_size<span class="br0">&#41;</span> <span class="br0">&#125;</span>;
        <span class="br0">&#125;</span>
        <span style="color: #0000ff;">let</span> new_ptr = malloc_aligned<span class="br0">&#40;</span>new_size, align<span class="br0">&#41;</span>;
        <span style="color: #0000ff;">if</span> new_ptr.is_null<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
            <span style="color: #0000ff;">return</span> core::ptr::null_mut<span class="br0">&#40;</span><span class="br0">&#41;</span>;
        <span class="br0">&#125;</span>
        <span style="color: #0000ff;">if</span> !ptr.is_null<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
            <span style="color: #0000ff;">unsafe</span> <span class="br0">&#123;</span>
                <span style="color: #0000ff;">let</span> copy = usable_size<span class="br0">&#40;</span>ptr<span class="br0">&#41;</span>.min<span class="br0">&#40;</span>new_size<span class="br0">&#41;</span>;
                core::ptr::copy_nonoverlapping<span class="br0">&#40;</span>ptr.cast::&lt;u8&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>, new_ptr.cast::&lt;u8&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>, copy<span class="br0">&#41;</span>;
                libc::free<span class="br0">&#40;</span>ptr<span class="br0">&#41;</span>;
            <span class="br0">&#125;</span>
        <span class="br0">&#125;</span>
        new_ptr
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span>
&nbsp;
<span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">use</span> max_heap_allocator::MaxHeapAllocator;
<span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">use</span> stack_fallback::ArenaPtr;
&nbsp;
<span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>path = <span style="color: #FF0000;">&quot;MimallocArena.rs&quot;</span><span class="br0">&#93;</span></span>
<span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">mod</span> mimalloc_arena;
&nbsp;
<span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">mod</span> ast_alloc;
<span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">use</span> ast_alloc::<span class="br0">&#123;</span>AstAlloc, AstBox, AstVec, ast_box<span class="br0">&#125;</span>;
<span style="color: #0000ff;">mod</span> hashbrown_bridge;
<span style="color: #808080; font-weight: bold;">/// Re-export so `bun_collections` can name the polyfill trait in</span>
<span style="color: #808080; font-weight: bold;">/// `StringHashMap`'s `A` bound without taking its own direct dep on</span>
<span style="color: #808080; font-weight: bold;">/// `allocator-api2`.</span>
<span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">use</span> allocator_api2::alloc::Allocator <span style="color: #0000ff;">as</span> HashbrownAllocator;
&nbsp;
<span style="color: #808080;">// &#9472;&#9472; tier-0 local primitives &#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;</span>
<span style="color: #808080;">// Real, self-contained helpers used by the BSS containers below. These are the</span>
<span style="color: #808080;">// canonical tier-0 definitions, re-exported by higher tiers (`bun_paths::SEP_STR`,</span>
<span style="color: #808080;">// `bun_core::strings::trim_right`, `bun_core::strings::trim_right`).</span>
&nbsp;
<span style="color: #808080; font-weight: bold;">/// `&quot;\\&quot;` on Windows, `&quot;/&quot;` elsewhere.</span>
<span style="color: #808080; font-weight: bold;">/// Canonical tier-0 definition; re-exported by `bun_paths::SEP_STR`.</span>
<span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">const</span> SEP_STR: &amp;str = <span style="color: #0000ff;">if</span> <span style="color: #0080ff;">cfg!</span><span class="br0">&#40;</span>windows<span class="br0">&#41;</span> <span class="br0">&#123;</span> <span style="color: #FF0000;">&quot;<span style="color: #800000;">\\</span>&quot;</span> <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span> <span style="color: #FF0000;">&quot;/&quot;</span> <span class="br0">&#125;</span>;
&nbsp;
<span style="color: #808080; font-weight: bold;">/// `b'\\'` on Windows, `b'/'` elsewhere.</span>
<span style="color: #808080; font-weight: bold;">/// Canonical tier-0 definition; re-exported by `bun_paths::SEP` / `bun_core::SEP`.</span>
<span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">const</span> SEP: u8 = <span style="color: #0000ff;">if</span> <span style="color: #0080ff;">cfg!</span><span class="br0">&#40;</span>windows<span class="br0">&#41;</span> <span class="br0">&#123;</span> b<span style="color: #FF0000;">'<span style="color: #800000;">\\</span>'</span> <span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span> b<span style="color: #FF0000;">'/'</span> <span class="br0">&#125;</span>;
&nbsp;
<span style="color: #808080; font-weight: bold;">/// Canonical tier-0 definition; re-exported by `bun_core::strings::trim_right`.</span>
<span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>inline<span class="br0">&#93;</span></span>
<span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">fn</span> trim_right&lt;<span style="color: #339933;">'a</span>&gt;<span class="br0">&#40;</span>s: &amp;<span style="color: #339933;">'a</span> <span class="br0">&#91;</span>u8<span class="br0">&#93;</span>, chars: &amp;<span class="br0">&#91;</span>u8<span class="br0">&#93;</span><span class="br0">&#41;</span> -&gt; &amp;<span style="color: #339933;">'a</span> <span class="br0">&#91;</span>u8<span class="br0">&#93;</span> <span class="br0">&#123;</span>
    <span style="color: #0000ff;">let</span> <span style="color: #0080ff;">mut</span> end = s.len<span class="br0">&#40;</span><span class="br0">&#41;</span>;
    <span style="color: #0000ff;">while</span> end &gt; <span style="color: #cc66cc;">0</span> &amp;&amp; chars.contains<span class="br0">&#40;</span>&amp;s<span class="br0">&#91;</span>end - <span style="color: #cc66cc;">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        end -= <span style="color: #cc66cc;">1</span>;
    <span class="br0">&#125;</span>
    &amp;s<span class="br0">&#91;</span>..end<span class="br0">&#93;</span>
<span class="br0">&#125;</span>
&nbsp;
<span style="color: #808080; font-weight: bold;">/// Canonical tier-0 definition; re-exported by `bun_core::strings::trim_left`.</span>
<span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>inline<span class="br0">&#93;</span></span>
<span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">fn</span> trim_left&lt;<span style="color: #339933;">'a</span>&gt;<span class="br0">&#40;</span>s: &amp;<span style="color: #339933;">'a</span> <span class="br0">&#91;</span>u8<span class="br0">&#93;</span>, chars: &amp;<span class="br0">&#91;</span>u8<span class="br0">&#93;</span><span class="br0">&#41;</span> -&gt; &amp;<span style="color: #339933;">'a</span> <span class="br0">&#91;</span>u8<span class="br0">&#93;</span> <span class="br0">&#123;</span>
    <span style="color: #0000ff;">let</span> <span style="color: #0080ff;">mut</span> begin = <span style="color: #cc66cc;">0</span>usize;
    <span style="color: #0000ff;">while</span> begin &lt; s.len<span class="br0">&#40;</span><span class="br0">&#41;</span> &amp;&amp; chars.contains<span class="br0">&#40;</span>&amp;s<span class="br0">&#91;</span>begin<span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        begin += <span style="color: #cc66cc;">1</span>;
    <span class="br0">&#125;</span>
    &amp;s<span class="br0">&#91;</span>begin..<span class="br0">&#93;</span>
<span class="br0">&#125;</span>
&nbsp;
<span style="color: #808080; font-weight: bold;">/// Strip `chars` from both ends.</span>
<span style="color: #808080; font-weight: bold;">/// Canonical tier-0 definition; re-exported by `bun_core::strings::trim`.</span>
<span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>inline<span class="br0">&#93;</span></span>
<span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">fn</span> trim&lt;<span style="color: #339933;">'a</span>&gt;<span class="br0">&#40;</span>s: &amp;<span style="color: #339933;">'a</span> <span class="br0">&#91;</span>u8<span class="br0">&#93;</span>, chars: &amp;<span class="br0">&#91;</span>u8<span class="br0">&#93;</span><span class="br0">&#41;</span> -&gt; &amp;<span style="color: #339933;">'a</span> <span class="br0">&#91;</span>u8<span class="br0">&#93;</span> <span class="br0">&#123;</span>
    trim_right<span class="br0">&#40;</span>trim_left<span class="br0">&#40;</span>s, chars<span class="br0">&#41;</span>, chars<span class="br0">&#41;</span>
<span class="br0">&#125;</span>
&nbsp;
<span style="color: #808080;">// &#9472;&#9472;&#9472; ascii-lowercase helpers &#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;</span>
<span style="color: #808080;">// Sunk from bun_core::strings so bun_alloc::BSSList::append_lower_case can call</span>
<span style="color: #808080;">// them without a dep cycle (bun_core &rarr; bun_alloc, not the reverse).</span>
<span style="color: #808080;">// `bun_core::strings` re-exports `copy_lowercase` and `ascii_lowercase_buf`.</span>
&nbsp;
<span style="color: #808080; font-weight: bold;">/// ASCII-lowercase</span>
<span style="color: #808080; font-weight: bold;">/// `in_` into `out` (which must be at least `in_.len()`), returning the</span>
<span style="color: #808080; font-weight: bold;">/// written prefix. Memcpy-runs + per-uppercase-byte fixup; identical output</span>
<span style="color: #808080; font-weight: bold;">/// to a byte-at-a-time `to_ascii_lowercase` zip.</span>
<span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">fn</span> copy_lowercase&lt;<span style="color: #339933;">'a</span>&gt;<span class="br0">&#40;</span>in_: &amp;<span class="br0">&#91;</span>u8<span class="br0">&#93;</span>, out: &amp;<span style="color: #339933;">'a</span> <span style="color: #0080ff;">mut</span> <span class="br0">&#91;</span>u8<span class="br0">&#93;</span><span class="br0">&#41;</span> -&gt; &amp;<span style="color: #339933;">'a</span> <span class="br0">&#91;</span>u8<span class="br0">&#93;</span> <span class="br0">&#123;</span>
    <span style="color: #0000ff;">let</span> <span style="color: #0080ff;">mut</span> in_slice = in_;
    <span style="color: #808080;">// Reshaped for borrowck &#151; track output offset instead of reslicing &amp;mut.</span>
    <span style="color: #0000ff;">let</span> <span style="color: #0080ff;">mut</span> out_off: usize = <span style="color: #cc66cc;">0</span>;
&nbsp;
    <span style="color: #339933;">'begin</span>: <span style="color: #0000ff;">loop</span> <span class="br0">&#123;</span>
        <span style="color: #0000ff;">for</span> <span class="br0">&#40;</span>i, &amp;c<span class="br0">&#41;</span> <span style="color: #0000ff;">in</span> in_slice.iter<span class="br0">&#40;</span><span class="br0">&#41;</span>.enumerate<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
            <span style="color: #0000ff;">if</span> <span style="color: #0000ff;">let</span> b<span style="color: #FF0000;">'A'</span>..=b<span style="color: #FF0000;">'Z'</span> = c <span class="br0">&#123;</span>
                out<span class="br0">&#91;</span>out_off..out_off + i<span class="br0">&#93;</span>.copy_from_slice<span class="br0">&#40;</span>&amp;in_slice<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span>..i<span class="br0">&#93;</span><span class="br0">&#41;</span>;
                out<span class="br0">&#91;</span>out_off + i<span class="br0">&#93;</span> = c.to_ascii_lowercase<span class="br0">&#40;</span><span class="br0">&#41;</span>;
                <span style="color: #0000ff;">let</span> end = i + <span style="color: #cc66cc;">1</span>;
                in_slice = &amp;in_slice<span class="br0">&#91;</span>end..<span class="br0">&#93;</span>;
                out_off += end;
                <span style="color: #0000ff;">continue</span> <span style="color: #339933;">'begin</span>;
            <span class="br0">&#125;</span>
        <span class="br0">&#125;</span>
&nbsp;
        out<span class="br0">&#91;</span>out_off..out_off + in_slice.len<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#93;</span>.copy_from_slice<span class="br0">&#40;</span>in_slice<span class="br0">&#41;</span>;
        <span style="color: #0000ff;">break</span>;
    <span class="br0">&#125;</span>
&nbsp;
    &amp;out<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span>..in_.len<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#93;</span>
<span class="br0">&#125;</span>
&nbsp;
<span style="color: #808080; font-weight: bold;">/// Lowercase `input` into a fresh `[u8; N]` stack buffer, returning</span>
<span style="color: #808080; font-weight: bold;">/// `Some((buf, input.len()))` or `None` if `input.len() &gt; N`. The unused tail</span>
<span style="color: #808080; font-weight: bold;">/// of `buf` is zero-filled. Covers the ubiquitous &quot;lowercase a short key into</span>
<span style="color: #808080; font-weight: bold;">/// a stack buffer, then look it up in a length-gated map&quot; pattern.</span>
<span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>inline<span class="br0">&#93;</span></span>
<span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">fn</span> ascii_lowercase_buf&lt;<span style="color: #0000ff;">const</span> N: usize&gt;<span class="br0">&#40;</span>input: &amp;<span class="br0">&#91;</span>u8<span class="br0">&#93;</span><span class="br0">&#41;</span> -&gt; <span style="color: #0080ff;">Option</span>&lt;<span class="br0">&#40;</span><span class="br0">&#91;</span>u8; N<span class="br0">&#93;</span>, usize<span class="br0">&#41;</span>&gt; <span class="br0">&#123;</span>
    <span style="color: #0000ff;">if</span> input.len<span class="br0">&#40;</span><span class="br0">&#41;</span> &gt; N <span class="br0">&#123;</span>
        <span style="color: #0000ff;">return</span> <span style="color: #FF0000;">None</span>;
    <span class="br0">&#125;</span>
    <span style="color: #0000ff;">let</span> <span style="color: #0080ff;">mut</span> buf = <span class="br0">&#91;</span><span style="color: #cc66cc;">0</span>u8; N<span class="br0">&#93;</span>;
    copy_lowercase<span class="br0">&#40;</span>input, &amp;<span style="color: #0080ff;">mut</span> buf<span class="br0">&#91;</span>..input.len<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;
    <span style="color: #FF0000;">Some</span><span class="br0">&#40;</span><span class="br0">&#40;</span>buf, input.len<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
<span class="br0">&#125;</span>
&nbsp;
<span style="color: #808080; font-weight: bold;">/// Wrap a raw allocator pointer in the `Result&lt;NonNull&lt;[u8]&gt;, AllocError&gt;`</span>
<span style="color: #808080; font-weight: bold;">/// shape `core::alloc::Allocator` wants. Null &rarr; `Err(AllocError)`. Generic</span>
<span style="color: #808080; font-weight: bold;">/// over the pointee so mimalloc's `*mut c_void` returns pass straight in.</span>
<span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>inline<span class="br0">&#40;</span>always<span class="br0">&#41;</span><span class="br0">&#93;</span></span>
<span style="color: #0000ff;">pub</span><span class="br0">&#40;</span><span style="color: #0000ff;">crate</span><span class="br0">&#41;</span> <span style="color: #0000ff;">fn</span> alloc_result&lt;T&gt;<span class="br0">&#40;</span>
    p: *<span style="color: #0080ff;">mut</span> T,
    size: usize,
<span class="br0">&#41;</span> -&gt; core::result::Result&lt;NonNull&lt;<span class="br0">&#91;</span>u8<span class="br0">&#93;</span>&gt;, core::alloc::AllocError&gt; <span class="br0">&#123;</span>
    NonNull::new<span class="br0">&#40;</span>p.cast::&lt;u8&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
        .map<span class="br0">&#40;</span>|p| NonNull::slice_from_raw_parts<span class="br0">&#40;</span>p, size<span class="br0">&#41;</span><span class="br0">&#41;</span>
        .ok_or<span class="br0">&#40;</span>core::alloc::AllocError<span class="br0">&#41;</span>
<span class="br0">&#125;</span>
&nbsp;
<span style="color: #808080; font-weight: bold;">/// Number of bytes the formatted args would produce.</span>
<span style="color: #808080; font-weight: bold;">///</span>
<span style="color: #808080; font-weight: bold;">/// Drives a discarding `fmt::Write` that only sums `s.len()` &#151; no allocation,</span>
<span style="color: #808080; font-weight: bold;">/// no UTF-8 validation beyond what the formatter already did. Lives here in</span>
<span style="color: #808080; font-weight: bold;">/// T0 so higher tiers (`bun_core::fmt::count` re-exports this) and `bun_alloc`</span>
<span style="color: #808080; font-weight: bold;">/// itself can share the single implementation.</span>
<span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>inline<span class="br0">&#93;</span></span>
<span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">fn</span> fmt_count<span class="br0">&#40;</span>args: core::fmt::Arguments&lt;<span style="color: #339933;">'_</span>&gt;<span class="br0">&#41;</span> -&gt; usize <span class="br0">&#123;</span>
    <span style="color: #0000ff;">struct</span> Discarding<span class="br0">&#40;</span>usize<span class="br0">&#41;</span>;
    <span style="color: #0000ff;">impl</span> core::fmt::Write <span style="color: #0000ff;">for</span> Discarding <span class="br0">&#123;</span>
        <span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>inline<span class="br0">&#93;</span></span>
        <span style="color: #0000ff;">fn</span> write_str<span class="br0">&#40;</span>&amp;<span style="color: #0080ff;">mut</span> <span style="color: #FF0000;">self</span>, s: &amp;str<span class="br0">&#41;</span> -&gt; core::fmt::Result <span class="br0">&#123;</span>
            <span style="color: #FF0000;">self</span><span style="color: #cc66cc;">.0</span> += s.len<span class="br0">&#40;</span><span class="br0">&#41;</span>;
            <span style="color: #FF0000;">Ok</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
        <span class="br0">&#125;</span>
    <span class="br0">&#125;</span>
    <span style="color: #0000ff;">let</span> <span style="color: #0080ff;">mut</span> w = Discarding<span class="br0">&#40;</span><span style="color: #cc66cc;">0</span><span class="br0">&#41;</span>;
    <span style="color: #808080;">// Infallible: our `write_str` never errors.</span>
    <span style="color: #0000ff;">let</span> <span style="color: #cc66cc;">_</span> = core::fmt::write<span class="br0">&#40;</span>&amp;<span style="color: #0080ff;">mut</span> w, args<span class="br0">&#41;</span>;
    w.<span style="color: #cc66cc;">0</span>
<span class="br0">&#125;</span>
&nbsp;
<span style="color: #808080; font-weight: bold;">/// `core::fmt::Write` adapter over a borrowed `&amp;mut [u8]` &#151; the engine behind</span>
<span style="color: #808080; font-weight: bold;">/// [`buf_print`] / [`buf_print_len`] (and `bun_core::fmt::buf_print_z`).</span>
<span style="color: #808080; font-weight: bold;">///</span>
<span style="color: #808080; font-weight: bold;">/// Lives at T0 so `bun_alloc` itself can use it (`BSSStringList::print`); T1</span>
<span style="color: #808080; font-weight: bold;">/// `bun_core::fmt` re-exports it and adds an `io::Write` impl for write-only</span>
<span style="color: #808080; font-weight: bold;">/// sites.</span>
<span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">struct</span> SliceCursor&lt;<span style="color: #339933;">'a</span>&gt; <span class="br0">&#123;</span>
    <span style="color: #0000ff;">pub</span> buf: &amp;<span style="color: #339933;">'a</span> <span style="color: #0080ff;">mut</span> <span class="br0">&#91;</span>u8<span class="br0">&#93;</span>,
    <span style="color: #0000ff;">pub</span> at: usize,
<span class="br0">&#125;</span>
<span style="color: #0000ff;">impl</span>&lt;<span style="color: #339933;">'a</span>&gt; SliceCursor&lt;<span style="color: #339933;">'a</span>&gt; <span class="br0">&#123;</span>
    <span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>inline<span class="br0">&#93;</span></span>
    <span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">fn</span> new<span class="br0">&#40;</span>buf: &amp;<span style="color: #339933;">'a</span> <span style="color: #0080ff;">mut</span> <span class="br0">&#91;</span>u8<span class="br0">&#93;</span><span class="br0">&#41;</span> -&gt; <span style="color: #0000ff;">Self</span> <span class="br0">&#123;</span>
        <span style="color: #0000ff;">Self</span> <span class="br0">&#123;</span> buf, at: <span style="color: #cc66cc;">0</span> <span class="br0">&#125;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span>
<span style="color: #0000ff;">impl</span> core::fmt::Write <span style="color: #0000ff;">for</span> SliceCursor&lt;<span style="color: #339933;">'_</span>&gt; <span class="br0">&#123;</span>
    <span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>inline<span class="br0">&#93;</span></span>
    <span style="color: #0000ff;">fn</span> write_str<span class="br0">&#40;</span>&amp;<span style="color: #0080ff;">mut</span> <span style="color: #FF0000;">self</span>, s: &amp;str<span class="br0">&#41;</span> -&gt; core::fmt::Result <span class="br0">&#123;</span>
        <span style="color: #0000ff;">let</span> bytes = s.as_bytes<span class="br0">&#40;</span><span class="br0">&#41;</span>;
        <span style="color: #0000ff;">let</span> end = <span style="color: #FF0000;">self</span>.at + bytes.len<span class="br0">&#40;</span><span class="br0">&#41;</span>;
        <span style="color: #0000ff;">if</span> end &gt; <span style="color: #FF0000;">self</span>.buf.len<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
            <span style="color: #0000ff;">return</span> <span style="color: #FF0000;">Err</span><span class="br0">&#40;</span>core::fmt::Error<span class="br0">&#41;</span>;
        <span class="br0">&#125;</span>
        <span style="color: #FF0000;">self</span>.buf<span class="br0">&#91;</span><span style="color: #FF0000;">self</span>.at..end<span class="br0">&#93;</span>.copy_from_slice<span class="br0">&#40;</span>bytes<span class="br0">&#41;</span>;
        <span style="color: #FF0000;">self</span>.at = end;
        <span style="color: #FF0000;">Ok</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span>
&nbsp;
<span style="color: #808080; font-weight: bold;">/// Render the formatted args into `buf`, returning the written sub-slice.</span>
<span style="color: #808080; font-weight: bold;">/// Fails (`fmt::Error`) when `buf` is too short.</span>
<span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">fn</span> buf_print&lt;<span style="color: #339933;">'a</span>&gt;<span class="br0">&#40;</span>
    buf: &amp;<span style="color: #339933;">'a</span> <span style="color: #0080ff;">mut</span> <span class="br0">&#91;</span>u8<span class="br0">&#93;</span>,
    args: core::fmt::Arguments&lt;<span style="color: #339933;">'_</span>&gt;,
<span class="br0">&#41;</span> -&gt; core::result::Result&lt;&amp;<span style="color: #339933;">'a</span> <span class="br0">&#91;</span>u8<span class="br0">&#93;</span>, core::fmt::Error&gt; <span class="br0">&#123;</span>
    <span style="color: #0000ff;">let</span> <span style="color: #0080ff;">mut</span> c = SliceCursor <span class="br0">&#123;</span> buf, at: <span style="color: #cc66cc;">0</span> <span class="br0">&#125;</span>;
    core::fmt::write<span class="br0">&#40;</span>&amp;<span style="color: #0080ff;">mut</span> c, args<span class="br0">&#41;</span>?;
    <span style="color: #0000ff;">let</span> len = c.at;
    <span style="color: #FF0000;">Ok</span><span class="br0">&#40;</span>&amp;c.buf<span class="br0">&#91;</span>..len<span class="br0">&#93;</span><span class="br0">&#41;</span>
<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></td></tr></table></code><hr />
</div><br />
<ul><li style="">	l’on note l’apparition dans le code de centaines d'utilisations de static mut et de fonctions de contournement de la mémoire qui violent les garanties de sécurité traditionnelles de Rust. A titre d’illustration, la fonction PathString::init (située dans les sources de gestion de chaînes de caractères de bun_core) a fait l'objet d'audits publics de sécurité après avoir été signalée pour avoir exposé par inadvertance un comportement non sécurisé dans une interface pourtant déclarée comme sûre.</li></ul><br />
<br />
<div style="text-align: center;">
<div class="video-container"><iframe class="restrain" title="YouTube video player" width="560" height="315" allowfullscreen src="//www.youtube.com/embed/0TSxrzBVEwQ?wmode=transparent&amp;fs=1" frameborder="0"></iframe></div>
</div><br />
<b><font size="3">Ces efforts interviennent dans un contexte d’intérêt croissant pour Rust qui ravive le débat de la comparaison avec des langages comme le C et le C++</font></b><br />
<br />
Pourquoi le langage Rust est-il devenu si désirable ? <a href="https://programmation.developpez.com/actu/311594/Les-applications-Rust-sont-elles-plus-rapides-que-leurs-equivalents-en-C-C-est-ce-que-suggerent-plusieurs-benchmarks-qui-comparent-les-deux-langages-de-programmation-de-la-filiere-systeme/" target="_blank">Essentiellement parce qu’il arrive à marier des performances proches du C tout en offrant de meilleures garanties de sécurisation de la mémoire</a>, et ce, même si certains acteurs de la filière sont d’avis que le problème de fond c’est l’aptitude des programmeurs à mettre à profit les fonctionnalités d’un langage donné. Si le sujet autour de la conversion de code du C vers le Rust a pris tant d’ampleur, c’est notamment parce que certaines grandes entreprises courent après les bugs liés à la mémoire.<br />
<br />
En 2019, Microsoft avertissait ainsi que 70 % des failles de sécurité détectées dans Windows étaient liées à la sécurité de la mémoire. Ce taux est le même depuis presque 20 ans. L’éditeur évoquait alors pour la première fois son intérêt pour le Rust. Même son de cloche chez Google. « Environ 70 % de nos bugs de sécurité de haute sévérité sont des problèmes d’insécurité de la mémoire (c’est-à-dire des erreurs avec les pointeurs C/C++). La moitié d’entre eux sont des bugs de type « use-after-free » », écrivait ainsi l’éditeur dans un billet de 2020 sur la sécurité de Chromium. <br />
<br />
Source : <a rel="nofollow" href="https://discourse.ubuntu.com/t/investing-in-automated-c-to-rust-translation/86369" target="_blank">Billet de blog sur l’approche neurosymbolique</a> <br />
<br />
<b>Et vous ?</b><br />
<br />
:fleche: Que pensez-vous de cette initiative annoncée par Canonical ? Partagez-vous les avis selon lesquels il serait plus judicieux de créer un compilateur C qui émet directement du code assembleur sécurisé ? <br />
:fleche: Avez-vous récemment mené un projet de conversion d'ancienne base de code C vers le Rust ? Quelles sont les leçons que vous avez tirées ? Partagez vos anecdotes<br />
<br />
<b>Voir aussi :</b> <br />
<br />
:fleche: <a href="https://rust.developpez.com/actu/270094/" target="_blank">L'équipe Microsoft Security Response Center recommande l'utilisation de Rust comme approche proactive pour un code plus sécurisé</a><br />
:fleche: <a href="https://www.developpez.com/actu/92484/" target="_blank">Quel langage pourrait remplacer C ? Après avoir comparé Go, Rust et D, le choix d'Andrei Alexandrescu se porte sur D</a><br />
:fleche: <a href="https://c.developpez.com/actu/266762/" target="_blank">C2Rust : un outil qui permet de faire la traduction et la refactorisation de votre code écrit en langage C vers le langage Rust</a></div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f2138/general-developpement/programmation-systeme/rust/">Rust</category>
			<dc:creator>Patrick Ruiz</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2185278/general-developpement/programmation-systeme/rust/canonical-finance-these-doctorat-visant-automatiser-conversion-code-c-vers-rust/</guid>
		</item>
		<item>
			<title><![CDATA[[Retour d'expérience] Migration d'un logiciel WinDev vers Rust + Tauri]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2185086&amp;goto=newpost</link>
			<pubDate>Mon, 10 Aug 2026 15:13:43 GMT</pubDate>
			<description>Bonjour à tous, 
 
*Je...</description>
			<content:encoded><![CDATA[<div>Bonjour à tous,<br />
<br />
<b>Je voudrais faire une sorte de témoignage.</b><br />
<br />
Je distribue gratuitement Radinus, un logiciel de finances personnelles écrit en WinDev et arrivé en version 1.9.3. Je viens de le refaire entièrement en Rust + Tauri. <br />
Voici ce que j'en retiens.<br />
<br />
<b>Pourquoi partir</b><br />
<br />
Uniquement pour des raisons économiques. Pour un logiciel gratuit, développé par une seule personne, le coût de la licence était devenu sans commune mesure avec ce qu'il était. <br />
<i>Je ne conteste à personne le droit de fixer ses tarifs ; je constate que ce modèle ne convenait plus au mien.</i><br />
Avec Windev tout les utilisateurs aurait du payer plus de 200 euros par an et par ordi pour avoir le droit de continuer a utiliser Radinus sans que j'en touche un seul centime.<br />
De plus j'aurait du contracter un abonnement SaaS a vie...<br />
Inutile de dire qu'on ne peut plus distribuer un logiciel gratuit avec Windev.<br />
<br />
Ce qui m'a décidé : la survie de mon logiciel ne dépendait pas de moi, mais de la politique commerciale d'un tiers. C'est cette dépendance que je voulais supprimer.<br />
<br />
<b>Le choix</b><br />
<br />
Rust pour le modèle et le contrôleur, Tauri v2 pour les fenêtres, HTML/CSS/TypeScript pour l'interface. <br />
Critères : libre et sans redevance, réellement multiplateforme, aucun moteur d'exécution à déployer chez l'utilisateur.<br />
<br />
<br />
<b>La contrainte qui a tout structuré</b><br />
<br />
Lire les sauvegardes de l'ancienne version : des utilisateurs ont dix ans d'historique dedans. J'ai donc conservé le schéma tel quel — les tables gardent leurs noms français d'origine —, reproduit la génération de clés de WinDev plutôt qu'un auto-incrément SQL, et j'écris les archives au format exact de la 1.9.3, jusqu'à l'entrée vide qu'elle place dans chaque zip. Une 2.0 produit une sauvegarde qu'une 1.9.3 relit sans broncher : l'utilisateur peut revenir en arrière.<br />
<br />
La partie la plus longue n'a été ni Rust ni Tauri, mais la fidélité : reproduire à l'identique le comportement de 41 fenêtres ...<br />
<br />
<br />
<b>Le résultat</b><br />
<br />
Je le prouve : on peut faire un projet aussi conviviale que la version Windev avec Rust+Tauri.<br />
Version 2.0.2, sous GPL v3, pour Windows, macOS (binaire universel signé et notarisé) et Linux. <br />
Gratuit, sans publicité, sans compte, sans communication réseau : les données restent sur la machine.<br />
<br />
<a rel="nofollow" href="https://www.radinus.fr" target="_blank">https://www.radinus.fr</a><br />
<a rel="nofollow" href="https://github.com/Fab2bprog/Rust-Radinus" target="_blank">https://github.com/Fab2bprog/Rust-Radinus</a><br />
<br />
Fabrice Garcia</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f2138/general-developpement/programmation-systeme/rust/">Rust</category>
			<dc:creator>Fab2bprog</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2185086/general-developpement/programmation-systeme/rust/retour-d-experience-migration-d-logiciel-windev-vers-rust-p-tauri/</guid>
		</item>
		<item>
			<title><![CDATA[[Projet DIY] Gestion de filtration de piscine avec ESP32 & Rust (esp-idf-hal)]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2185024&amp;goto=newpost</link>
			<pubDate>Thu, 06 Aug 2026 10:12:40 GMT</pubDate>
			<description>Bonjour à tous, 
 
Je vous...</description>
			<content:encoded><![CDATA[<div>Bonjour à tous,<br />
<br />
Je vous présente un projet domotique embarqué développé en Rust que je pilote actuellement chez moi : un système complet de gestion et de sécurisation de la filtration d'une piscine familiale sur ESP32.<br />
<br />
C'est l'évolution d'un ancien projet C++/PlatformIO. L'objectif était de concevoir un système autonome, robuste et sécurisé, exploitant la puissance du langage Rust avec l'écosystème esp-idf-hal / esp-idf-svc.<br />
&#128736;&#65039; Aperçu de l'architecture matérielle :<br />
<br />
    ESP32 avec RTOS (esp-idf).<br />
<br />
    Sonde 1-Wire (DS18B20) pour la température de l'eau.<br />
<br />
    Capteur I2C (AHT10) pour l'air/humidité.<br />
<br />
    Expandeur I2C (PCF8574) pour l'isolation et la lecture des relais/boutons/interrupteur physique.<br />
<br />
    Écran OLED (SSD1306) pour le diagnostic local.<br />
<br />
    Module GPS (UART2) pour l'horodatage fiable même hors réseau local, avec repli NTP.<br />
<br />
&#128161; Fonctionnalités clés :<br />
<br />
    Modes de fonctionnement : AUTO (durée calculée automatiquement selon la température d'eau), MANUEL et OFF via interrupteur physique 3 positions ou interface web.<br />
<br />
    Sécurités matérielles prioritaires : Anti-gel, canicule, niveau d'eau (ADC), défaut moteur (disjoncteur), protection anti-claquement du relais.<br />
<br />
    Watchdog dynamique : Redémarrage automatique et journalisé si la boucle principale bloque plus de 5 secondes.<br />
<br />
    Serveur web embarqué (Dashboard local) : Métriques en direct, contrôle, plage horaire, consultations des journaux, timeline dynamique.<br />
<br />
    Stockage NVS : Persistance locale des sessions, journaux et compteurs (survit aux reboot).<br />
<br />
    Export Cloud : Envoi asynchrone des métriques vers Adafruit IO dans un thread séparé.<br />
<br />
Le projet est en développement actif et tourne déjà en conditions réelles.<br />
<br />
&#128204; Le code source et la documentation complète sont disponibles sur GitHub :<br />
<br />
<a rel="nofollow" href="https://github.com/Phil-dav/piscine-domotique-esp32" target="_blank">https://github.com/Phil-dav/piscine-domotique-esp32</a><br />
<br />
N'hésitez pas si vous avez des questions sur la partie architecture Rust, la gestion des drivers 1-Wire/I2C ou si vous avez des suggestions d'amélioration !</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f2138/general-developpement/programmation-systeme/rust/">Rust</category>
			<dc:creator>Papy Azerty</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2185024/general-developpement/programmation-systeme/rust/projet-diy-gestion-filtration-piscine-esp32-rust-esp-idf-hal/</guid>
		</item>
		<item>
			<title><![CDATA[[Discord] Communauté francophone : Rust Embarqué, ESP32 & Électronique]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2185022&amp;goto=newpost</link>
			<pubDate>Thu, 06 Aug 2026 09:45:34 GMT</pubDate>
			<description>Bonjour à toutes et à tous, 
...</description>
			<content:encoded><![CDATA[<div>Bonjour à toutes et à tous,<br />
<br />
Passionné par le langage Rust et les systèmes embarqués, j'ai constaté qu'il était difficile de trouver une communauté francophone spécifiquement dédiée à la programmation embarquée. C'est de ce constat qu'est né Rust Embarqué FR, un serveur Discord créé pour rassembler les passionnés du code proche du matériel.<br />
<br />
Bien que le cœur du serveur soit orienté vers Rust et l'embarqué, la porte reste ouverte à d'autres langages et à l'électronique en général. Que vous soyez expérimenté sur microcontrôleurs, débutant curieux d'abandonner le C/C++ sur ESP32/STM32, ou adepte de domotique et de DIY, vous y êtes les bienvenus !<br />
<br />
Au programme du serveur :<br />
<br />
    &#129408; Entraide Rust &amp; Embedded : Configuration de la toolchain, gestion des registres, async/embassy, drivers hardware...<br />
<br />
    &#9889; Électronique &amp; Microcontrôleurs : ESP32, ESP8266, Raspberry Pi, capteurs, bus de communication (1-Wire, I2C, SPI)...<br />
<br />
    &#128736;&#65039; Projets &amp; DIY : Présentation de vos réalisations perso, retours d'expérience et conseils de conception.<br />
<br />
L'esprit de la communauté repose avant tout sur l'échange, la bienveillance et la passion du matériel.<br />
<br />
&#128204; Rejoindre la communauté : <a rel="nofollow" href="https://discord.gg/GVsEpapWXb" target="_blank">https://discord.gg/GVsEpapWXb</a><br />
<br />
Au plaisir de vous y croiser et d'échanger autour de vos projets !</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f2138/general-developpement/programmation-systeme/rust/">Rust</category>
			<dc:creator>Papy Azerty</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2185022/general-developpement/programmation-systeme/rust/discord-communaute-francophone-rust-embarque-esp32-electronique/</guid>
		</item>
		<item>
			<title><![CDATA[Time-Compute une librairie compatible avec l'API Chrono avec des fonctions en plus]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2184638&amp;goto=newpost</link>
			<pubDate>Tue, 14 Jul 2026 05:41:09 GMT</pubDate>
			<description>Bonjour, 
 
Je viens de...</description>
			<content:encoded><![CDATA[<div>Bonjour,<br />
<br />
Je viens de publier Time-Compute, une bibliothèque Rust de calcul de dates/heures dont l'API reprend celle de chrono à l'identique -- mêmes types, mêmes noms de méthodes, même comportement -- mais dont le code n'a strictement aucun lien avec celui de chrono. <br />
<br />
Aucune ligne copiée, aucun algorithme adapté  La ressemblance d'API n'existe que pour une seule raison : permettre à un projet déjà construit sur chrono de migrer en changeant use chrono::... en use time_compute::..., sans rien réécrire d'autre.<br />
<br />
Pourquoi refaire ce que chrono fait déjà :<br />
<br />
Le point de départ, c'est une observation simple : contrairement à la plupart des domaines logiciels, le calcul calendaire est un problème mathématiquement réglé.  Une fois qu'une fonction est vérifiée correcte (contre une table de fêtes publiée, une référence astronomique, une implémentation indépendante), elle le reste pour toujours. Ce qui bouge avec le temps, ce n'est jamais la logique du domaine, seulement l'écosystème autour (versions de Rust, dépendances). Ça change ce que &quot;maintenir&quot; ce genre de bibliothèque veut dire sur le long terme.<br />
<br />
Au-delà du cœur figé compatible chrono, time_compute embarque des calculs que chrono n'a pas du tout :<br />
Fêtes mobiles chrétiennes (Pâques occidentale et orthodoxe, Mardi gras, Ascension, Pentecôte...)<br />
Calendrier hébraïque complet (conversion bidirectionnelle, Pessah, Roch Hachana, Hanoucca, Pourim...)<br />
Calendrier hégirien tabulaire (Ramadan, Aïd al-Fitr, Aïd al-Adha)<br />
Système des ères japonaises, fêtes fixes et fêtes à calcul astronomique réel (équinoxes)<br />
Calendrier luni-solaire chinois (Nouvel An, fête des bateaux-dragons, fête de la mi-automne...)<br />
Calendrier bouddhiste thaï (Magha/Visakha/Asalha Bucha...)<br />
Matariki, le nouvel an m&#257;ori, jour férié officiel en Nouvelle-Zélande<br />
<br />
<br />
Comment c'est testé :<br />
Deux couches indépendantes : 492 tests unitaires vérifiés contre des sources externes (tables publiées, références astronomiques, implémentations indépendantes), et -- pendant le développement -- un harnais différentiel qui comparait littéralement les sorties de time_compute et de chrono, entrée par entrée, sur des dizaines de milliers de cas. <br />
<br />
<br />
Où regarder Time-Compute :<br />
Code : <a rel="nofollow" href="https://github.com/Fab2bprog/Time-Compute" target="_blank">https://github.com/Fab2bprog/Time-Compute</a><br />
crates.io : time_compute<br />
<br />
Toute la doc est fournis avec.</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f2138/general-developpement/programmation-systeme/rust/">Rust</category>
			<dc:creator>Fab2bprog</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2184638/general-developpement/programmation-systeme/rust/time-compute-librairie-compatible-l-api-chrono-fonctions-plus/</guid>
		</item>
		<item>
			<title>La version 1.97 de Rust intègre le mangling des symboles activé par défaut</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2184626&amp;goto=newpost</link>
			<pubDate>Mon, 13 Jul 2026 09:38:03 GMT</pubDate>
			<description>*La version 1.97 du langage...</description>
			<content:encoded><![CDATA[<div><b><font size="4">La version 1.97 du langage de programmation Rust est disponible et intègre le mangling des symboles activé par défaut ainsi qu'une prise en charge de Cargo permettant de désactiver les avertissements</font></b> <br />
<br />
<b>Rust 1.97 est désormais disponible, faisant progresser les objectifs du langage de programmation en matière de performances, de sécurité des types, de concurrence et de sécurité de la mémoire. L’un des principaux changements techniques réside dans l’adoption d’un schéma de mangling des symboles spécifique à Rust comme valeur par défaut sur la branche stable. À partir de cette version, les informations détaillées sur le chemin d’accès aux modules et aux crates sont conservées dans les noms manglés, et l’ancien schéma est désormais limité aux builds nightly. S'appuyant sur ces mises à jour, Cargo, le gestionnaire de paquets de Rust, permet désormais aux utilisateurs de contrôler la manière dont les avertissements sont gérés : les avertissements peuvent être masqués, affichés ou ignorés sans invalider le cache de compilation.</b> <br />
<br />
Rust est un langage de programmation polyvalent qui met l'accent sur les performances, la sécurité des types, la concurrence et la sécurité de la mémoire. Rust prend en charge plusieurs paradigmes de programmation. Il s'inspire de concepts issus de la programmation fonctionnelle, notamment l'immuabilité, les fonctions d'ordre supérieur, les types de données algébriques et la correspondance de motifs. Il prend également en charge la programmation orientée objet via des structures, des énumérations, des traits et des méthodes. Rust garantit la sécurité de la mémoire (c'est-à-dire que toutes les références pointent vers une mémoire valide) sans recourir à un ramasse-miettes classique ; à la place, les erreurs de sécurité de la mémoire et les conflits d'accès sont évités par le « vérificateur d'emprunt », qui suit la durée de vie des objets référencés lors de la compilation.<br />
<br />
Rust 1.97 est désormais disponible, faisant progresser les objectifs du langage de programmation en matière de performances, de sécurité des types, de concurrence et de sécurité de la mémoire. L’un des principaux changements techniques réside dans l’adoption d’un schéma de mangling des symboles spécifique à Rust comme valeur par défaut sur la branche stable. Auparavant, Rust utilisait une approche basée sur l’Itanium Application Binary Interface, qui nécessitait parfois un démangling personnalisé et pouvait masquer les instanciations de paramètres génériques derrière des hachages. À partir de cette version, les informations détaillées sur le chemin d’accès aux modules et aux crates sont conservées dans les noms manglés, et l’ancien schéma est désormais limité aux builds nightly.<br />
<br />
S'appuyant sur ces mises à jour, Cargo, le gestionnaire de paquets de Rust, permet désormais aux utilisateurs de contrôler la manière dont les avertissements sont gérés : les avertissements peuvent être masqués, affichés ou ignorés sans invalider le cache de compilation. Cela permet d’effectuer des modifications temporaires de configuration sans ralentir les cycles de développement. De plus, le compilateur rustc émettra par défaut les messages de l’éditeur de liens sous forme d’avertissements de lint, afin de remédier aux cas où une sortie supprimée pourrait masquer des problèmes. rustc continuera à filtrer les messages identifiés comme des faux positifs ou intentionnels.<br />
<br />
Enfin, Rust 1.97 stabilise plusieurs API et inclut des améliorations supplémentaires, faisant ainsi évoluer davantage les fonctionnalités du langage et les outils de développement. Cette annonce intervientt alors que Greg Kroah-Hartman, responsable de la maintenance du noyau stable de Linux, affirme que <a href="https://linux.developpez.com/actu/383621/-Rust-sauvera-Linux-de-l-IA-affirme-Greg-Kroah-Hartman-dans-le-cadre-d-une-critique-de-l-usage-de-l-intelligence-artificielle-pour-trouver-les-bogues-au-sein-du-code-du-noyau-ecrit-en-langage-C/" target="_blank">Rust peut aider Linux à faire face à un afflux de failles de sécurité détectées par l'IA</a> (notamment Dirty Frag, Copy Fail et Fragnesia) en prévenant les erreurs courantes en C liées à la gestion de la mémoire, au verrouillage, à la gestion des erreurs et aux données non fiables dès la phase de compilation, plutôt que lors de la révision par les mainteneurs. Sa sortie est de nature à donner un coup de neuf au débat sur la comparaison entre les langages Rust et C en matière de programmation système.<br />
<br />
<div style="text-align: center;">
<div class="video-container"><iframe class="restrain" title="YouTube video player" width="560" height="315" allowfullscreen src="//www.youtube.com/embed/xqS6App3q74?wmode=transparent&amp;fs=1" frameborder="0"></iframe></div>
</div><br />
Voici l'annonce de Rust 1.97 :<br />
<br />
<b><font size="3">Nouveautés de la version stable 1.97.0</font></b><br />
<br />
<b>Le mangling des symboles v0 est activé par défaut</b><br />
<br />
Lorsque Rust est compilé en fichiers objets et en binaires, chaque élément (fonctions, variables statiques, etc.) doit disposer d’un « symbole » unique au niveau global qui l’identifie. Afin d’éviter les conflits lors de la liaison de différents programmes Rust, Rust modifie le nom d’origine des éléments pour y inclure des informations contextuelles supplémentaires, telles que le chemin d’accès au module, le crate de définition, les génériques, etc. Historiquement, ce mangling était basé sur l’ABI Itanium, également (parfois) utilisée par le C++.<br />
<br />
Le nouveau schéma de mangling résout un certain nombre d’inconvénients du précédent :<br />
<br />
- Les instanciations de paramètres génériques conservent leurs valeurs, au lieu d’être uniquement identifiées par un hachage<br />
- Incohérences : toutes les parties n’utilisaient pas l’ABI Itanium, ce qui rendait encore nécessaire un démangling personnalisé<br />
<br />
Depuis Rust 1.59, le compilateur permet d’opter pour un schéma de mangling spécifique à Rust via l’option <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">-Csymbol-mangling-version=v0</span>. Depuis novembre 2025, ce schéma est activé par défaut sur la version nightly, et la version 1.97 l’active désormais sur la version stable de Rust. L’ancien schéma de mangling ne peut être activé que sur la version nightly, et il est actuellement prévu de le supprimer complètement.<br />
<br />
<b>Prise en charge par Cargo de la suppression des avertissements</b><br />
<br />
Il est courant de supprimer les avertissements en CI. Historiquement, cela se faisait généralement via <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">RUSTFLAGS=-Dwarnings</span>. Avec Rust 1.97, Cargo contrôle la manière dont les avertissements interagissent avec la réussite de la compilation : soit en les masquant (via le niveau <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">allow</span> ), soit en les affichant sans entraîner d’échec (par défaut, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">warn</span>), soit en les supprimant (via <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">deny</span>).<br />
<br />
Comme c’est la configuration de Cargo qui détermine ce comportement, l’utilisation de cette fonctionnalité n’invalide pas le cache de compilation sous-jacent, ce qui signifie qu’il est facile de l’activer temporairement. Par exemple, si les avertissements génèrent un bruit indésirable pendant que vous corrigez des erreurs après une refactorisation, vous pouvez exécuter <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">CARGO_BUILD_WARNINGS=allow cargo check</span> pour les désactiver temporairement.<br />
<br />
En CI, les tâches peuvent plutôt définir <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">CARGO_BUILD_WARNINGS=deny</span> pour ignorer les avertissements. Cela peut être combiné avec l’option <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">--keep-going</span> pour collecter toutes les erreurs et tous les avertissements plutôt que de s’arrêter dès le premier paquet en échec.<br />
<br />
<b>La sortie de l'éditeur de liens n'est plus masquée par défaut</b><br />
<br />
rustc lance un éditeur de liens pour le compte des utilisateurs. Auparavant, rustc masquait par défaut la sortie de l'éditeur de liens si la liaison aboutissait. Cela pouvant toutefois masquer de réels problèmes, nous activons par défaut les messages de l'éditeur de liens dans Rust 1.97. Ceux-ci sont émis sous forme d'avertissement de lint, par exemple :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0">warning: linker stderr: ignoring deprecated linker optimization setting <span style="color: #FF0000;">'1'</span>
  |
  = note: `<span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>warn<span class="br0">&#40;</span>linker_messages<span class="br0">&#41;</span><span class="br0">&#93;</span></span>` on by default</pre></td></tr></table></code><hr />
</div><br />
<br />
Les messages courants de l’éditeur de liens qui ont été identifiés comme des faux positifs ou un comportement intentionnel sont filtrés par rustc. Plusieurs bogues ont déjà été corrigés grâce au fait que cette sortie n’est plus masquée dans les versions nightly.<br />
<br />
Notez qu’actuellement, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">linker_messages</span> est un lint spécial qui n’est pas affecté par le groupe de lints <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">warnings</span>. Ceci est intentionnel, car rustc ne contrôle généralement pas la sortie de l’éditeur de liens de manière aussi précise, et il n’est pas rare que la sortie n’apparaisse que sur certaines plateformes. Si vous constatez ce que vous pensez être un faux positif provenant de l’éditeur de liens, veuillez ouvrir un ticket.<br />
<br />
Pour désactiver l’avertissement en attendant, vous pouvez configurer le niveau de lint sur allow. Cela peut être fait via <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Cargo.toml</span> en ajoutant une section lints comme celle-ci :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0"><span class="br0">&#91;</span>lints.rust<span class="br0">&#93;</span>
linker_messages = <span style="color: #FF0000;">&quot;allow&quot;</span></pre></td></tr></table></code><hr />
</div><br />
<br />
<b>Source</b> : <a rel="nofollow" href="https://blog.rust-lang.org/2026/07/09/Rust-1.97.0/" target="_blank">Annonce Rust 1.97</a><br />
<br />
<b>Et vous ?</b><br />
<br />
:fleche: Pensez-vous que cette version est crédible ou pertinente ?<br />
:fleche: Quel est votre avis sur le sujet ?<br />
<br />
<b>Voir aussi :</b><br />
<br />
:fleche: <a href="https://rust.developpez.com/actu/383709/La-version-1-96-0-du-langage-de-programmation-Rust-est-disponible-apportant-de-nouveaux-types-Range-etoile-de-nouvelles-macros-stabilisees-et-des-corrections-de-vulnerabilites-dans-Cargo/" target="_blank">La version 1.96.0 du langage de programmation Rust est disponible, apportant de nouveaux types Range*, de nouvelles macros stabilisées et des corrections de vulnérabilités dans Cargo</a><br />
<br />
:fleche: <a href="https://rust.developpez.com/actu/382127/Rust-a-t-il-atteint-son-plafond-de-popularite-Le-langage-recule-de-trois-places-dans-l-index-TIOBE-d-avril-2026-son-PDG-evoque-une-courbe-d-apprentissage-difficile-pour-les-developpeurs-non-experts/" target="_blank">Rust a-t-il atteint son plafond de popularité ? Le langage recule de trois places dans l'index TIOBE d'avril 2026. Son PDG évoque une « courbe d'apprentissage difficile pour les développeurs non experts »</a><br />
<br />
:fleche: <a href="https://rust.developpez.com/actu/378426/C-est-desormais-officiel-Rust-dans-le-noyau-Linux-sort-du-cadre-experimental-le-Rust-vient-de-faire-l-objet-d-integration-comme-partie-essentielle-du-kernel-aux-cotes-du-toujours-present-langage-C/" target="_blank">C'est désormais officiel : Rust dans le noyau Linux sort du cadre expérimental. Le Rust vient de faire l'objet d'intégration comme partie essentielle du kernel aux côtés du toujours présent langage C</a></div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f2138/general-developpement/programmation-systeme/rust/">Rust</category>
			<dc:creator>Alex</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2184626/general-developpement/programmation-systeme/rust/version-1-97-rust-integre-mangling-symboles-active-defaut/</guid>
		</item>
		<item>
			<title><![CDATA[Mon nouveau projet : Jeux d'echecs en Rust]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2184611&amp;goto=newpost</link>
			<pubDate>Sat, 11 Jul 2026 21:13:09 GMT</pubDate>
			<description>Bonjour, 
 
Pour tous les...</description>
			<content:encoded><![CDATA[<div>Bonjour,<br />
<br />
Pour tous les gens intéressés voici mes nouveaux projets ( Rust avec Slint ) :<br />
Vendetta-Chess-GUI : Une interface utilisateur pour jeux d’échecs compatible norme UCI (Compatible StockFish etc...).<br />
<a rel="nofollow" href="https://github.com/Fab2bprog/Rust-Vendetta-Chess-GUI" target="_blank">https://github.com/Fab2bprog/Rust-Vendetta-Chess-GUI</a><br />
<br />
Et j'ai développé aussi un moteur de Jeux d’échec à la norme UCI : Vendetta-Chess-Motor :<br />
<a rel="nofollow" href="https://github.com/Fab2bprog/Rust-Vendetta-Chess-Motor" target="_blank">https://github.com/Fab2bprog/Rust-Vendetta-Chess-Motor</a><br />
<br />
Tous cela en CoWorking avec Claude AI.<br />
<br />
Je vous invite donc sur les pages de mes projets sur Github.<br />
Amusez vous bien.<br />
<br />
Cordialement.</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f2138/general-developpement/programmation-systeme/rust/">Rust</category>
			<dc:creator>Fab2bprog</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2184611/general-developpement/programmation-systeme/rust/nouveau-projet-jeux-d-echecs-rust/</guid>
		</item>
		<item>
			<title>Rust 1.96.0 : nouveaux types de plage, macros stabilisées et corrections de vulnérabilités dans Cargo</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2183993&amp;goto=newpost</link>
			<pubDate>Mon, 01 Jun 2026 10:49:03 GMT</pubDate>
			<description>*La version 1.96.0 du langage...</description>
			<content:encoded><![CDATA[<div><b><font size="4">La version 1.96.0 du langage de programmation Rust est disponible, apportant de nouveaux types Range*, de nouvelles macros stabilisées et des corrections de vulnérabilités dans Cargo</font></b><br />
<br />
<b>La version 1.96.0 du langage Rust introduit de nouveaux types core::range compatibles avec Copy, permettant d'utiliser des plages dans les structs Copy et d'exposer des champs publics dans RangeInclusive.  Cette version stabilise également les macros assert_matches! et debug_assert_matches!, qui améliorent les diagnostics de correspondance de motifs, bien qu'elles nécessitent une importation manuelle.</b><br />
<br />
Rust est un langage de programmation polyvalent qui met l'accent sur les performances, la sécurité des types, la concurrence et la sécurité de la mémoire. Rust prend en charge plusieurs paradigmes de programmation. Il s'inspire de concepts issus de la programmation fonctionnelle, notamment l'immuabilité, les fonctions d'ordre supérieur, les types de données algébriques et la correspondance de motifs. Il prend également en charge la programmation orientée objet via des structures, des énumérations, des traits et des méthodes. Rust garantit la sécurité de la mémoire (c'est-à-dire que toutes les références pointent vers une mémoire valide) sans recourir à un ramasse-miettes classique ; à la place, les erreurs de sécurité de la mémoire et les conflits d'accès sont évités par le « vérificateur d'emprunt », qui suit la durée de vie des objets référencés lors de la compilation.<br />
<br />
La version 1.96.0 du langage Rust introduit de nouveaux types core::range compatibles avec Copy, permettant d'utiliser des plages dans les structs Copy et d'exposer des champs publics dans RangeInclusive.  Cette version stabilise également les macros assert_matches! et debug_assert_matches!, qui améliorent les diagnostics de correspondance de motifs, bien qu'elles nécessitent une importation manuelle. Les cibles WebAssembly traitent désormais les symboles de l'éditeur de liens non définis comme des erreurs par défaut. Deux vulnérabilités de Cargo affectant les registres tiers sont également corrigées.<br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p676643d1780313336/general-developpement/programmation-systeme/rust/rust-1-96-0-nouveaux-types-plage-macros-stabilisees-corrections-vulnerabilites-cargo/1.jpg/" border="0" alt="Nom : 1.jpg
Affichages : 509
Taille : 18,4 Ko"  style="float: CONFIG" /></div><br />
Voici les nouveautés de la version stable 1.96.0 :<br />
<br />
<b>Nouveaux types <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Range*</span>.</b><br />
<br />
De nombreux utilisateurs s'attendent à ce que <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Range</span> et les types <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">core::ops</span> associés soient de type <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Copy</span>, mais ce n'est pas le cas : ils implémentent directement <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Iterator</span>, et il serait risqué d'implémenter à la fois <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Iterator</span> et <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Copy</span> sur le même type, ce qui a donc été évité. La RFC3550 proposait un ensemble de types Range de remplacement qui implémentent <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">IntoIterator</span> plutôt qu'<span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Iterator</span>, ce qui signifie qu'ils peuvent également être de type <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Copy</span>. La partie de cette RFC concernant la bibliothèque standard est désormais stable, introduisant :<br />
<br />
- <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">core::range::Range</span>,<br />
- <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">core::range::RangeFrom</span>,<br />
- <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">core::range::RangeInclusive</span>.<br />
- Itérateurs associés<br />
<br />
Une version de Rust à venir ajoutera également <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">core::range::RangeFull</span> et <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">core::range::RangeTo</span> en tant que réexportations depuis <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">core::ops</span> (ces derniers n'implémentent pas <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Iterator</span> et implémentent déjà <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Copy</span>), ainsi que <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">core::range::legacy::*</span> en tant que nouvel emplacement pour les plages actuelles. La syntaxe de plage telle que <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #cc66cc;">0</span>..<span style="color: #cc66cc;">1</span></span> produit encore les types hérités pour l'instant, mais sera mise à jour vers les types <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">core::range</span> dans une future édition.<br />
<br />
Grâce à ces stabilisations, il est désormais possible de stocker des accesseurs de tranche dans des types <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Copy</span> sans séparer <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">start</span> et <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">end</span> :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">use</span> core::range::Range;
&nbsp;
<span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>derive<span class="br0">&#40;</span>Clone, Copy<span class="br0">&#41;</span><span class="br0">&#93;</span></span>
<span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">struct</span> Span<span class="br0">&#40;</span>Range&lt;usize&gt;<span class="br0">&#41;</span>;
&nbsp;
<span style="color: #0000ff;">impl</span> Span <span class="br0">&#123;</span>
    <span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">fn</span> of<span class="br0">&#40;</span><span style="color: #FF0000;">self</span>, s: &amp;str<span class="br0">&#41;</span> -&gt; &amp;str <span class="br0">&#123;</span>
        &amp;s<span class="br0">&#91;</span><span style="color: #FF0000;">self</span><span style="color: #cc66cc;">.0</span><span class="br0">&#93;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></td></tr></table></code><hr />
</div><br />
<br />
Le nouveau <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">RangeInclusive</span> rend également ses champs publics, contrairement à l'ancienne version qui évitait d'exposer l'état d'itérateur épuisé. Cela ne pose pas de problème avec le nouveau type, car celui-ci doit être converti pour pouvoir commencer l'itération.<br />
<br />
Les auteurs de bibliothèques devraient envisager d'utiliser <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">impl</span> RangeBounds</span> dans leur API publique, qui accepte à la fois les anciens types de plage et les nouveaux. Si un type concret est nécessaire, privilégiez l'utilisation des nouvelles plages, car celles-ci finiront par devenir la norme.<br />
<br />
<b>Assertions de correspondance de motifs</b><br />
<br />
Les nouvelles macros <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0080ff;">assert_matches!</span></span> et <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0080ff;">debug_assert_matches!</span></span> vérifient qu’une valeur correspond à un motif donné, et déclenchent une panique avec une représentation <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Debug</span> de la valeur dans le cas contraire. Elles sont essentiellement identiques à <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0080ff;">assert!</span><span class="br0">&#40;</span><span style="color: #0080ff;">matches!</span><span class="br0">&#40;</span>..<span class="br0">&#41;</span><span class="br0">&#41;</span></span> et <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0080ff;">debug_assert!</span><span class="br0">&#40;</span><span style="color: #0080ff;">matches!</span><span class="br0">&#40;</span>..<span class="br0">&#41;</span><span class="br0">&#41;</span></span>, mais la valeur affichée améliore les chances de diagnostiquer l’échec.<br />
<br />
Ces nouvelles macros n’ont pas été ajoutées au prélude standard, car elles entreraient en conflit avec des crates tierces populaires fournissant des macros du même nom. Elles doivent donc être importées manuellement depuis <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">core</span> ou <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">std</span> avant utilisation.<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">use</span> core::assert_matches;
&nbsp;
<span style="color: #808080; font-weight: bold;">/// [Random Number](https://xkcd.com/221/)</span>
<span style="color: #0000ff;">fn</span> get_random_number<span class="br0">&#40;</span><span class="br0">&#41;</span> -&gt; u32 <span class="br0">&#123;</span>
    <span style="color: #808080;">// chosen by a fair dice roll.</span>
    <span style="color: #808080;">// guaranteed to be random.</span>
    <span style="color: #cc66cc;">4</span>
<span class="br0">&#125;</span>
&nbsp;
<span style="color: #0000ff;">fn</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span style="color: #0080ff;">assert_matches!</span><span class="br0">&#40;</span>get_random_number<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span style="color: #cc66cc;">1</span>..=<span style="color: #cc66cc;">6</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span></pre></td></tr></table></code><hr />
</div><br />
<br />
<b>Modifications apportées aux cibles WebAssembly</b><br />
<br />
Les cibles WebAssembly ne transmettent plus l'option <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">--allow-undefined</span> à l'éditeur de liens, ce qui signifie que les symboles non définis lors de la liaison génèrent désormais une erreur d'éditeur de liens au lieu d'être convertis en importations WebAssembly à partir du module <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #FF0000;">&quot;env&quot;</span></span>. Cette modification empêche la liaison des modules tant que tous les symboles liés à la liaison ne sont pas définis, afin de détecter les bogues plus tôt et d'éviter les problèmes accidentels liés à la dénomination des symboles ou autres.<br />
<br />
Les symboles liés à la liaison non définis sont souvent le signe de bogues liés à la compilation ou d’une mauvaise configuration. Si, toutefois, l’ancien comportement est souhaité, il peut être réactivé avec <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">RUSTFLAGS=-Clink-arg=--allow-undefined</span> ou en modifiant le code source et en utilisant <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>link<span class="br0">&#40;</span>wasm_import_module = &laquo; env &raquo;<span class="br0">&#41;</span><span class="br0">&#93;</span></span></span> sur le bloc définissant le symbole.<br />
<br />
Ce changement avait été annoncé précédemment et prend désormais effet dans Rust 1.96.<br />
<br />
<b>Deux avis de sécurité concernant Cargo</b><br />
<br />
Rust 1.96 contient des correctifs pour deux vulnérabilités affectant les utilisateurs de registres tiers.<br />
<br />
- CVE-2026-5223 est une vulnérabilité de gravité moyenne concernant l'extraction d'archives de crates contenant des liens symboliques.<br />
- CVE-2026-5222 est une vulnérabilité de gravité faible concernant l'authentification avec des URL normalisées.<br />
<br />
Les utilisateurs de crates.io ne sont affectés par aucune de ces vulnérabilités.<br />
<br />
<b>Source</b> : <a rel="nofollow" href="https://blog.rust-lang.org/2026/05/28/Rust-1.96.0/" target="_blank">Annonce de Rust 1.96.0</a><br />
<br />
<b>Et vous ?</b><br />
<br />
:fleche: Pensez-vous que cette version est crédible ou pertinente ?<br />
:fleche: Quel est votre avis sur le sujet ?<br />
<br />
<b>Voir aussi :</b><br />
<br />
:fleche: <a href="https://rust.developpez.com/actu/382127/Rust-a-t-il-atteint-son-plafond-de-popularite-Le-langage-recule-de-trois-places-dans-l-index-TIOBE-d-avril-2026-son-PDG-evoque-une-courbe-d-apprentissage-difficile-pour-les-developpeurs-non-experts/" target="_blank">Rust a-t-il atteint son plafond de popularité ? Le langage recule de trois places dans l'index TIOBE d'avril 2026. Son PDG évoque une « courbe d'apprentissage difficile pour les développeurs non experts »</a><br />
<br />
:fleche: <a href="https://microsoft.developpez.com/actu/378682/Submerge-par-les-bugs-dans-ses-applications-la-solution-de-Microsoft-c-est-de-supprimer-tout-le-code-C-et-Cplusplus-de-ses-referentiels-d-ici-2030-pour-le-remplacer-par-Rust/" target="_blank">Submergé par les bugs dans ses applications, la solution de Microsoft c'est de supprimer tout le code C et C++ de ses référentiels d'ici 2030, pour le remplacer par Rust</a><br />
<br />
:fleche: <a href="https://linux.developpez.com/actu/383621/-Rust-sauvera-Linux-de-l-IA-affirme-Greg-Kroah-Hartman-dans-le-cadre-d-une-critique-de-l-usage-de-l-intelligence-artificielle-pour-trouver-les-bogues-au-sein-du-code-du-noyau-ecrit-en-langage-C/" target="_blank">« Rust sauvera Linux de l'IA », affirme Greg Kroah-Hartman dans le cadre d'une critique de l'usage de l'intelligence artificielle pour trouver les bogues au sein du code du noyau écrit en langage C</a></div>


	<div style="padding:10px">

	

	
		<fieldset class="fieldset">
			<legend>Images attachées</legend>
				<div style="padding:10px">
				<img class="attach" src="https://www.developpez.net/forums/attachments/p676643d1780313336/general-developpement/programmation-systeme/rust/rust-1-96-0-nouveaux-types-plage-macros-stabilisees-corrections-vulnerabilites-cargo/1.jpg/" alt="" />&nbsp;
			</div>
		</fieldset>
	

	

	

	</div>
]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f2138/general-developpement/programmation-systeme/rust/">Rust</category>
			<dc:creator>Jade Emy</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2183993/general-developpement/programmation-systeme/rust/rust-1-96-0-nouveaux-types-plage-macros-stabilisees-corrections-vulnerabilites-cargo/</guid>
		</item>
		<item>
			<title><![CDATA[Rust 1.94 introduit la nouvelle méthode array_windows, l'inclusion de configurations Cargo]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2182526&amp;goto=newpost</link>
			<pubDate>Mon, 09 Mar 2026 10:55:15 GMT</pubDate>
			<description>*Le langage de programmation...</description>
			<content:encoded><![CDATA[<div><b><font size="4">Le langage de programmation Rust 1.94 introduit la nouvelle méthode array_windows, l'inclusion de configurations Cargo et la prise en charge de TOML 1.1 dans Cargo</font></b> <br />
<br />
<b>Rust 1.94 est désormais disponible, poursuivant l'accent mis par le langage sur les performances, la sécurité des types, la concurrence et la sécurité de la mémoire. L'une des principales nouveautés est la nouvelle méthode array_windows pour les tranches. Outre les itérateurs, Cargo, le gestionnaire de paquets Rust, bénéficie d'une fonctionnalité de restructuration : les fichiers de configuration prennent désormais en charge la clé include. De plus, Cargo analyse désormais la version 1.1 de TOML dans les manifestes et les fichiers de configuration, ce qui permet d'utiliser les nouvelles fonctionnalités syntaxiques de TOML et d'améliorer la compatibilité avec les outils.</b><br />
<br />
Rust est un langage de programmation compilé multi-paradigme qui met l'accent sur la performance, la sûreté des types et la concurrence. Il assure la sécurité mémoire, ce qui signifie que toutes les références pointent vers une mémoire valide, sans nécessiter l'utilisation de techniques de gestion de la mémoire automatisée telles que le ramasse-miettes. Afin d'assurer la sécurité de la mémoire et d'empêcher une situation de compétition aux données, son « vérificateur d'emprunts » suit la durée de vie des objets de toutes les références dans un programme à la compilation.<br />
<br />
Rust 1.94 est désormais disponible, poursuivant l'accent mis par le langage sur les performances, la sécurité des types, la concurrence et la sécurité de la mémoire. L'une des principales nouveautés est la nouvelle méthode array_windows pour les tranches, qui offre un moyen d'itérer sur des fenêtres adjacentes de taille fixe, renvoyant des références à des tableaux de longueur constante. Cela permet un traitement plus sûr et plus performant des éléments de données groupés, particulièrement utile lorsque la longueur de la fenêtre peut être déduite au moment de la compilation.<br />
<br />
Outre les itérateurs, Cargo, le gestionnaire de paquets Rust, bénéficie d'une fonctionnalité de restructuration : les fichiers de configuration prennent désormais en charge la clé include. Cela permet une organisation et un partage plus clairs des détails de configuration, aidant les équipes à gérer les paramètres entre différents projets ou environnements. Il est à noter que les chemins de configuration inclus peuvent être marqués comme facultatifs, ce qui permet de s'adapter à différentes configurations entre développeurs ou scénarios de compilation. De plus, Cargo analyse désormais la version 1.1 de TOML dans les manifestes et les fichiers de configuration, ce qui permet d'utiliser les nouvelles fonctionnalités syntaxiques de TOML et d'améliorer la compatibilité avec les outils.<br />
<br />
À la suite de ces mises à jour essentielles, Rust 1.94 propose également plusieurs API stabilisées et corrige divers bogues. Ces changements visent collectivement à améliorer l'expérience quotidienne des développeurs et à prendre en charge l'évolution des bases de code.<br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p674844d1773055641/general-developpement/programmation-systeme/rust/rust-1-94-introduit-nouvelle-methode-array_windows-l-inclusion-configurations-cargo/1.jpg/" border="0" alt="Nom : 1.jpg
Affichages : 5634
Taille : 18,4 Ko"  style="float: CONFIG" /></div><br />
<b>Fenêtres de tableaux</b><br />
<br />
Rust 1.94 ajoute array_windows, une méthode d'itération pour les tranches. Elle fonctionne comme windows, mais avec une longueur constante, de sorte que les éléments de l'itérateur sont &amp;[T; N] plutôt que &amp;[T] de taille dynamique. Dans de nombreux cas, la longueur de la fenêtre peut même être déduite de la façon dont l'itérateur est utilisé !<br />
<br />
Par exemple, une partie d'une énigme de l'Advent of Code 2016 consiste à rechercher des motifs ABBA : « deux caractères différents suivis de l'inverse de cette paire, comme xyyx ou abba ». <br />
<br />
<br />
Le modèle d'argument de déstructuration dans cette fermeture permet au compilateur de déduire que nous voulons ici des fenêtres de 4. Si nous avions utilisé l'ancien itérateur .windows(4), cet argument serait alors une tranche que nous devrions indexer manuellement, en espérant que la vérification des limites d'exécution soit optimisée.<br />
<br />
<b>Inclusion de la configuration Cargo</b><br />
<br />
Cargo prend désormais en charge la clé include dans les fichiers de configuration (.cargo/config.toml), ce qui permet une meilleure organisation, un meilleur partage et une meilleure gestion des configurations Cargo entre les projets et les environnements. Ces chemins d'inclusion peuvent également être marqués optional s'ils ne sont pas présents dans certaines circonstances, par exemple en fonction des choix des développeurs locaux.<br />
<br />
<b>Prise en charge de TOML 1.1 dans Cargo</b><br />
<br />
Cargo analyse désormais TOML v1.1 pour les manifestes et les fichiers de configuration. Consultez les notes de mise à jour TOML pour connaître les modifications détaillées, notamment :<br />
<br />
- Tableaux en ligne sur plusieurs lignes et avec des virgules de fin<br />
- Caractères d'échappement de chaîne \xHH et \e<br />
- Secondes facultatives dans les heures (définies sur 0)<br />
<br />
Notez que l'utilisation de ces fonctionnalités dans Cargo.toml augmentera votre MSRV (version minimale de Rust prise en charge) de développement pour nécessiter ce nouveau parseur Cargo, et les outils tiers qui lisent le manifeste devront peut-être également mettre à jour leurs parseurs. Cependant, Cargo réécrit automatiquement les manifestes lors de la publication afin de rester compatible avec les anciens parseurs. Il est donc toujours possible de prendre en charge une MSRV antérieure pour les utilisateurs de votre crate.<br />
<br />
<b>Source</b> : <a rel="nofollow" href="https://blog.rust-lang.org/2026/03/05/Rust-1.94.0/" target="_blank">Annonce Rust 1.94</a><br />
<br />
<b>Et vous ?</b><br />
<br />
:fleche: Pensez-vous que cette annonce est crédible ou pertinente ?<br />
:fleche: Quel est votre avis sur le sujet ?<br />
<br />
<b>Voir aussi :</b><br />
<br />
:fleche: <a href="https://rust.developpez.com/actu/379545/La-version-1-93-du-langage-de-programmation-Rust-est-disponible-introduisant-musl-1-2-5-des-ameliorations-de-l-allocateur-et-des-attributs-cfg-sur-les-lignes-asm/" target="_blank">La version 1.93 du langage de programmation Rust est disponible, introduisant musl 1.2.5, des améliorations de l'allocateur et des attributs cfg sur les lignes asm!</a><br />
<br />
:fleche: <a href="https://microsoft.developpez.com/actu/378682/Submerge-par-les-bugs-dans-ses-applications-la-solution-de-Microsoft-c-est-de-supprimer-tout-le-code-C-et-Cplusplus-de-ses-referentiels-d-ici-2030-pour-le-remplacer-par-Rust/" target="_blank">Submergé par les bugs dans ses applications, la solution de Microsoft c'est de supprimer tout le code C et C++ de ses référentiels d'ici 2030, pour le remplacer par Rust</a><br />
<br />
:fleche: <a href="https://intelligence-artificielle.developpez.com/actu/380556/L-IA-abaisse-les-barrieres-mais-amplifie-les-mauvais-patterns-les-donnees-Octoverse-de-GitHub-revelent-la-mecanique-silencieuse-qui-redistribue-les-parts-de-marche-entre-langages-de-programmation/" target="_blank">L'IA abaisse les barrières mais amplifie les mauvais patterns : les données Octoverse de GitHub révèlent la mécanique silencieuse qui redistribue les parts de marché entre langages de programmation</a></div>


	<div style="padding:10px">

	

	
		<fieldset class="fieldset">
			<legend>Images attachées</legend>
				<div style="padding:10px">
				<img class="attach" src="https://www.developpez.net/forums/attachments/p674844d1773055641/general-developpement/programmation-systeme/rust/rust-1-94-introduit-nouvelle-methode-array_windows-l-inclusion-configurations-cargo/1.jpg/" alt="" />&nbsp;
			</div>
		</fieldset>
	

	

	

	</div>
]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f2138/general-developpement/programmation-systeme/rust/">Rust</category>
			<dc:creator>Jade Emy</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2182526/general-developpement/programmation-systeme/rust/rust-1-94-introduit-nouvelle-methode-array_windows-l-inclusion-configurations-cargo/</guid>
		</item>
		<item>
			<title><![CDATA[Rust 1.93 apporte musl 1.2.5, des améliorations de l'allocateur et des attributs cfg sur les lignes asm!]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2181709&amp;goto=newpost</link>
			<pubDate>Sun, 25 Jan 2026 03:52:20 GMT</pubDate>
			<description>*La version 1.93 du langage...</description>
			<content:encoded><![CDATA[<div><b><font size="4">La version 1.93 du langage de programmation Rust est disponible, introduisant musl 1.2.5, des améliorations de l'allocateur et des attributs cfg sur les lignes asm!</font></b><br />
<br />
<b>Rust 1.93 est désormais disponible, avec des mises à jour qui concernent à la fois les développeurs et l'écosystème Rust au sens large. Dans cette version, toutes les cibles <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">*-linux-musl</span> sont livrées avec la version 1.2.5 de musl, qui remplace le bundle 1.2.3 précédent. Ce changement apporte diverses corrections de bogues et améliorations. Cependant, il introduit également un changement radical qui affecte les builds musl statiques pour les développeurs x86_64, AArch64 et POWER PPC64LE.</b><br />
<br />
Rust est un langage de programmation compilé multi-paradigme qui met l'accent sur la performance, la sûreté des types et la concurrence. Il assure la sécurité mémoire (en), ce qui signifie que toutes les références pointent vers une mémoire valide, sans nécessiter l'utilisation de techniques de gestion de la mémoire automatisée telles que le ramasse-miettes. Afin d'assurer la sécurité de la mémoire et d'empêcher une situation de compétition aux données, son « vérificateur d'emprunts » suit la durée de vie des objets de toutes les références dans un programme à la compilation.<br />
<br />
Rust 1.93 est désormais disponible, avec des mises à jour qui concernent à la fois les développeurs et l'écosystème Rust au sens large. Dans cette version, toutes les cibles <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">*-linux-musl</span> sont livrées avec la version 1.2.5 de musl, qui remplace le bundle 1.2.3 précédent. Ce changement apporte diverses corrections de bogues et améliorations. Cependant, il introduit également un changement radical qui affecte les builds musl statiques pour les développeurs x86_64, AArch64 et POWER PPC64LE.<br />
<br />
Outre les mises à jour de la plateforme, la bibliothèque standard Rust a subi des changements internes. Les allocateurs globaux écrits en Rust peuvent désormais utiliser en toute sécurité la macro de stockage local au thread et l'inspection des threads sans problèmes de réentrance. Cela est rendu possible en s'appuyant sur l'allocateur système pour les opérations associées.<br />
<br />
S'appuyant sur la facilité d'utilisation du langage, Rust 1.93 permet la compilation conditionnelle (<span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">cfg</span>) pour des instructions individuelles dans des blocs d'assemblage en ligne. Auparavant, pour obtenir un contrôle fin, il fallait dupliquer des blocs <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0080ff;">asm!</span></span> entiers. Désormais, les développeurs peuvent inclure des instructions de manière conditionnelle, ce qui améliore la clarté et la maintenabilité du code.<br />
<br />
À la suite de ces changements apportés au langage et à la plate-forme, Rust 1.93 stabilise également plusieurs nouvelles API dans la bibliothèque standard, offrant des fonctionnalités supplémentaires aux auteurs de crates et aux utilisateurs finaux.<br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p673578d1769314839/general-developpement/programmation-systeme/rust/rust-1-93-apporte-musl-1-2-5-ameliorations-l-allocateur-attributs-cfg-lignes-asm/1.jpg/" border="0" alt="Nom : 1.jpg
Affichages : 4988
Taille : 18,4 Ko"  style="float: CONFIG" /></div><br />
<b>Mise à jour de musl intégré vers la version 1.2.5</b><br />
<br />
Les différentes cibles <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">*-linux-musl</span> sont désormais toutes livrées avec musl 1.2.5. Cela affecte principalement les builds musl statiques pour <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">x86_64</span>, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">aarch64</span> et <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">powerpc64le</span> qui incluaient musl 1.2.3. Cette mise à jour comprend plusieurs corrections et améliorations, ainsi qu'un changement majeur qui affecte l'écosystème Rust.<br />
<br />
Pour l'écosystème Rust, la principale motivation de cette mise à jour est d'apporter des améliorations majeures au résolveur DNS de <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">musl</span>, livré dans la version 1.2.4 et corrigé dans la version 1.2.5. Lors de l'utilisation de cibles musl pour la liaison statique, cela devrait rendre les binaires Linux portables qui effectuent des opérations réseau plus fiables, en particulier face à des enregistrements DNS volumineux et des serveurs de noms récursifs.<br />
<br />
Cependant, la version 1.2.4 s'accompagne également d'un changement radical : la suppression de plusieurs symboles de compatibilité hérités que la crate libc Rust utilisait. Une correction a été apportée dans la version 0.2.146 de libc en juin 2023 (il y a 2,5 ans), et elle a été suffisamment largement diffusée pour apporter cette modification aux cibles Rust.<br />
<br />
<b>Autoriser l'allocateur global à utiliser le stockage local au thread</b><br />
<br />
Rust 1.93 ajuste les composants internes de la bibliothèque standard afin de permettre aux allocateurs globaux écrits en Rust d'utiliser std's <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0080ff;">thread_local!</span></span> et <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">std::thread::current</span> sans problème de réentrance, en utilisant à la place l'allocateur système.<br />
<br />
<b>Attributs <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">cfg</span> sur les lignes <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0080ff;">asm!</span></span></b><br />
<br />
Auparavant, si certaines parties d'une section d'assemblage en ligne devaient être <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">cfg</span>, le bloc <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0080ff;">asm!</span></span> complet devait être répété avec et sans cette section. Dans la version 1.93, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">cfg</span> peut désormais être appliqué à des instructions individuelles dans le bloc <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0080ff;">asm!</span></span><div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0080ff;">asm!</span><span class="br0">&#40;</span> <span style="color: #808080;">// or global_asm! or naked_asm!</span>
    <span style="color: #FF0000;">&quot;nop&quot;</span>,
    <span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>cfg<span class="br0">&#40;</span>target_feature = <span style="color: #FF0000;">&quot;sse2&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span></span>
    <span style="color: #FF0000;">&quot;nop&quot;</span>,
    <span style="color: #808080;">// ...</span>
    <span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>cfg<span class="br0">&#40;</span>target_feature = <span style="color: #FF0000;">&quot;sse2&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span></span>
    a = <span style="color: #0000ff;">const</span> <span style="color: #cc66cc;">123</span>, <span style="color: #808080;">// only used on sse2</span>
<span class="br0">&#41;</span>;</pre></td></tr></table></code><hr />
</div><br />
<br />
<b>Source</b> : <a rel="nofollow" href="https://blog.rust-lang.org/2026/01/22/Rust-1.93.0/" target="_blank">Announcing Rust 1.93.0</a><br />
<br />
<b>Et vous ?</b><br />
<br />
:fleche: Pensez-vous que cette annonce est crédible ou pertinente ?<br />
:fleche: Quel est votre avis sur le sujet ? <br />
<br />
<b>Voir aussi :</b><br />
<br />
:fleche: <a href="https://rust.developpez.com/actu/378431/La-version-1-92-du-langage-de-programmation-Rust-est-disponible-introduisant-les-tables-de-deroulement-par-defaut-et-affinant-les-verifications-de-lints-et-d-attributs/" target="_blank">La version 1.92 du langage de programmation Rust est disponible, introduisant les tables de déroulement par défaut et affinant les vérifications de lints et d'attributs</a><br />
<br />
:fleche: <a href="https://rust.developpez.com/actu/378426/C-est-desormais-officiel-Rust-dans-le-noyau-Linux-sort-du-cadre-experimental-le-Rust-vient-de-faire-l-objet-d-integration-comme-partie-essentielle-du-kernel-aux-cotes-du-toujours-present-langage-C/" target="_blank">C'est désormais officiel : Rust dans le noyau Linux sort du cadre expérimental. Le Rust vient de faire l'objet d'intégration comme partie essentielle du kernel aux côtés du toujours présent langage C</a><br />
<br />
:fleche: <a href="https://rust.developpez.com/actu/377563/La-fondation-Rust-annonce-la-creation-d-un-fonds-pour-les-mainteneurs-afin-d-assurer-la-continuite-et-de-soutenir-les-roles-a-long-terme-des-developpeurs-qui-rendent-possible-le-langage-de-programmation-Rust/" target="_blank">La fondation Rust annonce la création d'un fonds pour les mainteneurs afin d'assurer la continuité et de soutenir les rôles à long terme des développeurs qui rendent possible le langage de programmation Rust</a></div>


	<div style="padding:10px">

	

	
		<fieldset class="fieldset">
			<legend>Images attachées</legend>
				<div style="padding:10px">
				<img class="attach" src="https://www.developpez.net/forums/attachments/p673578d1769314839/general-developpement/programmation-systeme/rust/rust-1-93-apporte-musl-1-2-5-ameliorations-l-allocateur-attributs-cfg-lignes-asm/1.jpg/" alt="" />&nbsp;
			</div>
		</fieldset>
	

	

	

	</div>
]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f2138/general-developpement/programmation-systeme/rust/">Rust</category>
			<dc:creator>Alex</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2181709/general-developpement/programmation-systeme/rust/rust-1-93-apporte-musl-1-2-5-ameliorations-l-allocateur-attributs-cfg-lignes-asm/</guid>
		</item>
		<item>
			<title><![CDATA[Rust 1.92 active les tables de déroulement par défaut et affine les vérifications de lints et d'attributs]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2180956&amp;goto=newpost</link>
			<pubDate>Mon, 15 Dec 2025 06:43:11 GMT</pubDate>
			<description>*La version 1.92 du langage...</description>
			<content:encoded><![CDATA[<div><b><font size="4">La version 1.92 du langage de programmation Rust est disponible, introduisant les tables de déroulement par défaut et affinant les vérifications de lints et d'attributs</font></b><br />
<br />
<b>Rust 1.92 est la dernière version du langage de programmation polyvalent, qui introduit des changements importants pour les développeurs. Notamment, les tables de déroulement sont désormais émises par défaut même lorsque le drapeau <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">-Cpanic=abort</span> est activé, ce qui garantit le bon fonctionnement des traces de retour en arrière dans les scénarios de panique-abandon. Les utilisateurs qui ne souhaitent pas utiliser les tables de déroulement peuvent désormais les désactiver explicitement avec <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">-Cforce-unwind-tables=no</span>.</b><br />
<br />
Rust est un langage de programmation compilé multi-paradigme qui met l'accent sur la performance, la sûreté des types et la concurrence. Il assure la sécurité mémoire, ce qui signifie que toutes les références pointent vers une mémoire valide, sans nécessiter l'utilisation de techniques de gestion de la mémoire automatisée telles que le ramasse-miettes. Afin d'assurer la sécurité de la mémoire et d'empêcher une situation de compétition aux données, son « vérificateur d'emprunts » suit la durée de vie des objets de toutes les références dans un programme à la compilation. Rust a été remarqué pour son adoption rapide, selon le Stack Overflow Survey 2025, c'est le langage le plus apprécié dans ce sondage. <br />
<br />
Rust 1.92 est la dernière version du langage de programmation polyvalent, qui introduit des changements importants pour les développeurs. Notamment, les tables de déroulement sont désormais émises par défaut même lorsque le drapeau <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">-Cpanic=abort</span> est activé, ce qui garantit le bon fonctionnement des traces de retour en arrière dans les scénarios de panique-abandon. Les utilisateurs qui ne souhaitent pas utiliser les tables de déroulement peuvent désormais les désactiver explicitement avec <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">-Cforce-unwind-tables=no</span>.<br />
<br />
Suite aux améliorations continues apportées au système de types, cette version poursuit les efforts de stabilisation du type never. Deux futurs lints de compatibilité, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">never_type_fallback_flowing_into_unsafe</span> et <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">dependency_on_unit_never_type_fallback</span>, sont désormais refusés par défaut, ce qui signifie que toute violation entraînera des erreurs de compilation plutôt que des avertissements ou une autorisation silencieuse.<br />
<br />
En ce qui concerne les lints, le lint <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">unused_must_use</span> n'émet plus d'avertissement lorsque les fonctions renvoient un <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0080ff;">Result</span></span> ou un <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">ControlFlow</span>, tel que <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0080ff;">Result</span></span>. Cela reflète le fait que ces types d'erreurs ne peuvent pas réellement se produire, ce qui réduit les vérifications inutiles pendant le développement.<br />
<br />
Ces mises à jour fondamentales s'accompagnent de modifications importantes dans la gestion des attributs intégrés à Rust. Le compilateur traite désormais les attributs de manière plus stricte et génère des diagnostics plus clairs et plus cohérents. Par exemple, les arguments <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">macro_export</span> incorrects dans les dépendances sont désormais considérés comme des lints refusés par défaut, ce qui rend ces problèmes plus visibles lors de la compilation.<br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p672552d1765786136/general-developpement/programmation-systeme/rust/rust-1-92-active-tables-deroulement-defaut-affine-verifications-lints-d-attributs/1.jpg/" border="0" alt="Nom : 1.jpg
Affichages : 21950
Taille : 18,4 Ko"  style="float: CONFIG" /></div><br />
Voici les principales mises à jour de la version 1.92.0 :<br />
<br />
<b>Lignes de code never type refusées par défaut</b><br />
<br />
Les équipes chargées du langage et du compilateur continuent de travailler à la stabilisation du type never. Dans cette version, les lignes de code <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">never_type_fallback_flowing_into_unsafe</span> et <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">dependency_on_unit_never_type_fallback</span>, compatibles avec les versions futures, ont été refusées par défaut, ce qui signifie qu'elles provoqueront une erreur de compilation lorsqu'elles seront détectées.<br />
<br />
Il convient de noter que même si cela peut entraîner des erreurs de compilation, il s'agit toujours d'un lint ; ces lints peuvent tous être <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>allow<span class="br0">&#93;</span></span></span>. Ces lints ne se déclencheront également que lors de la compilation directe des crates concernées, et non lorsqu'elles sont compilées en tant que dépendances (bien qu'un avertissement soit signalé par Cargo dans de tels cas).<br />
<br />
Ces lints détectent le code susceptible d'être rompu par la stabilisation du type never. Il est fortement recommandé de les corriger s'ils sont signalés dans votre graphique de crate.<br />
<br />
Nous estimons qu'environ 500 crates sont concernées par ce lint. Malgré cela, nous pensons que cela est acceptable, car les lints ne constituent pas un changement radical et permettront de stabiliser le type never à l'avenir.<br />
<br />
<br />
<b><span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">unused_must_use</span> n'affiche plus d'avertissement concernant <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0080ff;">Result</span>&lt;<span class="br0">&#40;</span><span class="br0">&#41;</span>, UninhabitedType&gt;</span></b><br />
<br />
Le lint <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">unused_must_use</span> de Rust affiche un avertissement lorsque la valeur de retour d'une fonction est ignorée, si la fonction ou son type de retour est annoté avec <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>must_use<span class="br0">&#93;</span></span></span>. Par exemple, cela avertit si vous ignorez un type de retour de <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0080ff;">Result</span></span>, pour vous rappeler d'utiliser <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">?</span>, ou quelque chose comme <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">.expect<span class="br0">&#40;</span>&laquo; ... &raquo;<span class="br0">&#41;</span></span>.<br />
<br />
Cependant, certaines fonctions renvoient <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0080ff;">Result</span></span>, mais le type d'erreur qu'elles utilisent n'est en fait pas « habité », ce qui signifie que vous ne pouvez construire aucune valeur de ce type (par exemple, les types <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">!</span> ou <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Infallible</span>).<br />
<br />
Le lint <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">unused_must_use</span> n'affiche désormais plus d'avertissement sur <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0080ff;">Result</span>&lt;<span class="br0">&#40;</span><span class="br0">&#41;</span>, UninhabitedType&gt;</span> ou sur <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">ControlFlow&lt;UninhabitedType, <span class="br0">&#40;</span><span class="br0">&#41;</span>&gt;</span>. Par exemple, il n'affichera pas d'avertissement sur <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0080ff;">Result</span>&lt;<span class="br0">&#40;</span><span class="br0">&#41;</span>, Infallible&gt;</span>. Cela évite d'avoir à vérifier une erreur qui ne peut jamais se produire.<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span style="color: #0000ff;">use</span> core::convert::Infallible;
<span style="color: #0000ff;">fn</span> can_never_fail<span class="br0">&#40;</span><span class="br0">&#41;</span> -&gt; <span style="color: #0080ff;">Result</span>&lt;<span class="br0">&#40;</span><span class="br0">&#41;</span>, Infallible&gt; <span class="br0">&#123;</span>
    <span style="color: #808080;">// ...</span>
    <span style="color: #FF0000;">Ok</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
<span class="br0">&#125;</span>
&nbsp;
<span style="color: #0000ff;">fn</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    can_never_fail<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span></pre></td></tr></table></code><hr />
</div><br />
<br />
Ceci est particulièrement utile avec le modèle courant d'un trait associé à un type d'erreur, où le type d'erreur peut <i>parfois</i> être infaillible :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span style="color: #0000ff;">trait</span> UsesAssocErrorType <span class="br0">&#123;</span>
    <span style="color: #0000ff;">type</span> Error;
    <span style="color: #0000ff;">fn</span> method<span class="br0">&#40;</span>&amp;<span style="color: #FF0000;">self</span><span class="br0">&#41;</span> -&gt; <span style="color: #0080ff;">Result</span>&lt;<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span style="color: #0000ff;">Self</span>::Error&gt;;
<span class="br0">&#125;</span>
&nbsp;
<span style="color: #0000ff;">struct</span> CannotFail;
<span style="color: #0000ff;">impl</span> UsesAssocErrorType <span style="color: #0000ff;">for</span> CannotFail <span class="br0">&#123;</span>
    <span style="color: #0000ff;">type</span> Error = core::convert::Infallible;
    <span style="color: #0000ff;">fn</span> method<span class="br0">&#40;</span>&amp;<span style="color: #FF0000;">self</span><span class="br0">&#41;</span> -&gt; <span style="color: #0080ff;">Result</span>&lt;<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span style="color: #0000ff;">Self</span>::Error&gt; <span class="br0">&#123;</span>
        <span style="color: #FF0000;">Ok</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span>
&nbsp;
<span style="color: #0000ff;">struct</span> CanFail;
<span style="color: #0000ff;">impl</span> UsesAssocErrorType <span style="color: #0000ff;">for</span> CanFail <span class="br0">&#123;</span>
    <span style="color: #0000ff;">type</span> Error = std::io::Error;
    <span style="color: #0000ff;">fn</span> method<span class="br0">&#40;</span>&amp;<span style="color: #FF0000;">self</span><span class="br0">&#41;</span> -&gt; <span style="color: #0080ff;">Result</span>&lt;<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span style="color: #0000ff;">Self</span>::Error&gt; <span class="br0">&#123;</span>
        <span style="color: #FF0000;">Err</span><span class="br0">&#40;</span>std::io::Error::other<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;something went wrong&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span>
&nbsp;
<span style="color: #0000ff;">fn</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    CannotFail.method<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span style="color: #808080;">// No warning</span>
    CanFail.method<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span style="color: #808080;">// Warning: unused `Result` that must be used</span>
<span class="br0">&#125;</span></pre></td></tr></table></code><hr />
</div><br />
<br />
<b>Émettre des tables de déroulement même lorsque <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">-Cpanic=abort</span> est activé sous Linux</b><br />
<br />
Les backtraces avec <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">-Cpanic=abort</span> fonctionnaient auparavant dans Rust 1.22, mais ne fonctionnaient plus dans Rust 1.23, car nous avons cessé d'émettre des tables de déroulement avec <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">-Cpanic=abort</span>. Dans Rust 1.45, une solution de contournement sous la forme de <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">-Cforce-unwind-tables=yes</span> a été stabilisée.<br />
<br />
Dans Rust 1.92, les tables de déroulement seront émises par défaut même lorsque <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">-Cpanic=abort</span> est spécifié, ce qui permettra aux backtraces de fonctionner correctement. Si les tables de déroulement ne sont pas souhaitées, les utilisateurs doivent utiliser <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">-Cforce-unwind-tables=no</span> pour désactiver explicitement leur émission.<br />
<br />
<b>Valider l'entrée vers <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>macro_export<span class="br0">&#93;</span></span></span></b><br />
<br />
Au cours des dernières versions, de nombreux changements ont été apportés à la manière dont les attributs intégrés sont traités dans le compilateur. Cela devrait considérablement améliorer les messages d'erreur et les avertissements fournis par Rust pour les attributs intégrés et, surtout, rendre ces diagnostics plus cohérents parmi les plus de 100 attributs intégrés.<br />
<br />
Pour donner un petit exemple, dans cette version en particulier, Rust est devenu plus strict dans la vérification des arguments autorisés pour <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">macro_export</span> en mettant à niveau cette vérification vers un « lint par défaut refusé » qui sera signalé dans les dépendances.<br />
<br />
<b>Source</b> : <a rel="nofollow" href="https://blog.rust-lang.org/2025/12/11/Rust-1.92.0/mais" target="_blank">Annonce Rust 1.92</a><br />
<br />
<b>Et vous ?</b><br />
<br />
:fleche: Pensez-vous que cette mise à jour est crédible ou pertinente ?<br />
:fleche: Quel est votre avis sur le sujet ?<br />
<br />
<b>Voir aussi :</b><br />
<br />
:fleche: <a href="https://rust.developpez.com/actu/377331/La-version-1-91-du-langage-de-programmation-Rust-est-disponible-ajoutant-la-prise-en-charge-de-niveau-1-pour-la-plateforme-Windows-ARM64-les-avertissements-de-pointeurs-bruts-et-plus-encore/" target="_blank">La version 1.91 du langage de programmation Rust est disponible, ajoutant la prise en charge de niveau 1 pour la plateforme Windows ARM64, les avertissements de pointeurs bruts, et plus encore</a><br />
<br />
:fleche: <a href="https://rust.developpez.com/actu/377563/La-fondation-Rust-annonce-la-creation-d-un-fonds-pour-les-mainteneurs-afin-d-assurer-la-continuite-et-de-soutenir-les-roles-a-long-terme-des-developpeurs-qui-rendent-possible-le-langage-de-programmation-Rust/" target="_blank">La fondation Rust annonce la création d'un fonds pour les mainteneurs afin d'assurer la continuité et de soutenir les rôles à long terme des développeurs qui rendent possible le langage de programmation Rust</a><br />
<br />
:fleche: <a href="https://rust.developpez.com/actu/378426/C-est-desormais-officiel-Rust-dans-le-noyau-Linux-sort-du-cadre-experimental-le-Rust-vient-de-faire-l-objet-d-integration-comme-partie-essentielle-du-kernel-aux-cotes-du-toujours-present-langage-C/" target="_blank">C'est désormais officiel : Rust dans le noyau Linux sort du cadre expérimental. Le Rust vient de faire l'objet d'intégration comme partie essentielle du kernel aux côtés du toujours présent langage C</a></div>


	<div style="padding:10px">

	

	
		<fieldset class="fieldset">
			<legend>Images attachées</legend>
				<div style="padding:10px">
				<img class="attach" src="https://www.developpez.net/forums/attachments/p672552d1765786136/general-developpement/programmation-systeme/rust/rust-1-92-active-tables-deroulement-defaut-affine-verifications-lints-d-attributs/1.jpg/" alt="" />&nbsp;
			</div>
		</fieldset>
	

	

	

	</div>
]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f2138/general-developpement/programmation-systeme/rust/">Rust</category>
			<dc:creator>Alex</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2180956/general-developpement/programmation-systeme/rust/rust-1-92-active-tables-deroulement-defaut-affine-verifications-lints-d-attributs/</guid>
		</item>
		<item>
			<title><![CDATA[[Cargo] [Thread][shared database PooledConn] value used here after move]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2180700&amp;goto=newpost</link>
			<pubDate>Sat, 29 Nov 2025 16:25:22 GMT</pubDate>
			<description>Greetings !! 
 
Je suis en...</description>
			<content:encoded><![CDATA[<div>Greetings !!<br />
<br />
Je suis en train de m'arracher les dreadlocks...<br />
<br />
Voilà l'extrait du thread principal...<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span style="color: #0000ff;">let</span> connection = establish_connection<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">let</span> <span style="color: #0080ff;">mut</span> connection_handle = connection.unwrap<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">let</span> arc_connection = Arc::new<span class="br0">&#40;</span>Mutex::new<span class="br0">&#40;</span>&amp;<span style="color: #0080ff;">mut</span> connection_handle<span class="br0">&#41;</span><span class="br0">&#41;</span>;
&nbsp;
<span style="color: #0000ff;">let</span> threadscope = thread::scope
<span class="br0">&#40;</span>
	|thescope|
	<span class="br0">&#123;</span>
		<span style="color: #339933;">'connexion</span>: <span style="color: #0000ff;">loop</span>
		<span class="br0">&#123;</span>
			<span style="color: #0000ff;">for</span> stream <span style="color: #0000ff;">in</span> Listener.incoming<span class="br0">&#40;</span><span class="br0">&#41;</span>
			<span class="br0">&#123;</span>
				<span style="color: #0000ff;">match</span> stream
				<span class="br0">&#123;</span>
					<span style="color: #FF0000;">Ok</span><span class="br0">&#40;</span>saloperie<span class="br0">&#41;</span> =&gt;
						<span class="br0">&#123;</span>
							<span style="color: #0000ff;">let</span> arc_stream = Arc::new<span class="br0">&#40;</span>Mutex::new<span class="br0">&#40;</span>saloperie<span class="br0">&#41;</span><span class="br0">&#41;</span>;
							<span style="color: #0080ff;">println!</span><span class="br0">&#40;</span><span style="color: #FF0000;">&quot;[{:?}] Connection granted !!&quot;</span>, Local::now<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
							<span style="color: #0000ff;">let</span> rc = thescope.spawn<span class="br0">&#40;</span>|| client_handler<span class="br0">&#40;</span>arc_stream,&amp;arc_connection<span class="br0">&#41;</span><span class="br0">&#41;</span>;
							<span style="color: #0000ff;">let</span> value = rc.join<span class="br0">&#40;</span><span class="br0">&#41;</span>.unwrap<span class="br0">&#40;</span><span class="br0">&#41;</span>;
							<span style="color: #0000ff;">if</span> value.is_negative<span class="br0">&#40;</span><span class="br0">&#41;</span>
							<span class="br0">&#123;</span>
								<span style="color: #0000ff;">break</span> <span style="color: #339933;">'connexion</span>;
							<span class="br0">&#125;</span>
						<span class="br0">&#125;</span>
					<span style="color: #FF0000;">Err</span><span class="br0">&#40;</span>erreur<span class="br0">&#41;</span> =&gt;
						<span class="br0">&#123;</span>
							<span style="color: #0080ff;">eprintln!</span><span class="br0">&#40;</span><span style="color: #FF0000;">&quot;Error: <span style="color: #800000;">{}</span>&quot;</span>, erreur<span class="br0">&#41;</span>;
						<span class="br0">&#125;</span>
				<span class="br0">&#125;</span> <span style="color: #808080;">// end match</span>
				<span class="br0">&#125;</span> <span style="color: #808080;">// end for</span>
			sleep<span class="br0">&#40;</span>Duration::from_millis<span class="br0">&#40;</span><span style="color: #cc66cc;">80</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		<span class="br0">&#125;</span> <span style="color: #808080;">// end loop</span>
	<span class="br0">&#125;</span>
<span class="br0">&#41;</span>;</pre></td></tr></table></code><hr />
</div>J'ai déjà bien galéré pour que le compilateur ne bronche plus...<br />
Manifestement je ne maîtrise pas du tout cette boîte noire appelée &quot;borrowing&quot; et ça commence tout doucement à me ca**er les c...<br />
Je pourrais taper le handler en static mutable mais je me suis dit que je pourrais faire cela sans devoir me taper des unsafe à tout bout de champs.<br />
<br />
Du coup voilà le client_handler<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
&nbsp;
<span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">fn</span> client_handler<span class="br0">&#40;</span>arc_stream :Arc&lt;Mutex&lt;TcpStream&gt;&gt;, arc_connect :&amp;Arc&lt;Mutex&lt;&amp;<span style="color: #0080ff;">mut</span> PooledConn&gt;&gt; <span class="br0">&#41;</span> -&gt; i32
<span class="br0">&#123;</span>
  ...
  <span style="color: #0000ff;">let</span> res_connection = arc_connect.lock<span class="br0">&#40;</span><span class="br0">&#41;</span>;
  ...
<span class="br0">&#125;</span></pre></td></tr></table></code><hr />
</div>Dans ce client handler je fais une première fois<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">let</span> result = player_fromDB.getIDbyName<span class="br0">&#40;</span>&amp;<span style="color: #0080ff;">mut</span> res_connection.unwrap<span class="br0">&#40;</span><span class="br0">&#41;</span>, onePlayer.getString<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">if</span> result &gt; <span style="color: #cc66cc;">0</span>
<span class="br0">&#123;</span>
  <span style="color: #0080ff;">println!</span><span class="br0">&#40;</span><span style="color: #FF0000;">&quot;[DB] <span style="color: #800000;">{}</span> found !!&quot;</span>,onePlayer.getString<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
  <span style="color: #808080;">// In this case some computing must be done... later.</span>
<span class="br0">&#125;</span>
<span style="color: #0000ff;">else</span>
<span class="br0">&#123;</span>
  <span style="color: #0080ff;">println!</span><span class="br0">&#40;</span><span style="color: #FF0000;">&quot;[DB] <span style="color: #800000;">{}</span> not found !!&quot;</span>,onePlayer.getString<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
 <span style="color: #808080;">// In this case the player must be inserted to the DB... later.</span>
<span class="br0">&#125;</span></pre></td></tr></table></code><hr />
</div>...avec une larme de joie sur la joue ça marche... je me dis &quot;c'est bon je continue&quot;...<br />
<br />
...puis je fais un peu plus loin...<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">if</span> player_fromDB.getID<span class="br0">&#40;</span><span class="br0">&#41;</span> &gt; <span style="color: #cc66cc;">0</span>
<span class="br0">&#123;</span>
  <span style="color: #808080;">// update</span>
  player_fromDB.setScore<span class="br0">&#40;</span>onePlayer.getScoreP<span class="br0">&#40;</span><span class="br0">&#41;</span>,onePlayer.getScoreO<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
  GEN_updateDB<span class="br0">&#40;</span>player_fromDB,&amp;<span style="color: #0080ff;">mut</span> res_connection.unwrap<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span></pre></td></tr></table></code><hr />
</div>...et là mes croyances se sont effondrées :{<br />
<div class="bbcode_container">
	<div class="bbcode_description">Citation:</div>
	<div class="bbcode_quote printable">
		<hr />
		
			|     let res_connection = arc_connect.lock();<br />
     |         -------------- move occurs because `res_connection` has type `Result&lt;MutexGuard&lt;'_, &amp;mut PooledConn&gt;, PoisonError&lt;...&gt;&gt;`, which does not implement the `Copy` trait<br />
...<br />
 229 |                 let result = player_fromDB.getIDbyName(&amp;mut res_connection.unwrap(), onePlayer.getString());<br />
     |                                                             -------------- -------- `res_connection` moved due to this method call<br />
     |                                                             |<br />
     |                                                             help: consider calling `.as_ref()` or `.as_mut()` to borrow the type's contents<br />
...<br />
 339 |             GEN_updateDB(player_fromDB,&amp;mut res_connection.unwrap());<br />
     |                                             ^^^^^^^^^^^^^^ value used here after move
			
		<hr />
	</div>
</div>Pas moyen de cloner, pas moyen de rien...<br />
Je fais comment maintenant ???<br />
<br />
C'est tellement de la merde Rust qu'il &quot;suffisait&quot; de taper le unwrap dans une bête variable...<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><span style="color: #0000ff;">let</span> couillonade = &amp;<span style="color: #0080ff;">mut</span> res_connection.unwrap<span class="br0">&#40;</span><span class="br0">&#41;</span>;</code><hr />
</div></div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f2138/general-developpement/programmation-systeme/rust/">Rust</category>
			<dc:creator>hurukan</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2180700/general-developpement/programmation-systeme/rust/thread-shared-database-pooledconn-value-used-here-after-move/</guid>
		</item>
		<item>
			<title><![CDATA[Les développeurs principaux de CPython proposent d'intégrer Rust]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2180542&amp;goto=newpost</link>
			<pubDate>Wed, 19 Nov 2025 15:40:53 GMT</pubDate>
			<description>*Les développeurs principaux...</description>
			<content:encoded><![CDATA[<div><b><font size="4">Les développeurs principaux de CPython proposent d'intégrer Rust afin d'améliorer la sécurité mémoire et de réduire les vulnérabilités dans le code source C de Python, ce qui suscite des débats</font></b> <br />
<br />
<b>Les développeurs principaux de CPython proposent d'intégrer Rust afin d'améliorer la sécurité de la mémoire et de réduire les vulnérabilités dans le code source basé sur C de Python. Commençant par des extensions optionnelles, Rust pourrait devenir obligatoire, ce qui susciterait des débats sur la complexité par rapport aux avantages. Cette initiative s'inscrit dans la tendance de l'industrie vers une programmation sécurisée et hautement performante.</b><br />
<br />
Rust est un langage de programmation polyvalent. Il est réputé pour l'importance qu'il accorde aux performances, à la sécurité des types, à la concurrence et à la sécurité mémoire. Rust prend en charge plusieurs paradigmes de programmation. Il a été influencé par des idées issues de la programmation fonctionnelle, notamment l'immuabilité, les fonctions d'ordre supérieur, les types de données algébriques et la correspondance de motifs. Il prend également en charge la programmation orientée objet via des structures, des énumérations, des traits et des méthodes.<br />
<br />
Rust est connu pour imposer la sécurité de la mémoire (c'est-à-dire que toutes les références pointent vers une mémoire valide) sans collecteur de mémoire conventionnel ; à la place, les erreurs de sécurité de la mémoire et les conflits d'accès aux données sont évités grâce au « vérificateur d'emprunt », qui suit la durée de vie des objets référencés au moment de la compilation.<br />
<br />
Dans une initiative qui pourrait bouleverser les fondements de l'un des langages de programmation les plus populaires au monde, deux développeurs principaux de CPython, l'implémentation de référence de Python, ont proposé d'intégrer le langage de programmation Rust dans son code source. Cette initiative, détaillée dans une discussion pré-PEP (Python Enhancement Proposal), vise à tirer parti des fonctionnalités de sécurité mémoire de Rust pour remédier aux vulnérabilités de longue date de CPython, qui est principalement écrit en C.<br />
<br />
La proposition, rédigée par les développeurs principaux de CPython Emma Twersky et Eclipse Obscura, suggère de commencer par utiliser Rust pour les modules d'extension optionnels avant d'étendre son utilisation à l'ensemble du code source de CPython. Selon le document publié sur Discussions on Python.org, Rust deviendrait à terme une dépendance obligatoire, marquant un changement significatif dans le paradigme de développement de Python.<br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p671937d1763571591/general-developpement/programmation-systeme/rust/developpeurs-principaux-cpython-proposent-d-integrer-rust/1.jpg/" border="0" alt="Nom : 1.jpg
Affichages : 37849
Taille : 16,9 Ko"  style="float: CONFIG" /></div><br />
<b>La tentative audacieuse Rust pour renforcer le cœur de Python</b><br />
<br />
L'attrait de Rust réside dans ses garanties solides contre les bogues liés à la mémoire, un problème persistant dans les projets basés sur C comme CPython. Le pré-PEP souligne que « <i>CPython a historiquement rencontré de nombreux bogues et plantages dus à des accès mémoire invalides</i> », comme indiqué dans la section « Motivation ». En introduisant Rust, les développeurs espèrent atténuer ces risques sans sacrifier les performances.<br />
<br />
Ce n'est pas la première fois que Rust est envisagé pour améliorer des systèmes établis. Des projets tels que le noyau Linux et Chromium ont déjà intégré Rust pour le nouveau code, invoquant des avantages similaires. Une discussion en 2023 sur Discussions on Python.org a exploré la faisabilité de construire CPython avec Rust, en mettant l'accent sur la réduction des CVE (Common Vulnerabilities and Exposures).<br />
<br />
L'approche progressive décrite dans la proposition commence par autoriser Rust pour les modules d'extension, qui pourraient être compilés de manière facultative. Cela reflète les stratégies d'autres écosystèmes, tels que l'adoption progressive de Rust par Git pour les composants critiques en termes de performances. Au fil du temps, Rust s'imposerait dans les domaines clés, devenant indispensable pour la construction de CPython.<br />
<br />
<b>Réactions et débats au sein de la communauté</b><br />
<br />
Les observateurs du secteur y voient une réponse à la demande croissante de logiciels sécurisés. Une analyse décrit Rust comme le « nouveau moteur de performance » de Python, soulignant une augmentation de 22 % de l'utilisation de Rust pour les extensions Python au cours de l'année dernière.<br />
<br />
La proposition a suscité des discussions animées au sein des communautés technologiques. Des développeurs ont noté que « <i>CPython pourrait introduire Rust pour le développement de base</i> », établissant un parallèle avec l'évolution de Git. Un autre développeur a mis l'accent sur la sécurité de la mémoire, citant l'importance accordée par le pré-PEP à la réduction des plantages.<br />
<br />
Les détracteurs, cependant, s'inquiètent de la complexité supplémentaire. Un développeur a averti qu'une dépendance à Rust « <i>éliminerait effectivement le Python moderne sur plusieurs plateformes</i> », ce qui pourrait aliéner les utilisateurs de systèmes ne disposant pas d'un support Rust robuste. Une analyse a qualifié cette initiative d'« intéressante », prédisant qu'elle pourrait faire évoluer CPython de manière significative.<br />
<br />
<b>Défis techniques à relever et tendances générales du secteur</b><br />
<br />
L'intégration de Rust dans CPython n'est pas simple. Le pré-PEP reconnaît la nécessité de modifier le système de compilation et d'assurer la compatibilité avec le code C existant. Des outils tels que PyO3, qui facilitent l'interopérabilité entre Rust et Python, pourraient jouer un rôle clé. Des tentatives historiques, telles que RustPython, un interpréteur Python open source entièrement écrit en Rust, constituent des précédents. Selon sa page GitHub, RustPython prend en charge CPython 3.11 et les versions supérieures, mais ne remplace pas encore CPython. Les observateurs ont salué le potentiel de RustPython, mais soulignent les obstacles à l'intégration avec les bibliothèques externes.<br />
<br />
Cette proposition s'inscrit dans une tendance plus large à l'adoption de Rust pour les bases de code héritées. Par exemple, un projet financé par la DARPA appelé CRAM migre C++ vers Rust. Dans l'écosystème Python, des outils tels que Ruff, un linter rapide écrit en Rust, ont démontré des gains de performance. Son créateur, Charlie Marsh, affirme qu'il analyse l'ensemble de la base de code CPython en moins de 500 ms.<br />
<br />
Des enquêtes indiquent la maturation de Python, l'intégration de Rust gagnant du terrain. Un rapport indique que la science des données domine l'utilisation de Python avec 51 %, tandis que Rust émerge comme un « partenaire de performance » pour les nouveaux venus, qui représentent la moitié des développeurs.<br />
<br />
Pour les développeurs Python, cela pourrait signifier l'apprentissage de Rust pour les contributions essentielles, ce qui pourrait rendre la courbe d'apprentissage plus raide. Cependant, les partisans affirment que les avantages l'emportent sur les coûts. « <i>Rust s'est imposé comme un langage de programmation système populaire et sûr pour la mémoire</i> », indique le pré-PEP, en référence à son utilisation dans de nombreux projets.<br />
<br />
Les performances sont un autre atout. Un rapport en 2022 comparait le temps de démarrage de 10 ms de CPython à la vitesse de Rust dans des contextes sans serveur. De même, Mara Bos a annoncé des outils tels que ct_python pour générer du code Rust à partir de Python au moment de la compilation, démontrant ainsi les possibilités d'intégration transparente.<br />
<br />
<b>Perspectives d'avenir</b><br />
<br />
Alors que la proposition se rapproche du statut officiel de PEP, le Python Steering Council va se prononcer. Si elle est approuvée, elle pourrait créer un précédent pour d'autres langages, à l'instar de l'intégration de Rust dans le noyau Linux. En fin de compte, cette intégration reflète l'évolution de Python, qui est passé d'un langage de script à un outil robuste pour l'IA, la science des données et la programmation de systèmes. Avec le soutien de Rust, CPython pourrait gagner en fiabilité, attirer davantage d'entreprises et répondre aux besoins de sécurité dans un paysage numérique de plus en plus exposé aux menaces.<br />
<br />
Cette proposition rappelle <a href="https://securite.developpez.com/actu/356156/Rust-Python-Apache-Foundations-et-d-autres-annoncent-une-grande-collaboration-sur-la-cybersecurite-afin-de-creer-des-specifications-communes-pour-le-developpement-de-logiciels-securises/" target="_blank">une initiative de 2024</a>. Apache Software Foundation, Blender Foundation, OpenSSL Software Foundation, PHP Foundation, Python Software Foundation, Rust Foundation et Eclipse Foundation avaient alors annoncé conjointement leur intention de collaborer à l'établissement de spécifications communes pour le développement de logiciels sécurisés sur la base des meilleures pratiques open source existantes.<br />
<br />
<b>Source</b> : <a rel="nofollow" href="https://discuss.python.org/t/how-hard-is-it-to-get-cpython-build-with-rust/22759" target="_blank">Discussion sur la faisabilité de construire CPython avec Rust</a><br />
<br />
<b>Et vous ?</b><br />
<br />
:fleche: Pensez-vous que cette proposition est crédible ou pertinente ?<br />
:fleche: Quel est votre avis sur le sujet ?<br />
<br />
<b>Voir aussi :</b><br />
<br />
:fleche: <a href="https://python.developpez.com/actu/333522/La-prochaine-version-de-l-interpreteur-Python-standard-CPython-va-s-accompagner-d-ameliorations-significatives-des-performances-ont-annonce-les-developpeurs-durant-la-PyCon/" target="_blank">La prochaine version de l'interpréteur Python standard, CPython, va s'accompagner d'améliorations significatives des performances ont annoncé les développeurs durant la PyCon</a><br />
<br />
:fleche: <a href="https://www.developpez.com/actu/244667/RustPython-un-interpreteur-Python-ecrit-en-Rust-et-compatible-avec-WebAssembly-est-disponible-pourrait-il-rivaliser-avec-CPython/" target="_blank">RustPython, un interpréteur Python écrit en Rust et compatible avec WebAssembly, est disponible : Pourrait-il rivaliser avec CPython ?</a><br />
<br />
:fleche: <a href="https://linux.developpez.com/actu/368891/Le-melange-de-Rust-et-de-C-dans-Linux-est-assimile-a-un-cancer-par-un-responsable-du-noyau-je-ne-veux-pas-qu-il-s-approche-d-une-enorme-base-de-code-C-que-je-dois-maintenir-dit-il-a-propos-de-Rust/" target="_blank">Le mélange de Rust et de C dans Linux est assimilé à un « cancer » par un responsable du noyau, « je ne veux pas qu'il s'approche d'une énorme base de code C que je dois maintenir », dit-il à propos de Rust</a></div>


	<div style="padding:10px">

	

	
		<fieldset class="fieldset">
			<legend>Images attachées</legend>
				<div style="padding:10px">
				<img class="attach" src="https://www.developpez.net/forums/attachments/p671937d1763571591/general-developpement/programmation-systeme/rust/developpeurs-principaux-cpython-proposent-d-integrer-rust/1.jpg/" alt="" />&nbsp;
			</div>
		</fieldset>
	

	

	

	</div>
]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f2138/general-developpement/programmation-systeme/rust/">Rust</category>
			<dc:creator>Jade Emy</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2180542/general-developpement/programmation-systeme/rust/developpeurs-principaux-cpython-proposent-d-integrer-rust/</guid>
		</item>
	</channel>
</rss>
