diff --git a/inc-compilo.php3 b/inc-compilo.php3
index a7c4996b92f79719a8ce3cadbb907ac503f77b71..e56868abb1c7f12e645240658b9c9b8f2cd7509a 100644
--- a/inc-compilo.php3
+++ b/inc-compilo.php3
@@ -77,20 +77,30 @@ function calculer_inclure($struct, $descr, &$boucles, $id_boucle) {
  }
 
 //
-// calculer_boucle() produit le corps PHP d'une boucle Spip 
-// Sauf pour les recursives, ce corps est un Select SQL + While PHP
-// remplissant une variable $t0 retournee en valeur
-//
+// calculer_boucle() produit le corps PHP d'une boucle Spip. 
+// ce corps remplit une variable $t0 retournee en valeur.
+// Ici on distingue boucles recursives et boucle a requete SQL
+// et on insere le code d'envoi au debusqueur du resultat de la fonction.
+
 function calculer_boucle($id_boucle, &$boucles) {
+ 
+  return
+	(($boucles[$id_boucle]->type_requete == 'boucle') ?
+	 ( "\n	\$t0 = " . $boucles[$id_boucle]->return . ";") :
+	 ( calculer_requete_sql($boucles[$id_boucle]) .
+	   calculer_boucle_nonrec($id_boucle, $boucles)))
+	. (($GLOBALS['var_mode_affiche'] != 'resultat') ? "" : "
+		boucle_debug_resultat('$id_boucle', 'resultat', \$t0);")
+	.  "\n	return \$t0;";
+}
+
+// compil d'un boucle non recursive; son corps est un Select SQL + While PHP
 
-  $boucle = &$boucles[$id_boucle];
-  $return = $boucle->return;
-  $type_boucle = $boucle->type_requete;
+function calculer_boucle_nonrec($id_boucle, &$boucles) {
 
-  if ($type_boucle == 'boucle') {
-	    $corps = "\n	\$t0 = " . $return . ";";
-	    $init = "";
-  } else {
+	$boucle = &$boucles[$id_boucle];
+	$return = $boucle->return;
+	$type_boucle = $boucle->type_requete;
 	$primary = $boucle->primary;
 	$constant = ereg(CODE_MONOTONE,$return);
 
@@ -101,9 +111,7 @@ function calculer_boucle($id_boucle, &$boucles) {
 	//
 	// Creer le debut du corps de la boucle :
 	//
-	$corps = '';
-	if ($flag_cpt)
-		$corps = "\n		\$Numrows['$id_boucle']['compteur_boucle']++;";
+	$corps = !$flag_cpt ? '' : "\n		\$Numrows['$id_boucle']['compteur_boucle']++;";
 
 	if ($boucle->mode_partie)
 		$corps .= "
@@ -136,9 +144,6 @@ function calculer_boucle($id_boucle, &$boucles) {
 	if (count($boucle->separateur))
 	  $code_sep = ("'" . ereg_replace("'","\'",join('',$boucle->separateur)) . "'"); 
 
-	$init = '';
-	$fin = '';
-
 	// La boucle doit-elle selectionner la langue ?
 	// -. par defaut, les boucles suivantes le font
 	// "peut-etre", c'est-a-dire si forcer_lang == false.
@@ -159,10 +164,14 @@ function calculer_boucle($id_boucle, &$boucles) {
 		  . index_pile($id_boucle, 'lang', $boucles)
 		  . ') ? $x : $old_lang;';
 		// Memoriser la langue avant la boucle pour la restituer apres
-	      $init .= "\n	\$old_lang = \$GLOBALS['spip_lang'];";
-	      $fin .= "\n	\$GLOBALS['spip_lang'] = \$old_lang;";
+	      $init.= "\n	\$old_lang = \$GLOBALS['spip_lang'];";
+	      $fin = "\n	\$GLOBALS['spip_lang'] = \$old_lang;";
 
 	  }
+	else {
+		$init = '';
+		$fin = '';
+	}
 
 	// gestion optimale des separateurs et des boucles constantes
 	$corps .= 
@@ -177,12 +186,8 @@ function calculer_boucle($id_boucle, &$boucles) {
 		  '$t0 .= (($t1 && $t0) ? ' . $code_sep . " : '') . \$t1;"));
      
 	// Fin de parties
-	if ($boucle->mode_partie)
-		$corps .= "\n		}\n";
+	if ($boucle->mode_partie) $corps .= "\n		}\n";
 
-	// Gestion de la hierarchie (voir inc-boucles)
-	if ($boucle->hierarchie)
-		$init .= "\n	".$boucle->hierarchie;
 
 	// si le corps est une constante, ne pas appeler le serveur N fois!
 	if (ereg(CODE_MONOTONE,$corps, $r)) {
@@ -198,7 +203,7 @@ function calculer_boucle($id_boucle, &$boucles) {
 		}
 	} else {
 
-		$corps = '
+		$corps = $init . '
 
 	// RESULTATS
 	while ($Pile[$SP] = @spip_abstract_fetch($result,"' .
@@ -208,15 +213,33 @@ function calculer_boucle($id_boucle, &$boucles) {
 		  $fin ;
 	}
 
-	//
-	// Requete
-	//
+	return '
+	$t0 = "";
+	$SP++;'
+		. (!$flag_cpt  ? "" :
+			"\n	\$Numrows['$id_boucle']['compteur_boucle'] = 0;")
+		. ($boucle->mode_partie ? 
+		   calculer_parties($boucles, $id_boucle) :
+		   (!$boucle->numrows ? '' :
+		    ( "\n	\$Numrows['" .
+			$id_boucle .
+			"']['total'] = @spip_abstract_count(\$result,'" .
+			$boucle->sql_serveur .
+		      "');"))) .
+		$corps .
+		"\n	@spip_abstract_free(\$result,'" .
+		$boucle->sql_serveur . "');";
+}
 
+
+function calculer_requete_sql($boucle)
+{
 	if (!$order = $boucle->order
 	AND !$order = $boucle->default_order)
 		$order = array();
 
-	$init .= $boucle->hash . 
+	return   ($boucle->hierarchie ? "\n\t$boucle->hierarchie" : '')
+		. $boucle->hash . 
 		"\n\n	// REQUETE
 	\$result = spip_abstract_select(\n\t\tarray(\"" . 
 		# En absence de champ c'est un decompte : 
@@ -242,36 +265,9 @@ function calculer_boucle($id_boucle, &$boucles) {
 		'".$boucle->id_table."', # table
 		'".$boucle->id_boucle."', # boucle
 		'".$boucle->sql_serveur."'); # serveur";
-
-	$init .= "\n	".'$t0 = "";
-	$SP++;';
-	if ($flag_cpt)
-		$init .= "\n	\$Numrows['$id_boucle']['compteur_boucle'] = 0;";
-
-	if ($boucle->mode_partie)
-		$init .= calculer_parties($boucles, $id_boucle);
-	else if ($boucle->numrows)
-		$init .= "\n	\$Numrows['" .
-			$id_boucle .
-			"']['total'] = @spip_abstract_count(\$result,'" .
-			$boucle->sql_serveur .
-			"');";
-
-	//
-	// Conclusion et retour
-	//
-	$corps .= "\n	@spip_abstract_free(\$result,'" .
-		   $boucle->sql_serveur . "');";
-
-  }
-
-  return $init . $corps . 
-	## inserer le code d'envoi au debusqueur du resultat de la fonction
-	(($GLOBALS['var_mode_affiche'] != 'resultat') ? "" : "
-		boucle_debug_resultat('$id_boucle', 'resultat', \$t0);") .
-    "\n	return \$t0;";
 }
 
+
 function calculer_from(&$boucle)
 {
   $res = "";