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 |
*/ |
*/ |
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 |
|
|
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; |
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; |
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 |
|
|