summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Boerger <helly@php.net>2002-08-25 12:16:48 +0000
committerMarcus Boerger <helly@php.net>2002-08-25 12:16:48 +0000
commit6d97e0c3eb82603c82aa339d87ea7a92f4e57fe8 (patch)
tree30575a6955ac6f6683197820638994370b556ccc
parent95ffc663d9ba09dd7004b7023e92dad2cb539f66 (diff)
downloadphp-git-6d97e0c3eb82603c82aa339d87ea7a92f4e57fe8.tar.gz
Use zend_is_callable() instead of php_check_object_method_array() and
drop the latter. THX to Markus Fischer - i did not recognize this function. @Expanded ob_start() to allow object parameters without methodnames and @use default method __output_handler(). (Marcus)
-rw-r--r--main/output.c51
1 files changed, 22 insertions, 29 deletions
diff --git a/main/output.c b/main/output.c
index b7edc2e06d..6fa9ebc2da 100644
--- a/main/output.c
+++ b/main/output.c
@@ -480,34 +480,6 @@ static zval* php_ob_handler_from_string(const char *handler_name TSRMLS_DC)
}
/* }}} */
-/* {{{ php_check_object_method_array
- * This function set *name to the 'object->method()' of NULL if given.
- * The callee must free that result using efree() function.
- */
-static int php_check_object_method_array(HashTable *ht, char **name)
-{
- if (zend_hash_num_elements(ht)>1) {
- zval **object, **method;
-
- if (zend_hash_index_find(ht, 0, (void **) &object)!=FAILURE
- && zend_hash_index_find(ht, 1, (void **) &method)!=FAILURE)
- {
- if ((*object)->type == IS_OBJECT
- && (*method)->type == IS_STRING)
- {
- if (*name) {
- spprintf(name, 0, "%s->%s()", Z_OBJCE_PP(object)->name, Z_STRVAL_PP(method));
- }
- return 1;
- }
- }
- }
- if (*name)
- *name = NULL;
- return 0;
-}
-/* }}} */
-
/* {{{ php_ob_init
*/
static int php_ob_init(uint initial_size, uint block_size, zval *output_handler, uint chunk_size, zend_bool erase TSRMLS_DC)
@@ -546,12 +518,13 @@ static int php_ob_init(uint initial_size, uint block_size, zval *output_handler,
else if (output_handler && output_handler->type == IS_ARRAY) {
result = 0;
/* do we have array(object,method) */
- if (php_check_object_method_array(Z_ARRVAL_P(output_handler), &handler_name)) {
+ if (zend_is_callable(output_handler, 1, &handler_name)) {
SEPARATE_ZVAL(&output_handler);
output_handler->refcount++;
result = php_ob_init_named(initial_size, block_size, handler_name, output_handler, chunk_size, erase TSRMLS_CC);
efree(handler_name);
} else {
+ /* init all array elements recursively */
zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(output_handler), &pos);
while (zend_hash_get_current_data_ex(Z_ARRVAL_P(output_handler), (void **)&tmp, &pos) == SUCCESS) {
result &= php_ob_init(initial_size, block_size, *tmp, chunk_size, erase TSRMLS_CC);
@@ -560,6 +533,26 @@ static int php_ob_init(uint initial_size, uint block_size, zval *output_handler,
}
result = result ? SUCCESS : FAILURE;
}
+ else if (output_handler && output_handler->type == IS_OBJECT) {
+ /* use __output_handler if only an object is given */
+ zval *object_method;
+
+ MAKE_STD_ZVAL(object_method);
+ if (array_init(object_method) != FAILURE) {
+ add_next_index_zval(object_method, output_handler);
+ add_next_index_string(object_method, "__output_handler", 1);
+ if (zend_is_callable(object_method, 1, &handler_name)) {
+ object_method->refcount++;
+ result = php_ob_init_named(initial_size, block_size, handler_name, object_method, chunk_size, erase TSRMLS_CC);
+ efree(handler_name);
+ result = result ? SUCCESS : FAILURE;
+ } else {
+ result = FAILURE;
+ }
+ } else {
+ result = FAILURE;
+ }
+ }
else {
if (output_handler) {
SEPARATE_ZVAL(&output_handler);