From 4890f3a684aff94d93a5cc3f68fa8c67c1da6c19 Mon Sep 17 00:00:00 2001 From: matz Date: Tue, 29 Feb 2000 08:05:32 +0000 Subject: 2000-02-29 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@629 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- array.c | 50 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 20 deletions(-) (limited to 'array.c') 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); -- cgit v1.2.3