Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:4008 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 91272 invoked from network); 15 Aug 2003 22:33:38 -0000 Received: from unknown (HELO mail.zend.com) (192.117.235.230) by pb1.pair.com with SMTP; 15 Aug 2003 22:33:38 -0000 Received: (qmail 31194 invoked from network); 15 Aug 2003 22:33:36 -0000 Received: from localhost (HELO zeev-laptop.zend.com) (127.0.0.1) by localhost with SMTP; 15 Aug 2003 22:33:36 -0000 Reply-To: zeev@zend.com Message-ID: <5.1.0.14.2.20030816012940.0675dff8@localhost> X-Sender: zeev@localhost X-Mailer: QUALCOMM Windows Eudora Version 5.1 Date: Sat, 16 Aug 2003 01:38:46 +0300 To: Rasmus Lerdorf Cc: internals@lists.php.net In-Reply-To: Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii"; format=flowed Subject: Re: [PHP-DEV] Zend bug? Overloading API in PHP4 From: zeev@zend.com (Zeev Suraski) References: At 01:10 16/08/2003, Rasmus Lerdorf wrote: >Did the overloading API in PHP4 actually ever work? Yep. > I have done some >simple stuff with it in the past, but I tried using it for something real >today and it is falling over. I have a very simple example extension >which illustrates it. See http://lerdorf.com/ovl.tar.gz > >For the lazy, here is the meat of it. The problem is in my set function >which looks like this: > >int _ovl_property_set(zend_property_reference *prop_ref, zval *value) { > zend_llist_element *element = prop_ref->elements_list->head; > zval overloaded_property = ((zend_overloaded_element > *)(element->data))->element; > > zval_add_ref(&value); > add_property_zval(prop_ref->object, Z_STRVAL(overloaded_property), > value); > return SUCCESS; >} > >If I do: > > $obj->foo = array(1,2,3); > >Then the zval value that gets passed to my set function is messed up. If >instead I do: > > $tmp = array(1,2,3); > $obj->foo = $tmp; > >Then everything is fine. > >The http://lerdorf.com/ovl.tar.gz tarball has a full self-contained >example of the problem if someone wouldn't mind having a look. You can't (reliably) connect to zval's that are passed to the setter callback in ZE1, as they're not necessarily reference counted. If you want to retain them, you have to duplicate them (using zval_copy_ctor()). array(1,2,3) is a temporary value that is destroyed regardless of its reference count. Zeev