/[weechat]/weechat/src/plugins/scripts/ruby/weechat-ruby.c
ViewVC logotype

Diff of /weechat/src/plugins/scripts/ruby/weechat-ruby.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.7 by kolter, Tue Dec 6 22:38:06 2005 UTC revision 1.8 by kolter, Sat Dec 10 22:28:18 2005 UTC
# Line 50  int modnum = 0; Line 50  int modnum = 0;
50    
51    
52  /*  /*
  * -- this structure comes from apache mod_ruby --  
  */  
 typedef struct protect_call_arg {  
     VALUE recv;  
     ID mid;  
     int argc;  
     VALUE *argv;  
 } protect_call_arg_t;  
   
 /*  
53   * protect_funcall0 :   * protect_funcall0 :
54   *   *
  * -- this function comes from apache mod_ruby --  
55   */   */
56    
57  static VALUE  static VALUE
58  protect_funcall0(VALUE arg)  rb_funcall0 (VALUE args)
59  {  {
60      return rb_funcall2(((protect_call_arg_t *) arg)->recv,      VALUE recv = rb_ary_shift (args);
61                         ((protect_call_arg_t *) arg)->mid,      VALUE func = rb_ary_shift (args);
62                         ((protect_call_arg_t *) arg)->argc,      VALUE argc = rb_ary_shift (args);
63                         ((protect_call_arg_t *) arg)->argv);  
64        return rb_funcall2(recv, rb_intern(STR2CSTR(func)), NUM2INT(argc), RARRAY(args)->ptr);
65  }  }
66    
67  /*  /*
68   * rb_protect_funcall :   * protect_rescue0 :
69   *   *
  * -- this function comes from apache mod_ruby --  
70   */   */
71    
72  VALUE  VALUE
73  rb_protect_funcall(VALUE recv, ID mid, int *state, int argc, ...)  rb_rescue0 (VALUE func, VALUE error_info)
74    {    
75        VALUE str = rb_funcall(error_info, rb_intern("to_s"), 0, NULL);
76        VALUE errinfo = rb_inspect(ruby_errinfo);
77        
78        ruby_plugin->printf_server (ruby_plugin,
79                                    "Ruby error: unable to run function \"%s\"",
80                                    STR2CSTR(func));
81        ruby_plugin->printf_server (ruby_plugin,
82                                    "Ruby error: %s", STR2CSTR(str));
83        ruby_plugin->printf_server (ruby_plugin,
84                                    "Ruby error: %s", STR2CSTR(errinfo));
85        //rb_backtrace ();
86            
87        return INT2FIX(PLUGIN_RC_KO);
88    }
89    
90    
91    /*
92     * rb_rescue_funcall :
93     *
94     */
95    
96    
97    VALUE
98    rb_rescue_funcall (VALUE recv, VALUE func, int argc, ...)
99  {  {
100    
101      va_list ap;      va_list ap;
102      VALUE *argv;      VALUE argv;
     struct protect_call_arg arg;  
103    
104        argv = rb_ary_new ();
105        
106        rb_ary_push (argv, recv);
107        rb_ary_push (argv, func);
108        rb_ary_push (argv, INT2FIX(argc));
109        
110      if (argc > 0)      if (argc > 0)
111      {      {
112          int i;          int i;
         argv = ALLOCA_N(VALUE, argc);  
113          va_start(ap, argc);          va_start(ap, argc);
114          for (i = 0; i < argc; i++)          for (i = 0; i < argc; i++)
115              argv[i] = va_arg(ap, VALUE);              rb_ary_push (argv, va_arg(ap, VALUE));
116          va_end(ap);          va_end(ap);
117      }      }
118      else      
119          argv = 0;      VALUE ret = rb_rescue(rb_funcall0, argv, rb_rescue0, func);
120      arg.recv = recv;  
121      arg.mid = mid;      if (NIL_P(ret))
122      arg.argc = argc;          ret = INT2FIX(PLUGIN_RC_KO);
123      arg.argv = argv;  
124      return rb_protect(protect_funcall0, (VALUE) &arg, state);      return ret;
125  }  }
126    
127    
128  /*  /*
129   * weechat_ruby_exec: execute a Ruby script   * weechat_ruby_exec: execute a Ruby script
130   */   */
# Line 118  weechat_ruby_exec (t_weechat_plugin *plu Line 138  weechat_ruby_exec (t_weechat_plugin *plu
138      (void) plugin;      (void) plugin;
139    
140      VALUE ruby_retcode;      VALUE ruby_retcode;
     int ruby_error;  
141            
142      ruby_current_script = script;      ruby_current_script = script;
143    
144      ruby_retcode = rb_protect_funcall ((VALUE) script->interpreter, rb_intern(function),      ruby_retcode = rb_rescue_funcall ((VALUE) script->interpreter, rb_str_new2(function), 2,
145                                         &ruby_error, 2,                                        rb_str_new2((server == NULL) ? "" : server),
146                                         rb_str_new2((server == NULL) ? "" : server),                                        rb_str_new2((arguments == NULL) ? "" : arguments));
147                                         rb_str_new2((arguments == NULL) ? "" : arguments));      
     if (ruby_error)  
     {  
         VALUE ruby_error_info = rb_inspect(ruby_errinfo);  
         rb_backtrace();  
         ruby_plugin->printf_server (ruby_plugin,  
                                     "Ruby error: unable to run function \"%s\"",  
                                     function);  
         ruby_plugin->printf_server (ruby_plugin,  
                                     "Ruby error: %s", STR2CSTR(ruby_error_info));        
         return PLUGIN_RC_KO;  
     }  
   
148      return NUM2INT(ruby_retcode);      return NUM2INT(ruby_retcode);
149  }  }
150    
# Line 934  weechat_ruby_load (t_weechat_plugin *plu Line 941  weechat_ruby_load (t_weechat_plugin *plu
941      char modname[64];      char modname[64];
942      VALUE curModule;      VALUE curModule;
943      VALUE ruby_retcode;      VALUE ruby_retcode;
     int ruby_error;  
944            
945      plugin->printf_server (plugin, "Loading Ruby script \"%s\"", filename);      plugin->printf_server (plugin, "Loading Ruby script \"%s\"", filename);
946      ruby_current_script = NULL;      ruby_current_script = NULL;
# Line 946  weechat_ruby_load (t_weechat_plugin *plu Line 952  weechat_ruby_load (t_weechat_plugin *plu
952    
953      ruby_current_script_filename = strdup (filename);      ruby_current_script_filename = strdup (filename);
954            
955      ruby_retcode = rb_protect_funcall (curModule, rb_intern("load_eval_file"),      ruby_retcode = rb_rescue_funcall (curModule, rb_str_new2("load_eval_file"),
956                                         &ruby_error, 1, rb_str_new2(filename));                                        1, rb_str_new2(filename));
957            
958      free (ruby_current_script_filename);      free (ruby_current_script_filename);
959        
960      if (NUM2INT(ruby_retcode) != 0)      if (NUM2INT(ruby_retcode) != 0)
961      {      {
962          VALUE ruby_eval_error;          VALUE ruby_eval_error;
# Line 985  weechat_ruby_load (t_weechat_plugin *plu Line 991  weechat_ruby_load (t_weechat_plugin *plu
991          return 0;          return 0;
992      }      }
993            
994      ruby_retcode = rb_protect_funcall (curModule, rb_intern("weechat_init"), &ruby_error, 0);      ruby_retcode = rb_rescue_funcall (curModule, rb_str_new2("weechat_init"), 0);
995      if (ruby_error) {      
996          VALUE ruby_error_info = rb_inspect(ruby_errinfo);      if (NUM2INT(ruby_retcode) != PLUGIN_RC_OK)
997          rb_backtrace();      {
998          ruby_plugin->printf_server (ruby_plugin,          ruby_plugin->printf_server (ruby_plugin,
999                                      "Ruby error: unable to eval weechat_init in file \"%s\"",                                      "Ruby error: unable to eval weechat_init in file \"%s\"",
1000                                      filename);                                      filename);  
         ruby_plugin->printf_server (ruby_plugin,  
                                     "Ruby error: %s", STR2CSTR(ruby_error_info));  
           
1001          if (ruby_current_script != NULL)          if (ruby_current_script != NULL)
1002              weechat_script_remove (plugin, &ruby_scripts, ruby_current_script);              weechat_script_remove (plugin, &ruby_scripts, ruby_current_script);
1003                    

Legend:
Removed from v.1.7  
changed lines
  Added in v.1.8

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26