zend_hash_update(
CG(function_table),
opline->op1.u.constant.value.str.val,
opline->op1.u.constant.value.str.len,
&op_array,
sizeof(zend_op_array),
(void **) &CG(active_op_array)
);
这也应该是Optimizer与源码的区别
源码使用zend_hash_update
Optimizer使用zend_hash_quick_update
#define zend_hash_update(ht, arKey, nKeyLength, pData, nDataSize, pDest) \
zend_hash_add_or_update(ht, arKey, nKeyLength, pData, nDataSize, pDest, HASH_UPDATE)
ZEND_API int zend_hash_add_or_update(
HashTable *ht, 函数表
char *arKey, 函数名
uint nKeyLength, 函数名长度
void *pData, 函数内部实现的操作码
uint nDataSize, 操作码大小
void **pDest, 与当前活动的函数操作码连接起来,从而可让函数找到它内部的实现
int flag)
解析执行时
从函数表中查找也是采用
zend_hash_quick_find而不是zend_hash_find