mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
enum.c: avoid inadvertent symbol creation
* enum.c (enum_inject): avoid inadvertent symbol creation. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40097 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
8074844065
commit
9f87297c21
3 changed files with 27 additions and 3 deletions
|
@ -1,3 +1,7 @@
|
||||||
|
Thu Apr 4 15:46:48 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* enum.c (enum_inject): avoid inadvertent symbol creation.
|
||||||
|
|
||||||
Thu Apr 4 14:37:07 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
Thu Apr 4 14:37:07 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
* thread.c (rb_thread_aref): avoid inadvertent symbol creation.
|
* thread.c (rb_thread_aref): avoid inadvertent symbol creation.
|
||||||
|
|
20
enum.c
20
enum.c
|
@ -17,6 +17,10 @@
|
||||||
|
|
||||||
#define STATIC_ASSERT(name, expr) typedef int static_assert_##name##_check[1 - 2*!(expr)]
|
#define STATIC_ASSERT(name, expr) typedef int static_assert_##name##_check[1 - 2*!(expr)]
|
||||||
|
|
||||||
|
#define numberof(array) (int)(sizeof(array) / sizeof((array)[0]))
|
||||||
|
|
||||||
|
VALUE rb_f_send(int argc, VALUE *argv, VALUE recv);
|
||||||
|
|
||||||
VALUE rb_mEnumerable;
|
VALUE rb_mEnumerable;
|
||||||
|
|
||||||
static ID id_next;
|
static ID id_next;
|
||||||
|
@ -527,6 +531,7 @@ static VALUE
|
||||||
inject_op_i(VALUE i, VALUE p, int argc, VALUE *argv)
|
inject_op_i(VALUE i, VALUE p, int argc, VALUE *argv)
|
||||||
{
|
{
|
||||||
NODE *memo = RNODE(p);
|
NODE *memo = RNODE(p);
|
||||||
|
VALUE name;
|
||||||
|
|
||||||
ENUM_WANT_SVALUE();
|
ENUM_WANT_SVALUE();
|
||||||
|
|
||||||
|
@ -534,8 +539,14 @@ inject_op_i(VALUE i, VALUE p, int argc, VALUE *argv)
|
||||||
memo->u2.argc = 1;
|
memo->u2.argc = 1;
|
||||||
memo->u1.value = i;
|
memo->u1.value = i;
|
||||||
}
|
}
|
||||||
|
else if (SYMBOL_P(name = memo->u3.value)) {
|
||||||
|
memo->u1.value = rb_funcall(memo->u1.value, SYM2ID(name), 1, i);
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
memo->u1.value = rb_funcall(memo->u1.value, memo->u3.id, 1, i);
|
VALUE args[2];
|
||||||
|
args[0] = name;
|
||||||
|
args[1] = i;
|
||||||
|
memo->u1.value = rb_f_send(numberof(args), args, memo->u1.value);
|
||||||
}
|
}
|
||||||
return Qnil;
|
return Qnil;
|
||||||
}
|
}
|
||||||
|
@ -589,6 +600,7 @@ enum_inject(int argc, VALUE *argv, VALUE obj)
|
||||||
NODE *memo;
|
NODE *memo;
|
||||||
VALUE init, op;
|
VALUE init, op;
|
||||||
VALUE (*iter)(VALUE, VALUE, int, VALUE*) = inject_i;
|
VALUE (*iter)(VALUE, VALUE, int, VALUE*) = inject_i;
|
||||||
|
ID id;
|
||||||
|
|
||||||
switch (rb_scan_args(argc, argv, "02", &init, &op)) {
|
switch (rb_scan_args(argc, argv, "02", &init, &op)) {
|
||||||
case 0:
|
case 0:
|
||||||
|
@ -597,7 +609,8 @@ enum_inject(int argc, VALUE *argv, VALUE obj)
|
||||||
if (rb_block_given_p()) {
|
if (rb_block_given_p()) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
op = (VALUE)rb_to_id(init);
|
id = rb_check_id(&init);
|
||||||
|
op = id ? ID2SYM(id) : init;
|
||||||
argc = 0;
|
argc = 0;
|
||||||
init = Qnil;
|
init = Qnil;
|
||||||
iter = inject_op_i;
|
iter = inject_op_i;
|
||||||
|
@ -606,7 +619,8 @@ enum_inject(int argc, VALUE *argv, VALUE obj)
|
||||||
if (rb_block_given_p()) {
|
if (rb_block_given_p()) {
|
||||||
rb_warning("given block not used");
|
rb_warning("given block not used");
|
||||||
}
|
}
|
||||||
op = (VALUE)rb_to_id(op);
|
id = rb_check_id(&op);
|
||||||
|
if (id) op = ID2SYM(id);
|
||||||
iter = inject_op_i;
|
iter = inject_op_i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -187,5 +187,11 @@ module Test_Symbol
|
||||||
assert_not_send([Thread.current, :thread_variable?, name])
|
assert_not_send([Thread.current, :thread_variable?, name])
|
||||||
assert_not_send([Bug::Symbol, :interned?, name])
|
assert_not_send([Bug::Symbol, :interned?, name])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_enumerable_inject_op
|
||||||
|
name = noninterned_name
|
||||||
|
assert_raise(NoMethodError) {[1, 2].inject(name)}
|
||||||
|
assert_not_send([Bug::Symbol, :interned?, name])
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue