summaryrefslogtreecommitdiff
path: root/Zend/zend_variables.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2014-04-14 13:24:43 +0400
committerDmitry Stogov <dmitry@zend.com>2014-04-14 13:24:43 +0400
commit5dc52e488048d93767b78fe7fce34a6a0febc5e0 (patch)
tree961d10c552ed70292e9823eacfe3e2fc1d666087 /Zend/zend_variables.c
parent4fc3d2d104493e417d2352e4312d97a7d17fc4c5 (diff)
downloadphp-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.c21
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);
}