Index: includes/menu.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/menu.inc,v retrieving revision 1.317 diff -u -p -r1.317 menu.inc --- includes/menu.inc 2 Apr 2009 03:40:05 -0000 1.317 +++ includes/menu.inc 2 Apr 2009 14:56:34 -0000 @@ -1832,24 +1832,27 @@ function menu_rebuild() { /** * Collect, alter and store the menu definitions. */ -function menu_router_build() { - // We need to manually call each module so that we can know which module - // a given item came from. - $callbacks = array(); - foreach (module_implements('menu') as $module) { - $router_items = call_user_func($module .'_menu'); - if (isset($router_items) && is_array($router_items)) { - foreach (array_keys($router_items) as $path) { - $router_items[$path]['module'] = $module; - } - $callbacks = array_merge($callbacks, $router_items); - } - } - // Alter the menu as defined in modules, keys are like user/%user. - drupal_alter('menu', $callbacks); - $menu = _menu_router_build($callbacks); - _menu_router_store($menu); +function menu_router_build($reset = FALSE) { + static $menu; + if (!isset($menu) || $reset) { + // We need to manually call each module so that we can know which module + // a given item came from. + $callbacks = array(); + foreach (module_implements('menu') as $module) { + $router_items = call_user_func($module .'_menu'); + if (isset($router_items) && is_array($router_items)) { + foreach (array_keys($router_items) as $path) { + $router_items[$path]['module'] = $module; + } + $callbacks = array_merge($callbacks, $router_items); + } + } + // Alter the menu as defined in modules, keys are like user/%user. + drupal_alter('menu', $callbacks); + $menu = _menu_router_build($callbacks); + _menu_router_store($menu); + } return $menu; }