Index: includes/common.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/common.inc,v
retrieving revision 1.1005
diff -u -p -r1.1005 common.inc
--- includes/common.inc	3 Oct 2009 19:16:03 -0000	1.1005
+++ includes/common.inc	4 Oct 2009 02:01:17 -0000
@@ -4208,52 +4208,51 @@ function drupal_system_listing($mask, $d
 }
 
 /**
- * Hands off structured Drupal arrays to type-specific *_alter implementations.
+ * Hands off alterable variables to type-specific *_alter implementations.
  *
- * This dispatch function hands off structured Drupal arrays to type-specific
- * *_alter implementations. It ensures a consistent interface for all altering
- * operations.
+ * This dispatch function hands off the passed in variables to type-specific
+ * hook_TYPE_alter() implementations in modules. It ensures a consistent
+ * interface for all altering operations.
  *
  * @param $type
- *   The data type of the structured array. 'form', 'links',
- *   'node_content', and so on are several examples.
- * @param $data
- *   The structured array to be altered.
+ *   The data type of the structured array. 'element_info', 'form', and
+ *   'node_content' are several examples.
  * @param ...
- *   Any additional params will be passed on to the called
- *   hook_$type_alter functions.
+ *   A variable amount of arguments to be altered or to provide as context,
+ *   which will be passed on to hook_$type_alter() functions.
  */
-function drupal_alter($type, &$data) {
-  // PHP's func_get_args() always returns copies of params, not references, so
-  // drupal_alter() can only manipulate data that comes in via the required first
-  // param. For the edge case functions that must pass in an arbitrary number of
-  // alterable parameters (hook_form_alter() being the best example), an array of
-  // those params can be placed in the __drupal_alter_by_ref key of the $data
-  // array. This is somewhat ugly, but is an unavoidable consequence of a flexible
-  // drupal_alter() function, and the limitations of func_get_args().
-  // @todo: Remove this in Drupal 7.
-  if (is_array($data) && isset($data['__drupal_alter_by_ref'])) {
-    $by_ref_parameters = $data['__drupal_alter_by_ref'];
-    unset($data['__drupal_alter_by_ref']);
-  }
-
-  // Hang onto a reference to the data array so that it isn't blown away later.
-  // Also, merge in any parameters that need to be passed by reference.
-  $args = array(&$data);
-  if (isset($by_ref_parameters)) {
-    $args = array_merge($args, $by_ref_parameters);
-  }
-
-  // Now, use func_get_args() to pull in any additional parameters passed into
-  // the drupal_alter() call.
-  $additional_args = func_get_args();
-  array_shift($additional_args);
-  array_shift($additional_args);
-  $args = array_merge($args, $additional_args);
-
+function drupal_alter($type, &$arg1 = NULL, &$arg2 = NULL, &$arg3 = NULL, &$arg4 = NULL, &$arg5 = NULL, &$arg6 = NULL, &$arg7 = NULL) {
   foreach (module_implements($type . '_alter') as $module) {
     $function = $module . '_' . $type . '_alter';
-    call_user_func_array($function, $args);
+    switch (func_num_args()) {
+      case 2:
+        $function($arg1);
+        break;
+
+      case 3:
+        $function($arg1, $arg2);
+        break;
+
+      case 4:
+        $function($arg1, $arg2, $arg3);
+        break;
+
+      case 5:
+        $function($arg1, $arg2, $arg3, $arg4);
+        break;
+
+      case 6:
+        $function($arg1, $arg2, $arg3, $arg4, $arg5);
+        break;
+
+      case 7:
+        $function($arg1, $arg2, $arg3, $arg4, $arg5, $arg6);
+        break;
+
+      case 8:
+        $function($arg1, $arg2, $arg3, $arg4, $arg5, $arg6, $arg7);
+        break;
+    }
   }
 }
 
Index: includes/form.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/form.inc,v
retrieving revision 1.378
diff -u -p -r1.378 form.inc
--- includes/form.inc	3 Oct 2009 20:17:46 -0000	1.378
+++ includes/form.inc	4 Oct 2009 01:35:57 -0000
@@ -669,20 +669,11 @@ function drupal_prepare_form($form_id, &
     }
   }
 
-  // Normally, we would call drupal_alter($form_id, $form, $form_state).
-  // However, drupal_alter() normally supports just one byref parameter. Using
-  // the __drupal_alter_by_ref key, we can store any additional parameters
-  // that need to be altered, and they'll be split out into additional params
-  // for the hook_form_alter() implementations.
-  // @todo: Remove this in Drupal 7.
-  $data = &$form;
-  $data['__drupal_alter_by_ref'] = array(&$form_state);
-  drupal_alter('form_' . $form_id, $data);
-
-  // __drupal_alter_by_ref is unset in the drupal_alter() function, we need
-  // to repopulate it to ensure both calls get the data.
-  $data['__drupal_alter_by_ref'] = array(&$form_state);
-  drupal_alter('form', $data, $form_id);
+  // Invoke hook_form_FORM_ID_alter() implementations.
+  drupal_alter('form_' . $form_id, $form, $form_state);
+
+  // Invoke hook_form_alter() implementations.
+  drupal_alter('form', $form, $form_state, $form_id);
 }
 
 
