From 3b6e3ce995bc1f01614a3f9eba3d7cb40384a1b8 Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Sat, 6 Dec 2025 15:05:45 -0800 Subject: [PATCH] Avoid the use of the rb_eval_cmd_kw function if it is not available Fixes #75 --- ext/tk/tkutil/extconf.rb | 1 + ext/tk/tkutil/tkutil.c | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/ext/tk/tkutil/extconf.rb b/ext/tk/tkutil/extconf.rb index 253a8d26..10a2af98 100644 --- a/ext/tk/tkutil/extconf.rb +++ b/ext/tk/tkutil/extconf.rb @@ -2,6 +2,7 @@ begin require 'mkmf' + have_func("rb_eval_cmd_kw", "ruby.h") have_func("rb_obj_instance_exec", "ruby.h") have_func("rb_sym2str", "ruby.h") have_func("rb_id2str", "ruby.h") diff --git a/ext/tk/tkutil/tkutil.c b/ext/tk/tkutil/tkutil.c index f79dd421..4fe65d15 100644 --- a/ext/tk/tkutil/tkutil.c +++ b/ext/tk/tkutil/tkutil.c @@ -174,7 +174,19 @@ tk_eval_cmd(int argc, VALUE *argv, VALUE self) rb_scan_args(argc, argv, "1*", &cmd, &rest); #ifdef RB_PASS_KEYWORDS +# ifdef HAVE_RB_EVAL_CMD_KW return rb_eval_cmd_kw(cmd, rest, 0); +# else + if (RB_TYPE_P(cmd, T_STRING)) { + VALUE val = rb_funcallv_kw(rb_const_get(rb_cObject, rb_intern("TOPLEVEL_BINDING")), rb_intern("eval"), 1, &cmd, 0); + RB_GC_GUARD(cmd); + return val; + } else { + VALUE val = rb_funcallv_kw(cmd, rb_intern("call"), RARRAY_LENINT(rest), RARRAY_CONST_PTR(rest), 0); + RB_GC_GUARD(rest); + return val; + } +# endif #else return rb_eval_cmd(cmd, rest, 0); #endif