php-5.6.26源代码 - 如何用C语言支持“类似异常”机制
- 代码编写在文件php-5.6.\Zend\zend.h
- #define zend_bailout() _zend_bailout(__FILE__, __LINE__)
- #ifdef HAVE_SIGSETJMP
- # define SETJMP(a) sigsetjmp(a, ) // 设置跳转点
- # define LONGJMP(a,b) siglongjmp(a, b) // 进行跳转
- # define JMP_BUF sigjmp_buf
- #else
- # define SETJMP(a) setjmp(a)
- # define LONGJMP(a,b) longjmp(a, b)
- # define JMP_BUF jmp_buf
- #endif
- #define zend_try \
- { \
- JMP_BUF *__orig_bailout = EG(bailout); \
- JMP_BUF __bailout; \
- \
- EG(bailout) = &__bailout; \
- if (SETJMP(__bailout)==) { // 设置跳转点
- #define zend_catch \
- } else { \
- EG(bailout) = __orig_bailout;
- #define zend_end_try() \
- } \
- EG(bailout) = __orig_bailout; \
- }
- #define zend_first_try EG(bailout)=NULL; zend_try
- 使用例子
- // 宏代码
- zend_try {
- /* 2 = Count of deprecation structs */
- for (i = ; i < ; i++) {
- const char **p = directives[i].directives;
- while(*p) {
- long value;
- if (cfg_get_long((char*)*p, &value) == SUCCESS && value) {
- zend_error(directives[i].error_level, directives[i].phrase, *p);
- }
- ++p;
- }
- }
- } zend_catch {
- retval = FAILURE;
- } zend_end_try();
- // 宏展开
- {
- {
- JMP_BUF *__orig_bailout = EG(bailout);
- JMP_BUF __bailout;
- EG(bailout) = &__bailout;
- if (SETJMP(__bailout)==) {
- /* 2 = Count of deprecation structs */
- for (i = ; i < ; i++) {
- const char **p = directives[i].directives;
- while(*p) {
- long value;
- if (cfg_get_long((char*)*p, &value) == SUCCESS && value) {
- zend_error(directives[i].error_level, directives[i].phrase, *p);
- }
- ++p;
- }
- }
- } else {
- EG(bailout) = __orig_bailout;
- }
- EG(bailout) = __orig_bailout;
- }
- }
php-5.6.26源代码 - 如何用C语言支持“类似异常”机制的更多相关文章
- 如何用C#语言构造蜘蛛程序
"蜘蛛"(Spider)是Internet上一种很有用的程序,搜索引擎利用蜘蛛程序将Web页面收集到数据库,企业利用蜘蛛程序监视竞争对手的网站并跟踪变动,个人用户用蜘蛛程序下载We ...
- PostSharp-5.0.26安装包_KeyGen发布_支持VS2017
PostSharp-5.0.26安装包_KeyGen发布_支持VS2017 请低调使用. PostSharp安装及注册步骤截图.rar 请把浏览器主页设置为以下地址支持本人.https://www.d ...
- 如何用 js 实现一个类似微信红包的随机算法
如何用 js 实现一个类似微信红包的随机算法 js, 微信红包, 随机算法 "use strict"; /** * * @author xgqfrms * @license MIT ...
- php-5.6.26源代码 - hash存储结构 - 添加
添加 , (void *)module, sizeof(zend_module_entry), (void**)&module_ptr){ // zend_hash_add 定义在文件“php ...
- php-5.6.26源代码 - hash存储结构 - 初始化
初始化 有指定析构函数,在销毁hash的时候会调用,如:“类似extension=test.so扩展”也是存放在HashTable中的,“类似extension=test.so扩展”的module_s ...
- php-5.6.26源代码 - hash存储结构 - hash算法
// zend_inline_hash_func 实现在文件“php-5.6.26\Zend\zend_hash.h” h = zend_inline_hash_func(arKey, nKeyLen ...
- php-7.2.3源代码和php-5.6.26源代码摘录,对比 “汇编php文件”和“执行opcode代码”
php-7.2.3 在“汇编php文件”和“执行opcode代码”上做了大量改变php-5.6.26 没见到支持抽象语法树的相关代码,php-7.2.3 见到支持抽象语法树的相关代码php-5.6.2 ...
- php-5.6.26源代码 - opcode处理器,“函数调用opcode”处理器,如何调用扩展模块的函数
// opcode处理器 --- ZEND_DO_FCALL_SPEC_CONST_HANDLER实现在 php-5.6.26\Zend\zend_vm_execute.h static int ZE ...
- php-5.6.26源代码 - 扩展模块的加载、注册
// main实现在文件 php-5.6.26\sapi\cgi\cgi_main.c int main(int argc, char *argv[]) { .... cgi_sapi_module- ...
随机推荐
- SQLSERVER 自增列,值突然增大1000
SQLSERVER 自增列,值突然增大1000https://blog.csdn.net/lichxi1002/article/details/40074247
- 配置Slf4j依赖,桥接各种多个日志组件(排除commons-logging依赖的影响)
由于各个jar组件使用的日志框架不一样,实际项目中可能会引入多个jar,通常使用的日志框架有 commons-logging log4j 若同一个项目引入多个日志组件,那么Slf4j组件会有不能捕捉到 ...
- Mysql慢查询 [第一篇]
一.简介 开启慢查询日志,可以让MySQL记录下查询超过指定时间的语句,通过定位分析性能的瓶颈,才能更好的优化数据库系统的性能. 二.参数说明 slow_query_log 慢查询开启状态slow_q ...
- Form 头行附件查询
查询Form的头行附件: SELECT st.short_text order_short_text, description order_attach_desc, pk1_value order_ ...
- Azure 进阶攻略 | 上云后的系统,「门禁」制度又该如何实现?
各位办公室白领们,不妨回想一下自己每天去公司上班时的一些细节. 为避免「闲杂人等」进入工作场所,我们需要证明自己是这家公司的员工才能进入,对吧!所有员工,无论所属部门或职位,都必须先证明自己身份,例如 ...
- Request processing failed; nested exception is org.apache.ibatis.binding.BindingException: Invalid b
Request processing failed; nested exception is org.apache.ibatis.binding.BindingException: Invalid b ...
- Google面试准备
本人小弱,面试过了Google的HC,虽然team match还没完成,到最后还有变数.但对自己这段时间的努力,也算一个交代了. 最初是一年半前Google的HR联系到我,然后第一次在电面就挂了.经过 ...
- Python用户交互与流程控制
1. 用户交互 python3通过input实现用户交互,与python2的raw_input一样,接收的值都转换成字符串格式.python2中也有一个input,而python2中的input接收的 ...
- IOS TableView代理设置 table的行高
// 设置行高(每一行的高度一致) self.tableView.rowHeight = ; self.tableView.delegate = self; #pragma mark - 代理方法 / ...
- ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id
远程删除key ssh-keygen -f "~/.ssh/known_hosts" -R 192.168.0.34 如果还是不可以,通过 ssh-keygen 重新生成key