955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
|
# File 'ext/list/list.c', line 955
static VALUE
list_fetch(int argc, VALUE *argv, VALUE self)
{
VALUE pos, ifnone;
long block_given;
long idx;
list_t *ptr;
Data_Get_Struct(self, list_t, ptr);
rb_scan_args(argc, argv, "11", &pos, &ifnone);
block_given = rb_block_given_p();
if (block_given && argc == 2) {
rb_warn("block supersedes default value argument");
}
idx = NUM2LONG(pos);
if (idx < 0) {
idx += LIST_LEN(self);
}
if (idx < 0 || LIST_LEN(self) <= idx) {
if (block_given) return rb_yield(pos);
if (argc == 1) {
rb_raise(rb_eIndexError, "index %ld outside of array bounds: %ld...%ld",
idx - (idx < 0 ? LIST_LEN(self) : 0), -LIST_LEN(self), LIST_LEN(self));
}
return ifnone;
}
return list_entry(self, idx);
}
|