]> granicus.if.org Git - php/commitdiff
Fixed immutable array support
authorDmitry Stogov <dmitry@zend.com>
Wed, 20 Aug 2014 17:42:49 +0000 (21:42 +0400)
committerDmitry Stogov <dmitry@zend.com>
Wed, 20 Aug 2014 17:42:49 +0000 (21:42 +0400)
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index a50f1431567103acad3b4a9a8cdec7698e2c0d62..c8044205838917dca17c136f189a626bccce0452 100644 (file)
@@ -4539,7 +4539,7 @@ 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) {
+                       } else if (OP1_TYPE == IS_CV || OP1_TYPE == IS_VAR) {
                                if (Z_ISREF_P(array_ref) && Z_REFCOUNT_P(array_ref) == 1) {
                                        ZVAL_UNREF(array_ref);
                                        array_ptr = array_ref;
@@ -4553,7 +4553,9 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET, CONST|TMP|VAR|CV, ANY)
                                        }
                                        zval_copy_ctor(array_ptr);
                                }
-                               Z_ADDREF_P(array_ref);
+                               if (OP1_TYPE == IS_CV) {
+                                       Z_ADDREF_P(array_ref);
+                               }
                        }
                }
        }
index f1909b65ce88490cb5cf5dc97134010924c9cabd..46fc39e33f0d85f0ae13f2b7ac3adc86a77f33a6 100644 (file)
@@ -3156,7 +3156,7 @@ 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) {
+                       } else if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
                                if (Z_ISREF_P(array_ref) && Z_REFCOUNT_P(array_ref) == 1) {
                                        ZVAL_UNREF(array_ref);
                                        array_ptr = array_ref;
@@ -3170,7 +3170,9 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
                                        }
                                        zval_copy_ctor(array_ptr);
                                }
-                               Z_ADDREF_P(array_ref);
+                               if (IS_CONST == IS_CV) {
+                                       Z_ADDREF_P(array_ref);
+                               }
                        }
                }
        }
@@ -8679,7 +8681,7 @@ 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) {
+                       } else if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
                                if (Z_ISREF_P(array_ref) && Z_REFCOUNT_P(array_ref) == 1) {
                                        ZVAL_UNREF(array_ref);
                                        array_ptr = array_ref;
@@ -8693,7 +8695,9 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
                                        }
                                        zval_copy_ctor(array_ptr);
                                }
-                               Z_ADDREF_P(array_ref);
+                               if (IS_TMP_VAR == IS_CV) {
+                                       Z_ADDREF_P(array_ref);
+                               }
                        }
                }
        }
@@ -14122,7 +14126,7 @@ 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) {
+                       } else if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
                                if (Z_ISREF_P(array_ref) && Z_REFCOUNT_P(array_ref) == 1) {
                                        ZVAL_UNREF(array_ref);
                                        array_ptr = array_ref;
@@ -14136,7 +14140,9 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
                                        }
                                        zval_copy_ctor(array_ptr);
                                }
-                               Z_ADDREF_P(array_ref);
+                               if (IS_VAR == IS_CV) {
+                                       Z_ADDREF_P(array_ref);
+                               }
                        }
                }
        }
@@ -31483,7 +31489,7 @@ 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) {
+                       } else if (IS_CV == IS_CV || IS_CV == IS_VAR) {
                                if (Z_ISREF_P(array_ref) && Z_REFCOUNT_P(array_ref) == 1) {
                                        ZVAL_UNREF(array_ref);
                                        array_ptr = array_ref;
@@ -31497,7 +31503,9 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
                                        }
                                        zval_copy_ctor(array_ptr);
                                }
-                               Z_ADDREF_P(array_ref);
+                               if (IS_CV == IS_CV) {
+                                       Z_ADDREF_P(array_ref);
+                               }
                        }
                }
        }