summaryrefslogtreecommitdiff
path: root/array.c
diff options
context:
space:
mode:
Diffstat (limited to 'array.c')
-rw-r--r--array.c50
1 files changed, 30 insertions, 20 deletions
diff --git a/array.c b/array.c
index 56957e3aac..5b2cbed45e 100644
--- a/array.c
+++ b/array.c
@@ -167,33 +167,42 @@ rb_ary_s_new(argc, argv, klass)
VALUE *argv;
VALUE klass;
{
- long len = 0;
- VALUE size, val;
- NEWOBJ(ary, struct RArray);
+ VALUE ary = rb_ary_new();
OBJSETUP(ary, klass, T_ARRAY);
+ rb_obj_call_init(ary, argc, argv);
+
+ return ary;
+}
+
+static VALUE
+rb_ary_initialize(argc, argv, ary)
+ int argc;
+ VALUE *argv;
+ VALUE ary;
+{
+ long len;
+ VALUE size, val;
- ary->len = 0;
- ary->ptr = 0;
if (rb_scan_args(argc, argv, "02", &size, &val) == 0) {
- ary->capa = ARY_DEFAULT_SIZE;
+ return ary;
}
- else {
- long capa = NUM2LONG(size);
- if (capa < 0) {
- rb_raise(rb_eArgError, "negative array size");
- }
- if (capa > 0 && capa*sizeof(VALUE) <= 0) {
- rb_raise(rb_eArgError, "array size too big");
- }
- ary->capa = capa;
- len = capa;
+ rb_ary_modify(ary);
+ len = NUM2LONG(size);
+ if (len < 0) {
+ rb_raise(rb_eArgError, "negative array size");
}
- ary->ptr = ALLOC_N(VALUE, ary->capa);
- memfill(ary->ptr, len, val);
- ary->len = len;
+ if (len > 0 && len*sizeof(VALUE) <= 0) {
+ rb_raise(rb_eArgError, "array size too big");
+ }
+ if (len > RARRAY(ary)->capa) {
+ RARRAY(ary)->capa = len;
+ REALLOC_N(RARRAY(ary)->ptr, VALUE, RARRAY(ary)->capa);
+ }
+ memfill(RARRAY(ary)->ptr, len, val);
+ RARRAY(ary)->len = len;
- return (VALUE)ary;
+ return ary;
}
static VALUE
@@ -1544,6 +1553,7 @@ Init_Array()
rb_define_singleton_method(rb_cArray, "new", rb_ary_s_new, -1);
rb_define_singleton_method(rb_cArray, "[]", rb_ary_s_create, -1);
+ rb_define_method(rb_cArray, "initialize", rb_ary_initialize, -1);
rb_define_method(rb_cArray, "to_s", rb_ary_to_s, 0);
rb_define_method(rb_cArray, "inspect", rb_ary_inspect, 0);
rb_define_method(rb_cArray, "to_a", rb_ary_to_a, 0);