Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:28640 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 57519 invoked by uid 1010); 31 Mar 2007 09:17:46 -0000 Delivered-To: ezmlm-scan-internals@lists.php.net Delivered-To: ezmlm-internals@lists.php.net Received: (qmail 57503 invoked from network); 31 Mar 2007 09:17:46 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 31 Mar 2007 09:17:46 -0000 Authentication-Results: pb1.pair.com header.from=helly@php.net; sender-id=unknown Authentication-Results: pb1.pair.com smtp.mail=helly@php.net; spf=permerror; sender-id=unknown Received-SPF: error (pb1.pair.com: domain php.net from 85.214.94.56 cause and error) X-PHP-List-Original-Sender: helly@php.net X-Host-Fingerprint: 85.214.94.56 aixcept.net Received: from [85.214.94.56] ([85.214.94.56:59733] helo=h1149922.serverkompetenz.net) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 60/19-22779-6372E064 for ; Sat, 31 Mar 2007 04:17:43 -0500 Received: from baumbart.mbo (dslb-084-063-034-145.pools.arcor-ip.net [84.63.34.145]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by h1149922.serverkompetenz.net (Postfix) with ESMTP id AFE3C1B361C; Sat, 31 Mar 2007 11:17:37 +0200 (CEST) Date: Sat, 31 Mar 2007 11:17:48 +0200 Reply-To: Marcus Boerger X-Priority: 3 (Normal) Message-ID: <1003177097.20070331111748@marcus-boerger.de> To: Jani Taskinen CC: internals@lists.php.net, sniper@iki.fi, iliaa@php.net In-Reply-To: <460AEFCF.9020005@sci.fi> References: <460AEFCF.9020005@sci.fi> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Subject: Re: [PHP-DEV] [PATCH] Allow get_declared_classes() and get_declared_interfaces() return user/internal class/interface separately From: helly@php.net (Marcus Boerger) 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