Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:906 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 38981 invoked from network); 14 Apr 2003 16:26:47 -0000 Received: from unknown (HELO moutng.kundenserver.de) (212.227.126.189) by pb1.pair.com with SMTP; 14 Apr 2003 16:26:47 -0000 Received: from [212.227.126.160] (helo=mrelayng.kundenserver.de) by moutng.kundenserver.de with esmtp (Exim 3.35 #1) id 1956n9-0005XZ-00 for internals@lists.php.net; Mon, 14 Apr 2003 18:26:47 +0200 Received: from [217.80.180.205] (helo=[217.80.180.205]) by mrelayng.kundenserver.de with asmtp (Exim 3.35 #1) id 1956n8-00053d-00 for internals@lists.php.net; Mon, 14 Apr 2003 18:26:46 +0200 To: internals@lists.php.net Content-Type: multipart/mixed; boundary="=-TqC40xjur/wyW887MuF6" Organization: Message-ID: <1050337636.25691.2406.camel@localhost> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.1 Date: 14 Apr 2003 18:27:17 +0200 Subject: Patch for get_class() From: thekid@thekid.de (Timm Friebe) --=-TqC40xjur/wyW887MuF6 Content-Type: text/plain Content-Transfer-Encoding: 7bit This patch adds an optional parameter to get_class to retreive it's fully qualified class name (including the namespace, if existant). This solves an issue with get_class and a constellation such as: namespace Foo { class Bar { } } namespace Baz { class Bar { } } - Timm --=-TqC40xjur/wyW887MuF6 Content-Disposition: attachment; filename=zend_builtin_functions.c.diff Content-Type: text/x-patch; name=zend_builtin_functions.c.diff; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Index: Zend/zend_builtin_functions.c =================================================================== RCS file: /repository/ZendEngine2/zend_builtin_functions.c,v retrieving revision 1.184 diff -u -r1.184 zend_builtin_functions.c --- Zend/zend_builtin_functions.c 8 Apr 2003 18:22:32 -0000 1.184 +++ Zend/zend_builtin_functions.c 14 Apr 2003 16:25:00 -0000 @@ -511,35 +511,42 @@ /* }}} */ -/* {{{ proto string get_class(object object) +/* {{{ proto string get_class(object object [, bool fully_qualified]) Retrieves the class name */ ZEND_FUNCTION(get_class) { - zval **arg; + zval *arg; char *name; + char *fullname; + long fully_qualified = 0; zend_uint name_len; + zend_class_entry *ce; - if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &arg)==FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o|b", &arg, &fully_qualified) == FAILURE) { ZEND_WRONG_PARAM_COUNT(); } - if (Z_TYPE_PP(arg) != IS_OBJECT) { + + ce = zend_get_class_entry(arg TSRMLS_CC); + if (!ce) { RETURN_FALSE; } - - if (Z_OBJ_HT_PP(arg)->get_class_name == NULL || - Z_OBJ_HT_PP(arg)->get_class_name(*arg, &name, &name_len, 0 TSRMLS_CC) != SUCCESS) { - zend_class_entry *ce; - - ce = zend_get_class_entry(*arg TSRMLS_CC); - if (!ce) { - RETURN_FALSE; - } + + if (Z_OBJ_HT_P(arg)->get_class_name == NULL || + Z_OBJ_HT_P(arg)->get_class_name(arg, &name, &name_len, 0 TSRMLS_CC) != SUCCESS) { name = ce->name; name_len = ce->name_length; } - - RETURN_STRINGL(name, name_len, 1); + if (!fully_qualified + || (!(ce->ns && ce->ns != &CG(global_namespace) && ce->ns->name))) { + RETURN_STRINGL(name, name_len, 1); + } + + fullname= (char *)emalloc(name_len + ce->ns->name_length + 1 + 2); + strncpy(fullname, ce->ns->name, ce->ns->name_length + 1); + strncat(fullname, "::", 2); + strncat(fullname, name, name_len); + RETURN_STRINGL(fullname, name_len + ce->ns->name_length + 2, 0); } /* }}} */ --=-TqC40xjur/wyW887MuF6--