goto done;
case ZEND_INIT_FCALL:
case ZEND_INIT_FCALL_BY_NAME:
+ case ZEND_INIT_NS_FCALL_BY_NAME:
if (!zend_jit_init_fcall(&dasm_state, opline, b, op_array, ssa, call_level, NULL)) {
goto jit_failure;
}
REGISTER_HELPER(memcmp);
REGISTER_HELPER(zend_jit_init_func_run_time_cache_helper);
REGISTER_HELPER(zend_jit_find_func_helper);
+ REGISTER_HELPER(zend_jit_find_ns_func_helper);
REGISTER_HELPER(zend_jit_extend_stack_helper);
REGISTER_HELPER(zend_jit_int_extend_stack_helper);
REGISTER_HELPER(zend_jit_leave_nested_func_helper);
return fbc;
}
+static zend_function* ZEND_FASTCALL zend_jit_find_ns_func_helper(zval *func_name)
+{
+ zval *func = zend_hash_find_ex(EG(function_table), Z_STR_P(func_name + 1), 1);
+ zend_function *fbc;
+
+ if (func == NULL) {
+ func = zend_hash_find_ex(EG(function_table), Z_STR_P(func_name + 2), 1);
+ if (UNEXPECTED(func == NULL)) {
+ return NULL;
+ }
+ }
+ fbc = Z_FUNC_P(func);
+ if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
+ fbc = _zend_jit_init_func_run_time_cache(&fbc->op_array);
+ }
+ return fbc;
+}
+
static zend_execute_data* ZEND_FASTCALL zend_jit_extend_stack_helper(uint32_t used_stack, zend_function *fbc)
{
zend_execute_data *call = (zend_execute_data*)zend_vm_stack_extend(used_stack);
goto done;
case ZEND_INIT_FCALL:
case ZEND_INIT_FCALL_BY_NAME:
+ case ZEND_INIT_NS_FCALL_BY_NAME:
if (!zend_jit_init_fcall(&dasm_state, opline, op_array_ssa->cfg.map ? op_array_ssa->cfg.map[opline - op_array->opcodes] : -1, op_array, op_array_ssa, call_level, p + 1)) {
goto jit_failure;
}
}
goto done;
#endif
-// case ZEND_INIT_NS_FCALL_BY_NAME:
- // TODO: we may need a guard after INIT_NS_FCALL???
case ZEND_INIT_METHOD_CALL:
case ZEND_INIT_DYNAMIC_CALL:
if (!zend_jit_trace_handler(&dasm_state, op_array, opline, zend_may_throw(opline, ssa_op, op_array, ssa), p + 1)) {
if (!func
&& trace
- && trace->op == ZEND_JIT_TRACE_INIT_CALL
- && (opline->opcode == ZEND_INIT_FCALL || opline->opcode == ZEND_INIT_FCALL_BY_NAME)) {
+ && trace->op == ZEND_JIT_TRACE_INIT_CALL) {
/* TODO: add guard ??? */
func = (zend_function*)trace->func;
}
if (opline->opcode == ZEND_INIT_FCALL) {
| LOAD_ADDR FCARG1a, Z_STR_P(zv);
+ | EXT_CALL zend_jit_find_func_helper, r0
} else if (opline->opcode == ZEND_INIT_FCALL_BY_NAME) {
| LOAD_ADDR FCARG1a, Z_STR_P(zv + 1);
+ | EXT_CALL zend_jit_find_func_helper, r0
+ } else if (opline->opcode == ZEND_INIT_NS_FCALL_BY_NAME) {
+ | LOAD_ADDR FCARG1a, zv;
+ | EXT_CALL zend_jit_find_ns_func_helper, r0
} else {
ZEND_ASSERT(0);
}
- | EXT_CALL zend_jit_find_func_helper, r0
| // CACHE_PTR(opline->result.num, fbc);
| mov r1, EX->run_time_cache
| mov aword [r1 + opline->result.num], r0