diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1998-07-29 09:50:58 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1998-07-29 09:50:58 +0000 |
commit | 2562004338bc2694a7d8da75f4effcb9aa889641 (patch) | |
tree | 0af9582deace7d436b411552640555f90d7cd9fa /array.c | |
parent | 3b0fec9a5f966fd7ae26bc7b84877fa7209d8605 (diff) |
sync ev
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/v1_1r@280 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'array.c')
-rw-r--r-- | array.c | 23 |
1 files changed, 16 insertions, 7 deletions
@@ -27,6 +27,17 @@ memclear(mem, size) } } +static void +memfill(mem, size, val) + register VALUE *mem; + register int size; + register VALUE val; +{ + while (size--) { + *mem++ = val; + } +} + #define ARY_FREEZE FL_USER1 static void @@ -131,9 +142,6 @@ ary_new4(n, elts) if (elts) { MEMCPY(RARRAY(ary)->ptr, elts, VALUE, n); } - else { - memclear(RARRAY(ary)->ptr, n); - } RARRAY(ary)->len = n; return ary; @@ -159,13 +167,13 @@ ary_s_new(argc, argv, klass) VALUE *argv; VALUE klass; { - VALUE size; + VALUE size, val; NEWOBJ(ary, struct RArray); OBJSETUP(ary, klass, T_ARRAY); ary->len = 0; ary->ptr = 0; - if (rb_scan_args(argc, argv, "01", &size) == 0) { + if (rb_scan_args(argc, argv, "02", &size, &val) == 0) { ary->capa = ARY_DEFAULT_SIZE; } else { @@ -174,13 +182,14 @@ ary_s_new(argc, argv, klass) if (capa < 0) { ArgError("negative array size"); } - if (capa*sizeof(VALUE) < 0) { + if (capa > 0 && capa*sizeof(VALUE) <= 0) { ArgError("array size too big"); } ary->capa = capa; + ary->len = capa; } ary->ptr = ALLOC_N(VALUE, ary->capa); - memclear(ary->ptr, ary->capa); + memfill(ary->ptr, ary->len, val); obj_call_init((VALUE)ary); return (VALUE)ary; |