summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2014-09-24 15:39:54 +0400
committerDmitry Stogov <dmitry@zend.com>2014-09-24 15:39:54 +0400
commit8ea2409e4494dfb2c6c22f097bd62fdcc00ace7c (patch)
treeeab675ea04a0c3280cf45b39e3d0e61781effc20
parent75860fa8e1d8ce0c9fd2b505bf7663a4936a7a39 (diff)
downloadphp-git-8ea2409e4494dfb2c6c22f097bd62fdcc00ace7c.tar.gz
Fixed immutable arrays support
-rw-r--r--Zend/zend_vm_def.h5
-rw-r--r--Zend/zend_vm_execute.h20
2 files changed, 20 insertions, 5 deletions
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index 1fef4eb7db..00f647e487 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -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) {
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index 3aa36c8f2b..8ab3f3b2e3 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -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) {