assigned to its objects.
Implementation notes for overloaded object modules:
- If you return a zval which is not otherwise referenced by the extension
or the engine's symbol table, its reference count should be 0.
- If you receive a value zval in write_property/write_dimension, you
may only modify it if its reference count is 1. Otherwise, you must
create a copy of that zval before making any changes. You should NOT
modify the reference count of the value passed to you.
Have fun!
static void
change_node_zval(xmlNodePtr node, zval *value)
{
+ zval value_copy;
+
switch (Z_TYPE_P(value)) {
case IS_LONG:
case IS_BOOL:
case IS_DOUBLE:
case IS_NULL:
+ if (value->refcount > 1) {
+ value_copy = *value;
+ zval_copy_ctor(&value_copy);
+ value = &value_copy;
+ }
convert_to_string(value);
+ /* break missing intentionally */
case IS_STRING:
xmlNodeSetContentLen(node, Z_STRVAL_P(value), Z_STRLEN_P(value));
+ if (value == &value_copy) {
+ zval_dtor(value);
+ }
break;
default:
php_error(E_WARNING, "It is not possible to assign complex types to nodes");