- if (o) {
- convert_to_string_ex(&o);
- zend_symtable_update(Z_ARRVAL_P(proxied_value), Z_STRVAL_P(o), Z_STRLEN_P(o) + 1, (void *) &value, sizeof(zval *), NULL);
- } else {
- zend_hash_next_index_insert(Z_ARRVAL_P(proxied_value), (void *) &value, sizeof(zval *), NULL);
+ SEPARATE_ZVAL(value);
+ Z_TRY_ADDREF_P(value);
+
+ if (offset) {
+ zend_string *zs = zval_get_string(offset);
+ zend_symtable_update(Z_ARRVAL(proxied_value), zs, value);
+ zend_string_release(zs);
+ } else {
+ zend_hash_next_index_insert(Z_ARRVAL(proxied_value), value);
+ }
+
+ set_proxied_value(object, &proxied_value);
+
+ debug_propro(-1, "dim_write", get_propro(object), offset, &proxied_value);
+
+ zval_ptr_dtor(&proxied_value);
+}
+
+static void unset_dimension(zval *object, zval *offset)
+{
+ zval proxied_value;
+
+ debug_propro(1, "dim_unset", get_propro(object), offset, NULL);
+
+ ZVAL_UNDEF(&proxied_value);
+ get_proxied_value(object, &proxied_value);
+
+ if (Z_TYPE(proxied_value) == IS_ARRAY) {
+ zval *o = offset;
+ ZEND_RESULT_CODE rv;
+
+ convert_to_string_ex(o);
+ rv = zend_symtable_del(Z_ARRVAL(proxied_value), Z_STR_P(o));
+ if (SUCCESS == rv) {
+ set_proxied_value(object, &proxied_value);