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

Reply via email to