From c2f427c5ed71dd69850442ee5d3b855028c78acf Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 30 May 2012 14:44:33 +0900 Subject: mark ci->proc as well --- src/gc.c | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/gc.c b/src/gc.c index 0ba6e3e76..cf6dd35ef 100644 --- a/src/gc.c +++ b/src/gc.c @@ -500,6 +500,7 @@ root_scan_phase(mrb_state *mrb) for (ci = mrb->cibase; ci <= mrb->ci; ci++) { if (!ci) continue; mrb_gc_mark( mrb, (struct RBasic*)ci->env); + mrb_gc_mark( mrb, (struct RBasic*)ci->proc); } /* mark irep pool */ for (i=0; iirep_len; i++) { -- cgit v1.2.3 From b662a12ee5cda85209c1c9d64cd78fee425ef413 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 30 May 2012 14:51:39 +0900 Subject: remove spaces after open paren --- src/gc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/gc.c b/src/gc.c index cf6dd35ef..1ae70a375 100644 --- a/src/gc.c +++ b/src/gc.c @@ -499,8 +499,8 @@ root_scan_phase(mrb_state *mrb) /* mark closure */ for (ci = mrb->cibase; ci <= mrb->ci; ci++) { if (!ci) continue; - mrb_gc_mark( mrb, (struct RBasic*)ci->env); - mrb_gc_mark( mrb, (struct RBasic*)ci->proc); + mrb_gc_mark(mrb, (struct RBasic*)ci->env); + mrb_gc_mark(mrb, (struct RBasic*)ci->proc); } /* mark irep pool */ for (i=0; iirep_len; i++) { -- cgit v1.2.3 From e5d1dd2a8eebf4500bcbf319e264a08b99c788d7 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 30 May 2012 16:01:48 +0900 Subject: MRB_GC_STRESS for GC test --- src/gc.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/gc.c b/src/gc.c index 1ae70a375..999a1a7d2 100644 --- a/src/gc.c +++ b/src/gc.c @@ -247,6 +247,9 @@ mrb_obj_alloc(mrb_state *mrb, enum mrb_vtype ttype, struct RClass *cls) { struct RBasic *p; +#ifdef MRB_GC_STRESS + mrb_garbage_collect(mrb); +#endif if (mrb->gc_threshold < mrb->live) { mrb_incremental_gc(mrb); } @@ -277,6 +280,11 @@ mrb_obj_alloc(mrb_state *mrb, enum mrb_vtype ttype, struct RClass *cls) static inline void add_gray_list(mrb_state *mrb, struct RBasic *obj) { +#ifdef MRB_GC_STRESS + if (obj->tt > MRB_TT_MAXDEFINE) { + abort(); + } +#endif paint_gray(obj); obj->gcnext = mrb->gray_list; mrb->gray_list = obj; @@ -501,13 +509,16 @@ root_scan_phase(mrb_state *mrb) if (!ci) continue; mrb_gc_mark(mrb, (struct RBasic*)ci->env); mrb_gc_mark(mrb, (struct RBasic*)ci->proc); + mrb_gc_mark(mrb, (struct RBasic*)ci->target_class); } /* mark irep pool */ for (i=0; iirep_len; i++) { - mrb_irep *irep = mrb->irep[i]; - if (!irep) continue; - for (j=0; jplen; j++) { - mrb_gc_mark_value(mrb, irep->pool[j]); + if (mrb->irep) { + mrb_irep *irep = mrb->irep[i]; + if (!irep) continue; + for (j=0; jplen; j++) { + mrb_gc_mark_value(mrb, irep->pool[j]); + } } } } -- cgit v1.2.3 From e6c6dcc176c9f08997601f49e4afb74893a8548c Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 30 May 2012 16:02:19 +0900 Subject: update mrb->irep_len for each irep addition --- src/load.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src') diff --git a/src/load.c b/src/load.c index e73f09b3a..28f52433a 100644 --- a/src/load.c +++ b/src/load.c @@ -531,14 +531,13 @@ mrb_read_irep(mrb_state *mrb, const char *bin) src += MRB_DUMP_SIZE_OF_LONG; //record ren if ((ret = read_rite_irep_record(mrb, src, mrb->irep[i], &len)) != MRB_DUMP_OK) goto error_exit; - mrb->irep[i]->idx = i; + mrb->irep[mrb->irep_len++]->idx = i; src += len; } if (0 != bin_to_uint32(src)) { //dummy record len ret = MRB_DUMP_GENERAL_FAILURE; } - mrb->irep_len += nirep; error_exit: if (ret != MRB_DUMP_OK) { for (n=0,i=sirep; n Date: Wed, 30 May 2012 16:12:32 +0900 Subject: specify allocating array size for Hash#values --- src/hash.c | 2 +- test/t/hash.rb | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/hash.c b/src/hash.c index 19d0507e3..777d5fc1a 100644 --- a/src/hash.c +++ b/src/hash.c @@ -1037,7 +1037,7 @@ mrb_hash_values(mrb_state *mrb, mrb_value hash) { khash_t(ht) *h = RHASH_TBL(hash); khiter_t k; - mrb_value ary = mrb_ary_new(mrb); + mrb_value ary = mrb_ary_new_capa(mrb, kh_size(h)); if (!h) return ary; for (k = kh_begin(h); k != kh_end(h); k++) { diff --git a/test/t/hash.rb b/test/t/hash.rb index af662688a..240f6616b 100644 --- a/test/t/hash.rb +++ b/test/t/hash.rb @@ -222,5 +222,6 @@ end assert('Hash#values', '15.2.13.4.28') do a = { 'abc_key' => 'abc_value' } + p a.values a.values == ['abc_value'] end -- cgit v1.2.3 From 7cf607bb75556f6f1cd32de557466efeb79e0cb1 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 30 May 2012 16:25:22 +0900 Subject: stop duping values from Hash#values --- src/hash.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'src') diff --git a/src/hash.c b/src/hash.c index 777d5fc1a..28e718c0d 100644 --- a/src/hash.c +++ b/src/hash.c @@ -1043,8 +1043,6 @@ mrb_hash_values(mrb_state *mrb, mrb_value hash) for (k = kh_begin(h); k != kh_end(h); k++) { if (kh_exist(h, k)){ mrb_value v = kh_value(h,k); - if ( !mrb_special_const_p(v) ) - v = mrb_obj_dup(mrb, v); mrb_ary_push(mrb, ary, v); } } -- cgit v1.2.3 From 0e5958d4043001d242c2677d37a9c7db2bb0bf56 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 30 May 2012 21:19:04 +0900 Subject: rename ruby_digitmap to mrb_digitmap --- include/mruby/string.h | 3 +-- src/numeric.c | 2 +- src/sprintf.c | 2 +- src/string.c | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/include/mruby/string.h b/include/mruby/string.h index 7050957bd..08dd306e8 100644 --- a/include/mruby/string.h +++ b/include/mruby/string.h @@ -24,9 +24,8 @@ extern "C" { #define mrb_str_new4 mrb_str_new_frozen #define STR_BUF_MIN_SIZE 128 -//#define RSTRING_EMBED_LEN_MAX STR_BUF_MIN_SIZE -extern const char ruby_digitmap[]; +extern const char mrb_digitmap[]; struct RString { MRUBY_OBJECT_HEADER; diff --git a/src/numeric.c b/src/numeric.c index f26dda424..722473a6c 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -1140,7 +1140,7 @@ mrb_fix2str(mrb_state *mrb, mrb_value x, int base) } *--b = '\0'; do { - *--b = ruby_digitmap[(int)(val % base)]; + *--b = mrb_digitmap[(int)(val % base)]; } while (val /= base); if (neg) { *--b = '-'; diff --git a/src/sprintf.c b/src/sprintf.c index 479efa6c4..dc9b83dec 100644 --- a/src/sprintf.c +++ b/src/sprintf.c @@ -90,7 +90,7 @@ mrb_fix2binstr(mrb_state *mrb, mrb_value x, int base) } *--b = '\0'; do { - *--b = ruby_digitmap[(int)(val % base)]; + *--b = mrb_digitmap[(int)(val % base)]; } while (val /= base); if (mrb_fixnum(x) < 0) { diff --git a/src/string.c b/src/string.c index 695b0d01c..83d78ccb9 100644 --- a/src/string.c +++ b/src/string.c @@ -33,7 +33,7 @@ #define TRUE 1 #endif -const char ruby_digitmap[] = "0123456789abcdefghijklmnopqrstuvwxyz"; +const char mrb_digitmap[] = "0123456789abcdefghijklmnopqrstuvwxyz"; #ifdef INCLUDE_REGEXP static mrb_value get_pat(mrb_state *mrb, mrb_value pat, mrb_int quote); -- cgit v1.2.3 From 3e8d330c2cca7b67edbfa2a03331c03499dbdbf5 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 31 May 2012 11:11:55 +0900 Subject: remove #new from immediate classes --- include/mruby.h | 1 + src/class.c | 14 ++++++++++---- src/numeric.c | 2 ++ src/object.c | 3 +++ test/t/nil.rb | 10 +++++----- 5 files changed, 21 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/include/mruby.h b/include/mruby.h index 1c370812e..c86c3b478 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -294,6 +294,7 @@ void mrb_define_class_method(mrb_state *, struct RClass *, const char *, mrb_fun void mrb_define_singleton_method(mrb_state*, struct RObject*, const char*, mrb_func_t,int); void mrb_define_module_function(mrb_state*, struct RClass*, const char*, mrb_func_t,int); void mrb_define_const(mrb_state*, struct RClass*, const char *name, mrb_value); +void mrb_undef_method(mrb_state*, struct RClass*, const char*); mrb_value mrb_instance_new(mrb_state *mrb, mrb_value cv); struct RClass * mrb_class_new(mrb_state *mrb, struct RClass *super); struct RClass * mrb_module_new(mrb_state *mrb); diff --git a/src/class.c b/src/class.c index b1ed7c0dc..fa349a015 100644 --- a/src/class.c +++ b/src/class.c @@ -1100,8 +1100,8 @@ mrb_mod_alias(mrb_state *mrb, mrb_value mod) } -void -mrb_undef_method(mrb_state *mrb, struct RClass *c, mrb_sym a) +static void +undef_method(mrb_state *mrb, struct RClass *c, mrb_sym a) { mrb_value m; @@ -1110,6 +1110,12 @@ mrb_undef_method(mrb_state *mrb, struct RClass *c, mrb_sym a) mrb_define_method_vm(mrb, c, a, m); } +void +mrb_undef_method(mrb_state *mrb, struct RClass *c, const char *name) +{ + undef_method(mrb, c, mrb_intern(mrb, name)); +} + mrb_value mrb_mod_undef(mrb_state *mrb, mrb_value mod) { @@ -1119,7 +1125,7 @@ mrb_mod_undef(mrb_state *mrb, mrb_value mod) mrb_get_args(mrb, "*", &argv, &argc); while (argc--) { - mrb_undef_method(mrb, c, mrb_symbol(*argv)); + undef_method(mrb, c, mrb_symbol(*argv)); argv++; } return mrb_nil_value(); @@ -1170,7 +1176,7 @@ mrb_init_class(mrb_state *mrb) mrb_name_class(mrb, mod, mrb_intern(mrb, "Module")); mrb_name_class(mrb, cls, mrb_intern(mrb, "Class")); - mrb_undef_method(mrb, mod, mrb_intern(mrb, "new")); + mrb_undef_method(mrb, mod, "new"); MRB_SET_INSTANCE_TT(cls, MRB_TT_CLASS); mrb_define_method(mrb, bob, "initialize", mrb_bob_init, ARGS_NONE()); mrb_define_method(mrb, bob, "!", mrb_bob_not, ARGS_NONE()); diff --git a/src/numeric.c b/src/numeric.c index 722473a6c..e1f711478 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -1266,6 +1266,7 @@ mrb_init_numeric(mrb_state *mrb) integer = mrb_define_class(mrb, "Integer", numeric); fixnum = mrb->fixnum_class = mrb_define_class(mrb, "Fixnum", integer); + mrb_undef_method(mrb, fixnum, "new"); mrb_define_method(mrb, fixnum, "+", mrb_fixnum_plus, ARGS_REQ(1)); /* 15.2.8.3.1 */ mrb_define_method(mrb, fixnum, "-", mrb_fixnum_minus, ARGS_REQ(1)); /* 15.2.8.3.2 */ mrb_define_method(mrb, fixnum, "-@", fix_uminus, ARGS_REQ(1)); /* 15.2.7.4.2 */ @@ -1293,6 +1294,7 @@ mrb_init_numeric(mrb_state *mrb) /* Float Class */ fl = mrb->float_class = mrb_define_class(mrb, "Float", numeric); + mrb_undef_method(mrb, fl, "new"); mrb_define_method(mrb, fl, "+", mrb_float_plus, ARGS_REQ(1)); /* 15.2.9.3.1 */ mrb_define_method(mrb, fl, "-", flo_minus, ARGS_REQ(1)); /* 15.2.9.3.2 */ mrb_define_method(mrb, fl, "*", flo_mul, ARGS_REQ(1)); /* 15.2.9.3.3 */ diff --git a/src/object.c b/src/object.c index 01a40063a..1d84909ec 100644 --- a/src/object.c +++ b/src/object.c @@ -290,6 +290,7 @@ mrb_init_object(mrb_state *mrb) struct RClass *f; n = mrb->nil_class = mrb_define_class(mrb, "NilClass", mrb->object_class); + mrb_undef_method(mrb, n, "new"); mrb_define_method(mrb, n, "&", false_and, ARGS_REQ(1)); /* 15.2.4.3.1 */ mrb_define_method(mrb, n, "^", false_xor, ARGS_REQ(1)); /* 15.2.4.3.2 */ mrb_define_method(mrb, n, "|", false_or, ARGS_REQ(1)); /* 15.2.4.3.3 */ @@ -297,12 +298,14 @@ mrb_init_object(mrb_state *mrb) mrb_define_method(mrb, n, "to_s", nil_to_s, ARGS_NONE()); /* 15.2.4.3.5 */ t = mrb->true_class = mrb_define_class(mrb, "TrueClass", mrb->object_class); + mrb_undef_method(mrb, n, "new"); mrb_define_method(mrb, t, "&", true_and, ARGS_REQ(1)); /* 15.2.5.3.1 */ mrb_define_method(mrb, t, "^", true_xor, ARGS_REQ(1)); /* 15.2.5.3.2 */ mrb_define_method(mrb, t, "to_s", true_to_s, ARGS_NONE()); /* 15.2.5.3.3 */ mrb_define_method(mrb, t, "|", true_or, ARGS_REQ(1)); /* 15.2.5.3.4 */ f = mrb->false_class = mrb_define_class(mrb, "FalseClass", mrb->object_class); + mrb_undef_method(mrb, n, "new"); mrb_define_method(mrb, f, "&", false_and, ARGS_REQ(1)); /* 15.2.6.3.1 */ mrb_define_method(mrb, f, "^", false_xor, ARGS_REQ(1)); /* 15.2.6.3.2 */ mrb_define_method(mrb, f, "to_s", false_to_s, ARGS_NONE()); /* 15.2.6.3.3 */ diff --git a/test/t/nil.rb b/test/t/nil.rb index 3188a9516..8f1393e1b 100644 --- a/test/t/nil.rb +++ b/test/t/nil.rb @@ -6,21 +6,21 @@ assert('NilClass', '15.2.4') do end assert('NilClass#&', '15.2.4.3.1') do - not NilClass.new.& and not NilClass.new.&(nil) + not nil.&(true) and not nil.&(nil) end assert('NilClass#^', '15.2.4.3.2') do - NilClass.new.^(true) and not NilClass.new.^(false) + nil.^(true) and not nil.^(false) end assert('NilClass#|', '15.2.4.3.3') do - NilClass.new.|(true) and not NilClass.new.|(false) + nil.|(true) and not nil.|(false) end assert('NilClass#nil?', '15.2.4.3.4') do - NilClass.new.nil? + nil.nil? end assert('NilClass#to_s', '15.2.4.3.5') do - NilClass.new.to_s == '' + nil.to_s == '' end -- cgit v1.2.3 From e3c1b48ba25e97967a5f27869653af05fad90dd2 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 31 May 2012 11:14:33 +0900 Subject: mrb_gets_args strict argc check; now returns argc --- src/class.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/class.c b/src/class.c index fa349a015..f96922f4b 100644 --- a/src/class.c +++ b/src/class.c @@ -398,10 +398,16 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) sp = a->buf; } while ((c = *format++)) { - if (argc < i) { - if (opt) continue; - mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments"); + switch (c) { + case '|': case '*': case '&': + break; + default: + if (argc <= i) { + if (opt) continue; + mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments"); + } } + switch (c) { case 'o': { @@ -556,6 +562,7 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) case '|': opt = 1; break; + case '*': { mrb_value **var; @@ -569,6 +576,8 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) *var = sp; i = argc; } + i = argc; + sp += *pl; } else { *pl = 0; @@ -582,7 +591,7 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments"); } va_end(ap); - return 0; + return i; } static struct RClass* -- cgit v1.2.3 From fae483ff2a91e806e714cb7d118c7bfb8aadbeb2 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 31 May 2012 11:15:51 +0900 Subject: the argument for Exception.new is optinal --- src/error.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/error.c b/src/error.c index feaa04af7..ae89541c1 100644 --- a/src/error.c +++ b/src/error.c @@ -56,9 +56,9 @@ exc_initialize(mrb_state *mrb, mrb_value exc) { mrb_value mesg; - mrb_get_args(mrb, "o", &mesg); - mrb_iv_set(mrb, exc, mrb_intern(mrb, "mesg"), mesg); - + if (mrb_get_args(mrb, "|o", &mesg) == 1) { + mrb_iv_set(mrb, exc, mrb_intern(mrb, "mesg"), mesg); + } return exc; } -- cgit v1.2.3