? 1048322-4-features-override-recursion-error.patch
? 895250-3-features_override-cache.patch
? 931642-features_override-key-fix.patch
? features_override-key-fix.patch
Index: features_override.alter.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/features_override/features_override.alter.inc,v
retrieving revision 1.1
diff -u -p -r1.1 features_override.alter.inc
--- features_override.alter.inc	26 Aug 2010 15:26:41 -0000	1.1
+++ features_override.alter.inc	8 Feb 2011 22:48:19 -0000
@@ -10,6 +10,7 @@ function features_override_features_defa
     if ($override->component_type == $component && !empty($override->value)) {
       if (!empty($override->value['additions'])) {
         foreach ($override->value['additions'] as $addition) {
+          $reference =& $items[$override->component_id];
           $item =& $items[$override->component_id];
           foreach ($addition['keys'] as $key) {
             if ($key['type'] == 'object') {
@@ -18,12 +19,17 @@ function features_override_features_defa
             else {
               $item =& $item[$key['key']];
             }
+            if (_features_override_recursion_marker($item, $key['type'] == 'object') > 1) {
+              return;
+            }
           }
+          _features_override_leave_hive($reference);
           $item = $addition['value'];
         }
       }
       if (!empty($override->value['deletions'])) {
         foreach ($override->value['deletions'] as $deletion) {
+          $reference =& $items[$override->component_id];
           $item =& $items[$override->component_id];
           $last_key = array_pop($deletion['keys']);
           foreach ($deletion['keys'] as $key) {
@@ -33,7 +39,11 @@ function features_override_features_defa
             else {
               $item =& $item[$key['key']];
             }
+            if (_features_override_recursion_marker($item, $key['type'] == 'object') > 1) {
+              return;
+            }
           }
+          _features_override_leave_hive($reference);
           $copy = is_object($item) ? drupal_clone($item) : $item;
           if ($last_key['type'] == 'object') {
             unset($copy->{$last_key['key']});
@@ -53,9 +63,6 @@ function features_override_features_defa
  *
  * Dynamically declare alter functions for all supported components.
  *
- * Because this function indirectly calls features_include() on every page, it has
- * significant performance implications.
- *
  * @todo
  *   Either introduce a general alter hook for all features components or
  *   determine how to limit these alter calls to pages where they are needed.
