summaryrefslogtreecommitdiff
path: root/array.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>1998-07-29 09:50:58 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>1998-07-29 09:50:58 +0000
commit2562004338bc2694a7d8da75f4effcb9aa889641 (patch)
tree0af9582deace7d436b411552640555f90d7cd9fa /array.c
parent3b0fec9a5f966fd7ae26bc7b84877fa7209d8605 (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.c23
1 files changed, 16 insertions, 7 deletions
diff --git a/array.c b/array.c
index 6bee8aed40..983ce9b951 100644
--- a/array.c
+++ b/array.c
@@ -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;