Skip to content

Commit 5985d8a

Browse files
committed
Avoid the use of the rb_eval_cmd_kw function if it is not available
Fixes #75
1 parent 6f35a07 commit 5985d8a

2 files changed

Lines changed: 31 additions & 0 deletions

File tree

ext/tk/tkutil/extconf.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
begin
33
require 'mkmf'
44

5+
have_func("rb_eval_cmd_kw", "ruby.h")
56
have_func("rb_obj_instance_exec", "ruby.h")
67
have_func("rb_sym2str", "ruby.h")
78
have_func("rb_id2str", "ruby.h")

ext/tk/tkutil/tkutil.c

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,14 +167,44 @@ tk_obj_untrust(VALUE self, VALUE obj)
167167
return obj;
168168
}
169169

170+
struct tk_eval_cmd_call_args {
171+
VALUE cmd;
172+
int argc;
173+
const VALUE *argv;
174+
};
175+
176+
static VALUE
177+
tk_eval_cmd_call(VALUE arg)
178+
{
179+
const struct tk_eval_cmd_call_args *args = (const struct tk_eval_cmd_call_args*)arg;
180+
return rb_funcallv_kw(args->cmd, rb_intern("call"), args->argc, args->argv, 0);
181+
}
182+
170183
static VALUE
171184
tk_eval_cmd(int argc, VALUE *argv, VALUE self)
172185
{
173186
VALUE cmd, rest;
174187

175188
rb_scan_args(argc, argv, "1*", &cmd, &rest);
176189
#ifdef RB_PASS_KEYWORDS
190+
# ifdef HAVE_RB_EVAL_CMD_KW
177191
return rb_eval_cmd_kw(cmd, rest, 0);
192+
# else
193+
if (RB_TYPE_P(cmd, T_STRING)) {
194+
int pstate;
195+
return rb_eval_string_protect(RSTRING_PTR(cmd), &pstate);
196+
} else {
197+
int pstate;
198+
struct tk_eval_cmd_call_args args;
199+
VALUE val;
200+
args.cmd = cmd;
201+
args.argc = RARRAY_LENINT(rest);
202+
args.argv = RARRAY_CONST_PTR(rest);
203+
val = rb_protect(tk_eval_cmd_call, (VALUE)&args, &pstate);
204+
RB_GC_GUARD(rest);
205+
return val;
206+
}
207+
# endif
178208
#else
179209
return rb_eval_cmd(cmd, rest, 0);
180210
#endif

0 commit comments

Comments
 (0)