diff --git a/includes/bootstrap.inc b/includes/bootstrap.inc index 29b925350514ab0b3d5ebfc77ace7308a10defd2..b9bf2d6d01dc15dbd54a53f58b587c819ef1af33 100644 --- a/includes/bootstrap.inc +++ b/includes/bootstrap.inc @@ -2098,8 +2098,22 @@ function _registry_check_code($type, $name = NULL) { * each interface or class in the database. */ function registry_rebuild() { + system_rebuild_module_data(); + registry_update(); +} + +/** + * Update the registry based on the latest files listed in the database. + * + * This function should be used when system_rebuild_module_data() does not need + * to be called, because it is already known that the list of files in the + * {system} table matches those in the file system. + * + * @see registry_rebuild() + */ +function registry_update() { require_once DRUPAL_ROOT . '/includes/registry.inc'; - _registry_rebuild(); + _registry_update(); } /** diff --git a/includes/module.inc b/includes/module.inc index ba44dc46e5692b3703fb2396ab20096b4baf1380..e3f31a0090aeceb82c1800edddf8c31ae45cb216 100644 --- a/includes/module.inc +++ b/includes/module.inc @@ -319,8 +319,8 @@ function module_enable($module_list, $disable_modules_installed_hook = FALSE) { system_list_reset(); module_list(TRUE); module_implements('', FALSE, TRUE); - // Force to regenerate the stored list of hook implementations. - registry_rebuild(); + // Update the registry to include the new enabled module. + registry_update(); // Refresh the schema to include the new enabled module. drupal_get_schema(NULL, TRUE); @@ -383,8 +383,8 @@ function module_disable($module_list) { // Invoke hook_modules_disabled before disabling modules, // so we can still call module hooks to get information. module_invoke_all('modules_disabled', $invoke_modules); - // Force to regenerate the stored list of hook implementations. - registry_rebuild(); + // Update the registry to remove the newly-disabled module. + registry_update(); } // If there remains no more node_access module, rebuilding will be diff --git a/includes/registry.inc b/includes/registry.inc index be7154851970f7473859772faf71bc4e780b2819..16b869b7620df6eed6a687c709a86297d5c173e9 100644 --- a/includes/registry.inc +++ b/includes/registry.inc @@ -17,9 +17,9 @@ */ /** - * @see registry_rebuild. + * @see registry_update(). */ -function _registry_rebuild() { +function _registry_update() { // The registry serves as a central autoloader for all classes, including // the database query builders. However, the registry rebuild process @@ -35,11 +35,12 @@ function _registry_rebuild() { require_once DRUPAL_ROOT . '/includes/database/' . $driver . '/query.inc'; // Get current list of modules and their files. - $modules = system_rebuild_module_data(); + $modules = db_query("SELECT * FROM {system} WHERE type = 'module'")->fetchAll(); // Get the list of files we are going to parse. $files = array(); foreach ($modules as &$module) { - $dir = dirname($module->uri); + $module->info = unserialize($module->info); + $dir = dirname($module->filename); // Store the module directory for use in hook_registry_files_alter(). $module->dir = $dir; diff --git a/modules/system/system.api.php b/modules/system/system.api.php index 57ad535364137ffa2504cd25888a15d96d42636e..70ba43ea1fd72ca32313d6141e32d5171c780764 100644 --- a/modules/system/system.api.php +++ b/modules/system/system.api.php @@ -2192,7 +2192,7 @@ function hook_disable() { * files found in each enabled module's info file and the core includes * directory. The array is keyed by the file path and contains an array of * the related module's name and weight as used internally by - * _registry_rebuild() and related functions. + * _registry_update() and related functions. * * For example: * @code @@ -2202,17 +2202,17 @@ function hook_disable() { * ); * @endcode * @param $modules - * List of all the modules provided as returned by drupal_system_listing(). - * The list also contains the .info file information in the property 'info'. - * An additional 'dir' property has been added to the module information - * which provides the path to the directory in which the module resides. The - * example shows how to take advantage of the property both properties. - * - * @see _registry_rebuild() - * @see drupal_system_listing() + * An array containing all module information stored in the {system} table. + * Each element of the array also contains the module's .info file + * information in the property 'info'. An additional 'dir' property has been + * added to the module information which provides the path to the directory + * in which the module resides. The example shows how to take advantage of + * both properties. + * + * @see _registry_update() * @see simpletest_test_get_all() */ -function hook_registry_files_alter(&$files, $module_cache) { +function hook_registry_files_alter(&$files, $modules) { foreach ($modules as $module) { // Only add test files for disabled modules, as enabled modules should // already include any test files they provide.