]> granicus.if.org Git - php/commitdiff
Fixed immutable arrays support
authorDmitry Stogov <dmitry@zend.com>
Wed, 24 Sep 2014 11:39:54 +0000 (15:39 +0400)
committerDmitry Stogov <dmitry@zend.com>
Wed, 24 Sep 2014 11:39:54 +0000 (15:39 +0400)
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index 1fef4eb7db2352246d7672dabb3e2d063f13ec67..00f647e4879a9e431523b2fe726f267dd9b0376b 100644 (file)
@@ -4458,7 +4458,10 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET, CONST|TMP|VAR|CV, ANY)
                ZVAL_DEREF(array_ptr);
                if (OP1_TYPE == IS_TMP_VAR) {
                        ZVAL_COPY_VALUE(&tmp, array_ptr);
-                       array_ptr = &tmp;
+                       if (Z_OPT_IMMUTABLE_P(&tmp)) {
+                               zval_copy_ctor_func(&tmp);
+                       }
+                       array_ref = array_ptr = &tmp;
                        if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
                                ce = Z_OBJCE_P(array_ptr);
                                if (ce && ce->get_iterator) {
index 3aa36c8f2befa0e8559c0c911acc5557766665aa..8ab3f3b2e3dd25df4e9f9c6e49eaff7668f59912 100644 (file)
@@ -3085,7 +3085,10 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
                ZVAL_DEREF(array_ptr);
                if (IS_CONST == IS_TMP_VAR) {
                        ZVAL_COPY_VALUE(&tmp, array_ptr);
-                       array_ptr = &tmp;
+                       if (Z_OPT_IMMUTABLE_P(&tmp)) {
+                               zval_copy_ctor_func(&tmp);
+                       }
+                       array_ref = array_ptr = &tmp;
                        if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
                                ce = Z_OBJCE_P(array_ptr);
                                if (ce && ce->get_iterator) {
@@ -9786,7 +9789,10 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
                ZVAL_DEREF(array_ptr);
                if (IS_TMP_VAR == IS_TMP_VAR) {
                        ZVAL_COPY_VALUE(&tmp, array_ptr);
-                       array_ptr = &tmp;
+                       if (Z_OPT_IMMUTABLE_P(&tmp)) {
+                               zval_copy_ctor_func(&tmp);
+                       }
+                       array_ref = array_ptr = &tmp;
                        if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
                                ce = Z_OBJCE_P(array_ptr);
                                if (ce && ce->get_iterator) {
@@ -16392,7 +16398,10 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
                ZVAL_DEREF(array_ptr);
                if (IS_VAR == IS_TMP_VAR) {
                        ZVAL_COPY_VALUE(&tmp, array_ptr);
-                       array_ptr = &tmp;
+                       if (Z_OPT_IMMUTABLE_P(&tmp)) {
+                               zval_copy_ctor_func(&tmp);
+                       }
+                       array_ref = array_ptr = &tmp;
                        if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
                                ce = Z_OBJCE_P(array_ptr);
                                if (ce && ce->get_iterator) {
@@ -33696,7 +33705,10 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
                ZVAL_DEREF(array_ptr);
                if (IS_CV == IS_TMP_VAR) {
                        ZVAL_COPY_VALUE(&tmp, array_ptr);
-                       array_ptr = &tmp;
+                       if (Z_OPT_IMMUTABLE_P(&tmp)) {
+                               zval_copy_ctor_func(&tmp);
+                       }
+                       array_ref = array_ptr = &tmp;
                        if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
                                ce = Z_OBJCE_P(array_ptr);
                                if (ce && ce->get_iterator) {