summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/zend_ast.c24
-rw-r--r--Zend/zend_ast.h1
-rw-r--r--Zend/zend_compile.c5
-rw-r--r--Zend/zend_execute_API.c2
-rw-r--r--Zend/zend_language_scanner.c4
-rw-r--r--Zend/zend_language_scanner.l4
-rw-r--r--Zend/zend_variables.c4
7 files changed, 27 insertions, 17 deletions
diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c
index fa46301f5a..62b98ff93f 100644
--- a/Zend/zend_ast.c
+++ b/Zend/zend_ast.c
@@ -50,6 +50,7 @@ ZEND_API zend_ast *zend_ast_create_decl(
unsigned char *lex_pos, zend_string *doc_comment, zend_string *name,
zend_ast *child0, zend_ast *child1, zend_ast *child2
) {
+ TSRMLS_FETCH();
zend_ast_decl *ast = zend_arena_alloc(&CG(ast_arena), sizeof(zend_ast_decl));
ast->kind = kind;
@@ -139,6 +140,7 @@ static inline zend_bool is_power_of_two(unsigned short n) {
ZEND_API zend_ast *zend_ast_dynamic_add(zend_ast *ast, zend_ast *op)
{
if (ast->children >= 4 && is_power_of_two(ast->children)) {
+ TSRMLS_FETCH();
size_t old_size = sizeof(zend_ast) + sizeof(zend_ast *) * (ast->children - 1);
zend_ast *new_ast = zend_arena_alloc(&CG(ast_arena),
sizeof(zend_ast) + sizeof(zend_ast *) * (ast->children * 2 - 1));
@@ -355,8 +357,7 @@ ZEND_API zend_ast *zend_ast_copy(zend_ast *ast)
}
}
-ZEND_API void zend_ast_destroy(zend_ast *ast)
-{
+static void zend_ast_destroy_ex(zend_ast *ast, zend_bool free) {
if (!ast) {
return;
}
@@ -377,19 +378,28 @@ ZEND_API void zend_ast_destroy(zend_ast *ast)
if (decl->doc_comment) {
STR_RELEASE(decl->doc_comment);
}
- zend_ast_destroy(decl->child[0]);
- zend_ast_destroy(decl->child[1]);
- zend_ast_destroy(decl->child[2]);
+ zend_ast_destroy_ex(decl->child[0], free);
+ zend_ast_destroy_ex(decl->child[1], free);
+ zend_ast_destroy_ex(decl->child[2], free);
break;
}
default:
{
zend_uint i;
for (i = 0; i < ast->children; i++) {
- zend_ast_destroy(ast->child[i]);
+ zend_ast_destroy_ex(ast->child[i], free);
}
}
}
- //efree(ast);
+ if (free) {
+ efree(ast);
+ }
+}
+
+ZEND_API void zend_ast_destroy(zend_ast *ast) {
+ zend_ast_destroy_ex(ast, 0);
+}
+ZEND_API void zend_ast_destroy_and_free(zend_ast *ast) {
+ zend_ast_destroy_ex(ast, 1);
}
diff --git a/Zend/zend_ast.h b/Zend/zend_ast.h
index d4d4933af0..da34eb1a5f 100644
--- a/Zend/zend_ast.h
+++ b/Zend/zend_ast.h
@@ -185,6 +185,7 @@ ZEND_API void zend_ast_evaluate(zval *result, zend_ast *ast, zend_class_entry *s
ZEND_API zend_ast *zend_ast_copy(zend_ast *ast);
ZEND_API void zend_ast_destroy(zend_ast *ast);
+ZEND_API void zend_ast_destroy_and_free(zend_ast *ast);
static inline zend_ast *zend_ast_create_zval(zval *zv) {
return zend_ast_create_zval_ex(zv, 0);
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index b14bda0e0d..2ae0e7ce2d 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -3426,14 +3426,13 @@ static void _tmp_compile_const_expr(zval *result, zend_ast *ast TSRMLS_DC) {
zend_eval_const_expr(&ast TSRMLS_CC);
zend_compile_const_expr(&ast TSRMLS_CC);
if (ast->kind == ZEND_AST_ZVAL) {
- ZVAL_COPY(result, zend_ast_get_zval(ast));
+ ZVAL_COPY_VALUE(result, zend_ast_get_zval(ast));
if (Z_TYPE_P(result) == IS_ARRAY) {
zend_make_immutable_array_r(result TSRMLS_CC);
}
orig_ast->kind = ZEND_AST_ZNODE;
} else {
- ast = zend_ast_copy(ast);
- ZVAL_NEW_AST(result, ast);
+ ZVAL_NEW_AST(result, zend_ast_copy(ast));
}
}
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c
index 308d54b31d..5ac8eab068 100644
--- a/Zend/zend_execute_API.c
+++ b/Zend/zend_execute_API.c
@@ -606,7 +606,7 @@ ZEND_API int zval_update_constant_ex(zval *p, zend_bool inline_change, zend_clas
zend_ast_evaluate(&tmp, Z_ASTVAL_P(p), scope TSRMLS_CC);
if (inline_change) {
- zend_ast_destroy(Z_ASTVAL_P(p));
+ zend_ast_destroy_and_free(Z_ASTVAL_P(p));
efree(Z_AST_P(p));
}
ZVAL_COPY_VALUE(p, &tmp);
diff --git a/Zend/zend_language_scanner.c b/Zend/zend_language_scanner.c
index 65bdcf23d9..938930e481 100644
--- a/Zend/zend_language_scanner.c
+++ b/Zend/zend_language_scanner.c
@@ -585,7 +585,7 @@ ZEND_API zend_op_array *compile_file(zend_file_handle *file_handle, int type TSR
CG(active_op_array) = op_array;
zend_stack_push(&CG(context_stack), (void *) &CG(context));
zend_init_compiler_context(TSRMLS_C);
- CG(ast_arena) = zend_arena_create(1024 * 32 TSRMLS_CC);
+ CG(ast_arena) = zend_arena_create(1024 * 32);
compiler_result = zendparse(TSRMLS_C);
if (compiler_result != 0) { /* parser error */
zend_bailout();
@@ -757,7 +757,7 @@ zend_op_array *compile_string(zval *source_string, char *filename TSRMLS_DC)
zend_stack_push(&CG(context_stack), (void *) &CG(context));
zend_init_compiler_context(TSRMLS_C);
BEGIN(ST_IN_SCRIPTING);
- CG(ast_arena) = zend_arena_create(1024 * 32 TSRMLS_CC);
+ CG(ast_arena) = zend_arena_create(1024 * 32);
compiler_result = zendparse(TSRMLS_C);
if (SCNG(script_filtered)) {
diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l
index aec871fd8f..31b76e9076 100644
--- a/Zend/zend_language_scanner.l
+++ b/Zend/zend_language_scanner.l
@@ -583,7 +583,7 @@ ZEND_API zend_op_array *compile_file(zend_file_handle *file_handle, int type TSR
CG(active_op_array) = op_array;
zend_stack_push(&CG(context_stack), (void *) &CG(context));
zend_init_compiler_context(TSRMLS_C);
- CG(ast_arena) = zend_arena_create(1024 * 32 TSRMLS_CC);
+ CG(ast_arena) = zend_arena_create(1024 * 32);
compiler_result = zendparse(TSRMLS_C);
if (compiler_result != 0) { /* parser error */
zend_bailout();
@@ -755,7 +755,7 @@ zend_op_array *compile_string(zval *source_string, char *filename TSRMLS_DC)
zend_stack_push(&CG(context_stack), (void *) &CG(context));
zend_init_compiler_context(TSRMLS_C);
BEGIN(ST_IN_SCRIPTING);
- CG(ast_arena) = zend_arena_create(1024 * 32 TSRMLS_CC);
+ CG(ast_arena) = zend_arena_create(1024 * 32);
compiler_result = zendparse(TSRMLS_C);
if (SCNG(script_filtered)) {
diff --git a/Zend/zend_variables.c b/Zend/zend_variables.c
index 9f76d9f812..c02e3c410b 100644
--- a/Zend/zend_variables.c
+++ b/Zend/zend_variables.c
@@ -53,7 +53,7 @@ ZEND_API void _zval_dtor_func(zend_refcounted *p ZEND_FILE_LINE_DC)
case IS_CONSTANT_AST: {
zend_ast_ref *ast = (zend_ast_ref*)p;
- zend_ast_destroy(ast->ast);
+ zend_ast_destroy_and_free(ast->ast);
efree(ast);
break;
}
@@ -113,7 +113,7 @@ ZEND_API void _zval_dtor_func_for_ptr(zend_refcounted *p ZEND_FILE_LINE_DC)
case IS_CONSTANT_AST: {
zend_ast_ref *ast = (zend_ast_ref*)p;
- zend_ast_destroy(ast->ast);
+ zend_ast_destroy_and_free(ast->ast);
efree(ast);
break;
}