From 5dc52e488048d93767b78fe7fce34a6a0febc5e0 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 14 Apr 2014 13:24:43 +0400 Subject: Fixed interface constants inheritance. Now we use IS_REFERENCE for inhereted class constants. I might miss some edje cases. --- Zend/zend_variables.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) (limited to 'Zend/zend_variables.c') diff --git a/Zend/zend_variables.c b/Zend/zend_variables.c index 24e347a15b..9661af1773 100644 --- a/Zend/zend_variables.c +++ b/Zend/zend_variables.c @@ -161,6 +161,13 @@ ZEND_API void _zval_internal_dtor(zval *zvalue ZEND_FILE_LINE_DC) case IS_RESOURCE: zend_error(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_BOOL: @@ -185,6 +192,13 @@ ZEND_API void _zval_internal_dtor_for_ptr(zval *zvalue ZEND_FILE_LINE_DC) case IS_RESOURCE: zend_error(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_BOOL: @@ -210,12 +224,7 @@ ZEND_API void zval_add_ref_unref(zval *p) { if (Z_REFCOUNTED_P(p)) { if (Z_ISREF_P(p)) { - if (Z_REFCOUNT_P(p) == 1) { - zval *q = Z_REFVAL_P(p); - ZVAL_DUP(p, q); - } else { - Z_ADDREF_P(p); - } + ZVAL_DUP(p, Z_REFVAL_P(p)); } else { Z_ADDREF_P(p); } -- cgit v1.2.1