helly Sat Jun 24 18:53:51 2006 UTC Modified files: /php-src/ext/reflection php_reflection.c Log: - Fix ReflectionObject::getProperties() + dyn properties http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/php_reflection.c?r1=1.236&r2=1.237&diff_format=u Index: php-src/ext/reflection/php_reflection.c diff -u php-src/ext/reflection/php_reflection.c:1.236 php-src/ext/reflection/php_reflection.c:1.237 --- php-src/ext/reflection/php_reflection.c:1.236 Sun Jun 11 23:46:53 2006 +++ php-src/ext/reflection/php_reflection.c Sat Jun 24 18:53:51 2006 @@ -20,7 +20,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_reflection.c,v 1.236 2006/06/11 23:46:53 bjori Exp $ */ +/* $Id: php_reflection.c,v 1.237 2006/06/24 18:53:51 helly Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -3106,6 +3106,34 @@ } /* }}} */ +/* {{{ _adddynproperty */ +static int _adddynproperty(zval **pptr, int num_args, va_list args, zend_hash_key *hash_key) +{ + zval *property; + zend_class_entry *ce = *va_arg(args, zend_class_entry**); + zval *retval = va_arg(args, zval*), member; + TSRMLS_FETCH(); + + if (hash_key->type == IS_UNICODE) { + if (hash_key->arKey.u[0] == 0) { + return 0; /* non public cannot be dynamic */ + } + ZVAL_UNICODEL(&member, hash_key->arKey.u, hash_key->nKeyLength-1, 0); + } else { + if (hash_key->arKey.s[0] == '\0') { + return 0; /* non public cannot be dynamic */ + } + ZVAL_STRINGL(&member, hash_key->arKey.s, hash_key->nKeyLength-1, 0); + } + if (zend_get_property_info(ce, &member, 1 TSRMLS_CC) == &EG(std_property_info)) { + ALLOC_ZVAL(property); + reflection_property_factory(ce, &EG(std_property_info), property TSRMLS_CC); + add_next_index_zval(retval, property); + } + return 0; +} +/* }}} */ + /* {{{ proto public ReflectionProperty[] ReflectionClass::getProperties() Returns an array of this class' properties */ ZEND_METHOD(reflection_class, getProperties) @@ -3129,6 +3157,11 @@ array_init(return_value); zend_hash_apply_with_arguments(&ce->properties_info, (apply_func_args_t) _addproperty, 3, &ce, return_value, filter); + + if (intern->obj && (filter & ZEND_ACC_PUBLIC) != 0 && Z_OBJ_HT_P(intern->obj)->get_properties) { + HashTable *properties = Z_OBJ_HT_P(intern->obj)->get_properties(intern->obj TSRMLS_CC); + zend_hash_apply_with_arguments(properties, (apply_func_args_t) _adddynproperty, 2, &ce, return_value); + } } /* }}} */ @@ -4775,7 +4808,7 @@ php_info_print_table_start(); php_info_print_table_header(2, "Reflection", "enabled"); - php_info_print_table_row(2, "Version", "$Id: php_reflection.c,v 1.236 2006/06/11 23:46:53 bjori Exp $"); + php_info_print_table_row(2, "Version", "$Id: php_reflection.c,v 1.237 2006/06/24 18:53:51 helly Exp $"); php_info_print_table_end(); } /* }}} */
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php