This patch allows get_declared_classes and get_declared_interfaces()
functions to return the information in associative array with "internal"
and "user" keys when passed the optional parameter. And makes them a bit
more consistent with similar functions like get_defined_functions()..

Example:

[EMAIL PROTECTED] php_5_2tst]$ sapi/cli/php -r 'class foobar {}
print_r(get_declared_classes(true));'|less
Array
(
    [internal] => Array
        (
            [0] => stdClass
            [1] => Exception
            [2] => ErrorException
            [3] => __PHP_Incomplete_Class
            [4] => php_user_filter
            [5] => Directory
            [6] => DateTime
            [7] => DateTimeZone
        )

    [user] => Array
        (
            [0] => foobar
        )

)

--Jani

Index: zend_builtin_functions.c
===================================================================
RCS file: /repository/ZendEngine2/zend_builtin_functions.c,v
retrieving revision 1.277.2.12.2.16
diff -u -r1.277.2.12.2.16 zend_builtin_functions.c
--- zend_builtin_functions.c    24 Feb 2007 02:17:23 -0000      1.277.2.12.2.16
+++ zend_builtin_functions.c    28 Mar 2007 12:19:54 -0000
@@ -1333,46 +1333,76 @@
        zval *array = va_arg(args, zval *);
        zend_uint mask = va_arg(args, zend_uint);
        zend_uint comply = va_arg(args, zend_uint);
-       zend_uint comply_mask = (comply)? mask:0;
+       zend_uint comply_mask = (comply) ? mask : 0;
        zend_class_entry *ce  = *pce;
 
-       if ((hash_key->nKeyLength==0 || hash_key->arKey[0]!=0)
+       if ((hash_key->nKeyLength == 0 || hash_key->arKey[0] != 0)
                && (comply_mask == (ce->ce_flags & mask))) {
-               add_next_index_stringl(array, ce->name, ce->name_length, 1);
+               
+               if (num_args == 3) {
+                       add_next_index_stringl(array, ce->name, 
ce->name_length, 1);
+               } else if (num_args == 5) {
+                       zval *internal_ar = va_arg(args, zval *),
+                            *user_ar     = va_arg(args, zval *);
+
+                       if (ce->type == ZEND_INTERNAL_CLASS) {
+                               add_next_index_stringl(internal_ar, ce->name, 
ce->name_length, 1);
+                       } else if (ce->type == ZEND_USER_CLASS) {
+                               add_next_index_stringl(user_ar, ce->name, 
ce->name_length, 1);
+                       }
+               }
        }
        return ZEND_HASH_APPLY_KEEP;
 }
 
-
-/* {{{ proto array get_declared_classes()
-   Returns an array of all declared classes. */
-ZEND_FUNCTION(get_declared_classes)
+static void 
do_get_declared_classes_or_interfaces(INTERNAL_FUNCTION_PARAMETERS, zend_uint 
mask, zend_uint comply)
 {
-       zend_uint mask = ZEND_ACC_INTERFACE;
-       zend_uint comply = 0;
+       zend_bool return_assoc = 0;
 
-       if (ZEND_NUM_ARGS() != 0) {
-               ZEND_WRONG_PARAM_COUNT();
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|b", 
&return_assoc) == FAILURE) {
+               return;
        }
-
+                
        array_init(return_value);
-       zend_hash_apply_with_arguments(EG(class_table), (apply_func_args_t) 
copy_class_or_interface_name, 3, return_value, mask, comply);
+       
+       if (return_assoc)
+       {
+               zval *internal;
+               zval *user;
+
+               MAKE_STD_ZVAL(internal);
+               MAKE_STD_ZVAL(user);
+
+               array_init(internal);
+               array_init(user);
+               
+               zend_hash_apply_with_arguments(EG(class_table), 
(apply_func_args_t) copy_class_or_interface_name, 5, return_value, mask, 
comply, internal, user);
+               zend_hash_add(Z_ARRVAL_P(return_value), "internal", 
sizeof("internal"), (void **) &internal, sizeof(zval *), NULL);
+               zend_hash_add(Z_ARRVAL_P(return_value), "user", sizeof("user"), 
(void **) &user, sizeof(zval *), NULL);
+       } else {
+               zend_hash_apply_with_arguments(EG(class_table), 
(apply_func_args_t) copy_class_or_interface_name, 3, return_value, mask, 
comply);
+       }
 }
 /* }}} */
 
-/* {{{ proto array get_declared_interfaces()
-   Returns an array of all declared interfaces. */
+/* {{{ proto array get_declared_classes([bool return_assoc])
+   Returns an array of declared classes. */
+ZEND_FUNCTION(get_declared_classes)
+{
+       zend_uint mask = ZEND_ACC_INTERFACE;
+       zend_uint comply = 0;
+
+       do_get_declared_classes_or_interfaces(INTERNAL_FUNCTION_PARAM_PASSTHRU, 
mask, comply);
+}
+ 
+/* {{{ proto array get_declared_interfaces([bool assoc])
+   Returns an array of declared interfaces. */
 ZEND_FUNCTION(get_declared_interfaces)
 {
        zend_uint mask = ZEND_ACC_INTERFACE;
        zend_uint comply = 1;
 
-       if (ZEND_NUM_ARGS() != 0) {
-               ZEND_WRONG_PARAM_COUNT();
-       }
-
-       array_init(return_value);
-       zend_hash_apply_with_arguments(EG(class_table), (apply_func_args_t) 
copy_class_or_interface_name, 3, return_value, mask, comply);
+       do_get_declared_classes_or_interfaces(INTERNAL_FUNCTION_PARAM_PASSTHRU, 
mask, comply);
 }
 /* }}} */
 
Index: tests/017.phpt
===================================================================
RCS file: /repository/ZendEngine2/tests/017.phpt,v
retrieving revision 1.1.2.2
diff -u -r1.1.2.2 017.phpt
--- tests/017.phpt      21 Nov 2006 11:11:39 -0000      1.1.2.2
+++ tests/017.phpt      28 Mar 2007 12:19:54 -0000
@@ -28,7 +28,11 @@
 var_dump(gettype(get_defined_functions()));
 var_dump(count(get_defined_functions()));
 
-var_dump(get_declared_interfaces(true));
+var_dump(get_declared_classes(true,true));
+var_dump(gettype(get_declared_classes()));
+var_dump(count(get_declared_classes()));
+
+var_dump(get_declared_interfaces(true,true));
 var_dump(gettype(get_declared_interfaces()));
 var_dump(count(get_declared_interfaces()));
 
@@ -67,7 +71,12 @@
 string(5) "array"
 int(%d)
 
-Warning: Wrong parameter count for get_declared_interfaces() in %s on line %d
+Warning: get_declared_classes() expects at most 1 parameter, 2 given in %s on 
line %d
+NULL
+string(5) "array"
+int(%d)
+
+Warning: get_declared_interfaces() expects at most 1 parameter, 2 given in %s 
on line %d
 NULL
 string(5) "array"
 int(%d)
@@ -80,3 +89,4 @@
 string(5) "array"
 int(%d)
 Done
+

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to