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

Reply via email to