Index: includes/common.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/common.inc,v
retrieving revision 1.788
diff -u -r1.788 common.inc
--- includes/common.inc	21 Aug 2008 19:36:36 -0000	1.788
+++ includes/common.inc	30 Aug 2008 23:01:34 -0000
@@ -2727,7 +2727,7 @@
  *   The rendered HTML.
  */
 function drupal_render(&$elements) {
-  if (!isset($elements) || (isset($elements['#access']) && !$elements['#access'])) {
+  if (!isset($elements) || !element_access($elements)) {
     return NULL;
   }
 
@@ -2817,6 +2817,17 @@
 }
 
 /**
+ * Determine whether the user has access to view or edit an array element.
+ */
+function element_access(&$element, $op = 'view') {
+  if (isset($element['#access'])) {
+    $access = $element['#access'];
+    return is_string($access) ? function_exists($access) && $access($element, $op) : $access;
+  }
+  return TRUE;
+}
+
+/**
  * Function used by uasort to sort structured arrays by weight.
  */
 function element_sort($a, $b) {
Index: includes/form.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/form.inc,v
retrieving revision 1.281
diff -u -r1.281 form.inc
--- includes/form.inc	17 Aug 2008 11:08:23 -0000	1.281
+++ includes/form.inc	30 Aug 2008 23:03:08 -0000
@@ -879,7 +879,7 @@
     }
 
     // Deny access to child elements if parent is denied.
-    if (isset($form['#access']) && !$form['#access']) {
+    if (!element_access($form, 'edit')) {
       $form[$key]['#access'] = FALSE;
     }
 
@@ -970,7 +970,7 @@
 
   if (!isset($form['#value']) && !array_key_exists('#value', $form)) {
     $function = !empty($form['#value_callback']) ? $form['#value_callback'] : 'form_type_' . $form['#type'] . '_value';
-    if (($form['#programmed']) || ((!isset($form['#access']) || $form['#access']) && isset($form['#post']) && (isset($form['#post']['form_id']) && $form['#post']['form_id'] == $form_id))) {
+    if (($form['#programmed']) || (element_access($form, 'edit') && isset($form['#post']) && (isset($form['#post']['form_id']) && $form['#post']['form_id'] == $form_id))) {
       $edit = $form['#post'];
       foreach ($form['#parents'] as $parent) {
         $edit = isset($edit[$parent]) ? $edit[$parent] : NULL;