Skip to content

Commit 21da469

Browse files
committed
update
1 parent afe79b0 commit 21da469

File tree

2 files changed

+5
-5
lines changed

2 files changed

+5
-5
lines changed

zend_executor.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ ZEND_API zend_executor_globals executor_globals;
9898
![EG](img/EG.png)
9999
100100
### 1.4、zend_execute_data
101-
`zend_execute_data`是执行过程中最核心的一个结构,它代表了当前的作用域、代码的执行位置以及局部变量的分配等等,后面分析具体执行流程的时候会详细分析其作用。
101+
`zend_execute_data`是执行过程中最核心的一个结构,每次函数的调用、include/require、eval等都会生成一个新的结构,它表示当前的作用域、代码的执行位置以及局部变量的分配等等,等同于机器码执行过程中stack的角色,后面分析具体执行流程的时候会详细分析其作用。
102102
103103
```c
104104
#define EX(element) ((execute_data)->element)
@@ -109,7 +109,7 @@ struct _zend_execute_data {
109109
zend_execute_data *call; /* current call */
110110
zval *return_value; //返回值指针 */
111111
zend_function *func; //当前执行的函数(非函数调用时为空)
112-
zval This; //this + call_info + num_args
112+
zval This; //这个值并仅仅是面向对象的this,还有另外两个值也通过这个记录:call_info + num_args,分别存在zval.u1.reserved、zval.u2.num_args
113113
zend_class_entry *called_scope; //当前call的类
114114
zend_execute_data *prev_execute_data; //函数调用时指向调用位置作用空间
115115
zend_array *symbol_table; //全局变量符号表
@@ -234,7 +234,7 @@ static zend_always_inline zend_execute_data *zend_vm_stack_push_call_frame_ex(ui
234234
```
235235

236236
#### (2)初始化execute_data
237-
这一步的操作主要是设置几个指针:`opline``call``return_value`,同时将PHP的全局变量添加到`EG(symbol_table)`中去:
237+
注意,这里的初始化是整个php脚本最初的那个,并不是指函数调用时的,这一步的操作主要是设置几个指针:`opline``call``return_value`,同时将PHP的全局变量添加到`EG(symbol_table)`中去:
238238
```c
239239
//zend_execute.c
240240
static zend_always_inline void i_init_execute_data(zend_execute_data *execute_data, zend_op_array *op_array, zval *return_value)
@@ -245,7 +245,7 @@ static zend_always_inline void i_init_execute_data(zend_execute_data *execute_da
245245

246246
if (UNEXPECTED(EX(symbol_table) != NULL)) {
247247
...
248-
zend_attach_symbol_table(execute_data);//将全局变量添加到EG(symbol_table)中一份
248+
zend_attach_symbol_table(execute_data);//将全局变量添加到EG(symbol_table)中一份,因为此处的execute_data是PHP脚本最初的那个,不是function的,所以所有的变量都是全局的
249249
}else{ //这个分支的情况还未深入分析,后面碰到再补充
250250
...
251251
}

zval.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ struct _zval_struct {
3535
zend_uchar type, //变量类型
3636
zend_uchar type_flags, //类型掩码,不同的类型会有不同的几种属性,内存管理会用到
3737
zend_uchar const_flags,
38-
zend_uchar reserved) /* call info for EX(This) */
38+
zend_uchar reserved) //call info,zend执行流程会用到
3939
} v;
4040
uint32_t type_info; //上面4个值的组合值,可以直接根据type_info取到4个对应位置的值
4141
} u1;

0 commit comments

Comments
 (0)