I've been rewriting my embedded Python extension for PHP5 so that I
can take advantage of ZE2's spiffy object handler system. I've just
gotten most things working, but I noticed that my custom object
destructor is never being executed.
I ran the following through the debugger a few times:
$p = new Python('foo', 'Test');
And compared it to the execution of a "native" PHP class:
class Foo {}
$f = new Foo();
The difference appears to lay with the reference counts on the
resultant store object. With my Python class, an additional reference
is added to the store object, so zend_objects_store_del_ref() never
drops the reference count to zero, and the destructor is never
invoked.
It looks like this code from zend_execute.c is responsible for the
added reference:
if (PZVAL_IS_REF(value) && value->refcount > 0) {
ALLOC_ZVAL(variable_ptr);
*variable_ptr_ptr = variable_ptr;
*variable_ptr = *value;
zval_copy_ctor(variable_ptr);
variable_ptr->refcount=1;
break;
}
In my case, 'value' is a reference (PZVAL_IS_REF(value) == 1), and in
the case of the native PHP object, it isn't. zval_copy_ctor() calls
zend_objects_store_add_ref(), which increments the store object's
reference count.
Two questions:
Why is my object being treated as a reference while the native PHP
object is not?
'variable_ptr->refcount=1;' resets the reference count of the
variable's zval to 1, but the underlying _store_object's reference
count is still incremented. What will ever reclaim that reference on
the _store_object?
I'm still finding my way around the the "new" ZE2 way of doing things,
so please be gentle if the answers to these questions is obvious.
--
Jon Parise ([EMAIL PROTECTED]) :: The PHP Project (http://www.php.net/)
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php