mirror of
https://github.com/ruby/ruby.git
synced 2025-08-23 04:55:21 +02:00
rb_ary_aset: do not goto into a branch
I'm not necessarily against every goto in general, but jumping into a branch is definitely a bad idea. Better refactor.
This commit is contained in:
parent
2d6f8db3d6
commit
4dc83eefce
Notes:
git
2020-06-29 11:07:18 +09:00
1 changed files with 22 additions and 14 deletions
36
array.c
36
array.c
|
@ -2412,6 +2412,22 @@ rb_ary_resize(VALUE ary, long len)
|
||||||
return ary;
|
return ary;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
ary_aset_by_rb_ary_store(VALUE ary, long key, VALUE val)
|
||||||
|
{
|
||||||
|
rb_ary_store(ary, key, val);
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
ary_aset_by_rb_ary_splice(VALUE ary, long beg, long len, VALUE val)
|
||||||
|
{
|
||||||
|
VALUE rpl = rb_ary_to_ary(val);
|
||||||
|
rb_ary_splice(ary, beg, len, RARRAY_CONST_PTR_TRANSIENT(rpl), RARRAY_LEN(rpl));
|
||||||
|
RB_GC_GUARD(rpl);
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* call-seq:
|
* call-seq:
|
||||||
* array[index] = object -> object
|
* array[index] = object -> object
|
||||||
|
@ -2558,33 +2574,25 @@ static VALUE
|
||||||
rb_ary_aset(int argc, VALUE *argv, VALUE ary)
|
rb_ary_aset(int argc, VALUE *argv, VALUE ary)
|
||||||
{
|
{
|
||||||
long offset, beg, len;
|
long offset, beg, len;
|
||||||
VALUE rpl;
|
|
||||||
|
|
||||||
if (argc == 3) {
|
rb_check_arity(argc, 2, 3);
|
||||||
rb_ary_modify_check(ary);
|
rb_ary_modify_check(ary);
|
||||||
|
if (argc == 3) {
|
||||||
beg = NUM2LONG(argv[0]);
|
beg = NUM2LONG(argv[0]);
|
||||||
len = NUM2LONG(argv[1]);
|
len = NUM2LONG(argv[1]);
|
||||||
goto range;
|
return ary_aset_by_rb_ary_splice(ary, beg, len, argv[2]);
|
||||||
}
|
}
|
||||||
rb_check_arity(argc, 2, 2);
|
|
||||||
rb_ary_modify_check(ary);
|
|
||||||
if (FIXNUM_P(argv[0])) {
|
if (FIXNUM_P(argv[0])) {
|
||||||
offset = FIX2LONG(argv[0]);
|
offset = FIX2LONG(argv[0]);
|
||||||
goto fixnum;
|
return ary_aset_by_rb_ary_store(ary, offset, argv[1]);
|
||||||
}
|
}
|
||||||
if (rb_range_beg_len(argv[0], &beg, &len, RARRAY_LEN(ary), 1)) {
|
if (rb_range_beg_len(argv[0], &beg, &len, RARRAY_LEN(ary), 1)) {
|
||||||
/* check if idx is Range */
|
/* check if idx is Range */
|
||||||
range:
|
return ary_aset_by_rb_ary_splice(ary, beg, len, argv[1]);
|
||||||
rpl = rb_ary_to_ary(argv[argc-1]);
|
|
||||||
rb_ary_splice(ary, beg, len, RARRAY_CONST_PTR_TRANSIENT(rpl), RARRAY_LEN(rpl));
|
|
||||||
RB_GC_GUARD(rpl);
|
|
||||||
return argv[argc-1];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
offset = NUM2LONG(argv[0]);
|
offset = NUM2LONG(argv[0]);
|
||||||
fixnum:
|
return ary_aset_by_rb_ary_store(ary, offset, argv[1]);
|
||||||
rb_ary_store(ary, offset, argv[1]);
|
|
||||||
return argv[1];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue