diff options
author | Marcus Boerger <helly@php.net> | 2002-08-25 12:16:48 +0000 |
---|---|---|
committer | Marcus Boerger <helly@php.net> | 2002-08-25 12:16:48 +0000 |
commit | 6d97e0c3eb82603c82aa339d87ea7a92f4e57fe8 (patch) | |
tree | 30575a6955ac6f6683197820638994370b556ccc | |
parent | 95ffc663d9ba09dd7004b7023e92dad2cb539f66 (diff) | |
download | php-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.c | 51 |
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); |