summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/tk/tkutil/extconf.rb1
-rw-r--r--ext/tk/tkutil/tkutil.c28
2 files changed, 21 insertions, 8 deletions
diff --git a/ext/tk/tkutil/extconf.rb b/ext/tk/tkutil/extconf.rb
index 20b6f37bce..a4b5e030bd 100644
--- a/ext/tk/tkutil/extconf.rb
+++ b/ext/tk/tkutil/extconf.rb
@@ -6,6 +6,7 @@ begin
have_func("rb_obj_taint", "ruby.h")
have_func("rb_sym2str", "ruby.h")
have_func("rb_id2str", "ruby.h")
+ have_func("rb_ary_cat", "ruby.h")
have_func("strndup", "string.h")
create_makefile('tkutil')
diff --git a/ext/tk/tkutil/tkutil.c b/ext/tk/tkutil/tkutil.c
index 5d6613c7c2..f18fadfc7f 100644
--- a/ext/tk/tkutil/tkutil.c
+++ b/ext/tk/tkutil/tkutil.c
@@ -106,6 +106,22 @@ strndup(ptr, len)
}
#endif
+#ifndef HAVE_RB_ARY_CAT
+static VALUE rb_ary_cat _((VALUE, const VALUE *, long));
+static VALUE
+rb_ary_cat(ary, argv, len)
+ VALUE ary;
+ const VALUE *argv;
+ long len;
+{
+ long i;
+ for (i = 0; i < len; i++) {
+ rb_ary_push(ary, argv[i]);
+ }
+ return ary;
+}
+#endif
+
/*************************************/
#if defined(HAVE_RB_OBJ_INSTANCE_EXEC) && !defined(RUBY_VM)
@@ -584,7 +600,7 @@ assoc2kv(assoc, ary, self)
VALUE ary;
VALUE self;
{
- long i, j, len;
+ long i, len;
volatile VALUE pair;
volatile VALUE val;
volatile VALUE dst = rb_ary_new2(2 * RARRAY_LEN(assoc));
@@ -611,9 +627,7 @@ assoc2kv(assoc, ary, self)
rb_ary_push(dst, key2keyname(RARRAY_CONST_PTR(pair)[0]));
val = rb_ary_new2(RARRAY_LEN(pair) - 1);
- for(j = 1; j < RARRAY_LEN(pair); j++) {
- rb_ary_push(val, RARRAY_CONST_PTR(pair)[j]);
- }
+ rb_ary_cat(val, RARRAY_CONST_PTR(pair) + 1, RARRAY_LEN(pair) - 1);
rb_ary_push(dst, val);
}
@@ -632,7 +646,7 @@ assoc2kv_enc(assoc, ary, self)
VALUE ary;
VALUE self;
{
- long i, j, len;
+ long i, len;
volatile VALUE pair;
volatile VALUE val;
volatile VALUE dst = rb_ary_new2(2 * RARRAY_LEN(assoc));
@@ -659,9 +673,7 @@ assoc2kv_enc(assoc, ary, self)
rb_ary_push(dst, key2keyname(RARRAY_CONST_PTR(pair)[0]));
val = rb_ary_new2(RARRAY_LEN(pair) - 1);
- for(j = 1; j < RARRAY_LEN(pair); j++) {
- rb_ary_push(val, RARRAY_CONST_PTR(pair)[j]);
- }
+ rb_ary_cat(val, RARRAY_CONST_PTR(pair) + 1, RARRAY_LEN(pair) - 1);
rb_ary_push(dst, get_eval_string_core(val, Qtrue, self));
}