Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:27173 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 48161 invoked by uid 1010); 22 Dec 2006 01:24:00 -0000 Delivered-To: ezmlm-scan-internals@lists.php.net Delivered-To: ezmlm-internals@lists.php.net Received: (qmail 48146 invoked from network); 22 Dec 2006 01:24:00 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 22 Dec 2006 01:24:00 -0000 Authentication-Results: pb1.pair.com header.from=toomuchphp-phpdev@yahoo.com; sender-id=unknown; domainkeys=bad Authentication-Results: pb1.pair.com smtp.mail=toomuchphp-phpdev@yahoo.com; spf=permerror; sender-id=unknown Received-SPF: error (pb1.pair.com: domain yahoo.com from 206.190.49.161 cause and error) DomainKey-Status: bad X-DomainKeys: Ecelerity dk_validate implementing draft-delany-domainkeys-base-01 X-PHP-List-Original-Sender: toomuchphp-phpdev@yahoo.com X-Host-Fingerprint: 206.190.49.161 web54511.mail.yahoo.com Received: from [206.190.49.161] ([206.190.49.161:36183] helo=web54511.mail.yahoo.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id EA/09-19910-A633B854 for ; Thu, 21 Dec 2006 20:23:25 -0500 Received: (qmail 8326 invoked by uid 60001); 22 Dec 2006 01:22:48 -0000 Message-ID: <20061222012248.8324.qmail@web54511.mail.yahoo.com> DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.com; h=X-YMail-OSG:Received:Date:From:Reply-To:Subject:To:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-ID; b=4MrLIiMjIfNz42EntqnnAfsR6dzN9E+2yjyuk08VG7uPcYIsRxgHmuXbRFBjJjW9FkjY5OYbiDQzbIBAEfCirFb6uTxUKTWa0hn4sx5rfYxMPMxG9/ntxf4/Y21YYuxzo6cAanync+UVKQzzzPMlVZQbvmkWBHs5QNbxbbOGjAc=; X-YMail-OSG: XytYKbUVM1npl.zJP0jsoRoBpGBJLpptSdJ2G3tamghv4fEQF5mf51QdxbfsLySO5p1f43iF.y9x3DcQZWRcY7oWNE3i3lkD7kABRJEzf2a7TmCF4rLT_aqMJGf2bOkI2T_JzuUfbdaq_NQ- Received: from [58.109.16.235] by web54511.mail.yahoo.com via HTTP; Fri, 22 Dec 2006 12:22:48 EST Date: Fri, 22 Dec 2006 12:22:48 +1100 (EST) Reply-To: toomuchphp-phpdev@yahoo.com To: internals@lists.php.net MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit Subject: Patch: recursive call to __get() error From: toomuchphp-phpdev@yahoo.com (Peter Hodge) Hello, This patch for 5.2 provides an alternative error when you accidentally call __get() recursively when trying to access some property of a class. Currently, PHP says: "Notice: Undefined property: someClass::$someProperty" which makes it seem as though __get() is not called at all. This patch changes the error to: "Warning: Recursive call to __get() trying to read property: someClass::$someProperty" regards, Peter --- Zend.original/zend_object_handlers.c Fri Dec 22 10:36:32 2006 +++ Zend/zend_object_handlers.c Fri Dec 22 10:47:29 2006 @@ -325,30 +325,40 @@ zend_guard *guard; if (zobj->ce->__get && - zend_get_property_guard(zobj, property_info, member, &guard) == SUCCESS && - !guard->in_get) { - /* have getter - try with it! */ - guard->in_get = 1; /* prevent circular getting */ - rv = zend_std_call_getter(object, member TSRMLS_CC); - guard->in_get = 0; + zend_get_property_guard(zobj, property_info, member, &guard) == SUCCESS) { + /* only if not already in __get() */ + if(!guard->in_get) { + /* have getter - try with it! */ + guard->in_get = 1; /* prevent circular getting */ + rv = zend_std_call_getter(object, member TSRMLS_CC); + guard->in_get = 0; - if (rv) { - retval = &rv; - if (type == BP_VAR_W || type == BP_VAR_RW || type == BP_VAR_UNSET) { - if (rv->refcount > 0) { - zval *tmp = rv; + if (rv) { + retval = &rv; + if (type == BP_VAR_W || type == BP_VAR_RW || type == BP_VAR_UNSET) { + if (rv->refcount > 0) { + zval *tmp = rv; - ALLOC_ZVAL(rv); - *rv = *tmp; - zval_copy_ctor(rv); - rv->is_ref = 0; - rv->refcount = 0; - } - if (Z_TYPE_P(rv) != IS_OBJECT) { - zend_error(E_NOTICE, "Indirect modification of overloaded property %s::$%s has no effect", zobj->ce->name, Z_STRVAL_P(member)); + ALLOC_ZVAL(rv); + *rv = *tmp; + zval_copy_ctor(rv); + rv->is_ref = 0; + rv->refcount = 0; + } + if (Z_TYPE_P(rv) != IS_OBJECT) { + zend_error(E_NOTICE, "Indirect modification of overloaded property %s::$%s has no effect", zobj->ce->name, Z_STRVAL_P(member)); + } } + } else { + retval = &EG(uninitialized_zval_ptr); + } + } + else { + /* already in __get() */ + if (!silent) { + zend_error(E_WARNING, "Recursive call to __get() trying to read property: %s::$%s", + zobj->ce->name, Z_STRVAL_P(member)); } - } else { retval = &EG(uninitialized_zval_ptr); } } else { Send instant messages to your online friends http://au.messenger.yahoo.com