Hello Jani, how about allowing all those functions to return [internal/user], [user], [internal] or [[internal],[user]] depending on a flag?
best regards marcus Thursday, March 29, 2007, 12:44:31 AM, you wrote: > 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 > + Best regards, Marcus -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php