diff options
Diffstat (limited to 'Zend/zend_variables.c')
-rw-r--r-- | Zend/zend_variables.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/Zend/zend_variables.c b/Zend/zend_variables.c index 757019860c..f919fb8c85 100644 --- a/Zend/zend_variables.c +++ b/Zend/zend_variables.c @@ -126,6 +126,40 @@ ZEND_API int _zval_copy_ctor(zval *zvalue ZEND_FILE_LINE_DC) } +ZEND_API int zval_persist(zval *zvalue TSRMLS_DC) +{ + switch (zvalue->type) { + case IS_RESOURCE: + return FAILURE; /* resources cannot be persisted */ + break; + case IS_BOOL: + case IS_LONG: + case IS_NULL: + break; + case IS_CONSTANT: + case IS_STRING: + if (zvalue->value.str.val) { + if (zvalue->value.str.len==0) { + zvalue->value.str.val = empty_string; + return SUCCESS; + } + } + persist_alloc(zvalue->value.str.val); + break; + case IS_ARRAY: + case IS_CONSTANT_ARRAY: + persist_alloc(zvalue->value.ht); + zend_hash_apply(zvalue->value.ht, (apply_func_t) zval_persist TSRMLS_CC); + break; + case IS_OBJECT: + persist_alloc(zvalue->value.obj.properties); + zend_hash_apply(zvalue->value.obj.properties, (apply_func_t) zval_persist TSRMLS_CC); + break; + } + return SUCCESS; +} + + ZEND_API int zend_print_variable(zval *var) { return zend_print_zval(var, 0); |