} /* }}} */
- ZVAL_ARR(&tmp, zend_std_get_properties(ZEND_THIS));
+ /* {{{ proto array ArrayObject::__serialize() */
+ SPL_METHOD(Array, __serialize)
+ {
+ spl_array_object *intern = Z_SPLARRAY_P(ZEND_THIS);
+ zval tmp;
+
+ if (zend_parse_parameters_none_throw() == FAILURE) {
+ return;
+ }
+
+ array_init(return_value);
+
+ /* flags */
+ ZVAL_LONG(&tmp, (intern->ar_flags & SPL_ARRAY_CLONE_MASK));
+ zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &tmp);
+
+ /* storage */
+ if (intern->ar_flags & SPL_ARRAY_IS_SELF) {
+ ZVAL_NULL(&tmp);
+ } else {
+ ZVAL_COPY(&tmp, &intern->array);
+ }
+ zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &tmp);
+
+ /* members */
++ ZVAL_ARR(&tmp, zend_std_get_properties(&intern->std));
+ Z_TRY_ADDREF(tmp);
+ zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &tmp);
+ }
+ /* }}} */
+
+
+ /* {{{ proto void ArrayObject::__unserialize(array data) */
+ SPL_METHOD(Array, __unserialize)
+ {
+ spl_array_object *intern = Z_SPLARRAY_P(ZEND_THIS);
+ HashTable *data;
+ zval *flags_zv, *storage_zv, *members_zv;
+ zend_long flags;
+
+ if (zend_parse_parameters_throw(ZEND_NUM_ARGS(), "h", &data) == FAILURE) {
+ return;
+ }
+
+ flags_zv = zend_hash_index_find(data, 0);
+ storage_zv = zend_hash_index_find(data, 1);
+ members_zv = zend_hash_index_find(data, 2);
+ if (!flags_zv || !storage_zv || !members_zv ||
+ Z_TYPE_P(flags_zv) != IS_LONG || Z_TYPE_P(members_zv) != IS_ARRAY) {
+ zend_throw_exception(spl_ce_UnexpectedValueException,
+ "Incomplete or ill-typed serialization data", 0);
+ return;
+ }
+
+ flags = Z_LVAL_P(flags_zv);
+ intern->ar_flags &= ~SPL_ARRAY_CLONE_MASK;
+ intern->ar_flags |= flags & SPL_ARRAY_CLONE_MASK;
+
+ if (flags & SPL_ARRAY_IS_SELF) {
+ zval_ptr_dtor(&intern->array);
+ ZVAL_UNDEF(&intern->array);
+ } else if (Z_TYPE_P(storage_zv) == IS_ARRAY) {
+ zval_ptr_dtor(&intern->array);
+ ZVAL_COPY_VALUE(&intern->array, storage_zv);
+ ZVAL_NULL(storage_zv);
+ SEPARATE_ARRAY(&intern->array);
+ } else {
+ spl_array_set_array(ZEND_THIS, intern, storage_zv, 0L, 1);
+ }
+
+ object_properties_load(&intern->std, Z_ARRVAL_P(members_zv));
+ }
+ /* }}} */
+
/* {{{ arginfo and function table */
ZEND_BEGIN_ARG_INFO_EX(arginfo_array___construct, 0, 0, 0)
ZEND_ARG_INFO(0, input)
} /* }}} */
- ZVAL_ARR(&tmp, zend_std_get_properties(ZEND_THIS));
+ /* {{{ proto array SplDoublyLinkedList::__serialize() */
+ SPL_METHOD(SplDoublyLinkedList, __serialize)
+ {
+ spl_dllist_object *intern = Z_SPLDLLIST_P(ZEND_THIS);
+ spl_ptr_llist_element *current = intern->llist->head;
+ zval tmp;
+
+ if (zend_parse_parameters_none_throw() == FAILURE) {
+ return;
+ }
+
+ array_init(return_value);
+
+ /* flags */
+ ZVAL_LONG(&tmp, intern->flags);
+ zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &tmp);
+
+ /* elements */
+ array_init_size(&tmp, intern->llist->count);
+ while (current) {
+ zend_hash_next_index_insert(Z_ARRVAL(tmp), ¤t->data);
+ current = current->next;
+ }
+ zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &tmp);
+
+ /* members */
++ ZVAL_ARR(&tmp, zend_std_get_properties(&intern->std));
+ Z_TRY_ADDREF(tmp);
+ zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &tmp);
+ } /* }}} */
+
+ /* {{{ proto void SplDoublyLinkedList::__unserialize(array serialized) */
+ SPL_METHOD(SplDoublyLinkedList, __unserialize) {
+ spl_dllist_object *intern = Z_SPLDLLIST_P(ZEND_THIS);
+ HashTable *data;
+ zval *flags_zv, *storage_zv, *members_zv, *elem;
+
+ if (zend_parse_parameters_throw(ZEND_NUM_ARGS(), "h", &data) == FAILURE) {
+ return;
+ }
+
+ flags_zv = zend_hash_index_find(data, 0);
+ storage_zv = zend_hash_index_find(data, 1);
+ members_zv = zend_hash_index_find(data, 2);
+ if (!flags_zv || !storage_zv || !members_zv ||
+ Z_TYPE_P(flags_zv) != IS_LONG || Z_TYPE_P(storage_zv) != IS_ARRAY ||
+ Z_TYPE_P(members_zv) != IS_ARRAY) {
+ zend_throw_exception(spl_ce_UnexpectedValueException,
+ "Incomplete or ill-typed serialization data", 0);
+ return;
+ }
+
+ intern->flags = (int) Z_LVAL_P(flags_zv);
+
+ ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(storage_zv), elem) {
+ spl_ptr_llist_push(intern->llist, elem);
+ } ZEND_HASH_FOREACH_END();
+
+ object_properties_load(&intern->std, Z_ARRVAL_P(members_zv));
+ } /* }}} */
+
/* {{{ proto void SplDoublyLinkedList::add(mixed index, mixed newval)
Inserts a new entry before the specified $index consisting of $newval. */
SPL_METHOD(SplDoublyLinkedList, add)
} /* }}} */
- ZVAL_ARR(&tmp, zend_std_get_properties(ZEND_THIS));
+ /* {{{ proto auto SplObjectStorage::__serialize() */
+ SPL_METHOD(SplObjectStorage, __serialize)
+ {
+ spl_SplObjectStorage *intern = Z_SPLOBJSTORAGE_P(ZEND_THIS);
+ spl_SplObjectStorageElement *elem;
+ zval tmp;
+
+ if (zend_parse_parameters_none_throw() == FAILURE) {
+ return;
+ }
+
+ array_init(return_value);
+
+ /* storage */
+ array_init_size(&tmp, 2 * zend_hash_num_elements(&intern->storage));
+ ZEND_HASH_FOREACH_PTR(&intern->storage, elem) {
+ Z_TRY_ADDREF(elem->obj);
+ zend_hash_next_index_insert(Z_ARRVAL(tmp), &elem->obj);
+ Z_TRY_ADDREF(elem->inf);
+ zend_hash_next_index_insert(Z_ARRVAL(tmp), &elem->inf);
+ } ZEND_HASH_FOREACH_END();
+ zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &tmp);
+
+ /* members */
- spl_object_storage_attach(intern, ZEND_THIS, key, val);
++ ZVAL_ARR(&tmp, zend_std_get_properties(&intern->std));
+ Z_TRY_ADDREF(tmp);
+ zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &tmp);
+ } /* }}} */
+
+ /* {{{ proto void SplObjectStorage::__unserialize(array serialized) */
+ SPL_METHOD(SplObjectStorage, __unserialize)
+ {
+ spl_SplObjectStorage *intern = Z_SPLOBJSTORAGE_P(ZEND_THIS);
+ HashTable *data;
+ zval *storage_zv, *members_zv, *key, *val;
+
+ if (zend_parse_parameters_throw(ZEND_NUM_ARGS(), "h", &data) == FAILURE) {
+ return;
+ }
+
+ storage_zv = zend_hash_index_find(data, 0);
+ members_zv = zend_hash_index_find(data, 1);
+ if (!storage_zv || !members_zv ||
+ Z_TYPE_P(storage_zv) != IS_ARRAY || Z_TYPE_P(members_zv) != IS_ARRAY) {
+ zend_throw_exception(spl_ce_UnexpectedValueException,
+ "Incomplete or ill-typed serialization data", 0);
+ return;
+ }
+
+ if (zend_hash_num_elements(Z_ARRVAL_P(storage_zv)) % 2 != 0) {
+ zend_throw_exception(spl_ce_UnexpectedValueException, "Odd number of elements", 0);
+ return;
+ }
+
+ key = NULL;
+ ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(storage_zv), val) {
+ if (key) {
+ if (Z_TYPE_P(key) != IS_OBJECT) {
+ zend_throw_exception(spl_ce_UnexpectedValueException, "Non-object key", 0);
+ return;
+ }
+
++ spl_object_storage_attach(intern, &intern->std, key, val);
+ key = NULL;
+ } else {
+ key = val;
+ }
+ } ZEND_HASH_FOREACH_END();
+
+ object_properties_load(&intern->std, Z_ARRVAL_P(members_zv));
+ }
+
ZEND_BEGIN_ARG_INFO(arginfo_Object, 0)
ZEND_ARG_INFO(0, object)
ZEND_END_ARG_INFO();