Index: includes/form.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/form.inc,v
retrieving revision 1.419
diff -u -9 -p -r1.419 form.inc
--- includes/form.inc	14 Dec 2009 13:51:56 -0000	1.419
+++ includes/form.inc	15 Dec 2009 18:22:11 -0000
@@ -1128,21 +1128,18 @@ function form_builder($form_id, $element
   if (isset($element['#process']) && !$element['#processed']) {
     foreach ($element['#process'] as $process) {
       if (function_exists($process)) {
         $element = $process($element, $form_state, $form_state['complete form']);
       }
     }
     $element['#processed'] = TRUE;
   }
 
-  // We start off assuming all form elements are in the correct order.
-  $element['#sorted'] = TRUE;
-
   // Recurse through all child elements.
   $count = 0;
   foreach (element_children($element) as $key) {
     // Don't squash an existing tree value.
     if (!isset($element[$key]['#tree'])) {
       $element[$key]['#tree'] = $element['#tree'];
     }
 
     // Deny access to child elements if parent is denied.
@@ -1157,29 +1154,34 @@ function form_builder($form_id, $element
       $element[$key]['#parents'] = $element[$key]['#tree'] && $element['#tree'] ? array_merge($element['#parents'], array($key)) : array($key);
     }
     // Ensure #array_parents follows the actual form structure.
     $array_parents = isset($element['#array_parents']) ? $element['#array_parents'] : array();
     $array_parents[] = $key;
     $element[$key]['#array_parents'] = $array_parents;
 
     // Assign a decimal placeholder weight to preserve original array order.
     if (!isset($element[$key]['#weight'])) {
-      $element[$key]['#weight'] = $count/1000;
+      $element[$key]['#weight'] = $count / 1000;
     }
-    else {
+    elseif (empty($element['#sorted'])) {
       // If one of the child elements has a weight then we will need to sort
       // later.
-      unset($element['#sorted']);
+      $element['#sorted'] = FALSE;
     }
     $element[$key] = form_builder($form_id, $element[$key], $form_state);
     $count++;
   }
 
+  // If we did not set $element['#sorted'] to FALSE, the array was already sorted.
+  if (!isset($element['#sorted'])) {
+    $element['#sorted'] = TRUE;
+  }
+
   // The #after_build flag allows any piece of a form to be altered
   // after normal input parsing has been completed.
   if (isset($element['#after_build']) && !isset($element['#after_build_done'])) {
     foreach ($element['#after_build'] as $function) {
       $element = $function($element, $form_state);
       $element['#after_build_done'] = TRUE;
     }
   }
 
Index: modules/system/system.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.admin.inc,v
retrieving revision 1.238
diff -u -9 -p -r1.238 system.admin.inc
--- modules/system/system.admin.inc	15 Dec 2009 08:45:32 -0000	1.238
+++ modules/system/system.admin.inc	15 Dec 2009 18:22:11 -0000
@@ -845,18 +845,19 @@ function system_modules($form, $form_sta
     }
     $form['modules'][$module->info['package']][$filename] = _system_modules_build_row($module->info, $extra);
   }
   // Add basic information to the fieldsets.
   foreach (element_children($form['modules']) as $package) {
     $form['modules'][$package] += array(
       '#type' => 'fieldset',
       '#title' => t($package),
       '#collapsible' => TRUE,
+      '#sorted' => TRUE,
       '#theme' => 'system_modules_fieldset',
       '#header' => array(
         array('data' => t('Enabled'), 'class' => array('checkbox')),
         t('Name'),
         t('Version'),
         t('Description'),
         array('data' => t('Operations'), 'colspan' => 3),
       ),
     );
