|
|
|
@ -108,65 +108,32 @@ static void ZEND_FASTCALL zend_ast_ref_destroy_wrapper(zend_ast_ref *ast ZEND_FI |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
ZEND_API void _zval_internal_dtor(zval *zvalue ZEND_FILE_LINE_DC) |
|
|
|
ZEND_API void _zval_ptr_dtor(zval *zval_ptr ZEND_FILE_LINE_DC) /* {{{ */ |
|
|
|
{ |
|
|
|
switch (Z_TYPE_P(zvalue)) { |
|
|
|
case IS_STRING: |
|
|
|
CHECK_ZVAL_STRING_REL(Z_STR_P(zvalue)); |
|
|
|
zend_string_release_ex(Z_STR_P(zvalue), 1); |
|
|
|
break; |
|
|
|
case IS_ARRAY: |
|
|
|
case IS_CONSTANT_AST: |
|
|
|
case IS_OBJECT: |
|
|
|
case IS_RESOURCE: |
|
|
|
zend_error_noreturn(E_CORE_ERROR, "Internal zval's can't be arrays, objects or resources"); |
|
|
|
break; |
|
|
|
case IS_REFERENCE: { |
|
|
|
zend_reference *ref = (zend_reference*)Z_REF_P(zvalue); |
|
|
|
|
|
|
|
zval_internal_ptr_dtor(&ref->val); |
|
|
|
free(ref); |
|
|
|
break; |
|
|
|
} |
|
|
|
case IS_LONG: |
|
|
|
case IS_DOUBLE: |
|
|
|
case IS_FALSE: |
|
|
|
case IS_TRUE: |
|
|
|
case IS_NULL: |
|
|
|
default: |
|
|
|
break; |
|
|
|
} |
|
|
|
i_zval_ptr_dtor(zval_ptr ZEND_FILE_LINE_RELAY_CC); |
|
|
|
} |
|
|
|
/* }}} */ |
|
|
|
|
|
|
|
ZEND_API void _zval_internal_dtor_for_ptr(zval *zvalue ZEND_FILE_LINE_DC) |
|
|
|
ZEND_API void _zval_internal_ptr_dtor(zval *zval_ptr ZEND_FILE_LINE_DC) /* {{{ */ |
|
|
|
{ |
|
|
|
switch (Z_TYPE_P(zvalue)) { |
|
|
|
case IS_STRING: |
|
|
|
CHECK_ZVAL_STRING_REL(Z_STR_P(zvalue)); |
|
|
|
zend_string_free(Z_STR_P(zvalue)); |
|
|
|
break; |
|
|
|
case IS_ARRAY: |
|
|
|
case IS_CONSTANT_AST: |
|
|
|
case IS_OBJECT: |
|
|
|
case IS_RESOURCE: |
|
|
|
zend_error_noreturn(E_CORE_ERROR, "Internal zval's can't be arrays, objects or resources"); |
|
|
|
break; |
|
|
|
case IS_REFERENCE: { |
|
|
|
zend_reference *ref = (zend_reference*)Z_REF_P(zvalue); |
|
|
|
|
|
|
|
zval_internal_ptr_dtor(&ref->val); |
|
|
|
free(ref); |
|
|
|
break; |
|
|
|
if (Z_REFCOUNTED_P(zval_ptr)) { |
|
|
|
zend_refcounted *ref = Z_COUNTED_P(zval_ptr); |
|
|
|
|
|
|
|
if (GC_DELREF(ref) == 0) { |
|
|
|
if (Z_TYPE_P(zval_ptr) == IS_STRING) { |
|
|
|
zend_string *str = (zend_string*)ref; |
|
|
|
|
|
|
|
CHECK_ZVAL_STRING_REL(str); |
|
|
|
ZEND_ASSERT(!ZSTR_IS_INTERNED(str)); |
|
|
|
ZEND_ASSERT((GC_FLAGS(str) & IS_STR_PERSISTENT)); |
|
|
|
free(str); |
|
|
|
} else { |
|
|
|
zend_error_noreturn(E_CORE_ERROR, "Internal zval's can't be arrays, objects, resources or reference"); |
|
|
|
} |
|
|
|
case IS_LONG: |
|
|
|
case IS_DOUBLE: |
|
|
|
case IS_FALSE: |
|
|
|
case IS_TRUE: |
|
|
|
case IS_NULL: |
|
|
|
default: |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
/* }}} */ |
|
|
|
|
|
|
|
/* This function should only be used as a copy constructor, i.e. it |
|
|
|
* should only be called AFTER a zval has been copied to another |
|
|
|
@ -183,17 +150,6 @@ ZEND_API void zval_add_ref(zval *p) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
ZEND_API void zval_add_ref_unref(zval *p) |
|
|
|
{ |
|
|
|
if (Z_REFCOUNTED_P(p)) { |
|
|
|
if (Z_ISREF_P(p)) { |
|
|
|
ZVAL_COPY(p, Z_REFVAL_P(p)); |
|
|
|
} else { |
|
|
|
Z_ADDREF_P(p); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
ZEND_API void ZEND_FASTCALL _zval_copy_ctor_func(zval *zvalue ZEND_FILE_LINE_DC) |
|
|
|
{ |
|
|
|
if (EXPECTED(Z_TYPE_P(zvalue) == IS_ARRAY)) { |
|
|
|
@ -206,25 +162,7 @@ ZEND_API void ZEND_FASTCALL _zval_copy_ctor_func(zval *zvalue ZEND_FILE_LINE_DC) |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
ZEND_API size_t zend_print_variable(zval *var) |
|
|
|
{ |
|
|
|
return zend_print_zval(var, 0); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
ZEND_API void _zval_dtor_wrapper(zval *zvalue) |
|
|
|
{ |
|
|
|
zval_dtor(zvalue); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#if ZEND_DEBUG |
|
|
|
ZEND_API void _zval_internal_dtor_wrapper(zval *zvalue) |
|
|
|
{ |
|
|
|
zval_internal_dtor(zvalue); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
ZEND_API void _zval_ptr_dtor_wrapper(zval *zval_ptr) |
|
|
|
{ |
|
|
|
|
|
|
|
|