Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:6755 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 71527 invoked by uid 1010); 3 Jan 2004 01:21:13 -0000 Delivered-To: ezmlm-scan-internals@lists.php.net Delivered-To: ezmlm-internals@lists.php.net Received: (qmail 71461 invoked from network); 3 Jan 2004 01:21:13 -0000 Received: from unknown (HELO blacksheep.csh.rit.edu) (129.21.60.6) by pb1.pair.com with SMTP; 3 Jan 2004 01:21:13 -0000 Received: from fury.csh.rit.edu (fury.csh.rit.edu [IPv6:2001:470:1f00:135:a00:20ff:fe8d:5399]) by blacksheep.csh.rit.edu (Postfix) with ESMTP id 0AAEB12E for ; Fri, 2 Jan 2004 20:21:13 -0500 (EST) Received: by fury.csh.rit.edu (Postfix, from userid 37404) id D3568137F; Fri, 2 Jan 2004 20:21:12 -0500 (EST) Date: Fri, 2 Jan 2004 20:21:12 -0500 To: internals@lists.php.net Message-ID: <20040103012111.GC23760@csh.rit.edu> Mail-Followup-To: internals@lists.php.net References: <20040103000120.GA23760@csh.rit.edu> <20040103000921.GA3712@gravitonic.com> <20040103002841.GB23760@csh.rit.edu> <20040103010033.GA4245@gravitonic.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20040103010033.GA4245@gravitonic.com> Subject: Re: [PHP-DEV] Custom object creation and reference counts From: jon@php.net (Jon Parise) On Fri, Jan 02, 2004 at 05:00:33PM -0800, Andrei Zmievski wrote: > > It appears to be a side-effect of not defining the 'scope' field in > > the zend_internal_function call that is invokved from my custom > > 'constructor_get' handler. If the 'scope' field is NULL, my object > > is treated as a reference. If I assign my class entry to the 'scope' > > field, the object is "normal" (i.e. not a reference). > > Hmm, can I see the code? Here's my constructor function definition: zend_internal_function php_python_constructor_function = { ZEND_INTERNAL_FUNCTION, /* type */ "python", /* function_name */ &python_class_entry, /* scope */ 0, /* fn_flags */ NULL, /* prototype */ 0, /* num_args */ NULL, /* arg_info */ 0, /* pass_rest_by_reference */ ZEND_FN(python_new) /* handler */ }; I use this function as part of my class initialization: INIT_CLASS_ENTRY(python_class_entry, "python", NULL); python_class_entry.create_object = python_object_create; python_class_entry.constructor = (union _zend_function *)&php_python_constructor_function; zend_register_internal_class(&python_class_entry TSRMLS_CC); And I return the 'constructor' value from my 'constructor_get' handler: static union _zend_function * python_constructor_get(zval *object TSRMLS_DC) { php_python_object *obj = PIP_FETCH(object); return obj->ce->constructor; } If I specify NULL for the 'scope' field, I end up with a second reference to the new object. I don't know if that's intentional or a bug. I'm still getting familiar with the new object model code. -- Jon Parise (jon@php.net) :: The PHP Project (http://www.php.net/)