diff --git a/core/includes/theme.inc b/core/includes/theme.inc index 3fd6b0a3e21df3be53d8b4eb847a7a0ede838784..9b89250fc950617f253f62273265ea3d8f4370de 100644 --- a/core/includes/theme.inc +++ b/core/includes/theme.inc @@ -134,8 +134,7 @@ function drupal_theme_rebuild() { */ function drupal_find_theme_functions($cache, $prefixes) { $implementations = []; - $functions = get_defined_functions(); - $theme_functions = preg_grep('/^(' . implode(')|(', $prefixes) . ')_/', $functions['user']); + $grouped_functions = \Drupal::service('theme.registry')->getPrefixGroupedUserFunctions(); foreach ($cache as $hook => $info) { foreach ($prefixes as $prefix) { @@ -151,8 +150,10 @@ function drupal_find_theme_functions($cache, $prefixes) { // are found using the base hook's pattern, not a pattern from an // intermediary suggestion. $pattern = isset($info['pattern']) ? $info['pattern'] : ($hook . '__'); - if (!isset($info['base hook']) && !empty($pattern)) { - $matches = preg_grep('/^' . $prefix . '_' . $pattern . '/', $theme_functions); + // Grep only the functions which are within the prefix group. + list($first_prefix,) = explode('_', $prefix, 2); + if (!isset($info['base hook']) && !empty($pattern) && isset($grouped_functions[$first_prefix])) { + $matches = preg_grep('/^' . $prefix . '_' . $pattern . '/', $grouped_functions[$first_prefix]); if ($matches) { foreach ($matches as $match) { $new_hook = substr($match, strlen($prefix) + 1);