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