Index: includes/module.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/module.inc,v
retrieving revision 1.197
diff -u -9 -p -r1.197 module.inc
--- includes/module.inc	28 Jul 2010 01:46:59 -0000	1.197
+++ includes/module.inc	27 Aug 2010 17:33:30 -0000
@@ -169,18 +169,19 @@ function system_list($type) {
 
   return $lists[$type];
 }
 
 /**
  * Reset all system_list() caches.
  */
 function system_list_reset() {
   drupal_static_reset('system_list');
+  drupal_static_reset('system_rebuild_module_data');
   drupal_static_reset('list_themes');
   cache_clear_all('bootstrap_modules', 'cache_bootstrap');
   cache_clear_all('system_list', 'cache_bootstrap');
 }
 
 /**
  * Find dependencies any level deep and fill in required by information too.
  *
  * @param $files
Index: modules/simpletest/tests/module.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/module.test,v
retrieving revision 1.23
diff -u -9 -p -r1.23 module.test
--- modules/simpletest/tests/module.test	5 Aug 2010 23:53:38 -0000	1.23
+++ modules/simpletest/tests/module.test	27 Aug 2010 17:33:31 -0000
@@ -115,24 +115,26 @@ class ModuleUnitTest extends DrupalWebTe
    * Test dependency resolution.
    */
   function testDependencyResolution() {
     module_enable(array('module_test'), FALSE);
     $this->assertTrue(module_exists('module_test'), t('Test module is enabled.'));
 
     // First, create a fake missing dependency. Forum depends on poll, which
     // depends on a made-up module, foo. Nothing should be installed.
     variable_set('dependency_test', 'missing dependency');
+    drupal_static_reset('system_rebuild_module_data');
     $result = module_enable(array('forum'));
     $this->assertFalse($result, t('module_enable() returns FALSE if dependencies are missing.'));
     $this->assertFalse(module_exists('forum'), t('module_enable() aborts if dependencies are missing.'));
 
     // Now, fix the missing dependency. module_enable() should work.
     variable_set('dependency_test', 'dependency');
+    drupal_static_reset('system_rebuild_module_data');
     $result = module_enable(array('forum'));
     $this->assertTrue($result, t('module_enable() returns the correct value.'));
     // Verify that the fake dependency chain was installed.
     $this->assertTrue(module_exists('poll') && module_exists('php'), t('Dependency chain was installed by module_enable().'));
     // Finally, verify that the original module was installed.
     $this->assertTrue(module_exists('forum'), t('Module installation with unlisted dependencies succeeded.'));
   }
 }
 
Index: modules/system/system.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.module,v
retrieving revision 1.957
diff -u -9 -p -r1.957 system.module
--- modules/system/system.module	22 Aug 2010 13:52:58 -0000	1.957
+++ modules/system/system.module	27 Aug 2010 17:33:31 -0000
@@ -2311,24 +2311,31 @@ function _system_rebuild_module_data() {
 }
 
 /**
  * Rebuild, save, and return data about all currently available modules.
  *
  * @return
  *   Array of all available modules and their data.
  */
 function system_rebuild_module_data() {
-  $modules = _system_rebuild_module_data();
-  ksort($modules);
-  system_get_files_database($modules, 'module');
-  system_update_files_database($modules, 'module');
-  $modules = _module_build_dependencies($modules);
-  return $modules;
+  $modules_cache = &drupal_static(__FUNCTION__);
+  // Only rebuild once per request. $modules and $modules_cache cannot be
+  // combined into one variable, because the $modules_cache variable is reset by
+  // reference from system_list_reset() during the rebuild.
+  if (!isset($modules_cache)) {
+    $modules = _system_rebuild_module_data();
+    ksort($modules);
+    system_get_files_database($modules, 'module');
+    system_update_files_database($modules, 'module');
+    $modules = _module_build_dependencies($modules);
+    $modules_cache = $modules;
+  }
+  return $modules_cache;
 }
 
 /**
  * Refresh bootstrap column in the system table.
  *
  * This is called internally by module_enable/disable() to flag modules that
  * implement hooks used during bootstrap, such as hook_boot(). These modules
  * are loaded earlier to invoke the hooks.
  */
