]> granicus.if.org Git - php/commitdiff
Fixed reference afto conversion
authorDmitry Stogov <dmitry@zend.com>
Wed, 12 Mar 2014 08:07:03 +0000 (12:07 +0400)
committerDmitry Stogov <dmitry@zend.com>
Wed, 12 Mar 2014 08:07:03 +0000 (12:07 +0400)
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index 0d594897eae58ae9c017d8d9a4fc7d3a0ac6eea0..6e94c3dc9b1b86cb8b981f554f40d692f2e6a9da 100644 (file)
@@ -4338,7 +4338,19 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET, CONST|TMP|VAR|CV, ANY)
                                ZVAL_DUP(&tmp, array_ref);
                                array_ptr = array_ref = &tmp;
                        } else if (OP1_TYPE == IS_CV) {
-                               Z_ADDREF_P(array_ref);
+//??? dereference
+                               if (Z_ISREF_P(array_ref)) {
+                                       if (Z_REFCOUNT_P(array_ref) == 1) {
+                                               zend_reference *ref = Z_REF_P(array_ref);
+                                               ZVAL_COPY(array_ref, &ref->val);
+                                               efree(ref);
+                                               array_ptr = array_ref;
+                                       } else {
+                                               Z_ADDREF_P(array_ref);
+                                       }
+                               } else {
+                                       Z_ADDREF_P(array_ref);
+                               }
                        }
                }
        }
index e33ad57577a001238c1b3d6e983685f321bfbfe5..2742b84f6f90470790674af312bf02b404ca5145 100644 (file)
@@ -3076,7 +3076,19 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
                                ZVAL_DUP(&tmp, array_ref);
                                array_ptr = array_ref = &tmp;
                        } else if (IS_CONST == IS_CV) {
-                               Z_ADDREF_P(array_ref);
+//??? dereference
+                               if (Z_ISREF_P(array_ref)) {
+                                       if (Z_REFCOUNT_P(array_ref) == 1) {
+                                               zend_reference *ref = Z_REF_P(array_ref);
+                                               ZVAL_COPY(array_ref, &ref->val);
+                                               efree(ref);
+                                               array_ptr = array_ref;
+                                       } else {
+                                               Z_ADDREF_P(array_ref);
+                                       }
+                               } else {
+                                       Z_ADDREF_P(array_ref);
+                               }
                        }
                }
        }
@@ -8175,7 +8187,19 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
                                ZVAL_DUP(&tmp, array_ref);
                                array_ptr = array_ref = &tmp;
                        } else if (IS_TMP_VAR == IS_CV) {
-                               Z_ADDREF_P(array_ref);
+//??? dereference
+                               if (Z_ISREF_P(array_ref)) {
+                                       if (Z_REFCOUNT_P(array_ref) == 1) {
+                                               zend_reference *ref = Z_REF_P(array_ref);
+                                               ZVAL_COPY(array_ref, &ref->val);
+                                               efree(ref);
+                                               array_ptr = array_ref;
+                                       } else {
+                                               Z_ADDREF_P(array_ref);
+                                       }
+                               } else {
+                                       Z_ADDREF_P(array_ref);
+                               }
                        }
                }
        }
@@ -13347,7 +13371,19 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
                                ZVAL_DUP(&tmp, array_ref);
                                array_ptr = array_ref = &tmp;
                        } else if (IS_VAR == IS_CV) {
-                               Z_ADDREF_P(array_ref);
+//??? dereference
+                               if (Z_ISREF_P(array_ref)) {
+                                       if (Z_REFCOUNT_P(array_ref) == 1) {
+                                               zend_reference *ref = Z_REF_P(array_ref);
+                                               ZVAL_COPY(array_ref, &ref->val);
+                                               efree(ref);
+                                               array_ptr = array_ref;
+                                       } else {
+                                               Z_ADDREF_P(array_ref);
+                                       }
+                               } else {
+                                       Z_ADDREF_P(array_ref);
+                               }
                        }
                }
        }
@@ -30717,7 +30753,19 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
                                ZVAL_DUP(&tmp, array_ref);
                                array_ptr = array_ref = &tmp;
                        } else if (IS_CV == IS_CV) {
-                               Z_ADDREF_P(array_ref);
+//??? dereference
+                               if (Z_ISREF_P(array_ref)) {
+                                       if (Z_REFCOUNT_P(array_ref) == 1) {
+                                               zend_reference *ref = Z_REF_P(array_ref);
+                                               ZVAL_COPY(array_ref, &ref->val);
+                                               efree(ref);
+                                               array_ptr = array_ref;
+                                       } else {
+                                               Z_ADDREF_P(array_ref);
+                                       }
+                               } else {
+                                       Z_ADDREF_P(array_ref);
+                               }
                        }
                }
        }