]> granicus.if.org Git - php/commitdiff
Fixed constant expressions in array indeces handling
authorDmitry Stogov <dmitry@zend.com>
Thu, 27 Feb 2014 12:41:41 +0000 (16:41 +0400)
committerDmitry Stogov <dmitry@zend.com>
Thu, 27 Feb 2014 12:41:41 +0000 (16:41 +0400)
Zend/zend_compile.c
Zend/zend_execute_API.c

index 40694377be961ec5c03d60828c9751be433d3a9f..50283d16cc06053e16597dd04e4afdc58f92b76e 100644 (file)
@@ -5908,9 +5908,8 @@ void zend_do_add_static_array_element(znode *result, znode *offset, const znode
                                zend_string *key;
 //???                          int len = sizeof(zend_ast *);
 //???                          Z_TYPE(element) |= IS_CONSTANT_INDEX;
-                               Z_STR(offset->u.constant)->gc.u.v.flags |= IS_STR_AST;
-
-                               key = STR_INIT((char*)Z_AST(offset->u.constant), sizeof(zend_ast*), 0);
+                               key = STR_INIT((char*)&Z_AST(offset->u.constant), sizeof(zend_ast*), 0);
+                               key->gc.u.v.flags |= IS_STR_AST;
 //???                          key[len] = Z_TYPE(offset->u.constant);
 //???                          key[len + 1] = 0;
                                zend_symtable_update(Z_ARRVAL(result->u.constant), key, &element);
index e81339b1381d86b4fc7c10edbf3b88997a389176..cf634b6be7c0425bf1d8ebd8f2716f4584f14079 100644 (file)
@@ -582,8 +582,11 @@ ZEND_API int zval_update_constant_ex(zval *p, void *arg, zend_class_entry *scope
                        }
 
                        if (str_index->gc.u.v.flags & IS_STR_AST) {
-                               zend_ast_evaluate(&const_value, (zend_ast *)str_index->val, scope TSRMLS_CC);
-                               zend_ast_destroy((zend_ast *)str_index->val);
+                               zend_ast_ref *ast = *(zend_ast_ref **)str_index->val;
+
+                               zend_ast_evaluate(&const_value, ast->ast, scope TSRMLS_CC);
+                               zend_ast_destroy(ast->ast);
+                               efree(ast);
 //???
                        } else if (!zend_get_constant_ex(str_index->val, str_index->len, &const_value, scope, str_index->gc.u.v.flags TSRMLS_CC)) {
                                char *actual, *str;