diff --git a/ecrire/public/compiler.php b/ecrire/public/compiler.php
index a5973202b1621799403059bbe6911841b7888de2..f22be6e4937e4f9e5294f7cc5c1d72f9b5264fac 100644
--- a/ecrire/public/compiler.php
+++ b/ecrire/public/compiler.php
@@ -112,7 +112,7 @@ function calculer_inclure($struct, $descr, &$boucles, $id_boucle) {
 function calculer_boucle($id_boucle, &$boucles) {
  
   if ($boucles[$id_boucle]->type_requete == 'boucle')  {
-    $corps = ( "\n	\$t0 = " . $boucles[$id_boucle]->return . ";");
+    $corps = calculer_boucle_rec($id_boucle, $boucles);
     $req = "";
     } else {
       $corps = calculer_boucle_nonrec($id_boucle, $boucles);
@@ -129,6 +129,17 @@ function calculer_boucle($id_boucle, &$boucles) {
 	.  "\n	return \$t0;";
 }
 
+// compil d'un boucle non recursive. 
+// il suffit (ET IL FAUT) sauvegarder les valeurs des arguments passes par
+// reference, car par definition un tel passage ne les sauvegarde pas
+
+function calculer_boucle_rec($id_boucle, &$boucles) {
+	$nom = $boucles[$id_boucle]->param[0];
+	return "\n\t\$save_numrows = (\$Numrows['$nom']);"
+	. "\n\t\$t0 = " . $boucles[$id_boucle]->return . ";"
+	. "\n\t\$Numrows['$nom'] = (\$save_numrows);";
+}
+
 // compil d'un boucle non recursive. 
 // c'est un "while (fetch_sql)" dans le cas général,
 // qu'on essaye d'optimiser un max.