Skip to content

Commit c13ed36

Browse files
committed
Add get_serialize_info object handler
1 parent 678ef6a commit c13ed36

File tree

4 files changed

+20
-6
lines changed

4 files changed

+20
-6
lines changed

Zend/zend_object_handlers.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,12 @@ ZEND_API HashTable *zend_std_get_debug_info(zval *object, int *is_temp TSRMLS_DC
142142
}
143143
/* }}} */
144144

145+
ZEND_API HashTable *zend_std_get_serialize_info(zval *object TSRMLS_DC) /* {{{ */
146+
{
147+
return zend_std_get_properties(object TSRMLS_CC);
148+
}
149+
/* }}} */
150+
145151
static zval *zend_std_call_getter(zval *object, zval *member TSRMLS_DC) /* {{{ */
146152
{
147153
zval *retval = NULL;
@@ -1649,6 +1655,7 @@ ZEND_API zend_object_handlers std_object_handlers = {
16491655
zend_std_cast_object_tostring, /* cast_object */
16501656
NULL, /* count_elements */
16511657
NULL, /* get_debug_info */
1658+
NULL, /* get_serialize_info */
16521659
zend_std_get_closure, /* get_closure */
16531660
zend_std_get_gc, /* get_gc */
16541661
NULL, /* do_operation */

Zend/zend_object_handlers.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ typedef void (*zend_object_unset_dimension_t)(zval *object, zval *offset TSRMLS_
8282
typedef HashTable *(*zend_object_get_properties_t)(zval *object TSRMLS_DC);
8383

8484
typedef HashTable *(*zend_object_get_debug_info_t)(zval *object, int *is_temp TSRMLS_DC);
85+
typedef HashTable *(*zend_object_get_serialize_info_t)(zval *objectp TSRMLS_DC);
8586

8687
/* Used to call methods */
8788
/* args on stack! */
@@ -143,6 +144,7 @@ struct _zend_object_handlers {
143144
zend_object_cast_t cast_object;
144145
zend_object_count_elements_t count_elements;
145146
zend_object_get_debug_info_t get_debug_info;
147+
zend_object_get_serialize_info_t get_serialize_info;
146148
zend_object_get_closure_t get_closure;
147149
zend_object_get_gc_t get_gc;
148150
zend_object_do_operation_t do_operation;
@@ -162,6 +164,7 @@ ZEND_API union _zend_function *zend_std_get_constructor(zval *object TSRMLS_DC);
162164
ZEND_API struct _zend_property_info *zend_get_property_info(zend_class_entry *ce, zval *member, int silent TSRMLS_DC);
163165
ZEND_API HashTable *zend_std_get_properties(zval *object TSRMLS_DC);
164166
ZEND_API HashTable *zend_std_get_debug_info(zval *object, int *is_temp TSRMLS_DC);
167+
ZEND_API HashTable *zend_std_get_serialize_info(zval *object TSRMLS_DC);
165168
ZEND_API int zend_std_cast_object_tostring(zval *readobj, zval *writeobj, int type TSRMLS_DC);
166169
ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, const struct _zend_literal *key TSRMLS_DC);
167170
ZEND_API void rebuild_object_properties(zend_object *zobj);

Zend/zend_operators.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,7 @@ END_EXTERN_C()
451451
#define Z_OBJ_HANDLER(zval, hf) Z_OBJ_HT((zval))->hf
452452
#define Z_RESVAL(zval) (zval).value.lval
453453
#define Z_OBJDEBUG(zval,is_tmp) (Z_OBJ_HANDLER((zval),get_debug_info)?Z_OBJ_HANDLER((zval),get_debug_info)(&(zval),&is_tmp TSRMLS_CC):(is_tmp=0,Z_OBJ_HANDLER((zval),get_properties)?Z_OBJPROP(zval):NULL))
454+
#define Z_OBJSERIALIZE(zval) (Z_OBJ_HANDLER((zval),get_serialize_info)?Z_OBJ_HANDLER((zval),get_serialize_info)(&(zval) TSRMLS_CC):(Z_OBJ_HANDLER((zval),get_properties)?Z_OBJPROP(zval):NULL))
454455

455456
#define Z_LVAL_P(zval_p) Z_LVAL(*zval_p)
456457
#define Z_BVAL_P(zval_p) Z_BVAL(*zval_p)
@@ -466,6 +467,7 @@ END_EXTERN_C()
466467
#define Z_OBJ_HT_P(zval_p) Z_OBJ_HT(*zval_p)
467468
#define Z_OBJ_HANDLER_P(zval_p, h) Z_OBJ_HANDLER(*zval_p, h)
468469
#define Z_OBJDEBUG_P(zval_p,is_tmp) Z_OBJDEBUG(*zval_p,is_tmp)
470+
#define Z_OBJSERIALIZE_P(zval) Z_OBJSERIALIZE(*zval)
469471

470472
#define Z_LVAL_PP(zval_pp) Z_LVAL(**zval_pp)
471473
#define Z_BVAL_PP(zval_pp) Z_BVAL(**zval_pp)
@@ -481,6 +483,7 @@ END_EXTERN_C()
481483
#define Z_OBJ_HT_PP(zval_p) Z_OBJ_HT(**zval_p)
482484
#define Z_OBJ_HANDLER_PP(zval_p, h) Z_OBJ_HANDLER(**zval_p, h)
483485
#define Z_OBJDEBUG_PP(zval_pp,is_tmp) Z_OBJDEBUG(**zval_pp,is_tmp)
486+
#define Z_OBJSERIALIZE_PP(zval) Z_OBJSERIALIZE(**zval)
484487

485488
#define Z_TYPE(zval) (zval).type
486489
#define Z_TYPE_P(zval_p) Z_TYPE(*zval_p)

ext/standard/var.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -619,13 +619,14 @@ static inline zend_bool php_var_serialize_class_name(smart_str *buf, zval *struc
619619

620620
static void php_var_serialize_class(smart_str *buf, zval *struc, zval *retval_ptr, HashTable *var_hash TSRMLS_DC) /* {{{ */
621621
{
622+
HashTable *retval_props = Z_OBJSERIALIZE_P(retval_ptr);
622623
int count;
623624
zend_bool incomplete_class;
624625

625626
incomplete_class = php_var_serialize_class_name(buf, struc TSRMLS_CC);
626627
/* count after serializing name, since php_var_serialize_class_name
627628
* changes the count if the variable is incomplete class */
628-
count = zend_hash_num_elements(HASH_OF(retval_ptr));
629+
count = zend_hash_num_elements(retval_props);
629630
if (incomplete_class) {
630631
--count;
631632
}
@@ -644,10 +645,10 @@ static void php_var_serialize_class(smart_str *buf, zval *struc, zval *retval_pt
644645
ZVAL_NULL(&nval);
645646
nvalp = &nval;
646647

647-
zend_hash_internal_pointer_reset_ex(HASH_OF(retval_ptr), &pos);
648+
zend_hash_internal_pointer_reset_ex(retval_props, &pos);
648649

649-
for (;; zend_hash_move_forward_ex(HASH_OF(retval_ptr), &pos)) {
650-
i = zend_hash_get_current_key_ex(HASH_OF(retval_ptr), &key, NULL, &index, 0, &pos);
650+
for (;; zend_hash_move_forward_ex(retval_props, &pos)) {
651+
i = zend_hash_get_current_key_ex(retval_props, &key, NULL, &index, 0, &pos);
651652

652653
if (i == HASH_KEY_NON_EXISTENT) {
653654
break;
@@ -656,7 +657,7 @@ static void php_var_serialize_class(smart_str *buf, zval *struc, zval *retval_pt
656657
if (incomplete_class && strcmp(key, MAGIC_MEMBER) == 0) {
657658
continue;
658659
}
659-
zend_hash_get_current_data_ex(HASH_OF(retval_ptr), (void **) &name, &pos);
660+
zend_hash_get_current_data_ex(retval_props, (void **) &name, &pos);
660661

661662
if (Z_TYPE_PP(name) != IS_STRING) {
662663
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "__sleep should return an array only containing the names of instance-variables to serialize.");
@@ -840,7 +841,7 @@ static void php_var_serialize_intern(smart_str *buf, zval *struc, HashTable *var
840841
myht = HASH_OF(struc);
841842
} else {
842843
incomplete_class = php_var_serialize_class_name(buf, struc TSRMLS_CC);
843-
myht = Z_OBJPROP_P(struc);
844+
myht = Z_OBJSERIALIZE_P(struc);
844845
}
845846
/* count after serializing name, since php_var_serialize_class_name
846847
* changes the count if the variable is incomplete class */

0 commit comments

Comments
 (0)