]> granicus.if.org Git - php/commitdiff
Fixed support for undefined constants in RECV_INIT
authorDmitry Stogov <dmitry@zend.com>
Wed, 5 Mar 2014 20:15:56 +0000 (00:15 +0400)
committerDmitry Stogov <dmitry@zend.com>
Wed, 5 Mar 2014 20:15:56 +0000 (00:15 +0400)
Zend/zend_execute_API.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index 0d3637a937e21c241cf23e4ee6474ed73d9f6a2b..02030ff413bf4a3f6e2949b3e2f5d0386e7cff31 100644 (file)
@@ -531,17 +531,16 @@ ZEND_API int zval_update_constant_ex(zval *p, void *arg, zend_class_entry *scope
                                                zend_error(E_ERROR, "Undefined constant '%s'", save->val);
                                        }
                                        if (inline_change) {
-//???                                          STR_RELEASE(save);
+                                               STR_RELEASE(save);
                                        }
                                        save = NULL;
                                }
-                               if (inline_change && save && save->val != actual) {
-//???                                  STR_RELEASE(save);
-                               }
                                zend_error(E_NOTICE, "Use of undefined constant %s - assumed '%s'",  actual,  actual);
                                p->type = IS_STRING;
                                if (!inline_change) {
                                        ZVAL_STRINGL(p, actual, actual_len);
+                               } else if (save) {
+                                       STR_RELEASE(save);
                                }
                        }
                } else {
index 7d975deb67bb27d52cec8fbf197ab75d2ba6e3e9..30fefcdf9734751e35a292b409c3ec3ffca29fc4 100644 (file)
@@ -3376,12 +3376,30 @@ ZEND_VM_HANDLER(64, ZEND_RECV_INIT, ANY, CONST)
        var_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->result.var TSRMLS_CC);
        zval_ptr_dtor(var_ptr);
        if (param == NULL) {
+//???
+#if 1
+               if (IS_CONSTANT_TYPE(Z_TYPE_P(opline->op2.zv))) {
+                       zval tmp;
+                                       
+                       ZVAL_COPY_VALUE(&tmp, opline->op2.zv);
+                       zval_update_constant(&tmp, 0 TSRMLS_CC);
+//???: var_ptr may become INDIRECT
+                       if (Z_TYPE_P(var_ptr) == IS_INDIRECT) {
+                               var_ptr = Z_INDIRECT_P(var_ptr);
+                       }
+                       ZVAL_COPY_VALUE(var_ptr, &tmp);
+               } else {
+                       ZVAL_COPY_VALUE(var_ptr, opline->op2.zv);
+                       zval_copy_ctor(var_ptr);
+               }
+#else
                ZVAL_COPY_VALUE(var_ptr, opline->op2.zv);
                if (IS_CONSTANT_TYPE(Z_TYPE_P(var_ptr))) {
                        zval_update_constant(var_ptr, 0 TSRMLS_CC);
                } else {
                        zval_copy_ctor(var_ptr);
                }
+#endif
        } else {
                ZVAL_COPY(var_ptr, param);
        }
index 03e0276a60fe10fca862a3b9dba9210b66ff4073..12393aa37903c1115dce4251b56a0a4ff393d82c 100644 (file)
@@ -1603,12 +1603,30 @@ static int ZEND_FASTCALL  ZEND_RECV_INIT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_
        var_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->result.var TSRMLS_CC);
        zval_ptr_dtor(var_ptr);
        if (param == NULL) {
+//???
+#if 1
+               if (IS_CONSTANT_TYPE(Z_TYPE_P(opline->op2.zv))) {
+                       zval tmp;
+
+                       ZVAL_COPY_VALUE(&tmp, opline->op2.zv);
+                       zval_update_constant(&tmp, 0 TSRMLS_CC);
+//???: var_ptr may become INDIRECT
+                       if (Z_TYPE_P(var_ptr) == IS_INDIRECT) {
+                               var_ptr = Z_INDIRECT_P(var_ptr);
+                       }
+                       ZVAL_COPY_VALUE(var_ptr, &tmp);
+               } else {
+                       ZVAL_COPY_VALUE(var_ptr, opline->op2.zv);
+                       zval_copy_ctor(var_ptr);
+               }
+#else
                ZVAL_COPY_VALUE(var_ptr, opline->op2.zv);
                if (IS_CONSTANT_TYPE(Z_TYPE_P(var_ptr))) {
                        zval_update_constant(var_ptr, 0 TSRMLS_CC);
                } else {
                        zval_copy_ctor(var_ptr);
                }
+#endif
        } else {
                ZVAL_COPY(var_ptr, param);
        }