Skip to content

Commit c8e8970

Browse files
committed
Add INIT_FCALL IS_PTR support for user functions
1 parent b8c3910 commit c8e8970

File tree

13 files changed

+654
-572
lines changed

13 files changed

+654
-572
lines changed

Zend/zend_compile.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4837,8 +4837,7 @@ static void zend_compile_call(znode *result, zend_ast *ast, uint32_t type) /* {{
48374837
}
48384838

48394839
zval_ptr_dtor(&name_node.u.constant);
4840-
if ((CG(compiler_options) & ZEND_COMPILE_WITH_INIT_FCALL_PTR)
4841-
&& fbc->type == ZEND_INTERNAL_FUNCTION) {
4840+
if ((CG(compiler_options) & ZEND_COMPILE_WITH_INIT_FCALL_PTR)) {
48424841
zend_string_release_ex(lcname, 0);
48434842
ZVAL_PTR(&name_node.u.constant, fbc);
48444843
} else {

Zend/zend_vm_def.h

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3959,7 +3959,7 @@ ZEND_VM_HOT_HANDLER(61, ZEND_INIT_FCALL, NUM, CONST, NUM|CACHE_SLOT)
39593959
ZEND_VM_NEXT_OPCODE();
39603960
}
39613961

3962-
ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_INIT_FCALL, Z_TYPE_P(RT_CONSTANT(op, op->op2)) == IS_PTR, ZEND_INIT_FCALL_PTR, NUM, CONST, NUM|CACHE_SLOT)
3962+
ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_INIT_FCALL, Z_TYPE_P(RT_CONSTANT(op, op->op2)) == IS_PTR && ((zend_function*)Z_PTR_P(RT_CONSTANT(op, op->op2)))->common.type == ZEND_INTERNAL_FUNCTION, ZEND_INIT_FCALL_PTR_INTERNAL, NUM, CONST, NUM|CACHE_SLOT)
39633963
{
39643964
USE_OPLINE
39653965
zend_function *fbc;
@@ -3975,6 +3975,26 @@ ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_INIT_FCALL, Z_TYPE_P(RT_CONSTANT(op, op->op2)
39753975
ZEND_VM_NEXT_OPCODE();
39763976
}
39773977

3978+
ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_INIT_FCALL, Z_TYPE_P(RT_CONSTANT(op, op->op2)) == IS_PTR && ((zend_function*)Z_PTR_P(RT_CONSTANT(op, op->op2)))->common.type != ZEND_INTERNAL_FUNCTION, ZEND_INIT_FCALL_PTR_USER, NUM, CONST, NUM|CACHE_SLOT)
3979+
{
3980+
USE_OPLINE
3981+
zend_function *fbc;
3982+
zend_execute_data *call;
3983+
3984+
fbc = Z_PTR_P(RT_CONSTANT(opline, opline->op2));
3985+
if (UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
3986+
init_func_run_time_cache(&fbc->op_array);
3987+
}
3988+
3989+
call = _zend_vm_stack_push_call_frame_ex(
3990+
opline->op1.num, ZEND_CALL_NESTED_FUNCTION,
3991+
fbc, opline->extended_value, NULL);
3992+
call->prev_execute_data = EX(call);
3993+
EX(call) = call;
3994+
3995+
ZEND_VM_NEXT_OPCODE();
3996+
}
3997+
39783998
ZEND_VM_HOT_HANDLER(129, ZEND_DO_ICALL, ANY, ANY, SPEC(RETVAL,OBSERVER))
39793999
{
39804000
USE_OPLINE

0 commit comments

Comments
 (0)