]> granicus.if.org Git - php/commitdiff
Merge branch 'PHP-7.4'
authorNikita Popov <nikita.ppv@gmail.com>
Wed, 10 Apr 2019 07:37:32 +0000 (09:37 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Wed, 10 Apr 2019 07:40:06 +0000 (09:40 +0200)
1  2 
ext/spl/spl_array.c
ext/spl/spl_dllist.c
ext/spl/spl_observer.c

index c4d9245cfbc160806346550e46eb5742e463a801,2806f93281f4cf2b8f8d239d7b82a13f6a5fb929..ac1306e8b9942e3a5ea723473f52022e3f2d0498
@@@ -1822,6 -1812,80 +1822,80 @@@ outexcept
  
  } /* }}} */
  
 -      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)
index fd59724b5ad144ccdc303c2b3a6912832c46803b,299cf70174e0c40f93d098a8eac403cfa88a074d..f39c301a114a9eea81f1156f2d114b54059bf926
@@@ -1216,6 -1220,67 +1216,67 @@@ error
  
  } /* }}} */
  
 -      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), &current->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)
index 12b9ac48e8a5598ca2f627d1741b3960fcc04dd6,381019519369d194bbfd74f5926baa150c2ebb7b..d758eb403bbeeae45cb6799ed1e35a2f3e5d4465
@@@ -866,6 -868,78 +866,78 @@@ outexcept
  
  } /* }}} */
  
 -      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();