diff options
author | Michael Wallner <mike@php.net> | 2010-05-26 07:24:37 +0000 |
---|---|---|
committer | Michael Wallner <mike@php.net> | 2010-05-26 07:24:37 +0000 |
commit | 89e93723fb11a623a42518d5de2c6f5e51243fda (patch) | |
tree | 1c313090bda4716a50efad8c8ba5f3dec1ff3cd7 /ext/standard/php_var.h | |
parent | de531056f7d002a5b0fea12c1e320e2abe2823c2 (diff) | |
download | php-git-89e93723fb11a623a42518d5de2c6f5e51243fda.tar.gz |
Added support for object references in recursive serialize() calls. FR #36424
Diffstat (limited to 'ext/standard/php_var.h')
-rw-r--r-- | ext/standard/php_var.h | 64 |
1 files changed, 52 insertions, 12 deletions
diff --git a/ext/standard/php_var.h b/ext/standard/php_var.h index ed03e3f2eb..e74680c548 100644 --- a/ext/standard/php_var.h +++ b/ext/standard/php_var.h @@ -21,6 +21,7 @@ #ifndef PHP_VAR_H #define PHP_VAR_H +#include "ext/standard/basic_functions.h" #include "ext/standard/php_smart_str_public.h" PHP_FUNCTION(var_dump); @@ -35,29 +36,68 @@ PHPAPI void php_var_dump(zval **struc, int level TSRMLS_DC); PHPAPI void php_var_export(zval **struc, int level TSRMLS_DC); PHPAPI void php_debug_zval_dump(zval **struc, int level TSRMLS_DC); -/* typdef HashTable php_serialize_data_t; */ -#define php_serialize_data_t HashTable +typedef HashTable* php_serialize_data_t; struct php_unserialize_data { void *first; void *first_dtor; }; -typedef struct php_unserialize_data php_unserialize_data_t; +typedef struct php_unserialize_data* php_unserialize_data_t; PHPAPI void php_var_serialize(smart_str *buf, zval **struc, php_serialize_data_t *var_hash TSRMLS_DC); PHPAPI int php_var_unserialize(zval **rval, const unsigned char **p, const unsigned char *max, php_unserialize_data_t *var_hash TSRMLS_DC); -#define PHP_VAR_SERIALIZE_INIT(var_hash) \ - zend_hash_init(&(var_hash), 10, NULL, NULL, 0) -#define PHP_VAR_SERIALIZE_DESTROY(var_hash) \ - zend_hash_destroy(&(var_hash)) +#define PHP_VAR_SERIALIZE_INIT(var_hash_ptr) \ +do { \ + if (BG(serialize).level) { \ + (var_hash_ptr) = BG(serialize).var_hash; \ + ++BG(serialize).level; \ + } else { \ + ALLOC_HASHTABLE(var_hash_ptr); \ + zend_hash_init((var_hash_ptr), 10, NULL, NULL, 0); \ + BG(serialize).var_hash = (var_hash_ptr); \ + BG(serialize).level = 1; \ + } \ +} while(0) -#define PHP_VAR_UNSERIALIZE_INIT(var_hash) \ - (var_hash).first = 0; \ - (var_hash).first_dtor = 0 -#define PHP_VAR_UNSERIALIZE_DESTROY(var_hash) \ - var_destroy(&(var_hash)) +#define PHP_VAR_SERIALIZE_DESTROY(var_hash_ptr) \ +do { \ + if (BG(serialize).level) { \ + if (!--BG(serialize).level) { \ + zend_hash_destroy(BG(serialize).var_hash); \ + FREE_HASHTABLE(BG(serialize).var_hash); \ + BG(serialize).var_hash = NULL; \ + } \ + } else { \ + zend_hash_destroy((var_hash_ptr)); \ + } \ +} while (0) + +#define PHP_VAR_UNSERIALIZE_INIT(var_hash_ptr) \ +do { \ + if (BG(unserialize).level) { \ + (var_hash_ptr) = BG(unserialize).var_hash; \ + ++BG(unserialize).level; \ + } else { \ + (var_hash_ptr) = ecalloc(1, sizeof(struct php_unserialize_data)); \ + BG(unserialize).var_hash = (var_hash_ptr); \ + BG(unserialize).level = 1; \ + } \ +} while (0) + +#define PHP_VAR_UNSERIALIZE_DESTROY(var_hash_ptr) \ +do { \ + if (BG(unserialize).level) { \ + if (!--BG(unserialize).level) { \ + var_destroy(&(var_hash_ptr)); \ + efree((var_hash_ptr)); \ + BG(unserialize).var_hash = NULL; \ + } \ + } else { \ + var_destroy(&(var_hash_ptr)); \ + } \ +} while (0) PHPAPI void var_replace(php_unserialize_data_t *var_hash, zval *ozval, zval **nzval); PHPAPI void var_destroy(php_unserialize_data_t *var_hash); |