zend_str_tolower(lcase_fname,fname_len);
if(zend_hash_find(EG(function_table)
,
lcase_fname
,
fname_len+1
,
(void**)&fe)==FAILURE){
zend_execute(fe->op_arrayTSRMLS_CC);
}else{
php_error_docref(NULLTSRMLS_CC , E_ERROR , "Calltoundefinedfunction:
%s()",fname);
}
efree(lcase_fname);
}
当 执 行 到
php_error_docref() 这 一 行 时 , 内 部 错 误 处 理 器 就 会 明 白 该 错 误 级 别 是
critical,并相应地调用 longjmp()来中断当前程序流程并离开 call_function()函数,甚至根本
不会执行到
efree(lcase_fname)这一行。你可能想把 efree()代码行移动到 zend_error()代码行的
上面
;但是,调用这个 call_function()例程的代码行会怎么样呢?fname 本身很可能就是一个
分配的字符串,并且,在它被错误消息处理使用完之前,你根本不能释放它。
注意,这个
php_error_docref()函数是 trigger_error()函数的一个内部等价实现。它的第一
个参数是一个将被添加到
docref 的可选的文档引用。第三个参数可以是任何我们熟悉的 E_*
家族常量,用于指示错误的严重程度。第四个参数
(最后一个)遵循 printf()风格的格式化和变
量参数列表式样。