Lines 20-25
VALUE rb_cArray;
Link Here
|
20 |
static ID id_cmp; |
20 |
static ID id_cmp; |
21 |
|
21 |
|
22 |
#define ARY_DEFAULT_SIZE 16 |
22 |
#define ARY_DEFAULT_SIZE 16 |
|
|
23 |
#define ARY_MAX_SIZE (LONG_MAX / sizeof(VALUE)) |
23 |
|
24 |
|
24 |
void |
25 |
void |
25 |
rb_mem_clear(mem, size) |
26 |
rb_mem_clear(mem, size) |
Lines 120-126
ary_new(klass, len)
Link Here
|
120 |
if (len < 0) { |
121 |
if (len < 0) { |
121 |
rb_raise(rb_eArgError, "negative array size (or size too big)"); |
122 |
rb_raise(rb_eArgError, "negative array size (or size too big)"); |
122 |
} |
123 |
} |
123 |
if (len > 0 && len * sizeof(VALUE) <= len) { |
124 |
if (len > ARY_MAX_SIZE) { |
124 |
rb_raise(rb_eArgError, "array size too big"); |
125 |
rb_raise(rb_eArgError, "array size too big"); |
125 |
} |
126 |
} |
126 |
if (len == 0) len++; |
127 |
if (len == 0) len++; |
Lines 293-299
rb_ary_initialize(argc, argv, ary)
Link Here
|
293 |
if (len < 0) { |
294 |
if (len < 0) { |
294 |
rb_raise(rb_eArgError, "negative array size"); |
295 |
rb_raise(rb_eArgError, "negative array size"); |
295 |
} |
296 |
} |
296 |
if (len > 0 && len * (long)sizeof(VALUE) <= len) { |
297 |
if (len > ARY_MAX_SIZE) { |
297 |
rb_raise(rb_eArgError, "array size too big"); |
298 |
rb_raise(rb_eArgError, "array size too big"); |
298 |
} |
299 |
} |
299 |
if (len > RARRAY(ary)->aux.capa) { |
300 |
if (len > RARRAY(ary)->aux.capa) { |
Lines 358-363
rb_ary_store(ary, idx, val)
Link Here
|
358 |
idx - RARRAY(ary)->len); |
359 |
idx - RARRAY(ary)->len); |
359 |
} |
360 |
} |
360 |
} |
361 |
} |
|
|
362 |
else if (idx >= ARY_MAX_SIZE) { |
363 |
rb_raise(rb_eIndexError, "index %ld too big", idx); |
364 |
} |
361 |
|
365 |
|
362 |
rb_ary_modify(ary); |
366 |
rb_ary_modify(ary); |
363 |
if (idx >= RARRAY(ary)->aux.capa) { |
367 |
if (idx >= RARRAY(ary)->aux.capa) { |
Lines 366-375
rb_ary_store(ary, idx, val)
Link Here
|
366 |
if (new_capa < ARY_DEFAULT_SIZE) { |
370 |
if (new_capa < ARY_DEFAULT_SIZE) { |
367 |
new_capa = ARY_DEFAULT_SIZE; |
371 |
new_capa = ARY_DEFAULT_SIZE; |
368 |
} |
372 |
} |
369 |
new_capa += idx; |
373 |
else if (new_capa >= ARY_MAX_SIZE - idx) { |
370 |
if (new_capa * (long)sizeof(VALUE) <= new_capa) { |
374 |
new_capa = (ARY_MAX_SIZE - idx) / 2; |
371 |
rb_raise(rb_eArgError, "index too big"); |
|
|
372 |
} |
375 |
} |
|
|
376 |
new_capa += idx; |
373 |
REALLOC_N(RARRAY(ary)->ptr, VALUE, new_capa); |
377 |
REALLOC_N(RARRAY(ary)->ptr, VALUE, new_capa); |
374 |
RARRAY(ary)->aux.capa = new_capa; |
378 |
RARRAY(ary)->aux.capa = new_capa; |
375 |
} |
379 |
} |
Lines 976-981
rb_ary_splice(ary, beg, len, rpl)
Link Here
|
976 |
|
980 |
|
977 |
if (beg >= RARRAY(ary)->len) { |
981 |
if (beg >= RARRAY(ary)->len) { |
978 |
len = beg + rlen; |
982 |
len = beg + rlen; |
|
|
983 |
if (len < 0 || len > ARY_MAX_SIZE) { |
984 |
rb_raise(rb_eIndexError, "index %ld too big", beg); |
985 |
} |
979 |
if (len >= RARRAY(ary)->aux.capa) { |
986 |
if (len >= RARRAY(ary)->aux.capa) { |
980 |
REALLOC_N(RARRAY(ary)->ptr, VALUE, len); |
987 |
REALLOC_N(RARRAY(ary)->ptr, VALUE, len); |
981 |
RARRAY(ary)->aux.capa = len; |
988 |
RARRAY(ary)->aux.capa = len; |
Lines 2378-2384
rb_ary_times(ary, times)
Link Here
|
2378 |
if (len < 0) { |
2385 |
if (len < 0) { |
2379 |
rb_raise(rb_eArgError, "negative argument"); |
2386 |
rb_raise(rb_eArgError, "negative argument"); |
2380 |
} |
2387 |
} |
2381 |
if (LONG_MAX/len < RARRAY(ary)->len) { |
2388 |
if (ARY_MAX_SIZE/len < RARRAY(ary)->len) { |
2382 |
rb_raise(rb_eArgError, "argument too big"); |
2389 |
rb_raise(rb_eArgError, "argument too big"); |
2383 |
} |
2390 |
} |
2384 |
len *= RARRAY(ary)->len; |
2391 |
len *= RARRAY(ary)->len; |