Hi everybody.  I'm working on an extension that creates classes, and I
want to add class variables to the classes.  It looks like,
internally, class variables are stored in the
zend_class_entry.default_properties hash.  Manipulating this hash has
the effect desired, however I seem to have misunderstood the memory
management issues somehow; the code below causes leaks and crashes.

Is there an official way to add class variables to a class from C?  Is
there anything obviously wrong with the code below?  

Thanks!!
-Tim

static zend_class_entry *class_name_class_entry;
static zend_class_entry tmp_class_entry;

int add_default_property_null(zend_class_entry *class_entry, 
                              const char *name)
{
    zval *property;
    int ret;

    MAKE_STD_ZVAL(property); 
    ZVAL_NULL(property);
    return zend_hash_update(&class_entry->default_properties, name, 
                            strlen(name)+1,  (void *)&property, sizeof(zval *), NULL);
}



int add_default_property_zval(zend_class_entry *class_entry, 
                              const char *name, 
                              zval **value)
{
    zval *aval;

    MAKE_STD_ZVAL(aval);
    *aval = **value;
    zval_add_ref(&aval);
    zval_copy_ctor(aval);
    return zend_hash_update(&class_entry->default_properties, name, 
                            strlen(name)+1, (void *)&aval, sizeof(zval *), NULL);
}


void define_a_class() 
{
   /* make a class with two properties, one of which is an array */        
    zval *wrapper;
    zval *array;

    INIT_CLASS_ENTRY(tmp_class_entry, "class_name", class_name_functions);
    class_name_class_entry = zend_register_internal_class(&tmp_class_entry);

    add_default_property_null(class_name_class_entry, "prop_name");

    MAKE_STD_ZVAL(array);
    array_init(array);
    add_next_index_string(array, "foo", 1);
    add_default_property_zval(class_name_class_entry, "prop_name1", &array); 

}



-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to