gpt4 book ai didi

php - php-src 中的 “zend_execute” 函数在哪里?

转载 作者:行者123 更新时间:2023-11-30 14:56:17 29 4
gpt4 key购买 nike

我只在zend_execute.h中看到了zend_execute函数的定义,但没有看到实现。

在 zend.c 第 1490 行

    ZEND_API int zend_execute_scripts(int type, zval *retval, int file_count, ...) /* {{{ */
{
va_list files;
int i;
zend_file_handle *file_handle;
zend_op_array *op_array;

va_start(files, file_count);
for (i = 0; i < file_count; i++) {
file_handle = va_arg(files, zend_file_handle *);
if (!file_handle) {
continue;
}

op_array = zend_compile_file(file_handle, type);
if (file_handle->opened_path) {
zend_hash_add_empty_element(&EG(included_files), file_handle->opened_path);
}
zend_destroy_file_handle(file_handle);
if (op_array) {
zend_execute(op_array, retval);
zend_exception_restore();
zend_try_exception_handler();
if (EG(exception)) {
zend_exception_error(EG(exception), E_ERROR);
}
destroy_op_array(op_array);
efree_size(op_array, sizeof(zend_op_array));
} else if (type==ZEND_REQUIRE) {
va_end(files);
return FAILURE;
}
}
va_end(files);

return SUCCESS;
}

在 zend_execute.h

ZEND_API void zend_execute(zend_op_array *op_array, zval *return_value);

但是我找不到这个函数的实现。

PHP 版本

PHP 7.2.0-dev (cli) (built: Mar 31 2017 10:47:40) ( NTS DEBUG )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.2.0-dev, Copyright (c) 1998-2017 Zend Technologies

有熟悉 php-src 的人帮助我吗?

最佳答案

我的理解是,这个函数不是硬编码的,而是由基于骨架的脚本生成的,作为创建虚拟机过程的一部分。

参见:

https://github.com/php/php-src/blob/master/Zend/README.ZEND_VM#L88

Executor's code is generated by PHP script zend_vm_gen.php it uses zend_vm_def.h and zend_vm_execute.skl as input and produces zend_vm_opcodes.h and zend_vm_execute.h. The first file is a list of opcode definitions. It is included from zend_compile.h. The second one is an executor code itself. It is included from zend_execute.c.

zend_vm_gen.php can produce different kind of executors. You can select different opcode threading model using --with-vm-kind=CALL|SWITCH|GOTO. You can disable opcode specialization using --without-specializer. You can include or exclude old executor together with specialized one using --without-old-executor. At last you can debug executor using original zend_vm_def.h or generated file zend_vm_execute.h. Debugging with original file requires --with-lines option. By default ZE2 uses the following command to generate executor:

$ php zend_vm_gen.php --with-vm-kind=CALL

您正在寻找的函数是从此骨架生成的:

https://github.com/php/php-src/blob/master/Zend/zend_vm_execute.skl#L24

通过 zend_vm_gen.php 脚本,有:

https://github.com/php/php-src/blob/master/Zend/zend_vm_gen.php#L2385

使用.php脚本后,生成的zend_execute()实际代码可以在zend_vm_execute.h中找到,它本身包含在zend_execute中.c.

你实际上可以看到一个生成的zend_vm_execute.h,它当前留在GitHub存储库中,这是该执行生成的文件,只不过生成的文件太大而无法正常查看GitHub,您需要使用 GitHub 的“原始” View 来查看它(它是一个 2.2 Mb 文件!),如下所示:

https://raw.githubusercontent.com/php/php-src/master/Zend/zend_vm_execute.h

您将在第 63108 行看到:

ZEND_API void zend_execute(zend_op_array *op_array, zval *return_value)                                                                                                                                            
{
zend_execute_data *execute_data;

if (EG(exception) != NULL) {
return;
}

execute_data = zend_vm_stack_push_call_frame(ZEND_CALL_TOP_CODE | ZEND_CALL_HAS_SYMBOL_TABLE,
(zend_function*)op_array, 0, zend_get_called_scope(EG(current_execute_data)), zend_get_this_object(EG(current_execute_data)));
if (EG(current_execute_data)) {
execute_data->symbol_table = zend_rebuild_symbol_table();
} else {
execute_data->symbol_table = &EG(symbol_table);
}
EX(prev_execute_data) = EG(current_execute_data);
i_init_code_execute_data(execute_data, op_array, return_value);
zend_execute_ex(execute_data);
zend_vm_stack_free_call_frame(execute_data);
}

这个blog post作者:nikic 通过添加您自己的新运算符的用例,有助于理解如何使用 php-src。

关于php - php-src 中的 “zend_execute” 函数在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44816658/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com