diff options
author | Dmitry Stogov <dmitry@zend.com> | 2014-04-14 13:24:43 +0400 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2014-04-14 13:24:43 +0400 |
commit | 5dc52e488048d93767b78fe7fce34a6a0febc5e0 (patch) | |
tree | 961d10c552ed70292e9823eacfe3e2fc1d666087 /Zend/zend_variables.c | |
parent | 4fc3d2d104493e417d2352e4312d97a7d17fc4c5 (diff) | |
download | php-git-5dc52e488048d93767b78fe7fce34a6a0febc5e0.tar.gz |
Fixed interface constants inheritance.
Now we use IS_REFERENCE for inhereted class constants.
I might miss some edje cases.
Diffstat (limited to 'Zend/zend_variables.c')
-rw-r--r-- | Zend/zend_variables.c | 21 |
1 files changed, 15 insertions, 6 deletions
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); } |