diff options
| author | Dmitry Stogov <dmitry@zend.com> | 2018-01-11 16:25:28 +0300 |
|---|---|---|
| committer | Dmitry Stogov <dmitry@zend.com> | 2018-01-11 16:25:28 +0300 |
| commit | 781e1573afdc7c336b3577ceabc9c65cafea17e8 (patch) | |
| tree | b9738020d342fac1c28b2517687008947117e19d /Zend/zend_vm_def.h | |
| parent | 35e70af2085300418cab4a801730dbeb05d5d222 (diff) | |
| download | php-git-781e1573afdc7c336b3577ceabc9c65cafea17e8.tar.gz | |
Use ZEND_CLOSURE_OBJECT() macro to resolve closure op_array to closure object through address calculation, instead of op_array->prototype reuse.
Diffstat (limited to 'Zend/zend_vm_def.h')
| -rw-r--r-- | Zend/zend_vm_def.h | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index cd0a769f34..9627c045d3 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2374,7 +2374,7 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY) } OBJ_RELEASE(object); } else if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) { - OBJ_RELEASE((zend_object*)execute_data->func->op_array.prototype); + OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func))); } EG(vm_stack_top) = (zval*)execute_data; execute_data = EX(prev_execute_data); @@ -2405,7 +2405,7 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY) } OBJ_RELEASE(object); } else if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) { - OBJ_RELEASE((zend_object*)execute_data->func->op_array.prototype); + OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func))); } zend_vm_stack_free_extra_args_ex(call_info, execute_data); @@ -2447,7 +2447,7 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY) } EG(current_execute_data) = EX(prev_execute_data); if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) { - OBJ_RELEASE((zend_object*)EX(func)->op_array.prototype); + OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func))); } ZEND_VM_RETURN(); } else /* if (call_kind == ZEND_CALL_TOP_CODE) */ { @@ -3356,8 +3356,7 @@ ZEND_VM_HANDLER(118, ZEND_INIT_USER_CALL, CONST, CONST|TMPVAR|CV, NUM) } if (func->common.fn_flags & ZEND_ACC_CLOSURE) { /* Delay closure destruction until its invocation */ - ZEND_ASSERT(GC_TYPE((zend_object*)func->common.prototype) == IS_OBJECT); - GC_ADDREF((zend_object*)func->common.prototype); + GC_ADDREF(ZEND_CLOSURE_OBJECT(func)); call_info |= ZEND_CALL_CLOSURE; if (func->common.fn_flags & ZEND_ACC_FAKE_CLOSURE) { call_info |= ZEND_CALL_FAKE_CLOSURE; @@ -3370,7 +3369,7 @@ ZEND_VM_HANDLER(118, ZEND_INIT_USER_CALL, CONST, CONST|TMPVAR|CV, NUM) FREE_OP2(); if ((OP2_TYPE & (IS_TMP_VAR|IS_VAR)) && UNEXPECTED(EG(exception))) { if (call_info & ZEND_CALL_CLOSURE) { - zend_object_release((zend_object*)func->common.prototype); + zend_object_release(ZEND_CLOSURE_OBJECT(func)); } if (call_info & ZEND_CALL_RELEASE_THIS) { zend_object_release(object); @@ -4532,7 +4531,7 @@ ZEND_VM_HANDLER(119, ZEND_SEND_ARRAY, ANY, ANY, NUM) } zend_internal_type_error(EX_USES_STRICT_TYPES(), "call_user_func_array() expects parameter 2 to be array, %s given", zend_get_type_by_const(Z_TYPE_P(args))); if (ZEND_CALL_INFO(EX(call)) & ZEND_CALL_CLOSURE) { - OBJ_RELEASE((zend_object*)EX(call)->func->common.prototype); + OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(call)->func)); } if (Z_TYPE(EX(call)->This) == IS_OBJECT) { OBJ_RELEASE(Z_OBJ(EX(call)->This)); |
