1. 代码编写在文件php-5.6.\Zend\zend.h
  2. #define zend_bailout() _zend_bailout(__FILE__, __LINE__)
  3.  
  4. #ifdef HAVE_SIGSETJMP
  5. # define SETJMP(a) sigsetjmp(a, ) // 设置跳转点
  6. # define LONGJMP(a,b) siglongjmp(a, b) // 进行跳转
  7. # define JMP_BUF sigjmp_buf
  8. #else
  9. # define SETJMP(a) setjmp(a)
  10. # define LONGJMP(a,b) longjmp(a, b)
  11. # define JMP_BUF jmp_buf
  12. #endif
  13.  
  14. #define zend_try \
  15. { \
  16. JMP_BUF *__orig_bailout = EG(bailout); \
  17. JMP_BUF __bailout; \
  18. \
  19. EG(bailout) = &__bailout; \
  20. if (SETJMP(__bailout)==) { // 设置跳转点
  21. #define zend_catch \
  22. } else { \
  23. EG(bailout) = __orig_bailout;
  24. #define zend_end_try() \
  25. } \
  26. EG(bailout) = __orig_bailout; \
  27. }
  28. #define zend_first_try EG(bailout)=NULL; zend_try
  29.  
  30. 使用例子
  31. // 宏代码
  32. zend_try {
  33. /* 2 = Count of deprecation structs */
  34. for (i = ; i < ; i++) {
  35. const char **p = directives[i].directives;
  36.  
  37. while(*p) {
  38. long value;
  39.  
  40. if (cfg_get_long((char*)*p, &value) == SUCCESS && value) {
  41. zend_error(directives[i].error_level, directives[i].phrase, *p);
  42. }
  43.  
  44. ++p;
  45. }
  46. }
  47. } zend_catch {
  48. retval = FAILURE;
  49. } zend_end_try();
  50.  
  51. // 宏展开
  52. {
  53. {
  54. JMP_BUF *__orig_bailout = EG(bailout);
  55. JMP_BUF __bailout;
  56.  
  57. EG(bailout) = &__bailout;
  58. if (SETJMP(__bailout)==) {
  59. /* 2 = Count of deprecation structs */
  60. for (i = ; i < ; i++) {
  61. const char **p = directives[i].directives;
  62.  
  63. while(*p) {
  64. long value;
  65.  
  66. if (cfg_get_long((char*)*p, &value) == SUCCESS && value) {
  67. zend_error(directives[i].error_level, directives[i].phrase, *p);
  68. }
  69.  
  70. ++p;
  71. }
  72. }
  73. } else {
  74. EG(bailout) = __orig_bailout;
  75. }
  76. EG(bailout) = __orig_bailout;
  77. }
  78. }

php-5.6.26源代码 - 如何用C语言支持“类似异常”机制的更多相关文章

  1. 如何用C#语言构造蜘蛛程序

    "蜘蛛"(Spider)是Internet上一种很有用的程序,搜索引擎利用蜘蛛程序将Web页面收集到数据库,企业利用蜘蛛程序监视竞争对手的网站并跟踪变动,个人用户用蜘蛛程序下载We ...

  2. PostSharp-5.0.26安装包_KeyGen发布_支持VS2017

    PostSharp-5.0.26安装包_KeyGen发布_支持VS2017 请低调使用. PostSharp安装及注册步骤截图.rar 请把浏览器主页设置为以下地址支持本人.https://www.d ...

  3. 如何用 js 实现一个类似微信红包的随机算法

    如何用 js 实现一个类似微信红包的随机算法 js, 微信红包, 随机算法 "use strict"; /** * * @author xgqfrms * @license MIT ...

  4. php-5.6.26源代码 - hash存储结构 - 添加

    添加 , (void *)module, sizeof(zend_module_entry), (void**)&module_ptr){ // zend_hash_add 定义在文件“php ...

  5. php-5.6.26源代码 - hash存储结构 - 初始化

    初始化 有指定析构函数,在销毁hash的时候会调用,如:“类似extension=test.so扩展”也是存放在HashTable中的,“类似extension=test.so扩展”的module_s ...

  6. 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 ...

  7. 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 ...

  8. 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 ...

  9. php-5.6.26源代码 - 扩展模块的加载、注册

    // main实现在文件 php-5.6.26\sapi\cgi\cgi_main.c int main(int argc, char *argv[]) { .... cgi_sapi_module- ...

随机推荐

  1. SQLSERVER 自增列,值突然增大1000

    SQLSERVER 自增列,值突然增大1000https://blog.csdn.net/lichxi1002/article/details/40074247  

  2. 配置Slf4j依赖,桥接各种多个日志组件(排除commons-logging依赖的影响)

    由于各个jar组件使用的日志框架不一样,实际项目中可能会引入多个jar,通常使用的日志框架有 commons-logging log4j 若同一个项目引入多个日志组件,那么Slf4j组件会有不能捕捉到 ...

  3. Mysql慢查询 [第一篇]

    一.简介 开启慢查询日志,可以让MySQL记录下查询超过指定时间的语句,通过定位分析性能的瓶颈,才能更好的优化数据库系统的性能. 二.参数说明 slow_query_log 慢查询开启状态slow_q ...

  4. Form 头行附件查询

    查询Form的头行附件: SELECT  st.short_text order_short_text, description order_attach_desc, pk1_value order_ ...

  5. Azure 进阶攻略 | 上云后的系统,「门禁」制度又该如何实现?

    各位办公室白领们,不妨回想一下自己每天去公司上班时的一些细节. 为避免「闲杂人等」进入工作场所,我们需要证明自己是这家公司的员工才能进入,对吧!所有员工,无论所属部门或职位,都必须先证明自己身份,例如 ...

  6. 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 ...

  7. Google面试准备

    本人小弱,面试过了Google的HC,虽然team match还没完成,到最后还有变数.但对自己这段时间的努力,也算一个交代了. 最初是一年半前Google的HR联系到我,然后第一次在电面就挂了.经过 ...

  8. Python用户交互与流程控制

    1. 用户交互 python3通过input实现用户交互,与python2的raw_input一样,接收的值都转换成字符串格式.python2中也有一个input,而python2中的input接收的 ...

  9. IOS TableView代理设置 table的行高

    // 设置行高(每一行的高度一致) self.tableView.rowHeight = ; self.tableView.delegate = self; #pragma mark - 代理方法 / ...

  10. 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