]> granicus.if.org Git - php/commitdiff
Fixed bug #45910 (Cannot declare self-referencing constant)
authorDmitry Stogov <dmitry@php.net>
Tue, 26 Aug 2008 08:38:15 +0000 (08:38 +0000)
committerDmitry Stogov <dmitry@php.net>
Tue, 26 Aug 2008 08:38:15 +0000 (08:38 +0000)
Zend/zend_execute_API.c

index 030e102e2ea0d47eec5169a827fcb4c5f6d1c6b2..f22fae6aa24e726dfb0440c925e7e316925c4ada 100644 (file)
@@ -583,6 +583,7 @@ ZEND_API int zval_update_constant_ex(zval **pp, void *arg, zend_class_entry *sco
                zstr str_index;
                uint str_index_len;
                ulong num_index;
+               int ret;
 
                SEPARATE_ZVAL_IF_NOT_REF(pp);
                p = *pp;
@@ -656,20 +657,25 @@ ZEND_API int zval_update_constant_ex(zval **pp, void *arg, zend_class_entry *sco
                        switch (Z_TYPE(const_value)) {
                                case IS_STRING:
                                case IS_UNICODE:
-                                       zend_u_symtable_update_current_key(Z_ARRVAL_P(p), Z_TYPE(const_value), Z_UNIVAL(const_value), Z_UNILEN(const_value) + 1, HASH_UPDATE_KEY_IF_BEFORE);
+                                       ret = zend_u_symtable_update_current_key(Z_ARRVAL_P(p), Z_TYPE(const_value), Z_UNIVAL(const_value), Z_UNILEN(const_value) + 1, HASH_UPDATE_KEY_IF_BEFORE);
                                        break;
                                case IS_BOOL:
                                case IS_LONG:
-                                       zend_hash_update_current_key_ex(Z_ARRVAL_P(p), HASH_KEY_IS_LONG, NULL_ZSTR, 0, Z_LVAL(const_value), HASH_UPDATE_KEY_IF_BEFORE, NULL);
+                                       ret = zend_hash_update_current_key_ex(Z_ARRVAL_P(p), HASH_KEY_IS_LONG, NULL_ZSTR, 0, Z_LVAL(const_value), HASH_UPDATE_KEY_IF_BEFORE, NULL);
                                        break;
                                case IS_DOUBLE:
-                                       zend_hash_update_current_key_ex(Z_ARRVAL_P(p), HASH_KEY_IS_LONG, NULL_ZSTR, 0, (long)Z_DVAL(const_value), HASH_UPDATE_KEY_IF_BEFORE, NULL);
+                                       ret = zend_hash_update_current_key_ex(Z_ARRVAL_P(p), HASH_KEY_IS_LONG, NULL_ZSTR, 0, (long)Z_DVAL(const_value), HASH_UPDATE_KEY_IF_BEFORE, NULL);
                                        break;
                                case IS_NULL:
-                                       zend_hash_update_current_key_ex(Z_ARRVAL_P(p), HASH_KEY_IS_STRING, EMPTY_ZSTR, 1, 0, HASH_UPDATE_KEY_IF_BEFORE, NULL);
+                                       ret = zend_hash_update_current_key_ex(Z_ARRVAL_P(p), HASH_KEY_IS_STRING, EMPTY_ZSTR, 1, 0, HASH_UPDATE_KEY_IF_BEFORE, NULL);
                                        break;
+                               default:
+                                       ret = SUCCESS;
+                                       break;
+                       }
+                       if (ret == SUCCESS) {
+                               zend_hash_move_forward(Z_ARRVAL_P(p));
                        }
-                       zend_hash_move_forward(Z_ARRVAL_P(p));
                        zval_dtor(&const_value);
                }
                zend_hash_apply_with_argument(Z_ARRVAL_P(p), (apply_func_arg_t) zval_update_constant, (void *) 1 TSRMLS_CC);