summaryrefslogtreecommitdiff
path: root/Zend/zend_opcode.c
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_opcode.c')
-rw-r--r--Zend/zend_opcode.c33
1 files changed, 18 insertions, 15 deletions
diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c
index d57721e58b..3397ed28e2 100644
--- a/Zend/zend_opcode.c
+++ b/Zend/zend_opcode.c
@@ -100,16 +100,12 @@ void init_op_array(zend_op_array *op_array, zend_uchar type, int initial_ops_siz
ZEND_API void destroy_zend_function(zend_function *function TSRMLS_DC)
{
- switch (function->type) {
- case ZEND_USER_FUNCTION:
- destroy_op_array((zend_op_array *) function TSRMLS_CC);
- break;
- case ZEND_INTERNAL_FUNCTION:
- if (function->common.function_name) {
- zend_string_release(function->common.function_name);
- }
- /* do nothing */
- break;
+ if (function->type == ZEND_USER_FUNCTION) {
+ destroy_op_array(&function->op_array TSRMLS_CC);
+ } else {
+ ZEND_ASSERT(function->type == ZEND_INTERNAL_FUNCTION);
+ ZEND_ASSERT(function->common.function_name);
+ zend_string_release(function->common.function_name);
}
}
@@ -118,11 +114,18 @@ ZEND_API void zend_function_dtor(zval *zv)
zend_function *function = Z_PTR_P(zv);
TSRMLS_FETCH();
- destroy_zend_function(function TSRMLS_CC);
- if (function->type == ZEND_INTERNAL_FUNCTION) {
- pefree(function, 1);
- } else if (!function->common.function_name) {
- efree_size(function, sizeof(zend_op_array));
+ if (function->type == ZEND_USER_FUNCTION) {
+ ZEND_ASSERT(function->common.function_name);
+ destroy_op_array(&function->op_array TSRMLS_CC);
+ /* op_arrays are allocated on arena, so we don't have to free them */
+//??? efree_size(function, sizeof(zend_op_array));
+ } else {
+ ZEND_ASSERT(function->type == ZEND_INTERNAL_FUNCTION);
+ ZEND_ASSERT(function->common.function_name);
+ zend_string_release(function->common.function_name);
+ if (!(function->common.fn_flags & ZEND_ACC_ARENA_ALLOCATED)) {
+ pefree(function, 1);
+ }
}
}