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