From cb057639289ff75b760a8c0b01dcc143b22ea804 Mon Sep 17 00:00:00 2001 From: kyab Date: Thu, 20 Jun 2013 18:00:10 +0900 Subject: Fix compile warning for abort --- src/gc.c | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/gc.c b/src/gc.c index 293fbf948..3e33c052c 100644 --- a/src/gc.c +++ b/src/gc.c @@ -11,6 +11,7 @@ # include #endif #include +#include #include "mruby.h" #include "mruby/array.h" #include "mruby/class.h" -- cgit v1.2.3 From 967c9cff2b236b38e78b35bfeef1c1799744245c Mon Sep 17 00:00:00 2001 From: cubicdaiya Date: Fri, 21 Jun 2013 09:53:10 +0900 Subject: make mrb_str_new_cstr DRY Using str_new eliminates duplicated codes in mrb_str_new_cstr. --- src/string.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) (limited to 'src') diff --git a/src/string.c b/src/string.c index 77f81ecc6..a2e8f155d 100644 --- a/src/string.c +++ b/src/string.c @@ -261,14 +261,7 @@ mrb_str_new_cstr(mrb_state *mrb, const char *p) len = 0; } - s = mrb_obj_alloc_string(mrb); - s->ptr = (char *)mrb_malloc(mrb, len+1); - if (p) { - memcpy(s->ptr, p, len); - } - s->ptr[len] = 0; - s->len = (mrb_int)len; - s->aux.capa = (mrb_int)len; + s = str_new(mrb, p, len); return mrb_obj_value(s); } -- cgit v1.2.3 From e4ae05ed9ba49342507da080ae0e95fd6be4fc3c Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Fri, 21 Jun 2013 16:06:35 +0900 Subject: Cleanup mrb_str_resize(). --- src/string.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/string.c b/src/string.c index a2e8f155d..328266df9 100644 --- a/src/string.c +++ b/src/string.c @@ -104,10 +104,9 @@ mrb_str_resize(mrb_state *mrb, mrb_value str, mrb_int len) mrb_str_modify(mrb, s); slen = s->len; if (len != slen) { - if (slen < len || slen -len > 1024) { - s->ptr = (char *)mrb_realloc(mrb, s->ptr, len+1); + if (slen < len || slen - len > 256) { + RESIZE_CAPA(s, len); } - s->aux.capa = len; s->len = len; s->ptr[len] = '\0'; /* sentinel */ } -- cgit v1.2.3 From 31fbfb51dbcb18f4f8893aa03195ba050a722a29 Mon Sep 17 00:00:00 2001 From: kyab Date: Sat, 22 Jun 2013 03:55:49 +0900 Subject: Add fallback for allocate CRC buffer --- src/load.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/load.c b/src/load.c index 62010e425..e832de628 100644 --- a/src/load.c +++ b/src/load.c @@ -539,7 +539,9 @@ mrb_read_irep_file(mrb_state *mrb, FILE* fp) size_t sirep; struct rite_section_header section_header; long fpos; - const size_t block_size = 1 << 14; + size_t block_size = 1 << 14; + const uint8_t block_fallback_count = 4; + int i; const size_t buf_size = sizeof(struct rite_binary_header); if ((mrb == NULL) || (fp == NULL)) { @@ -564,7 +566,10 @@ mrb_read_irep_file(mrb_state *mrb, FILE* fp) /* verify CRC */ fpos = ftell(fp); /* You don't need use SIZE_ERROR as block_size is enough small. */ - buf = mrb_malloc(mrb, block_size); + for (i = 0; i < block_fallback_count; i++,block_size >>= 1){ + buf = mrb_malloc(mrb, block_size); + if (buf) break; + } if (!buf) { return MRB_DUMP_GENERAL_FAILURE; } -- cgit v1.2.3 From b01670a3d391de3c7df868a8285e570564ea46cd Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Mon, 24 Jun 2013 00:41:34 +0900 Subject: fixed a bug in push back list; close #1298 --- src/parse.y | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/parse.y b/src/parse.y index f5dbdb6fd..1d5366d17 100644 --- a/src/parse.y +++ b/src/parse.y @@ -3293,7 +3293,7 @@ peek_n(parser_state *p, int c, int n) list = push(list, (node*)(intptr_t)c0); } while(n--); if (p->pb) { - p->pb = push(p->pb, (node*)list); + p->pb = append(p->pb, (node*)list); } else { p->pb = list; -- cgit v1.2.3 From e9ebd6f87a395c156e4d03295f5b63a04467e1a1 Mon Sep 17 00:00:00 2001 From: kyab Date: Tue, 25 Jun 2013 02:12:56 +0900 Subject: Fix crash on load *mrb --- src/load.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/load.c b/src/load.c index e832de628..a83fc7574 100644 --- a/src/load.c +++ b/src/load.c @@ -187,7 +187,6 @@ read_rite_section_irep(mrb_state *mrb, const uint8_t *bin) { int result; size_t sirep; - size_t i; uint32_t len; uint16_t nirep; uint16_t n; @@ -200,14 +199,14 @@ read_rite_section_irep(mrb_state *mrb, const uint8_t *bin) nirep = bin_to_uint16(header->nirep); //Read Binary Data Section - for (n = 0, i = sirep; n < nirep; n++, i++) { + for (n = 0; n < nirep; n++) { result = read_rite_irep_record(mrb, bin, &len); if (result != MRB_DUMP_OK) goto error_exit; bin += len; } - result = sirep + bin_to_uint16(header->sirep); + result = nirep; error_exit: if (result < MRB_DUMP_OK) { irep_free(sirep, mrb); @@ -368,7 +367,7 @@ mrb_read_irep(mrb_state *mrb, const uint8_t *bin) bin += bin_to_uint32(section_header->section_size); } while (memcmp(section_header->section_identify, RITE_BINARY_EOF, sizeof(section_header->section_identify)) != 0); - return total_nirep; + return sirep; } static void @@ -464,7 +463,6 @@ read_rite_section_irep_file(mrb_state *mrb, FILE *fp) { int32_t result; size_t sirep; - size_t i; uint16_t nirep; uint16_t n; uint32_t len, buf_size; @@ -488,7 +486,7 @@ read_rite_section_irep_file(mrb_state *mrb, FILE *fp) } //Read Binary Data Section - for (n = 0, i = sirep; n < nirep; n++, i++) { + for (n = 0; n < nirep; n++) { void *ptr; if (fread(buf, record_header_size, 1, fp) == 0) { @@ -516,7 +514,7 @@ read_rite_section_irep_file(mrb_state *mrb, FILE *fp) goto error_exit; } - result = sirep + bin_to_uint16(header.sirep); + result = nirep; error_exit: if (buf) { mrb_free(mrb, buf); @@ -614,7 +612,7 @@ mrb_read_irep_file(mrb_state *mrb, FILE* fp) fseek(fp, fpos + section_size, SEEK_SET); } while (memcmp(section_header.section_identify, RITE_BINARY_EOF, sizeof(section_header.section_identify)) != 0); - return total_nirep; + return sirep; } mrb_value -- cgit v1.2.3 From 3ceeb0be95874fe867f25004618c31ca8e23ecf4 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Tue, 25 Jun 2013 15:38:28 +0900 Subject: add mrb_malloc_simple() that returns NULL on error --- include/mruby.h | 7 ++++--- src/gc.c | 13 +++++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/include/mruby.h b/include/mruby.h index 33a15de0e..29d13c553 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -239,9 +239,10 @@ mrb_sym mrb_intern(mrb_state *mrb,const char *cstr) return mrb_intern_cstr(mrb, cstr); } -void *mrb_malloc(mrb_state*, size_t); -void *mrb_calloc(mrb_state*, size_t, size_t); -void *mrb_realloc(mrb_state*, void*, size_t); +void *mrb_malloc(mrb_state*, size_t); /* raise RuntimeError if no mem */ +void *mrb_calloc(mrb_state*, size_t, size_t); /* ditto */ +void *mrb_realloc(mrb_state*, void*, size_t); /* ditto */ +void *mrb_malloc_simple(mrb_state*, size_t); /* return NULL if no memory available */ struct RBasic *mrb_obj_alloc(mrb_state*, enum mrb_vtype, struct RClass*); void mrb_free(mrb_state*, void*); diff --git a/src/gc.c b/src/gc.c index 3e33c052c..7eee61dc1 100644 --- a/src/gc.c +++ b/src/gc.c @@ -182,6 +182,19 @@ mrb_malloc(mrb_state *mrb, size_t len) return mrb_realloc(mrb, 0, len); } +void* +mrb_malloc_simple(mrb_state *mrb, size_t len) +{ + void *p2; + + p2 = (mrb->allocf)(mrb, 0, len, mrb->ud); + if (!p2 && len > 0 && mrb->heaps) { + mrb_garbage_collect(mrb); + p2 = (mrb->allocf)(mrb, 0, len, mrb->ud); + } + return p2; +} + void* mrb_calloc(mrb_state *mrb, size_t nelem, size_t len) { -- cgit v1.2.3 From cf840c1d05f33f0e32f86508bdeae880fd059a5e Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Tue, 25 Jun 2013 15:39:34 +0900 Subject: use mrb_malloc_simple() to allocate crc buffer; close #1302 --- src/load.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/load.c b/src/load.c index a83fc7574..092ddbde8 100644 --- a/src/load.c +++ b/src/load.c @@ -565,7 +565,7 @@ mrb_read_irep_file(mrb_state *mrb, FILE* fp) fpos = ftell(fp); /* You don't need use SIZE_ERROR as block_size is enough small. */ for (i = 0; i < block_fallback_count; i++,block_size >>= 1){ - buf = mrb_malloc(mrb, block_size); + buf = mrb_malloc_simple(mrb, block_size); if (buf) break; } if (!buf) { -- cgit v1.2.3 From 1d4b26ecfc9500f7de48d24e8a1ba1ec2cc5eeac Mon Sep 17 00:00:00 2001 From: Carson McDonald Date: Wed, 26 Jun 2013 08:37:28 -0400 Subject: Add arena save/restore around use of hash KEY. --- src/hash.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src') diff --git a/src/hash.c b/src/hash.c index 5d78a6ea7..9b8c546b9 100644 --- a/src/hash.c +++ b/src/hash.c @@ -145,7 +145,9 @@ mrb_hash_set(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value val) /* mr k = kh_get(ht, h, key); if (k == kh_end(h)) { /* expand */ + int ai = mrb_gc_arena_save(mrb); k = kh_put(ht, h, KEY(key)); + mrb_gc_arena_restore(mrb, ai); } kh_value(h, k) = val; @@ -169,7 +171,9 @@ mrb_hash_dup(mrb_state *mrb, mrb_value hash) for (k = kh_begin(h); k != kh_end(h); k++) { if (kh_exist(h,k)) { + int ai = mrb_gc_arena_save(mrb); ret_k = kh_put(ht, ret_h, KEY(kh_key(h,k))); + mrb_gc_arena_restore(mrb, ai); kh_val(ret_h, ret_k) = kh_val(h,k); } } -- cgit v1.2.3 From 4dfa2033b6f811e4c9c6007d0a40521d2ed2948d Mon Sep 17 00:00:00 2001 From: Jun Hiroe Date: Wed, 26 Jun 2013 23:00:42 +0900 Subject: Refactor mrb_hash_has_keyWithKey() func in hash.c --- src/hash.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/hash.c b/src/hash.c index 5d78a6ea7..b4a629743 100644 --- a/src/hash.c +++ b/src/hash.c @@ -921,17 +921,12 @@ mrb_hash_has_keyWithKey(mrb_state *mrb, mrb_value hash, mrb_value key) { khash_t(ht) *h = RHASH_TBL(hash); khiter_t k; - mrb_bool result; if (h) { k = kh_get(ht, h, key); - result = (k != kh_end(h)); + return mrb_bool_value(k != kh_end(h)); } - else { - result = 0; - } - - return mrb_bool_value(result); + return mrb_false_value(); } /* 15.2.13.4.13 */ -- cgit v1.2.3 From dfb4d555c4443e78ae530b69a9c96561d8bd38e3 Mon Sep 17 00:00:00 2001 From: Takashi Sogabe Date: Thu, 27 Jun 2013 17:15:18 +0900 Subject: Avoid read_escape() in case of regexp --- src/parse.y | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/parse.y b/src/parse.y index 1d5366d17..fda66e92c 100644 --- a/src/parse.y +++ b/src/parse.y @@ -3620,12 +3620,14 @@ parse_string(parser_state *p) tokadd(p, '\n'); } else { - pushback(p, c); - - if(type & STR_FUNC_REGEXP) + if (type & STR_FUNC_REGEXP) { tokadd(p, '\\'); - - tokadd(p, read_escape(p)); + if (c != -1) + tokadd(p, c); + } else { + pushback(p, c); + tokadd(p, read_escape(p)); + } if (hinf) hinf->line_head = FALSE; } -- cgit v1.2.3 From 42991fe092150260d893e7e558f25b5d5c3d84ab Mon Sep 17 00:00:00 2001 From: mimaki Date: Thu, 27 Jun 2013 20:18:48 +0900 Subject: fix unnecessary exception in mrb_get_args with "z" format. --- src/class.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/class.c b/src/class.c index f94f9a933..6eb70dce6 100644 --- a/src/class.c +++ b/src/class.c @@ -487,7 +487,7 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) if (i < argc) { ss = to_str(mrb, *sp++); s = mrb_str_ptr(ss); - if (strlen(s->ptr) != s->len) { + if (strlen(s->ptr) < s->len) { mrb_raise(mrb, E_ARGUMENT_ERROR, "String contains NUL"); } *ps = s->ptr; -- cgit v1.2.3 From 0e5ecae325c63e78868fe461b40c12f69f8eb74e Mon Sep 17 00:00:00 2001 From: Jun Hiroe Date: Thu, 27 Jun 2013 21:23:12 +0900 Subject: Refactor mrb_hash_empty_p() func in hash.c --- src/hash.c | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/hash.c b/src/hash.c index e08de0cfe..3684b3b40 100644 --- a/src/hash.c +++ b/src/hash.c @@ -776,16 +776,9 @@ mrb_value mrb_hash_empty_p(mrb_state *mrb, mrb_value self) { khash_t(ht) *h = RHASH_TBL(self); - mrb_bool empty_p; - if (h) { - empty_p = (kh_size(h) == 0); - } - else { - empty_p = 1; - } - - return mrb_bool_value(empty_p); + if (h) return mrb_bool_value(kh_size(h) == 0); + return mrb_true_value(); } static mrb_value -- cgit v1.2.3 From 36fc42e7dbb8511efe316647dbbbdc822a929425 Mon Sep 17 00:00:00 2001 From: Akira Yumiyama Date: Tue, 25 Jun 2013 20:16:41 +0900 Subject: add nil.to_a, nil.to_f, nil.to_i methods --- mrbgems/default.gembox | 3 ++ mrbgems/mruby-object-ext/mrbgem.rake | 4 +++ mrbgems/mruby-object-ext/src/object.c | 56 +++++++++++++++++++++++++++++++++++ mrbgems/mruby-object-ext/test/nil.rb | 11 +++++++ src/object.c | 1 + test/t/nil.rb | 1 - 6 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 mrbgems/mruby-object-ext/mrbgem.rake create mode 100644 mrbgems/mruby-object-ext/src/object.c create mode 100644 mrbgems/mruby-object-ext/test/nil.rb (limited to 'src') diff --git a/mrbgems/default.gembox b/mrbgems/default.gembox index 1c6732d48..b2cdac93d 100644 --- a/mrbgems/default.gembox +++ b/mrbgems/default.gembox @@ -41,6 +41,9 @@ MRuby::GemBox.new do |conf| # Use Random class conf.gem :core => "mruby-random" + # Use extensional Object class + conf.gem :core => "mruby-object-ext" + # Use ObjectSpace class conf.gem :core => "mruby-objectspace" diff --git a/mrbgems/mruby-object-ext/mrbgem.rake b/mrbgems/mruby-object-ext/mrbgem.rake new file mode 100644 index 000000000..1f232949e --- /dev/null +++ b/mrbgems/mruby-object-ext/mrbgem.rake @@ -0,0 +1,4 @@ +MRuby::Gem::Specification.new('mruby-object-ext') do |spec| + spec.license = 'MIT' + spec.authors = 'mruby developers' +end diff --git a/mrbgems/mruby-object-ext/src/object.c b/mrbgems/mruby-object-ext/src/object.c new file mode 100644 index 000000000..70b8b4baa --- /dev/null +++ b/mrbgems/mruby-object-ext/src/object.c @@ -0,0 +1,56 @@ +#include "mruby.h" +#include "mruby/array.h" + +/* + * call-seq: + * nil.to_a -> [] + * + * Always returns an empty array. + */ + +static mrb_value +nil_to_a(mrb_state *mrb, mrb_value obj) +{ + return mrb_ary_new(mrb); +} + +/* + * call-seq: + * nil.to_f -> 0.0 + * + * Always returns zero. + */ + +static mrb_value +nil_to_f(mrb_state *mrb, mrb_value obj) +{ + return mrb_float_value(mrb, 0.0); +} + +/* + * call-seq: + * nil.to_i -> 0 + * + * Always returns zero. + */ + +static mrb_value +nil_to_i(mrb_state *mrb, mrb_value obj) +{ + return mrb_fixnum_value(0); +} + +void +mrb_mruby_object_ext_gem_init(mrb_state* mrb) +{ + struct RClass * n = mrb->nil_class; + + mrb_define_method(mrb, n, "to_a", nil_to_a, MRB_ARGS_NONE()); + mrb_define_method(mrb, n, "to_f", nil_to_f, MRB_ARGS_NONE()); + mrb_define_method(mrb, n, "to_i", nil_to_i, MRB_ARGS_NONE()); +} + +void +mrb_mruby_object_ext_gem_final(mrb_state* mrb) +{ +} diff --git a/mrbgems/mruby-object-ext/test/nil.rb b/mrbgems/mruby-object-ext/test/nil.rb new file mode 100644 index 000000000..e385dec6a --- /dev/null +++ b/mrbgems/mruby-object-ext/test/nil.rb @@ -0,0 +1,11 @@ +assert('NilClass#to_a') do + assert_equal nil.to_a, [] +end + +assert('NilClass#to_f') do + assert_equal nil.to_f, 0.0 +end + +assert('NilClass#to_i') do + assert_equal nil.to_i, 0 +end diff --git a/src/object.c b/src/object.c index a2162f77f..d6f756f18 100644 --- a/src/object.c +++ b/src/object.c @@ -5,6 +5,7 @@ */ #include "mruby.h" +#include "mruby/array.h" #include "mruby/class.h" #include "mruby/numeric.h" #include "mruby/string.h" diff --git a/test/t/nil.rb b/test/t/nil.rb index 99b1215e9..08d2acdf1 100644 --- a/test/t/nil.rb +++ b/test/t/nil.rb @@ -27,4 +27,3 @@ end assert('NilClass#to_s', '15.2.4.3.5') do assert_equal nil.to_s, '' end - -- cgit v1.2.3 From 5835406e6beccbfd97d973d876fad60a0dd70b58 Mon Sep 17 00:00:00 2001 From: Cremno Date: Fri, 28 Jun 2013 08:05:33 +0200 Subject: replaced POSIX header with standard C header --- src/crc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/crc.c b/src/crc.c index 463c7abe6..3bda7bc26 100644 --- a/src/crc.c +++ b/src/crc.c @@ -6,7 +6,7 @@ #include #include -#include +#include // Calculate CRC (CRC-16-CCITT) // -- cgit v1.2.3 From 68f31e94f564c48d8677acc8acf3ba46deebf94f Mon Sep 17 00:00:00 2001 From: fleuria Date: Fri, 28 Jun 2013 22:58:19 +0800 Subject: refactor mrb_realloc() remove the redundant codes with mrb_malloc_simple() --- include/mruby.h | 1 + src/gc.c | 23 +++++++++++++---------- 2 files changed, 14 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/include/mruby.h b/include/mruby.h index 29d13c553..568ed4876 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -242,6 +242,7 @@ mrb_sym mrb_intern(mrb_state *mrb,const char *cstr) void *mrb_malloc(mrb_state*, size_t); /* raise RuntimeError if no mem */ void *mrb_calloc(mrb_state*, size_t, size_t); /* ditto */ void *mrb_realloc(mrb_state*, void*, size_t); /* ditto */ +void *mrb_realloc_simple(mrb_state*, void*, size_t); /* return NULL if no memory available */ void *mrb_malloc_simple(mrb_state*, size_t); /* return NULL if no memory available */ struct RBasic *mrb_obj_alloc(mrb_state*, enum mrb_vtype, struct RClass*); void mrb_free(mrb_state*, void*); diff --git a/src/gc.c b/src/gc.c index 7eee61dc1..6fc400e32 100644 --- a/src/gc.c +++ b/src/gc.c @@ -148,18 +148,28 @@ gettimeofday_time(void) #define GC_STEP_SIZE 1024 + void* -mrb_realloc(mrb_state *mrb, void *p, size_t len) +mrb_realloc_simple(mrb_state *mrb, void *p, size_t len) { void *p2; p2 = (mrb->allocf)(mrb, p, len, mrb->ud); - if (!p2 && len > 0 && mrb->heaps) { mrb_garbage_collect(mrb); p2 = (mrb->allocf)(mrb, p, len, mrb->ud); } + return p2; +} + + +void* +mrb_realloc(mrb_state *mrb, void *p, size_t len) +{ + void *p2; + + p2 = mrb_realloc_simple(mrb, p, len); if (!p2 && len) { if (mrb->out_of_memory) { /* mrb_panic(mrb); */ @@ -185,14 +195,7 @@ mrb_malloc(mrb_state *mrb, size_t len) void* mrb_malloc_simple(mrb_state *mrb, size_t len) { - void *p2; - - p2 = (mrb->allocf)(mrb, 0, len, mrb->ud); - if (!p2 && len > 0 && mrb->heaps) { - mrb_garbage_collect(mrb); - p2 = (mrb->allocf)(mrb, 0, len, mrb->ud); - } - return p2; + return mrb_realloc_simple(mrb, 0, len); } void* -- cgit v1.2.3 From 73d4491174875a0b8698f12727aeb31204fb4098 Mon Sep 17 00:00:00 2001 From: Jun Hiroe Date: Sun, 30 Jun 2013 00:03:01 +0900 Subject: Refactor mrb_obj_eq() func in object.c. --- src/object.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/object.c b/src/object.c index d6f756f18..50f2c3ab9 100644 --- a/src/object.c +++ b/src/object.c @@ -17,7 +17,7 @@ mrb_obj_eq(mrb_state *mrb, mrb_value v1, mrb_value v2) if (mrb_type(v1) != mrb_type(v2)) return FALSE; switch (mrb_type(v1)) { case MRB_TT_TRUE: - return 1; + return TRUE; case MRB_TT_FALSE: case MRB_TT_FIXNUM: -- cgit v1.2.3 From a2210274eab85de9fbcf48a6509e8485482a083c Mon Sep 17 00:00:00 2001 From: Jun Hiroe Date: Sun, 30 Jun 2013 02:11:37 +0900 Subject: Refactor mrb_range_eq() func in range.c. --- src/range.c | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) (limited to 'src') diff --git a/src/range.c b/src/range.c index 7e3e03136..43de0e799 100644 --- a/src/range.c +++ b/src/range.c @@ -152,30 +152,22 @@ mrb_range_eq(mrb_state *mrb, mrb_value range) struct RRange *rr; struct RRange *ro; mrb_value obj; - mrb_bool eq_p; mrb_get_args(mrb, "o", &obj); - if (mrb_obj_equal(mrb, range, obj)) { - eq_p = 1; - } - else if (!mrb_obj_is_instance_of(mrb, obj, mrb_obj_class(mrb, range))) { /* same class? */ - eq_p = 0; - } - else { - rr = mrb_range_ptr(range); - ro = mrb_range_ptr(obj); - if (!mrb_obj_equal(mrb, rr->edges->beg, ro->edges->beg) || - !mrb_obj_equal(mrb, rr->edges->end, ro->edges->end) || - rr->excl != ro->excl) { - eq_p = 0; - } - else { - eq_p = 1; - } + if (mrb_obj_equal(mrb, range, obj)) return mrb_true_value(); + if (!mrb_obj_is_instance_of(mrb, obj, mrb_obj_class(mrb, range))) { /* same class? */ + return mrb_false_value(); } - return mrb_bool_value(eq_p); + rr = mrb_range_ptr(range); + ro = mrb_range_ptr(obj); + if (!mrb_obj_equal(mrb, rr->edges->beg, ro->edges->beg) || + !mrb_obj_equal(mrb, rr->edges->end, ro->edges->end) || + rr->excl != ro->excl) { + return mrb_false_value(); + } + return mrb_true_value(); } static int -- cgit v1.2.3 From 85ea2f61449ef42c834aceecddad8cadc61e05ae Mon Sep 17 00:00:00 2001 From: Jun Hiroe Date: Sun, 30 Jun 2013 21:30:22 +0900 Subject: Refactor range_eql() func in rangec.c --- src/range.c | 37 +++++++++++++------------------------ 1 file changed, 13 insertions(+), 24 deletions(-) (limited to 'src') diff --git a/src/range.c b/src/range.c index 43de0e799..73d532d94 100644 --- a/src/range.c +++ b/src/range.c @@ -377,34 +377,23 @@ range_eql(mrb_state *mrb, mrb_value range) { mrb_value obj; struct RRange *r, *o; - mrb_bool eql_p; mrb_get_args(mrb, "o", &obj); - if (mrb_obj_equal(mrb, range, obj)) { - eql_p = 1; - } - else if (!mrb_obj_is_kind_of(mrb, obj, RANGE_CLASS)) { - eql_p = 0; - } - else { - r = mrb_range_ptr(range); - if (mrb_type(obj) != MRB_TT_RANGE) { - eql_p = 0; - } - else { - o = mrb_range_ptr(obj); - if (!mrb_eql(mrb, r->edges->beg, o->edges->beg) || - !mrb_eql(mrb, r->edges->end, o->edges->end) || - (r->excl != o->excl)) { - eql_p = 0; - } - else { - eql_p = 1; - } - } + + if (mrb_obj_equal(mrb, range, obj)) return mrb_true_value(); + if (!mrb_obj_is_kind_of(mrb, obj, RANGE_CLASS)) { + return mrb_false_value(); } + if (mrb_type(obj) != MRB_TT_RANGE) return mrb_false_value(); - return mrb_bool_value(eql_p); + r = mrb_range_ptr(range); + o = mrb_range_ptr(obj); + if (!mrb_eql(mrb, r->edges->beg, o->edges->beg) || + !mrb_eql(mrb, r->edges->end, o->edges->end) || + (r->excl != o->excl)) { + return mrb_false_value(); + } + return mrb_true_value(); } /* 15.2.14.4.15(x) */ -- cgit v1.2.3 From db0eaa6352da470fdeb735403b858738897e3871 Mon Sep 17 00:00:00 2001 From: h2so5 Date: Sun, 30 Jun 2013 23:40:53 +0900 Subject: Fix Range#== --- src/range.c | 4 ++-- test/t/range.rb | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/range.c b/src/range.c index 43de0e799..7dd16ad5f 100644 --- a/src/range.c +++ b/src/range.c @@ -162,8 +162,8 @@ mrb_range_eq(mrb_state *mrb, mrb_value range) rr = mrb_range_ptr(range); ro = mrb_range_ptr(obj); - if (!mrb_obj_equal(mrb, rr->edges->beg, ro->edges->beg) || - !mrb_obj_equal(mrb, rr->edges->end, ro->edges->end) || + if (!mrb_bool(mrb_funcall(mrb, rr->edges->beg, "==", 1, ro->edges->beg)) || + !mrb_bool(mrb_funcall(mrb, rr->edges->end, "==", 1, ro->edges->end)) || rr->excl != ro->excl) { return mrb_false_value(); } diff --git a/test/t/range.rb b/test/t/range.rb index fdf6b415c..e8f57ecd5 100644 --- a/test/t/range.rb +++ b/test/t/range.rb @@ -12,6 +12,7 @@ end assert('Range#==', '15.2.14.4.1') do assert_true (1..10) == (1..10) assert_false (1..10) == (1..100) + assert_true (1..10) == Range.new(1.0, 10.0) end assert('Range#===', '15.2.14.4.2') do -- cgit v1.2.3 From 73f4ed5f0e80e2cb697ace286b4d87da6d1469d4 Mon Sep 17 00:00:00 2001 From: Carson McDonald Date: Sun, 30 Jun 2013 15:07:45 -0400 Subject: Fix some signed unsigned warnings, int to size_t. --- src/codegen.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src') diff --git a/src/codegen.c b/src/codegen.c index cfbbe7286..98df2a6b1 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -426,8 +426,7 @@ push_(codegen_scope *s) static inline int new_lit(codegen_scope *s, mrb_value val) { - int i; - + size_t i; switch (mrb_type(val)) { case MRB_TT_STRING: -- cgit v1.2.3 From b36f690655eb30e196f8d2b9e266c0db50acf769 Mon Sep 17 00:00:00 2001 From: Carson McDonald Date: Sun, 30 Jun 2013 15:10:39 -0400 Subject: Change int to size_t. --- src/codegen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/codegen.c b/src/codegen.c index 98df2a6b1..517a4c6f7 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -461,7 +461,7 @@ new_lit(codegen_scope *s, mrb_value val) static inline int new_msym(codegen_scope *s, mrb_sym sym) { - int i, len; + size_t i, len; len = s->irep->slen; if (len > 256) len = 256; -- cgit v1.2.3 From 56b63f5b45df096e677222d2911ef7fd91cdf92b Mon Sep 17 00:00:00 2001 From: Carson McDonald Date: Sun, 30 Jun 2013 15:12:34 -0400 Subject: Change int to size_t --- src/codegen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/codegen.c b/src/codegen.c index 517a4c6f7..091561b45 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -480,7 +480,7 @@ new_msym(codegen_scope *s, mrb_sym sym) static inline int new_sym(codegen_scope *s, mrb_sym sym) { - int i; + size_t i; for (i=0; iirep->slen; i++) { if (s->irep->syms[i] == sym) return i; -- cgit v1.2.3 From 3f823a0ceeadcba48a332b5d89f867b23c2d332b Mon Sep 17 00:00:00 2001 From: h2so5 Date: Mon, 1 Jul 2013 11:42:38 +0900 Subject: Add mrb_class_get_under() --- include/mruby.h | 1 + src/class.c | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/include/mruby.h b/include/mruby.h index 568ed4876..b602ba8c9 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -178,6 +178,7 @@ struct RClass * mrb_class_new(mrb_state *mrb, struct RClass *super); struct RClass * mrb_module_new(mrb_state *mrb); int mrb_class_defined(mrb_state *mrb, const char *name); struct RClass * mrb_class_get(mrb_state *mrb, const char *name); +struct RClass * mrb_class_get_under(mrb_state *mrb, struct RClass *outer, const char *name); mrb_value mrb_obj_dup(mrb_state *mrb, mrb_value obj); mrb_value mrb_check_to_integer(mrb_state *mrb, mrb_value val, const char *method); diff --git a/src/class.c b/src/class.c index 6eb70dce6..e33ab0153 100644 --- a/src/class.c +++ b/src/class.c @@ -227,7 +227,13 @@ class_from_sym(mrb_state *mrb, struct RClass *klass, mrb_sym id) struct RClass * mrb_class_get(mrb_state *mrb, const char *name) { - return class_from_sym(mrb, mrb->object_class, mrb_intern(mrb, name)); + return mrb_class_get_under(mrb, mrb->object_class, name); +} + +struct RClass * +mrb_class_get_under(mrb_state *mrb, struct RClass *outer, const char *name) +{ + return class_from_sym(mrb, outer, mrb_intern(mrb, name)); } /*! -- cgit v1.2.3 From 43ba7f74a2e2325fbc886fdfa0847bdbe84b5cda Mon Sep 17 00:00:00 2001 From: Carson McDonald Date: Mon, 1 Jul 2013 07:01:02 -0400 Subject: Fix unsigned/signed comparison. --- src/dump.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src') diff --git a/src/dump.c b/src/dump.c index c2b987bc8..bf3d25f13 100644 --- a/src/dump.c +++ b/src/dump.c @@ -334,8 +334,7 @@ static int write_lineno_record(mrb_state *mrb, mrb_irep *irep, uint8_t* bin) { uint8_t *cur = bin; - size_t filename_len = 0; - int iseq_no; + size_t filename_len = 0, iseq_no; cur += sizeof(uint32_t); /* record size */ -- cgit v1.2.3 From d8c4ce8f49ec491488a05881850e23611446387d Mon Sep 17 00:00:00 2001 From: Carson McDonald Date: Mon, 1 Jul 2013 07:03:21 -0400 Subject: Fix unsigned/signed warning. --- src/gc.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src') diff --git a/src/gc.c b/src/gc.c index 6fc400e32..2be387e79 100644 --- a/src/gc.c +++ b/src/gc.c @@ -630,8 +630,7 @@ obj_free(mrb_state *mrb, struct RBasic *obj) static void root_scan_phase(mrb_state *mrb) { - int j; - size_t i, e; + size_t i, e, j; if (!is_minor_gc(mrb)) { mrb->gray_list = 0; -- cgit v1.2.3 From 3c197f6ab1e091982ead76346e0335bfacf3adb7 Mon Sep 17 00:00:00 2001 From: Jun Hiroe Date: Mon, 1 Jul 2013 22:00:08 +0900 Subject: Refactor mrb_realloc() func in gc.c. --- 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 6fc400e32..dcbfaa890 100644 --- a/src/gc.c +++ b/src/gc.c @@ -175,12 +175,12 @@ mrb_realloc(mrb_state *mrb, void *p, size_t len) /* mrb_panic(mrb); */ } else { - mrb->out_of_memory = 1; + mrb->out_of_memory = TRUE; mrb_raise(mrb, E_RUNTIME_ERROR, "Out of memory"); } } else { - mrb->out_of_memory = 0; + mrb->out_of_memory = FALSE; } return p2; -- cgit v1.2.3 From 2f8e9b474f41d1fe72cbdc626fc990f2a7544a9e Mon Sep 17 00:00:00 2001 From: Jun Hiroe Date: Mon, 1 Jul 2013 23:34:56 +0900 Subject: Refactor mrb_ary_equal() func in array.c. --- src/array.c | 35 +++++++++++------------------------ 1 file changed, 11 insertions(+), 24 deletions(-) (limited to 'src') diff --git a/src/array.c b/src/array.c index 92359b033..a22730776 100644 --- a/src/array.c +++ b/src/array.c @@ -1056,39 +1056,26 @@ static mrb_value mrb_ary_equal(mrb_state *mrb, mrb_value ary1) { mrb_value ary2; - mrb_bool equal_p; + mrb_int i; mrb_get_args(mrb, "o", &ary2); - if (mrb_obj_equal(mrb, ary1, ary2)) { - equal_p = 1; - } - else if (mrb_special_const_p(ary2)) { - equal_p = 0; - } - else if (!mrb_array_p(ary2)) { + if (mrb_obj_equal(mrb, ary1, ary2)) return mrb_true_value(); + if (mrb_special_const_p(ary2)) return mrb_false_value(); + if (!mrb_array_p(ary2)) { if (!mrb_respond_to(mrb, ary2, mrb_intern2(mrb, "to_ary", 6))) { - equal_p = 0; + return mrb_false_value(); } else { - equal_p = mrb_equal(mrb, ary2, ary1); + return mrb_bool_value(mrb_equal(mrb, ary2, ary1)); } } - else if (RARRAY_LEN(ary1) != RARRAY_LEN(ary2)) { - equal_p = 0; - } - else { - mrb_int i; - - equal_p = 1; - for (i=0; i Date: Mon, 1 Jul 2013 23:51:37 +0900 Subject: Refactor mrb_ary_eql() func in array.c. --- src/array.c | 28 ++++++++-------------------- 1 file changed, 8 insertions(+), 20 deletions(-) (limited to 'src') diff --git a/src/array.c b/src/array.c index a22730776..ed087515a 100644 --- a/src/array.c +++ b/src/array.c @@ -1091,30 +1091,18 @@ static mrb_value mrb_ary_eql(mrb_state *mrb, mrb_value ary1) { mrb_value ary2; - mrb_bool eql_p; + mrb_int i; mrb_get_args(mrb, "o", &ary2); - if (mrb_obj_equal(mrb, ary1, ary2)) { - eql_p = 1; - } - else if (!mrb_array_p(ary2)) { - eql_p = 0; - } - else if (RARRAY_LEN(ary1) != RARRAY_LEN(ary2)) { - eql_p = 0; - } - else { - mrb_int i; - eql_p = 1; - for (i=0; i Date: Wed, 3 Jul 2013 00:13:57 +0900 Subject: Refactor mrb_define_class() method in class.c.c --- src/class.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'src') diff --git a/src/class.c b/src/class.c index e33ab0153..237109936 100644 --- a/src/class.c +++ b/src/class.c @@ -159,9 +159,7 @@ mrb_define_class_id(mrb_state *mrb, mrb_sym name, struct RClass *super) struct RClass* mrb_define_class(mrb_state *mrb, const char *name, struct RClass *super) { - struct RClass *c; - c = mrb_define_class_id(mrb, mrb_intern(mrb, name), super); - return c; + return mrb_define_class_id(mrb, mrb_intern(mrb, name), super); } struct RClass* -- cgit v1.2.3 From 2afae56c8eab117552db0b92adf13a0cb4352c20 Mon Sep 17 00:00:00 2001 From: Carson McDonald Date: Wed, 3 Jul 2013 06:52:19 -0400 Subject: Fix signed/unsigned warning, make pcapa a size_t --- src/codegen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/codegen.c b/src/codegen.c index 091561b45..d7d4f19b2 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -59,7 +59,7 @@ typedef struct scope { int icapa; mrb_irep *irep; - int pcapa; + size_t pcapa; int scapa; int nlocals; -- cgit v1.2.3 From c7f9ac79b70ffbb85f2709d42559fdde41bf8128 Mon Sep 17 00:00:00 2001 From: Carson McDonald Date: Wed, 3 Jul 2013 07:07:44 -0400 Subject: Fix signed/unsigned warning. --- src/codegen.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/codegen.c b/src/codegen.c index d7d4f19b2..e240995e5 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -2505,7 +2505,8 @@ codedump(mrb_state *mrb, int n) { #ifdef ENABLE_STDIO mrb_irep *irep = mrb->irep[n]; - int i, ai; + uint32_t i; + int ai; mrb_code c; if (!irep) return; -- cgit v1.2.3 From e57da6ae2a0d135af5e6400634478da27a5f4f01 Mon Sep 17 00:00:00 2001 From: Carson McDonald Date: Wed, 3 Jul 2013 07:15:30 -0400 Subject: Fix signed/unsigned warning, size_t for start_index was discarded. --- src/dump.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/dump.c b/src/dump.c index bf3d25f13..72ca9e0c3 100644 --- a/src/dump.c +++ b/src/dump.c @@ -364,13 +364,13 @@ write_lineno_record(mrb_state *mrb, mrb_irep *irep, uint8_t* bin) } static int -mrb_write_section_lineno(mrb_state *mrb, int start_index, uint8_t *bin) +mrb_write_section_lineno(mrb_state *mrb, size_t start_index, uint8_t *bin) { - int irep_no; + size_t irep_no; uint32_t section_size = 0, rlen = 0; /* size of irep record */ uint8_t *cur = bin; - if (mrb == NULL || start_index < 0 || start_index >= mrb->irep_len || bin == NULL) { + if (mrb == NULL || start_index >= mrb->irep_len || bin == NULL) { return MRB_DUMP_INVALID_ARGUMENT; } -- cgit v1.2.3 From db678329c00bd6cf08402c07e1f85f0752e9722e Mon Sep 17 00:00:00 2001 From: Jun Hiroe Date: Wed, 3 Jul 2013 20:52:48 +0900 Subject: Add comments in mrb_get_args() func. --- src/class.c | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/class.c b/src/class.c index 237109936..0d71886d3 100644 --- a/src/class.c +++ b/src/class.c @@ -375,20 +375,22 @@ to_hash(mrb_state *mrb, mrb_value val) format specifiers: - o: Object [mrb_value] - S: String [mrb_value] - A: Array [mrb_value] - H: Hash [mrb_value] - s: String [char*,int] - z: String [char*] - a: Array [mrb_value*,mrb_int] - f: Float [mrb_float] - i: Integer [mrb_int] - b: Boolean [mrb_bool] - n: Symbol [mrb_sym] - &: Block [mrb_value] - *: rest argument [mrb_value*,int] - |: optional + string mruby type C type note + ---------------------------------------------------------------------------------------------- + o: Object [mrb_value] + S: String [mrb_value] + A: Array [mrb_value] + H: Hash [mrb_value] + s: String [char*,int] Receive two arguments. + z: String [char*] NUL terminated string. + a: Array [mrb_value*,mrb_int] Receive two arguments. + f: Float [mrb_float] + i: Integer [mrb_int] + b: Boolean [mrb_bool] + n: Symbol [mrb_sym] + &: Block [mrb_value] + *: rest argument [mrb_value*,int] Receive the rest of the arguments as an array. + |: optional Next argument of '|' and later are optional. */ int mrb_get_args(mrb_state *mrb, const char *format, ...) -- cgit v1.2.3 From 780930cbf546c41002a8d27ec23bc9326e5e3e00 Mon Sep 17 00:00:00 2001 From: Jun Hiroe Date: Fri, 5 Jul 2013 21:21:17 +0900 Subject: Refactor mrb_range_beg_len() func in range.c --- src/range.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/range.c b/src/range.c index 992e47bd2..92eddfe8c 100644 --- a/src/range.c +++ b/src/range.c @@ -276,10 +276,10 @@ mrb_range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp, if (beg < 0) { beg += len; - if (beg < 0) goto out_of_range; + if (beg < 0) return FALSE; } - if (beg > len) goto out_of_range; + if (beg > len) return FALSE; if (end > len) end = len; if (end < 0) end += len; @@ -290,9 +290,6 @@ mrb_range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp, *begp = beg; *lenp = len; return TRUE; - -out_of_range: - return FALSE; } /* 15.2.14.4.12(x) */ -- cgit v1.2.3 From 2f62f74d0da0aa0bccfac05da8ecd530dfd43d83 Mon Sep 17 00:00:00 2001 From: Jun Hiroe Date: Fri, 5 Jul 2013 21:53:00 +0900 Subject: Fix indents in object.c. --- src/object.c | 54 +++++++++++++++++++++++++++--------------------------- 1 file changed, 27 insertions(+), 27 deletions(-) (limited to 'src') diff --git a/src/object.c b/src/object.c index 50f2c3ab9..e0873175c 100644 --- a/src/object.c +++ b/src/object.c @@ -68,7 +68,7 @@ mrb_equal(mrb_state *mrb, mrb_value obj1, mrb_value obj2) static mrb_value mrb_true(mrb_state *mrb, mrb_value obj) { - return mrb_true_value(); + return mrb_true_value(); } /* 15.2.4.3.5 */ @@ -319,14 +319,14 @@ convert_type(mrb_state *mrb, mrb_value val, const char *tname, const char *metho mrb_value mrb_check_to_integer(mrb_state *mrb, mrb_value val, const char *method) { - mrb_value v; + mrb_value v; - if (mrb_type(val) == MRB_TT_FIXNUM) return val; - v = convert_type(mrb, val, "Integer", method, FALSE); - if (mrb_nil_p(v) || mrb_type(v) != MRB_TT_FIXNUM) { - return mrb_nil_value(); - } - return v; + if (mrb_type(val) == MRB_TT_FIXNUM) return val; + v = convert_type(mrb, val, "Integer", method, FALSE); + if (mrb_nil_p(v) || mrb_type(v) != MRB_TT_FIXNUM) { + return mrb_nil_value(); + } + return v; } mrb_value @@ -355,8 +355,8 @@ mrb_check_convert_type(mrb_state *mrb, mrb_value val, mrb_int type, const char * } static const struct types { - unsigned char type; - const char *name; + unsigned char type; + const char *name; } builtin_types[] = { // {MRB_TT_NIL, "nil"}, {MRB_TT_FALSE, "false"}, @@ -500,21 +500,21 @@ mrb_obj_is_kind_of(mrb_state *mrb, mrb_value obj, struct RClass *c) static mrb_value mrb_to_integer(mrb_state *mrb, mrb_value val, const char *method) { - mrb_value v; + mrb_value v; - if (mrb_fixnum_p(val)) return val; - v = convert_type(mrb, val, "Integer", method, TRUE); - if (!mrb_obj_is_kind_of(mrb, v, mrb->fixnum_class)) { - mrb_raisef(mrb, E_TYPE_ERROR, "can't convert %S to Integer (%S#%S gives %S)", - val, val, mrb_str_new_cstr(mrb, method), v); - } - return v; + if (mrb_fixnum_p(val)) return val; + v = convert_type(mrb, val, "Integer", method, TRUE); + if (!mrb_obj_is_kind_of(mrb, v, mrb->fixnum_class)) { + mrb_raisef(mrb, E_TYPE_ERROR, "can't convert %S to Integer (%S#%S gives %S)", + val, val, mrb_str_new_cstr(mrb, method), v); + } + return v; } mrb_value mrb_to_int(mrb_state *mrb, mrb_value val) { - return mrb_to_integer(mrb, val, "to_int"); + return mrb_to_integer(mrb, val, "to_int"); } static mrb_value @@ -530,7 +530,7 @@ mrb_convert_to_integer(mrb_state *mrb, mrb_value val, int base) case MRB_TT_FLOAT: if (base != 0) goto arg_error; if (FIXABLE(mrb_float(val))) { - break; + break; } return mrb_flo_to_fixnum(mrb, val); @@ -546,14 +546,14 @@ string_conv: break; } if (base != 0) { - tmp = mrb_check_string_type(mrb, val); - if (!mrb_nil_p(tmp)) goto string_conv; - arg_error: - mrb_raise(mrb, E_ARGUMENT_ERROR, "base specified for non string value"); + tmp = mrb_check_string_type(mrb, val); + if (!mrb_nil_p(tmp)) goto string_conv; +arg_error: + mrb_raise(mrb, E_ARGUMENT_ERROR, "base specified for non string value"); } tmp = convert_type(mrb, val, "Integer", "to_int", FALSE); if (mrb_nil_p(tmp)) { - return mrb_to_integer(mrb, val, "to_i"); + return mrb_to_integer(mrb, val, "to_i"); } return tmp; } @@ -561,14 +561,14 @@ string_conv: mrb_value mrb_Integer(mrb_state *mrb, mrb_value val) { - return mrb_convert_to_integer(mrb, val, 0); + return mrb_convert_to_integer(mrb, val, 0); } mrb_value mrb_Float(mrb_state *mrb, mrb_value val) { if (mrb_nil_p(val)) { - mrb_raise(mrb, E_TYPE_ERROR, "can't convert nil into Float"); + mrb_raise(mrb, E_TYPE_ERROR, "can't convert nil into Float"); } switch (mrb_type(val)) { case MRB_TT_FIXNUM: -- cgit v1.2.3 From 9a5e78ae6771c272352d6b59bef264ccac2150ec Mon Sep 17 00:00:00 2001 From: Carson McDonald Date: Sat, 6 Jul 2013 08:54:18 -0400 Subject: Change width to size_t to fix warning --- src/numeric.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/numeric.c b/src/numeric.c index 6cd82d8b6..e1543c089 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -998,7 +998,7 @@ fix_xor(mrb_state *mrb, mrb_value x) #define NUMERIC_SHIFT_WIDTH_MAX (sizeof(mrb_int)*CHAR_BIT-1) static mrb_value -lshift(mrb_state *mrb, mrb_int val, int width) +lshift(mrb_state *mrb, mrb_int val, size_t width) { if (width > NUMERIC_SHIFT_WIDTH_MAX) { mrb_raisef(mrb, E_RANGE_ERROR, "width(%S) > (%S:sizeof(mrb_int)*CHAR_BIT-1)", @@ -1010,7 +1010,7 @@ lshift(mrb_state *mrb, mrb_int val, int width) } static mrb_value -rshift(mrb_int val, int width) +rshift(mrb_int val, size_t width) { if (width >= NUMERIC_SHIFT_WIDTH_MAX) { if (val < 0) { -- cgit v1.2.3 From 8ab83f763df9d406961f1eb370ce7d01ae648820 Mon Sep 17 00:00:00 2001 From: Kazuki Tsujimoto Date: Sun, 7 Jul 2013 14:18:37 +0900 Subject: Change parameter type to suppress -Wsign-compare warnings --- include/mruby.h | 4 ++-- src/object.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/include/mruby.h b/include/mruby.h index dd555eb8b..e5a5f2c69 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -286,12 +286,12 @@ void mrb_field_write_barrier(mrb_state *, struct RBasic*, struct RBasic*); } while (0) void mrb_write_barrier(mrb_state *, struct RBasic*); -mrb_value mrb_check_convert_type(mrb_state *mrb, mrb_value val, mrb_int type, const char *tname, const char *method); +mrb_value mrb_check_convert_type(mrb_state *mrb, mrb_value val, enum mrb_vtype type, const char *tname, const char *method); mrb_value mrb_any_to_s(mrb_state *mrb, mrb_value obj); const char * mrb_obj_classname(mrb_state *mrb, mrb_value obj); struct RClass* mrb_obj_class(mrb_state *mrb, mrb_value obj); mrb_value mrb_class_path(mrb_state *mrb, struct RClass *c); -mrb_value mrb_convert_type(mrb_state *mrb, mrb_value val, mrb_int type, const char *tname, const char *method); +mrb_value mrb_convert_type(mrb_state *mrb, mrb_value val, enum mrb_vtype type, const char *tname, const char *method); int mrb_obj_is_kind_of(mrb_state *mrb, mrb_value obj, struct RClass *c); mrb_value mrb_obj_inspect(mrb_state *mrb, mrb_value self); mrb_value mrb_obj_clone(mrb_state *mrb, mrb_value self); diff --git a/src/object.c b/src/object.c index e0873175c..aafd2d8fe 100644 --- a/src/object.c +++ b/src/object.c @@ -330,7 +330,7 @@ mrb_check_to_integer(mrb_state *mrb, mrb_value val, const char *method) } mrb_value -mrb_convert_type(mrb_state *mrb, mrb_value val, mrb_int type, const char *tname, const char *method) +mrb_convert_type(mrb_state *mrb, mrb_value val, enum mrb_vtype type, const char *tname, const char *method) { mrb_value v; @@ -344,7 +344,7 @@ mrb_convert_type(mrb_state *mrb, mrb_value val, mrb_int type, const char *tname, } mrb_value -mrb_check_convert_type(mrb_state *mrb, mrb_value val, mrb_int type, const char *tname, const char *method) +mrb_check_convert_type(mrb_state *mrb, mrb_value val, enum mrb_vtype type, const char *tname, const char *method) { mrb_value v; -- cgit v1.2.3 From 71fd1375d220923b888f5856de04f4d6ad2b2185 Mon Sep 17 00:00:00 2001 From: hoge Date: Sun, 7 Jul 2013 23:05:37 +0900 Subject: call Class#inherited when Class.new(klass) --- src/class.c | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/class.c b/src/class.c index 0d71886d3..228549b28 100644 --- a/src/class.c +++ b/src/class.c @@ -1075,6 +1075,7 @@ mrb_class_new_class(mrb_state *mrb, mrb_value cv) super = mrb_obj_value(mrb->object_class); } new_class = mrb_class_new(mrb, mrb_class_ptr(super)); + mrb_funcall(mrb, super, "inherited", 1, mrb_obj_value(new_class)); return mrb_obj_value(new_class); } -- cgit v1.2.3 From 948b1716a021e257a9fa483b9103f1979ab96b75 Mon Sep 17 00:00:00 2001 From: Jun Hiroe Date: Mon, 8 Jul 2013 22:25:04 +0900 Subject: Refactor true_or() and false_and() in object.c. --- src/object.c | 6 ------ 1 file changed, 6 deletions(-) (limited to 'src') diff --git a/src/object.c b/src/object.c index aafd2d8fe..c09ae3072 100644 --- a/src/object.c +++ b/src/object.c @@ -172,9 +172,6 @@ true_to_s(mrb_state *mrb, mrb_value obj) static mrb_value true_or(mrb_state *mrb, mrb_value obj) { - mrb_bool obj2; - - mrb_get_args(mrb, "b", &obj2); return mrb_true_value(); } @@ -203,9 +200,6 @@ true_or(mrb_state *mrb, mrb_value obj) static mrb_value false_and(mrb_state *mrb, mrb_value obj) { - mrb_bool obj2; - - mrb_get_args(mrb, "b", &obj2); return mrb_false_value(); } -- cgit v1.2.3 From e8e0b611c65fff4c75388fd09814e59fe5b1cb0a Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Wed, 10 Jul 2013 02:45:29 +0900 Subject: mrb_mod_alias to use mrb_get_args("nn") --- src/class.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/class.c b/src/class.c index 228549b28..73186c8f8 100644 --- a/src/class.c +++ b/src/class.c @@ -1417,10 +1417,10 @@ mrb_value mrb_mod_alias(mrb_state *mrb, mrb_value mod) { struct RClass *c = mrb_class_ptr(mod); - mrb_value new_value, old_value; + mrb_sym new_name, old_name; - mrb_get_args(mrb, "oo", &new_value, &old_value); - mrb_alias_method(mrb, c, mrb_symbol(new_value), mrb_symbol(old_value)); + mrb_get_args(mrb, "nn", &new_name, &old_name); + mrb_alias_method(mrb, c, new_name, old_name); return mrb_nil_value(); } -- cgit v1.2.3 From 1ffd25d5729833d9d9e80b7206486991c5d04c22 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Wed, 10 Jul 2013 09:37:24 +0900 Subject: mrb_bob_missing to use mrb_get_args("n") --- src/class.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/class.c b/src/class.c index 73186c8f8..ad683ed2b 100644 --- a/src/class.c +++ b/src/class.c @@ -1141,14 +1141,12 @@ mrb_bob_not(mrb_state *mrb, mrb_value cv) static mrb_value mrb_bob_missing(mrb_state *mrb, mrb_value mod) { - mrb_value name, *a; + mrb_sym name; + mrb_value *a; int alen; mrb_value inspect; - mrb_get_args(mrb, "o*", &name, &a, &alen); - if (!mrb_symbol_p(name)) { - mrb_raise(mrb, E_TYPE_ERROR, "name should be a symbol"); - } + mrb_get_args(mrb, "n*", &name, &a, &alen); if (mrb_respond_to(mrb,mod,mrb_intern2(mrb,"inspect",7))){ inspect = mrb_funcall(mrb, mod, "inspect", 0); @@ -1161,7 +1159,7 @@ mrb_bob_missing(mrb_state *mrb, mrb_value mod) } mrb_raisef(mrb, E_NOMETHOD_ERROR, "undefined method '%S' for %S", - mrb_sym2str(mrb, mrb_symbol(name)), inspect); + mrb_sym2str(mrb, name), inspect); /* not reached */ return mrb_nil_value(); } -- cgit v1.2.3 From 39b78ee48c4b7fdc507fb3b45395484ec065c5d9 Mon Sep 17 00:00:00 2001 From: Jun Hiroe Date: Thu, 11 Jul 2013 01:08:40 +0900 Subject: Replace 0 with '\0' as nul terminated string. --- src/string.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/string.c b/src/string.c index 328266df9..59a1df455 100644 --- a/src/string.c +++ b/src/string.c @@ -74,7 +74,7 @@ mrb_str_modify(mrb_state *mrb, struct RString *s) if (p) { memcpy(ptr, p, len); } - ptr[len] = 0; + ptr[len] = '\0'; s->ptr = ptr; s->aux.capa = len; str_decref(mrb, shared); @@ -398,7 +398,7 @@ mrb_str_concat(mrb_state *mrb, mrb_value self, mrb_value other) } memcpy(s1->ptr+s1->len, s2->ptr, s2->len); s1->len = len; - s1->ptr[len] = 0; + s1->ptr[len] = '\0'; } /* -- cgit v1.2.3 From b68ef2e634339697f1d954114fe672954def974f Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Thu, 11 Jul 2013 14:49:17 +0900 Subject: add dummy visibility methods (public/protected/private) that do nothing; ref #1357 --- src/class.c | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'src') diff --git a/src/class.c b/src/class.c index ad683ed2b..291642654 100644 --- a/src/class.c +++ b/src/class.c @@ -908,6 +908,12 @@ mrb_mod_module_eval(mrb_state *mrb, mrb_value mod) return mrb_yield_internal(mrb, b, 0, 0, mod, c); } +mrb_value +mrb_mod_dummy_visibility(mrb_state *mrb, mrb_value mod) +{ + return mod; +} + mrb_value mrb_singleton_class(mrb_state *mrb, mrb_value v) { @@ -1909,6 +1915,9 @@ mrb_init_class(mrb_state *mrb) mrb_define_method(mrb, mod, "instance_methods", mrb_mod_instance_methods, MRB_ARGS_ANY()); /* 15.2.2.4.33 */ mrb_define_method(mrb, mod, "method_defined?", mrb_mod_method_defined, MRB_ARGS_REQ(1)); /* 15.2.2.4.34 */ mrb_define_method(mrb, mod, "module_eval", mrb_mod_module_eval, MRB_ARGS_ANY()); /* 15.2.2.4.35 */ + mrb_define_method(mrb, mod, "private", mrb_mod_dummy_visibility, MRB_ARGS_ANY()); /* 15.2.2.4.36 */ + mrb_define_method(mrb, mod, "protected", mrb_mod_dummy_visibility, MRB_ARGS_ANY()); /* 15.2.2.4.37 */ + mrb_define_method(mrb, mod, "public", mrb_mod_dummy_visibility, MRB_ARGS_ANY()); /* 15.2.2.4.38 */ mrb_define_method(mrb, mod, "remove_class_variable", mrb_mod_remove_cvar, MRB_ARGS_REQ(1)); /* 15.2.2.4.39 */ mrb_define_method(mrb, mod, "remove_method", mrb_mod_remove_method, MRB_ARGS_ANY()); /* 15.2.2.4.41 */ mrb_define_method(mrb, mod, "to_s", mrb_mod_to_s, MRB_ARGS_NONE()); -- cgit v1.2.3 From e4e51a8aaa3950bd5100f356df3775f692549692 Mon Sep 17 00:00:00 2001 From: Jun Hiroe Date: Thu, 11 Jul 2013 21:39:12 +0900 Subject: Replace mrb_intern() with mrb_intern_cstr(). --- src/class.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/class.c b/src/class.c index 291642654..a50d3d85a 100644 --- a/src/class.c +++ b/src/class.c @@ -105,7 +105,7 @@ mrb_define_module_id(mrb_state *mrb, mrb_sym name) struct RClass* mrb_define_module(mrb_state *mrb, const char *name) { - return mrb_define_module_id(mrb, mrb_intern(mrb, name)); + return mrb_define_module_id(mrb, mrb_intern_cstr(mrb, name)); } static void @@ -159,7 +159,7 @@ mrb_define_class_id(mrb_state *mrb, mrb_sym name, struct RClass *super) struct RClass* mrb_define_class(mrb_state *mrb, const char *name, struct RClass *super) { - return mrb_define_class_id(mrb, mrb_intern(mrb, name), super); + return mrb_define_class_id(mrb, mrb_intern_cstr(mrb, name), super); } struct RClass* @@ -231,7 +231,7 @@ mrb_class_get(mrb_state *mrb, const char *name) struct RClass * mrb_class_get_under(mrb_state *mrb, struct RClass *outer, const char *name) { - return class_from_sym(mrb, outer, mrb_intern(mrb, name)); + return class_from_sym(mrb, outer, mrb_intern_cstr(mrb, name)); } /*! @@ -254,7 +254,7 @@ struct RClass * mrb_define_class_under(mrb_state *mrb, struct RClass *outer, const char *name, struct RClass *super) { struct RClass * c; - mrb_sym id = mrb_intern(mrb, name); + mrb_sym id = mrb_intern_cstr(mrb, name); if (mrb_const_defined_at(mrb, outer, id)) { c = class_from_sym(mrb, outer, id); @@ -276,7 +276,7 @@ struct RClass * mrb_define_module_under(mrb_state *mrb, struct RClass *outer, const char *name) { struct RClass * c; - mrb_sym id = mrb_intern(mrb, name); + mrb_sym id = mrb_intern_cstr(mrb, name); if (mrb_const_defined_at(mrb, outer, id)) { c = class_from_sym(mrb, outer, id); @@ -317,7 +317,7 @@ mrb_define_method_id(mrb_state *mrb, struct RClass *c, mrb_sym mid, mrb_func_t f void mrb_define_method(mrb_state *mrb, struct RClass *c, const char *name, mrb_func_t func, mrb_aspec aspec) { - mrb_define_method_id(mrb, c, mrb_intern(mrb, name), func, aspec); + mrb_define_method_id(mrb, c, mrb_intern_cstr(mrb, name), func, aspec); } void @@ -945,7 +945,7 @@ void mrb_define_singleton_method(mrb_state *mrb, struct RObject *o, const char *name, mrb_func_t func, mrb_aspec aspec) { prepare_singleton_class(mrb, (struct RBasic*)o); - mrb_define_method_id(mrb, o->c, mrb_intern(mrb, name), func, aspec); + mrb_define_method_id(mrb, o->c, mrb_intern_cstr(mrb, name), func, aspec); } void @@ -1154,7 +1154,7 @@ mrb_bob_missing(mrb_state *mrb, mrb_value mod) mrb_get_args(mrb, "n*", &name, &a, &alen); - if (mrb_respond_to(mrb,mod,mrb_intern2(mrb,"inspect",7))){ + if (mrb_respond_to(mrb,mod,mrb_intern2(mrb, "inspect",7))){ inspect = mrb_funcall(mrb, mod, "inspect", 0); if (RSTRING_LEN(inspect) > 64) { inspect = mrb_any_to_s(mrb, mod); @@ -1349,7 +1349,7 @@ mrb_alias_method(mrb_state *mrb, struct RClass *c, mrb_sym a, mrb_sym b) void mrb_define_alias(mrb_state *mrb, struct RClass *klass, const char *name1, const char *name2) { - mrb_alias_method(mrb, klass, mrb_intern(mrb, name1), mrb_intern(mrb, name2)); + mrb_alias_method(mrb, klass, mrb_intern_cstr(mrb, name1), mrb_intern_cstr(mrb, name2)); } /* @@ -1444,7 +1444,7 @@ undef_method(mrb_state *mrb, struct RClass *c, mrb_sym a) void mrb_undef_method(mrb_state *mrb, struct RClass *c, const char *name) { - undef_method(mrb, c, mrb_intern(mrb, name)); + undef_method(mrb, c, mrb_intern_cstr(mrb, name)); } void @@ -1885,10 +1885,10 @@ mrb_init_class(mrb_state *mrb) mrb_define_const(mrb, obj, "Class", mrb_obj_value(cls)); /* name each classes */ - mrb_name_class(mrb, bob, mrb_intern(mrb, "BasicObject")); - mrb_name_class(mrb, obj, mrb_intern(mrb, "Object")); - mrb_name_class(mrb, mod, mrb_intern(mrb, "Module")); - mrb_name_class(mrb, cls, mrb_intern(mrb, "Class")); + mrb_name_class(mrb, bob, mrb_intern2(mrb, "BasicObject", 11)); + mrb_name_class(mrb, obj, mrb_intern2(mrb, "Object", 6)); + mrb_name_class(mrb, mod, mrb_intern2(mrb, "Module", 6)); + mrb_name_class(mrb, cls, mrb_intern2(mrb, "Class", 5)); MRB_SET_INSTANCE_TT(cls, MRB_TT_CLASS); mrb_define_method(mrb, bob, "initialize", mrb_bob_init, MRB_ARGS_NONE()); -- cgit v1.2.3 From 8b29f10ba9ab4e66a6f79c5aca21d7dd1fb677ae Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Fri, 12 Jul 2013 00:15:50 +0900 Subject: factor out context stack marking --- src/gc.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/gc.c b/src/gc.c index d1d6ea1ee..bd7890087 100644 --- a/src/gc.c +++ b/src/gc.c @@ -408,19 +408,29 @@ add_gray_list(mrb_state *mrb, struct RBasic *obj) } static void -mark_context(mrb_state *mrb, struct mrb_context *c) +mark_context_stack(mrb_state *mrb, struct mrb_context *c) { size_t i; size_t e; - mrb_callinfo *ci; - /* mark stack */ e = c->stack - c->stbase; if (c->ci) e += c->ci->nregs; if (c->stbase + e > c->stend) e = c->stend - c->stbase; for (i=0; istbase[i]); } +} + +static void +mark_context(mrb_state *mrb, struct mrb_context *c) +{ + size_t i; + size_t e; + mrb_callinfo *ci; + + /* mark stack */ + mark_context_stack(mrb, c); + /* mark ensure stack */ e = (c->ci) ? c->ci->eidx : 0; for (i=0; i Date: Fri, 12 Jul 2013 00:23:37 +0900 Subject: mark stacks in final_marking; close #1359; close #1362 --- src/gc.c | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/gc.c b/src/gc.c index bd7890087..4eee12b11 100644 --- a/src/gc.c +++ b/src/gc.c @@ -769,6 +769,7 @@ incremental_marking_phase(mrb_state *mrb, size_t limit) static void final_marking_phase(mrb_state *mrb) { + mark_context_stack(mrb, mrb->root_c); while (mrb->gray_list) { if (is_gray(mrb->gray_list)) gc_mark_children(mrb, mrb->gray_list); -- cgit v1.2.3 From 883c45b931a7f1ed44fa3c629520f5481fe4fad3 Mon Sep 17 00:00:00 2001 From: Jun Hiroe Date: Fri, 12 Jul 2013 01:00:50 +0900 Subject: Replace mrb_intern() func with mrb_intern2() func or mrb_intern_cstr() func. --- src/backtrace.c | 4 ++-- src/object.c | 2 +- src/proc.c | 6 +++--- src/symbol.c | 4 ++-- src/variable.c | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/backtrace.c b/src/backtrace.c index d5d0818ae..e05ad4326 100644 --- a/src/backtrace.c +++ b/src/backtrace.c @@ -18,7 +18,7 @@ mrb_print_backtrace(mrb_state *mrb) int i, line; fputs("trace:\n", stderr); - ciidx = mrb_fixnum(mrb_obj_iv_get(mrb, mrb->exc, mrb_intern(mrb, "ciidx"))); + ciidx = mrb_fixnum(mrb_obj_iv_get(mrb, mrb->exc, mrb_intern2(mrb, "ciidx", 5))); if (ciidx >= mrb->c->ciend - mrb->c->cibase) ciidx = 10; /* ciidx is broken... */ @@ -41,7 +41,7 @@ mrb_print_backtrace(mrb_state *mrb) pc = mrb->c->cibase[i+1].pc; } else { - pc = (mrb_code*)mrb_voidp(mrb_obj_iv_get(mrb, mrb->exc, mrb_intern(mrb, "lastpc"))); + pc = (mrb_code*)mrb_voidp(mrb_obj_iv_get(mrb, mrb->exc, mrb_intern2(mrb, "lastpc", 6))); } if (irep->iseq <= pc && pc < irep->iseq + irep->ilen) { line = irep->lines[pc - irep->iseq - 1]; diff --git a/src/object.c b/src/object.c index c09ae3072..4003452cc 100644 --- a/src/object.c +++ b/src/object.c @@ -297,7 +297,7 @@ convert_type(mrb_state *mrb, mrb_value val, const char *tname, const char *metho { mrb_sym m = 0; - m = mrb_intern(mrb, method); + m = mrb_intern_cstr(mrb, method); if (!mrb_respond_to(mrb, val, m)) { if (raise) { mrb_raisef(mrb, E_TYPE_ERROR, "can't convert %S into %S", val, mrb_str_new_cstr(mrb, tname)); diff --git a/src/proc.c b/src/proc.c index e21a37736..c8d09e62d 100644 --- a/src/proc.c +++ b/src/proc.c @@ -139,7 +139,7 @@ mrb_proc_arity(mrb_state *mrb, mrb_value self) mrb_code *iseq = mrb_proc_iseq(mrb, p); mrb_aspec aspec = GETARG_Ax(*iseq); int ma, ra, pa, arity; - + ma = MRB_ASPEC_REQ(aspec); ra = MRB_ASPEC_REST(aspec); pa = MRB_ASPEC_POST(aspec); @@ -201,8 +201,8 @@ mrb_init_proc(mrb_state *mrb) mrb_define_method(mrb, mrb->proc_class, "arity", mrb_proc_arity, MRB_ARGS_NONE()); m = mrb_proc_new(mrb, call_irep); - mrb_define_method_raw(mrb, mrb->proc_class, mrb_intern(mrb, "call"), m); - mrb_define_method_raw(mrb, mrb->proc_class, mrb_intern(mrb, "[]"), m); + mrb_define_method_raw(mrb, mrb->proc_class, mrb_intern2(mrb, "call", 4), m); + mrb_define_method_raw(mrb, mrb->proc_class, mrb_intern2(mrb, "[]", 2), m); mrb_define_class_method(mrb, mrb->kernel_module, "lambda", proc_lambda, MRB_ARGS_NONE()); /* 15.3.1.2.6 */ mrb_define_method(mrb, mrb->kernel_module, "lambda", proc_lambda, MRB_ARGS_NONE()); /* 15.3.1.3.27 */ diff --git a/src/symbol.c b/src/symbol.c index e913f95c8..c29f7c6ae 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -382,7 +382,7 @@ mrb_sym2str(mrb_state *mrb, mrb_sym sym) size_t len; const char *name = mrb_sym2name_len(mrb, sym, &len); mrb_value str; - + if (!name) return mrb_undef_value(); /* can't happen */ str = mrb_str_new_static(mrb, name, len); if (symname_p(name) && strlen(name) == len) { @@ -452,5 +452,5 @@ mrb_init_symbol(mrb_state *mrb) mrb_define_method(mrb, sym, "to_sym", sym_to_sym, MRB_ARGS_NONE()); /* 15.2.11.3.4 */ mrb_define_method(mrb, sym, "inspect", sym_inspect, MRB_ARGS_NONE()); /* 15.2.11.3.5(x) */ mrb_define_method(mrb, sym, "<=>", sym_cmp, MRB_ARGS_REQ(1)); - mrb->init_sym = mrb_intern(mrb, "initialize"); + mrb->init_sym = mrb_intern2(mrb, "initialize", 10); } diff --git a/src/variable.c b/src/variable.c index 2610c5d7a..36ad24d09 100644 --- a/src/variable.c +++ b/src/variable.c @@ -916,7 +916,7 @@ mrb_const_remove(mrb_state *mrb, mrb_value mod, mrb_sym sym) void mrb_define_const(mrb_state *mrb, struct RClass *mod, const char *name, mrb_value v) { - mrb_obj_iv_set(mrb, (struct RObject*)mod, mrb_intern(mrb, name), v); + mrb_obj_iv_set(mrb, (struct RObject*)mod, mrb_intern_cstr(mrb, name), v); } void -- cgit v1.2.3 From 87ec819a2c8e1b399b9d50316e3be06069e78208 Mon Sep 17 00:00:00 2001 From: Jun Hiroe Date: Fri, 12 Jul 2013 01:12:25 +0900 Subject: Refactor codes using REGEXP_CLASS define. --- src/codegen.c | 8 ++++---- src/re.h | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/codegen.c b/src/codegen.c index e240995e5..8dd5a124d 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -427,7 +427,7 @@ static inline int new_lit(codegen_scope *s, mrb_value val) { size_t i; - + switch (mrb_type(val)) { case MRB_TT_STRING: for (i=0; iirep->plen; i++) { @@ -447,7 +447,7 @@ new_lit(codegen_scope *s, mrb_value val) } break; } - + if (s->irep->plen == s->pcapa) { s->pcapa *= 2; s->irep->pool = (mrb_value *)codegen_realloc(s, s->irep->pool, sizeof(mrb_value)*s->pcapa); @@ -2064,7 +2064,7 @@ codegen(codegen_scope *s, node *tree, int val) char *p1 = (char*)tree->car; char *p2 = (char*)tree->cdr; int ai = mrb_gc_arena_save(s->mrb); - int sym = new_sym(s, mrb_intern(s->mrb, REGEXP_CLASS)); + int sym = new_sym(s, mrb_intern2(s->mrb, REGEXP_CLASS, REGEXP_CLASS_CSTR_LEN)); int off = new_lit(s, mrb_str_new(s->mrb, p1, strlen(p1))); int argc = 1; @@ -2091,7 +2091,7 @@ codegen(codegen_scope *s, node *tree, int val) if (val) { node *n = tree->car; int ai = mrb_gc_arena_save(s->mrb); - int sym = new_sym(s, mrb_intern(s->mrb, REGEXP_CLASS)); + int sym = new_sym(s, mrb_intern2(s->mrb, REGEXP_CLASS, REGEXP_CLASS_CSTR_LEN)); int argc = 1; int off; char *p; diff --git a/src/re.h b/src/re.h index 5632bc399..20cd0b226 100644 --- a/src/re.h +++ b/src/re.h @@ -7,6 +7,7 @@ #ifndef RE_H #define RE_H -#define REGEXP_CLASS "Regexp" +#define REGEXP_CLASS "Regexp" +#define REGEXP_CLASS_CSTR_LEN 6 #endif -- cgit v1.2.3 From b8f4e47676785c04c45c2b2fe01bddfc5e98f46d Mon Sep 17 00:00:00 2001 From: Jun Hiroe Date: Fri, 12 Jul 2013 01:27:42 +0900 Subject: 2.Replace mrb_intern() func with mrb_intern2() func or mrb_intern_cstr() func. --- src/kernel.c | 2 +- src/vm.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/kernel.c b/src/kernel.c index 0fe374e73..965b80b95 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -1101,5 +1101,5 @@ mrb_init_kernel(mrb_state *mrb) mrb_define_method(mrb, krn, "to_s", mrb_any_to_s, MRB_ARGS_NONE()); /* 15.3.1.3.46 */ mrb_include_module(mrb, mrb->object_class, mrb->kernel_module); - mrb_alias_method(mrb, mrb->module_class, mrb_intern(mrb, "dup"), mrb_intern(mrb, "clone")); + mrb_alias_method(mrb, mrb->module_class, mrb_intern2(mrb, "dup", 3), mrb_intern2(mrb, "clone", 5)); } diff --git a/src/vm.c b/src/vm.c index 38e3cd6ed..d4e7fd483 100644 --- a/src/vm.c +++ b/src/vm.c @@ -279,7 +279,7 @@ ecall(mrb_state *mrb, int i) mrb_value mrb_funcall(mrb_state *mrb, mrb_value self, const char *name, int argc, ...) { - mrb_sym mid = mrb_intern(mrb, name); + mrb_sym mid = mrb_intern_cstr(mrb, name); if (argc == 0) { return mrb_funcall_argv(mrb, self, mid, 0, 0); -- cgit v1.2.3 From 31c3c70227835c112ae91f90eba89a9116c8ca6e Mon Sep 17 00:00:00 2001 From: Jun Hiroe Date: Fri, 12 Jul 2013 21:31:36 +0900 Subject: Fix indents in opcode.h. --- src/opcode.h | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) (limited to 'src') diff --git a/src/opcode.h b/src/opcode.h index b4f843116..4f0e9880c 100644 --- a/src/opcode.h +++ b/src/opcode.h @@ -17,27 +17,27 @@ /* Ax:OP = 25: 7 */ /* A:Bz:Cz:OP = 9:14: 2: 7 */ -#define GET_OPCODE(i) ((int)(((mrb_code)(i)) & 0x7f)) -#define GETARG_A(i) ((int)((((mrb_code)(i)) >> 23) & 0x1ff)) -#define GETARG_B(i) ((int)((((mrb_code)(i)) >> 14) & 0x1ff)) -#define GETARG_C(i) ((int)((((mrb_code)(i)) >> 7) & 0x7f)) -#define GETARG_Bx(i) ((int)((((mrb_code)(i)) >> 7) & 0xffff)) -#define GETARG_sBx(i) ((int)(GETARG_Bx(i)-MAXARG_sBx)) -#define GETARG_Ax(i) ((int32_t)((((mrb_code)(i)) >> 7) & 0x1ffffff)) +#define GET_OPCODE(i) ((int)(((mrb_code)(i)) & 0x7f)) +#define GETARG_A(i) ((int)((((mrb_code)(i)) >> 23) & 0x1ff)) +#define GETARG_B(i) ((int)((((mrb_code)(i)) >> 14) & 0x1ff)) +#define GETARG_C(i) ((int)((((mrb_code)(i)) >> 7) & 0x7f)) +#define GETARG_Bx(i) ((int)((((mrb_code)(i)) >> 7) & 0xffff)) +#define GETARG_sBx(i) ((int)(GETARG_Bx(i)-MAXARG_sBx)) +#define GETARG_Ax(i) ((int32_t)((((mrb_code)(i)) >> 7) & 0x1ffffff)) #define GETARG_UNPACK_b(i,n1,n2) ((int)((((mrb_code)(i)) >> (7+(n2))) & (((1<<(n1))-1)))) #define GETARG_UNPACK_c(i,n1,n2) ((int)((((mrb_code)(i)) >> 7) & (((1<<(n2))-1)))) -#define GETARG_b(i) GETARG_UNPACK_b(i,14,2) -#define GETARG_c(i) GETARG_UNPACK_c(i,14,2) - -#define MKOPCODE(op) ((op) & 0x7f) -#define MKARG_A(c) ((mrb_code)((c) & 0x1ff) << 23) -#define MKARG_B(c) ((mrb_code)((c) & 0x1ff) << 14) -#define MKARG_C(c) (((c) & 0x7f) << 7) -#define MKARG_Bx(v) ((mrb_code)((v) & 0xffff) << 7) -#define MKARG_sBx(v) MKARG_Bx((v)+MAXARG_sBx) -#define MKARG_Ax(v) ((mrb_code)((v) & 0x1ffffff) << 7) +#define GETARG_b(i) GETARG_UNPACK_b(i,14,2) +#define GETARG_c(i) GETARG_UNPACK_c(i,14,2) + +#define MKOPCODE(op) ((op) & 0x7f) +#define MKARG_A(c) ((mrb_code)((c) & 0x1ff) << 23) +#define MKARG_B(c) ((mrb_code)((c) & 0x1ff) << 14) +#define MKARG_C(c) (((c) & 0x7f) << 7) +#define MKARG_Bx(v) ((mrb_code)((v) & 0xffff) << 7) +#define MKARG_sBx(v) MKARG_Bx((v)+MAXARG_sBx) +#define MKARG_Ax(v) ((mrb_code)((v) & 0x1ffffff) << 7) #define MKARG_PACK(b,n1,c,n2) ((((b) & ((1< Date: Fri, 12 Jul 2013 22:18:35 +0900 Subject: Add comments in opcode.h --- src/opcode.h | 187 ++++++++++++++++++++++++++++++----------------------------- 1 file changed, 95 insertions(+), 92 deletions(-) (limited to 'src') diff --git a/src/opcode.h b/src/opcode.h index b4f843116..df1fcf9bd 100644 --- a/src/opcode.h +++ b/src/opcode.h @@ -50,98 +50,101 @@ #define MKOP_Abc(op,a,b,c) (MKOP_A(op,a)|MKARG_bc(b,c)) enum { -OP_NOP=0,/* */ -OP_MOVE,/* A B R(A) := R(B) */ -OP_LOADL,/* A Bx R(A) := Lit(Bx) */ -OP_LOADI,/* A sBx R(A) := sBx */ -OP_LOADSYM,/* A Bx R(A) := Sym(Bx) */ -OP_LOADNIL,/* A R(A) := nil */ -OP_LOADSELF,/* A R(A) := self */ -OP_LOADT,/* A R(A) := true */ -OP_LOADF,/* A R(A) := false */ - -OP_GETGLOBAL,/* A Bx R(A) := getglobal(Sym(Bx)) */ -OP_SETGLOBAL,/* A Bx setglobal(Sym(Bx), R(A)) */ -OP_GETSPECIAL,/*A Bx R(A) := Special[Bx] */ -OP_SETSPECIAL,/*A Bx Special[Bx] := R(A) */ -OP_GETIV,/* A Bx R(A) := ivget(Sym(Bx)) */ -OP_SETIV,/* A Bx ivset(Sym(Bx),R(A)) */ -OP_GETCV,/* A Bx R(A) := cvget(Sym(Bx)) */ -OP_SETCV,/* A Bx cvset(Sym(Bx),R(A)) */ -OP_GETCONST,/* A Bx R(A) := constget(Sym(Bx)) */ -OP_SETCONST,/* A Bx constset(Sym(Bx),R(A)) */ -OP_GETMCNST,/* A Bx R(A) := R(A)::Sym(B) */ -OP_SETMCNST,/* A Bx R(A+1)::Sym(B) := R(A) */ -OP_GETUPVAR,/* A B C R(A) := uvget(B,C) */ -OP_SETUPVAR,/* A B C uvset(B,C,R(A)) */ - -OP_JMP,/* sBx pc+=sBx */ -OP_JMPIF,/* A sBx if R(A) pc+=sBx */ -OP_JMPNOT,/* A sBx if !R(A) pc+=sBx */ -OP_ONERR,/* sBx rescue_push(pc+sBx) */ -OP_RESCUE,/* A clear(exc); R(A) := exception (ignore when A=0) */ -OP_POPERR,/* A A.times{rescue_pop()} */ -OP_RAISE,/* A raise(R(A)) */ -OP_EPUSH,/* Bx ensure_push(SEQ[Bx]) */ -OP_EPOP,/* A A.times{ensure_pop().call} */ - -OP_SEND,/* A B C R(A) := call(R(A),mSym(B),R(A+1),...,R(A+C)) */ -OP_SENDB,/* A B C R(A) := call(R(A),mSym(B),R(A+1),...,R(A+C),&R(A+C+1))*/ -OP_FSEND,/* A B C R(A) := fcall(R(A),mSym(B),R(A+1),...,R(A+C-1)) */ -OP_CALL,/* A B C R(A) := self.call(R(A),.., R(A+C)) */ -OP_SUPER,/* A B C R(A) := super(R(A+1),... ,R(A+C-1)) */ -OP_ARGARY,/* A Bx R(A) := argument array (16=6:1:5:4) */ -OP_ENTER,/* Ax arg setup according to flags (24=5:5:1:5:5:1:1) */ -OP_KARG,/* A B C R(A) := kdict[mSym(B)]; if C kdict.rm(mSym(B)) */ -OP_KDICT,/* A C R(A) := kdict */ - -OP_RETURN,/* A B return R(A) (B=normal,in-block return/break) */ -OP_TAILCALL,/* A B C return call(R(A),mSym(B),*R(C)) */ -OP_BLKPUSH,/* A Bx R(A) := block (16=6:1:5:4) */ - -OP_ADD,/* A B C R(A) := R(A)+R(A+1) (mSyms[B]=:+,C=1) */ -OP_ADDI,/* A B C R(A) := R(A)+C (mSyms[B]=:+) */ -OP_SUB,/* A B C R(A) := R(A)-R(A+1) (mSyms[B]=:-,C=1) */ -OP_SUBI,/* A B C R(A) := R(A)-C (mSyms[B]=:-) */ -OP_MUL,/* A B C R(A) := R(A)*R(A+1) (mSyms[B]=:*,C=1) */ -OP_DIV,/* A B C R(A) := R(A)/R(A+1) (mSyms[B]=:/,C=1) */ -OP_EQ,/* A B C R(A) := R(A)==R(A+1) (mSyms[B]=:==,C=1) */ -OP_LT,/* A B C R(A) := R(A)R(A+1) (mSyms[B]=:>,C=1) */ -OP_GE,/* A B C R(A) := R(A)>=R(A+1) (mSyms[B]=:>=,C=1) */ - -OP_ARRAY,/* A B C R(A) := ary_new(R(B),R(B+1)..R(B+C)) */ -OP_ARYCAT,/* A B ary_cat(R(A),R(B)) */ -OP_ARYPUSH,/* A B ary_push(R(A),R(B)) */ -OP_AREF,/* A B C R(A) := R(B)[C] */ -OP_ASET,/* A B C R(B)[C] := R(A) */ -OP_APOST,/* A B C *R(A),R(A+1)..R(A+C) := R(A) */ - -OP_STRING,/* A Bx R(A) := str_dup(Lit(Bx)) */ -OP_STRCAT,/* A B str_cat(R(A),R(B)) */ - -OP_HASH,/* A B C R(A) := hash_new(R(B),R(B+1)..R(B+C)) */ -OP_LAMBDA,/* A Bz Cz R(A) := lambda(SEQ[Bz],Cm) */ -OP_RANGE,/* A B C R(A) := range_new(R(B),R(B+1),C) */ - -OP_OCLASS,/* A R(A) := ::Object */ -OP_CLASS,/* A B R(A) := newclass(R(A),mSym(B),R(A+1)) */ -OP_MODULE,/* A B R(A) := newmodule(R(A),mSym(B)) */ -OP_EXEC,/* A Bx R(A) := blockexec(R(A),SEQ[Bx]) */ -OP_METHOD,/* A B R(A).newmethod(mSym(B),R(A+1)) */ -OP_SCLASS,/* A B R(A) := R(B).singleton_class */ -OP_TCLASS,/* A R(A) := target_class */ - -OP_DEBUG,/* A print R(A) */ -OP_STOP,/* stop VM */ -OP_ERR,/* Bx raise RuntimeError with message Lit(Bx) */ - -OP_RSVD1,/* reserved instruction #1 */ -OP_RSVD2,/* reserved instruction #2 */ -OP_RSVD3,/* reserved instruction #3 */ -OP_RSVD4,/* reserved instruction #4 */ -OP_RSVD5,/* reserved instruction #5 */ + /*----------------------------------------------------------------------- + name args description + ------------------------------------------------------------------------*/ + OP_NOP=0,/* */ + OP_MOVE,/* A B R(A) := R(B) */ + OP_LOADL,/* A Bx R(A) := Lit(Bx) */ + OP_LOADI,/* A sBx R(A) := sBx */ + OP_LOADSYM,/* A Bx R(A) := Sym(Bx) */ + OP_LOADNIL,/* A R(A) := nil */ + OP_LOADSELF,/* A R(A) := self */ + OP_LOADT,/* A R(A) := true */ + OP_LOADF,/* A R(A) := false */ + + OP_GETGLOBAL,/* A Bx R(A) := getglobal(Sym(Bx)) */ + OP_SETGLOBAL,/* A Bx setglobal(Sym(Bx), R(A)) */ + OP_GETSPECIAL,/*A Bx R(A) := Special[Bx] */ + OP_SETSPECIAL,/*A Bx Special[Bx] := R(A) */ + OP_GETIV,/* A Bx R(A) := ivget(Sym(Bx)) */ + OP_SETIV,/* A Bx ivset(Sym(Bx),R(A)) */ + OP_GETCV,/* A Bx R(A) := cvget(Sym(Bx)) */ + OP_SETCV,/* A Bx cvset(Sym(Bx),R(A)) */ + OP_GETCONST,/* A Bx R(A) := constget(Sym(Bx)) */ + OP_SETCONST,/* A Bx constset(Sym(Bx),R(A)) */ + OP_GETMCNST,/* A Bx R(A) := R(A)::Sym(B) */ + OP_SETMCNST,/* A Bx R(A+1)::Sym(B) := R(A) */ + OP_GETUPVAR,/* A B C R(A) := uvget(B,C) */ + OP_SETUPVAR,/* A B C uvset(B,C,R(A)) */ + + OP_JMP,/* sBx pc+=sBx */ + OP_JMPIF,/* A sBx if R(A) pc+=sBx */ + OP_JMPNOT,/* A sBx if !R(A) pc+=sBx */ + OP_ONERR,/* sBx rescue_push(pc+sBx) */ + OP_RESCUE,/* A clear(exc); R(A) := exception (ignore when A=0) */ + OP_POPERR,/* A A.times{rescue_pop()} */ + OP_RAISE,/* A raise(R(A)) */ + OP_EPUSH,/* Bx ensure_push(SEQ[Bx]) */ + OP_EPOP,/* A A.times{ensure_pop().call} */ + + OP_SEND,/* A B C R(A) := call(R(A),mSym(B),R(A+1),...,R(A+C)) */ + OP_SENDB,/* A B C R(A) := call(R(A),mSym(B),R(A+1),...,R(A+C),&R(A+C+1))*/ + OP_FSEND,/* A B C R(A) := fcall(R(A),mSym(B),R(A+1),...,R(A+C-1)) */ + OP_CALL,/* A B C R(A) := self.call(R(A),.., R(A+C)) */ + OP_SUPER,/* A B C R(A) := super(R(A+1),... ,R(A+C-1)) */ + OP_ARGARY,/* A Bx R(A) := argument array (16=6:1:5:4) */ + OP_ENTER,/* Ax arg setup according to flags (24=5:5:1:5:5:1:1) */ + OP_KARG,/* A B C R(A) := kdict[mSym(B)]; if C kdict.rm(mSym(B)) */ + OP_KDICT,/* A C R(A) := kdict */ + + OP_RETURN,/* A B return R(A) (B=normal,in-block return/break) */ + OP_TAILCALL,/* A B C return call(R(A),mSym(B),*R(C)) */ + OP_BLKPUSH,/* A Bx R(A) := block (16=6:1:5:4) */ + + OP_ADD,/* A B C R(A) := R(A)+R(A+1) (mSyms[B]=:+,C=1) */ + OP_ADDI,/* A B C R(A) := R(A)+C (mSyms[B]=:+) */ + OP_SUB,/* A B C R(A) := R(A)-R(A+1) (mSyms[B]=:-,C=1) */ + OP_SUBI,/* A B C R(A) := R(A)-C (mSyms[B]=:-) */ + OP_MUL,/* A B C R(A) := R(A)*R(A+1) (mSyms[B]=:*,C=1) */ + OP_DIV,/* A B C R(A) := R(A)/R(A+1) (mSyms[B]=:/,C=1) */ + OP_EQ,/* A B C R(A) := R(A)==R(A+1) (mSyms[B]=:==,C=1) */ + OP_LT,/* A B C R(A) := R(A)R(A+1) (mSyms[B]=:>,C=1) */ + OP_GE,/* A B C R(A) := R(A)>=R(A+1) (mSyms[B]=:>=,C=1) */ + + OP_ARRAY,/* A B C R(A) := ary_new(R(B),R(B+1)..R(B+C)) */ + OP_ARYCAT,/* A B ary_cat(R(A),R(B)) */ + OP_ARYPUSH,/* A B ary_push(R(A),R(B)) */ + OP_AREF,/* A B C R(A) := R(B)[C] */ + OP_ASET,/* A B C R(B)[C] := R(A) */ + OP_APOST,/* A B C *R(A),R(A+1)..R(A+C) := R(A) */ + + OP_STRING,/* A Bx R(A) := str_dup(Lit(Bx)) */ + OP_STRCAT,/* A B str_cat(R(A),R(B)) */ + + OP_HASH,/* A B C R(A) := hash_new(R(B),R(B+1)..R(B+C)) */ + OP_LAMBDA,/* A Bz Cz R(A) := lambda(SEQ[Bz],Cm) */ + OP_RANGE,/* A B C R(A) := range_new(R(B),R(B+1),C) */ + + OP_OCLASS,/* A R(A) := ::Object */ + OP_CLASS,/* A B R(A) := newclass(R(A),mSym(B),R(A+1)) */ + OP_MODULE,/* A B R(A) := newmodule(R(A),mSym(B)) */ + OP_EXEC,/* A Bx R(A) := blockexec(R(A),SEQ[Bx]) */ + OP_METHOD,/* A B R(A).newmethod(mSym(B),R(A+1)) */ + OP_SCLASS,/* A B R(A) := R(B).singleton_class */ + OP_TCLASS,/* A R(A) := target_class */ + + OP_DEBUG,/* A print R(A) */ + OP_STOP,/* stop VM */ + OP_ERR,/* Bx raise RuntimeError with message Lit(Bx) */ + + OP_RSVD1,/* reserved instruction #1 */ + OP_RSVD2,/* reserved instruction #2 */ + OP_RSVD3,/* reserved instruction #3 */ + OP_RSVD4,/* reserved instruction #4 */ + OP_RSVD5,/* reserved instruction #5 */ }; #define OP_L_STRICT 1 -- cgit v1.2.3 From b86409c36435502330beff87dfa3d9466d05daa7 Mon Sep 17 00:00:00 2001 From: Jun Hiroe Date: Fri, 12 Jul 2013 23:12:28 +0900 Subject: Fix comments in opcode.h --- src/opcode.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/opcode.h b/src/opcode.h index df1fcf9bd..45e5823c7 100644 --- a/src/opcode.h +++ b/src/opcode.h @@ -51,7 +51,7 @@ enum { /*----------------------------------------------------------------------- - name args description + operation code operand description ------------------------------------------------------------------------*/ OP_NOP=0,/* */ OP_MOVE,/* A B R(A) := R(B) */ -- cgit v1.2.3 From cd05c669ca817a6847663df022a6d77ca6440fae Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Sat, 13 Jul 2013 10:41:09 +0900 Subject: make_metaclass should skip MRB_TT_ICLASS; close #1369 --- src/class.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/class.c b/src/class.c index a50d3d85a..787e514b1 100644 --- a/src/class.c +++ b/src/class.c @@ -69,15 +69,14 @@ prepare_singleton_class(mrb_state *mrb, struct RBasic *o) sc->iv = 0; if (o->tt == MRB_TT_CLASS) { c = (struct RClass*)o; - if (!c->super) { - sc->super = mrb->class_class; - } - else { + if (c->super) { sc->super = c->super->c; } } else if (o->tt == MRB_TT_SCLASS) { c = (struct RClass*)o; + while (c->super->tt == MRB_TT_ICLASS) + c = c->super; make_metaclass(mrb, c->super); sc->super = c->super->c; } -- cgit v1.2.3 From 24fb4bf17a12188c41470d96fc1624f29868f229 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Sat, 13 Jul 2013 21:53:00 +0900 Subject: make_metaclass should skip MRB_TT_ICLASS; close #1369 --- src/class.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/class.c b/src/class.c index 787e514b1..ee5f544dd 100644 --- a/src/class.c +++ b/src/class.c @@ -55,7 +55,7 @@ mrb_name_class(mrb_state *mrb, struct RClass *c, mrb_sym name) mrb_obj_iv_set(mrb, (struct RObject*)c, mrb_intern2(mrb, "__classid__", 11), mrb_symbol_value(name)); } - + #define make_metaclass(mrb, c) prepare_singleton_class((mrb), (struct RBasic*)(c)) static void -- cgit v1.2.3 From 5b3d531d794c94c08c808a7d50309bdebe20bf56 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Sat, 13 Jul 2013 23:28:59 +0900 Subject: singleton class super initialize failed --- src/class.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/class.c b/src/class.c index ee5f544dd..9868d0080 100644 --- a/src/class.c +++ b/src/class.c @@ -69,7 +69,10 @@ prepare_singleton_class(mrb_state *mrb, struct RBasic *o) sc->iv = 0; if (o->tt == MRB_TT_CLASS) { c = (struct RClass*)o; - if (c->super) { + if (!c->super) { + sc->super = mrb->class_class; + } + else { sc->super = c->super->c; } } -- cgit v1.2.3 From 66c5b0d3fa394126964fce30242b8d931fc3e475 Mon Sep 17 00:00:00 2001 From: Jun Hiroe Date: Sun, 14 Jul 2013 00:01:08 +0900 Subject: Replace 0 with NULL because NULL is used in struct pointer. --- src/vm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/vm.c b/src/vm.c index d4e7fd483..ab07f5718 100644 --- a/src/vm.c +++ b/src/vm.c @@ -174,7 +174,7 @@ uvenv(mrb_state *mrb, int up) struct REnv *e = mrb->c->ci->proc->env; while (up--) { - if (!e) return 0; + if (!e) return NULL; e = (struct REnv*)e->c; } return e; -- cgit v1.2.3 From 6bab0c65f097babf98098b249332664165881550 Mon Sep 17 00:00:00 2001 From: Jun Hiroe Date: Sun, 14 Jul 2013 04:03:57 +0900 Subject: Add comments in variable.c --- src/variable.c | 45 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/variable.c b/src/variable.c index 36ad24d09..52ffb42e7 100644 --- a/src/variable.c +++ b/src/variable.c @@ -27,12 +27,21 @@ typedef struct segment { struct segment *next; } segment; +/* Instance variable table structure */ typedef struct iv_tbl { segment *rootseg; size_t size; size_t last_len; } iv_tbl; +/* + * Creates instance variable table. + * + * Parameters + * mrb + * Returns + * the instance variable table. + */ static iv_tbl* iv_new(mrb_state *mrb) { @@ -47,6 +56,15 @@ iv_new(mrb_state *mrb) return t; } +/* + * Set the value for the symbol in the instance variable table. + * + * Parameters + * mrb + * t the instance variable table to be set in. + * sym the symbol to be used as the key. + * val the value to be set. + */ static void iv_put(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value val) { @@ -59,7 +77,7 @@ iv_put(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value val) while (seg) { for (i=0; ikey[i]; - /* found room in last segment after last_len */ + /* Found room in last segment after last_len */ if (!seg->next && i >= t->last_len) { seg->key[i] = sym; seg->val[i] = val; @@ -80,7 +98,7 @@ iv_put(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value val) seg = seg->next; } - /* not found */ + /* Not found */ t->size++; if (matched_seg) { matched_seg->key[matched_idx] = sym; @@ -103,6 +121,18 @@ iv_put(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value val) return; } +/* + * Get a value for a symbol from the instance the variable table. + * + * Parameters + * mrb + * t the variable table to be searched. + * sym the symbol to be used as the key. + * vp the value pointer. Recieves the value if if the specified symbol contains + * in the instance variable table. + * Returns + * true if the specfiyed symbol contains in the instance variable table. + */ static mrb_bool iv_get(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value *vp) { @@ -127,6 +157,17 @@ iv_get(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value *vp) return FALSE; } +/* + * Deletes the value for the symbol from the instance variable table. + * + * Parameters + * t the variable table to be searched. + * sym the symbol to be used as the key. + * vp the value pointer. Recieve the deleted value if the symbol contans + * in the instance varible table. + * Returns + * true if the specfied symbol contains in the instance variable table. + */ static mrb_bool iv_del(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value *vp) { -- cgit v1.2.3 From 900b680006c64db52718a98632da5550950aa9bc Mon Sep 17 00:00:00 2001 From: Jun Hiroe Date: Sun, 14 Jul 2013 04:38:22 +0900 Subject: Replace 0 with FALSE and replace 1 with TRUE. --- src/vm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/vm.c b/src/vm.c index d4e7fd483..f39cfa033 100644 --- a/src/vm.c +++ b/src/vm.c @@ -187,9 +187,9 @@ is_strict(mrb_state *mrb, struct REnv *e) if (cioff >= 0 && mrb->c->cibase[cioff].proc && MRB_PROC_STRICT_P(mrb->c->cibase[cioff].proc)) { - return 1; + return TRUE; } - return 0; + return FALSE; } static inline struct REnv* -- cgit v1.2.3 From f7855764bc9d52913970cccfbf16600cca731051 Mon Sep 17 00:00:00 2001 From: Jun Hiroe Date: Sun, 14 Jul 2013 05:08:33 +0900 Subject: Replace int with mrb_bool because return a value is boolean. --- src/vm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/vm.c b/src/vm.c index f39cfa033..294b0d1ca 100644 --- a/src/vm.c +++ b/src/vm.c @@ -180,7 +180,7 @@ uvenv(mrb_state *mrb, int up) return e; } -static inline int +static inline mrb_bool is_strict(mrb_state *mrb, struct REnv *e) { int cioff = e->cioff; -- cgit v1.2.3 From 16031af1e77f41e42291936052ceaa8f6840fba2 Mon Sep 17 00:00:00 2001 From: Jun Hiroe Date: Sun, 14 Jul 2013 05:26:06 +0900 Subject: Replace 0 with NULL because set NULL in sturct pointer. --- src/gc.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/gc.c b/src/gc.c index 4eee12b11..a22ef1adf 100644 --- a/src/gc.c +++ b/src/gc.c @@ -312,8 +312,8 @@ add_heap(mrb_state *mrb) void mrb_init_heap(mrb_state *mrb) { - mrb->heaps = 0; - mrb->free_heaps = 0; + mrb->heaps = NULL; + mrb->free_heaps = NULL; add_heap(mrb); mrb->gc_interval_ratio = DEFAULT_GC_INTERVAL_RATIO; mrb->gc_step_ratio = DEFAULT_GC_STEP_RATIO; @@ -588,7 +588,7 @@ obj_free(mrb_state *mrb, struct RBasic *obj) if (e->cioff < 0) { mrb_free(mrb, e->stack); - e->stack = 0; + e->stack = NULL; } } break; @@ -643,8 +643,8 @@ root_scan_phase(mrb_state *mrb) size_t i, e, j; if (!is_minor_gc(mrb)) { - mrb->gray_list = 0; - mrb->variable_gray_list = 0; + mrb->gray_list = NULL; + mrb->variable_gray_list = NULL; } mrb_gc_mark_gv(mrb); @@ -778,7 +778,7 @@ final_marking_phase(mrb_state *mrb) } gc_assert(mrb->gray_list == NULL); mrb->gray_list = mrb->variable_gray_list; - mrb->variable_gray_list = 0; + mrb->variable_gray_list = NULL; while (mrb->gray_list) { if (is_gray(mrb->gray_list)) gc_mark_children(mrb, mrb->gray_list); -- cgit v1.2.3 From 65736fa36c05168ad2ff801a095d105a48feebf1 Mon Sep 17 00:00:00 2001 From: Jun Hiroe Date: Sun, 14 Jul 2013 23:42:31 +0900 Subject: Replace 0 with NULL because struct pointer is set NULL in. --- src/pool.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/pool.c b/src/pool.c index c992b5e53..19298c9ee 100644 --- a/src/pool.c +++ b/src/pool.c @@ -53,7 +53,7 @@ mrb_pool_open(mrb_state *mrb) if (pool) { pool->mrb = mrb; - pool->pages = 0; + pool->pages = NULL; } return pool; @@ -96,7 +96,7 @@ mrb_pool_alloc(mrb_pool *pool, size_t len) struct mrb_pool_page *page; size_t n; - if (!pool) return 0; + if (!pool) return NULL; len += ALIGN_PADDING(len); page = pool->pages; while (page) { @@ -109,7 +109,7 @@ mrb_pool_alloc(mrb_pool *pool, size_t len) page = page->next; } page = page_alloc(pool, len); - if (!page) return 0; + if (!page) return NULL; page->offset = len; page->next = pool->pages; pool->pages = page; @@ -145,7 +145,7 @@ mrb_pool_realloc(mrb_pool *pool, void *p, size_t oldlen, size_t newlen) struct mrb_pool_page *page; void *np; - if (!pool) return 0; + if (!pool) return NULL; oldlen += ALIGN_PADDING(oldlen); newlen += ALIGN_PADDING(newlen); page = pool->pages; @@ -177,7 +177,7 @@ main(void) mrb_pool *pool; void *p; - pool = mrb_pool_open(0); + pool = mrb_pool_open(NULL); p = mrb_pool_alloc(pool, len); for (i=1; i<20; i++) { printf("%p (len=%d) %d\n", p, len, mrb_pool_can_realloc(pool, p, len*2)); -- cgit v1.2.3 From efac8db6748ef95c52de32b16a534f7b8cbf982d Mon Sep 17 00:00:00 2001 From: Jun Hiroe Date: Sun, 14 Jul 2013 23:44:29 +0900 Subject: Replace int with mrb_bool because a return value is boolean. --- include/mruby.h | 2 +- src/pool.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/include/mruby.h b/include/mruby.h index e5a5f2c69..a7f2a49c4 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -378,7 +378,7 @@ struct mrb_pool* mrb_pool_open(mrb_state*); void mrb_pool_close(struct mrb_pool*); void* mrb_pool_alloc(struct mrb_pool*, size_t); void* mrb_pool_realloc(struct mrb_pool*, void*, size_t oldlen, size_t newlen); -int mrb_pool_can_realloc(struct mrb_pool*, void*, size_t); +mrb_bool mrb_pool_can_realloc(struct mrb_pool*, void*, size_t); void* mrb_alloca(mrb_state *mrb, size_t); #if defined(__cplusplus) diff --git a/src/pool.c b/src/pool.c index c992b5e53..81fb83c0c 100644 --- a/src/pool.c +++ b/src/pool.c @@ -118,7 +118,7 @@ mrb_pool_alloc(mrb_pool *pool, size_t len) return page->last; } -int +mrb_bool mrb_pool_can_realloc(mrb_pool *pool, void *p, size_t len) { struct mrb_pool_page *page; @@ -180,7 +180,7 @@ main(void) pool = mrb_pool_open(0); p = mrb_pool_alloc(pool, len); for (i=1; i<20; i++) { - printf("%p (len=%d) %d\n", p, len, mrb_pool_can_realloc(pool, p, len*2)); + printf("%p (len=%d) %ud\n", p, len, mrb_pool_can_realloc(pool, p, len*2)); p = mrb_pool_realloc(pool, p, len, len*2); len *= 2; } -- cgit v1.2.3 From 8e42868600e7adcdc5665ff9b0244150296960d6 Mon Sep 17 00:00:00 2001 From: Jun Hiroe Date: Mon, 15 Jul 2013 23:00:54 +0900 Subject: Repalace int with mrb_bool because a return value is boolean. --- include/mruby.h | 18 +++++++++--------- include/mruby/string.h | 2 +- mrbgems/mruby-bin-mirb/tools/mirb/mirb.c | 2 +- mrbgems/mruby-range-ext/src/range.c | 4 ++-- src/class.c | 6 +++--- src/codegen.c | 2 +- src/kernel.c | 6 +++--- src/object.c | 10 +++++----- src/range.c | 6 +++--- src/string.c | 4 ++-- src/symbol.c | 4 ++-- 11 files changed, 32 insertions(+), 32 deletions(-) (limited to 'src') diff --git a/include/mruby.h b/include/mruby.h index a7f2a49c4..85b464b8e 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -176,13 +176,13 @@ void mrb_undef_class_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); -int mrb_class_defined(mrb_state *mrb, const char *name); +mrb_bool mrb_class_defined(mrb_state *mrb, const char *name); struct RClass * mrb_class_get(mrb_state *mrb, const char *name); struct RClass * mrb_class_get_under(mrb_state *mrb, struct RClass *outer, const char *name); mrb_value mrb_obj_dup(mrb_state *mrb, mrb_value obj); mrb_value mrb_check_to_integer(mrb_state *mrb, mrb_value val, const char *method); -int mrb_obj_respond_to(struct RClass* c, mrb_sym mid); +mrb_bool mrb_obj_respond_to(struct RClass* c, mrb_sym mid); struct RClass * mrb_define_class_under(mrb_state *mrb, struct RClass *outer, const char *name, struct RClass *super); struct RClass * mrb_define_module_under(mrb_state *mrb, struct RClass *outer, const char *name); @@ -264,13 +264,13 @@ void mrb_p(mrb_state*, mrb_value); mrb_int mrb_obj_id(mrb_value obj); mrb_sym mrb_obj_to_sym(mrb_state *mrb, mrb_value name); -int mrb_obj_eq(mrb_state*, mrb_value, mrb_value); -int mrb_obj_equal(mrb_state*, mrb_value, mrb_value); -int mrb_equal(mrb_state *mrb, mrb_value obj1, mrb_value obj2); +mrb_bool mrb_obj_eq(mrb_state*, mrb_value, mrb_value); +mrb_bool mrb_obj_equal(mrb_state*, mrb_value, mrb_value); +mrb_bool mrb_equal(mrb_state *mrb, mrb_value obj1, mrb_value obj2); mrb_value mrb_Integer(mrb_state *mrb, mrb_value val); mrb_value mrb_Float(mrb_state *mrb, mrb_value val); mrb_value mrb_inspect(mrb_state *mrb, mrb_value obj); -int mrb_eql(mrb_state *mrb, mrb_value obj1, mrb_value obj2); +mrb_bool mrb_eql(mrb_state *mrb, mrb_value obj1, mrb_value obj2); void mrb_garbage_collect(mrb_state*); void mrb_incremental_gc(mrb_state *); @@ -292,7 +292,7 @@ const char * mrb_obj_classname(mrb_state *mrb, mrb_value obj); struct RClass* mrb_obj_class(mrb_state *mrb, mrb_value obj); mrb_value mrb_class_path(mrb_state *mrb, struct RClass *c); mrb_value mrb_convert_type(mrb_state *mrb, mrb_value val, enum mrb_vtype type, const char *tname, const char *method); -int mrb_obj_is_kind_of(mrb_state *mrb, mrb_value obj, struct RClass *c); +mrb_bool mrb_obj_is_kind_of(mrb_state *mrb, mrb_value obj, struct RClass *c); mrb_value mrb_obj_inspect(mrb_state *mrb, mrb_value self); mrb_value mrb_obj_clone(mrb_state *mrb, mrb_value self); @@ -369,8 +369,8 @@ void mrb_define_global_const(mrb_state *mrb, const char *name, mrb_value val); mrb_value mrb_block_proc(void); mrb_value mrb_attr_get(mrb_state *mrb, mrb_value obj, mrb_sym id); -int mrb_respond_to(mrb_state *mrb, mrb_value obj, mrb_sym mid); -int mrb_obj_is_instance_of(mrb_state *mrb, mrb_value obj, struct RClass* c); +mrb_bool mrb_respond_to(mrb_state *mrb, mrb_value obj, mrb_sym mid); +mrb_bool mrb_obj_is_instance_of(mrb_state *mrb, mrb_value obj, struct RClass* c); /* memory pool implementation */ typedef struct mrb_pool mrb_pool; diff --git a/include/mruby/string.h b/include/mruby/string.h index 26d1344d8..000c80b09 100644 --- a/include/mruby/string.h +++ b/include/mruby/string.h @@ -57,7 +57,7 @@ mrb_value mrb_str_to_str(mrb_state *mrb, mrb_value str); mrb_int mrb_str_hash(mrb_state *mrb, mrb_value str); mrb_value mrb_str_buf_append(mrb_state *mrb, mrb_value str, mrb_value str2); mrb_value mrb_str_inspect(mrb_state *mrb, mrb_value str); -int mrb_str_equal(mrb_state *mrb, mrb_value str1, mrb_value str2); +mrb_bool mrb_str_equal(mrb_state *mrb, mrb_value str1, mrb_value str2); mrb_value mrb_str_dump(mrb_state *mrb, mrb_value str); mrb_value mrb_str_cat(mrb_state *mrb, mrb_value str, const char *ptr, size_t len); mrb_value mrb_str_append(mrb_state *mrb, mrb_value str, mrb_value str2); diff --git a/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c b/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c index 7f2fcf282..eb7194f30 100644 --- a/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +++ b/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c @@ -38,7 +38,7 @@ p(mrb_state *mrb, mrb_value obj, int prompt) /* Guess if the user might want to enter more * or if he wants an evaluation of his code now */ -int +mrb_bool is_code_block_open(struct mrb_parser_state *parser) { int code_block_open = FALSE; diff --git a/mrbgems/mruby-range-ext/src/range.c b/mrbgems/mruby-range-ext/src/range.c index 377677ffb..4e17dac8c 100644 --- a/mrbgems/mruby-range-ext/src/range.c +++ b/mrbgems/mruby-range-ext/src/range.c @@ -1,7 +1,7 @@ #include "mruby.h" #include "mruby/range.h" -static int +static mrb_bool r_le(mrb_state *mrb, mrb_value a, mrb_value b) { mrb_value r = mrb_funcall(mrb, a, "<=>", 1, b); /* compare result */ @@ -15,7 +15,7 @@ r_le(mrb_state *mrb, mrb_value a, mrb_value b) return FALSE; } -static int +static mrb_bool r_lt(mrb_state *mrb, mrb_value a, mrb_value b) { mrb_value r = mrb_funcall(mrb, a, "<=>", 1, b); diff --git a/src/class.c b/src/class.c index 9868d0080..606a54a7c 100644 --- a/src/class.c +++ b/src/class.c @@ -203,7 +203,7 @@ mrb_vm_define_class(mrb_state *mrb, mrb_value outer, mrb_value super, mrb_sym id return c; } -int +mrb_bool mrb_class_defined(mrb_state *mrb, const char *name) { mrb_value sym = mrb_check_intern_cstr(mrb, name); @@ -1172,7 +1172,7 @@ mrb_bob_missing(mrb_state *mrb, mrb_value mod) return mrb_nil_value(); } -int +mrb_bool mrb_obj_respond_to(struct RClass* c, mrb_sym mid) { khiter_t k; @@ -1196,7 +1196,7 @@ mrb_obj_respond_to(struct RClass* c, mrb_sym mid) return FALSE; /* no method */ } -int +mrb_bool mrb_respond_to(mrb_state *mrb, mrb_value obj, mrb_sym mid) { return mrb_obj_respond_to(mrb_class(mrb, obj), mid); diff --git a/src/codegen.c b/src/codegen.c index 8dd5a124d..37176653b 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -683,7 +683,7 @@ scope_body(codegen_scope *s, node *tree) return idx - s->idx; } -static int +static mrb_bool nosplat(node *t) { while (t) { diff --git a/src/kernel.c b/src/kernel.c index 965b80b95..ae8d24710 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -26,7 +26,7 @@ typedef enum { NOEX_RESPONDS = 0x80 } mrb_method_flag_t; -int +mrb_bool mrb_obj_basic_to_s_p(mrb_state *mrb, mrb_value obj) { struct RProc *me = mrb_method_search(mrb, mrb_class(mrb, obj), mrb_intern2(mrb, "to_s", 4)); @@ -521,7 +521,7 @@ mrb_obj_instance_eval(mrb_state *mrb, mrb_value self) return mrb_yield_internal(mrb, b, 0, 0, self, c); } -int +mrb_bool mrb_obj_is_instance_of(mrb_state *mrb, mrb_value obj, struct RClass* c) { if (mrb_obj_class(mrb, obj) == c) return TRUE; @@ -938,7 +938,7 @@ mrb_obj_remove_instance_variable(mrb_state *mrb, mrb_value self) return val; } -static inline int +static inline mrb_bool basic_obj_respond_to(mrb_state *mrb, mrb_value obj, mrb_sym id, int pub) { return mrb_respond_to(mrb, obj, id); diff --git a/src/object.c b/src/object.c index 4003452cc..5b2278767 100644 --- a/src/object.c +++ b/src/object.c @@ -11,7 +11,7 @@ #include "mruby/string.h" #include "error.h" -int +mrb_bool mrb_obj_eq(mrb_state *mrb, mrb_value v1, mrb_value v2) { if (mrb_type(v1) != mrb_type(v2)) return FALSE; @@ -33,14 +33,14 @@ mrb_obj_eq(mrb_state *mrb, mrb_value v1, mrb_value v2) } } -int +mrb_bool mrb_obj_equal(mrb_state *mrb, mrb_value v1, mrb_value v2) { /* temporary definition */ return mrb_obj_eq(mrb, v1, v2); } -int +mrb_bool mrb_equal(mrb_state *mrb, mrb_value obj1, mrb_value obj2) { mrb_value result; @@ -468,7 +468,7 @@ mrb_any_to_s(mrb_state *mrb, mrb_value obj) * b.kind_of? M #=> true */ -int +mrb_bool mrb_obj_is_kind_of(mrb_state *mrb, mrb_value obj, struct RClass *c) { struct RClass *cl = mrb_class(mrb, obj); @@ -585,7 +585,7 @@ mrb_inspect(mrb_state *mrb, mrb_value obj) return mrb_obj_as_string(mrb, mrb_funcall(mrb, obj, "inspect", 0, 0)); } -int +mrb_bool mrb_eql(mrb_state *mrb, mrb_value obj1, mrb_value obj2) { if (mrb_obj_eq(mrb, obj1, obj2)) return TRUE; diff --git a/src/range.c b/src/range.c index 92eddfe8c..6e313df51 100644 --- a/src/range.c +++ b/src/range.c @@ -170,7 +170,7 @@ mrb_range_eq(mrb_state *mrb, mrb_value range) return mrb_true_value(); } -static int +static mrb_bool r_le(mrb_state *mrb, mrb_value a, mrb_value b) { mrb_value r = mrb_funcall(mrb, a, "<=>", 1, b); /* compare result */ @@ -184,7 +184,7 @@ r_le(mrb_state *mrb, mrb_value a, mrb_value b) return FALSE; } -static int +static mrb_bool r_gt(mrb_state *mrb, mrb_value a, mrb_value b) { mrb_value r = mrb_funcall(mrb, a, "<=>", 1, b); @@ -197,7 +197,7 @@ r_gt(mrb_state *mrb, mrb_value a, mrb_value b) return FALSE; } -static int +static mrb_bool r_ge(mrb_state *mrb, mrb_value a, mrb_value b) { mrb_value r = mrb_funcall(mrb, a, "<=>", 1, b); /* compare result */ diff --git a/src/string.c b/src/string.c index 59a1df455..975f6cdb9 100644 --- a/src/string.c +++ b/src/string.c @@ -595,7 +595,7 @@ mrb_str_cmp_m(mrb_state *mrb, mrb_value str1) return mrb_fixnum_value(result); } -static int +static mrb_bool str_eql(mrb_state *mrb, const mrb_value str1, const mrb_value str2) { const mrb_int len = RSTRING_LEN(str1); @@ -606,7 +606,7 @@ str_eql(mrb_state *mrb, const mrb_value str1, const mrb_value str2) return FALSE; } -int +mrb_bool mrb_str_equal(mrb_state *mrb, mrb_value str1, mrb_value str2) { if (mrb_obj_equal(mrb, str1, str2)) return TRUE; diff --git a/src/symbol.c b/src/symbol.c index c29f7c6ae..bd8dce7df 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -251,7 +251,7 @@ sym_to_sym(mrb_state *mrb, mrb_value sym) #endif #define is_identchar(c) (SIGN_EXTEND_CHAR(c)!=-1&&(ISALNUM(c) || (c) == '_')) -static int +static mrb_bool is_special_global_name(const char* m) { switch (*m) { @@ -274,7 +274,7 @@ is_special_global_name(const char* m) return !*m; } -static int +static mrb_bool symname_p(const char *name) { const char *m = name; -- cgit v1.2.3 From 75f8aab247abf58b61b3700c078d61ccf7e168bf Mon Sep 17 00:00:00 2001 From: Ryan Scott Date: Thu, 18 Jul 2013 07:54:16 +1000 Subject: First round of trying to improve the performance of attr_reader and attr_writer. From ~24sec to ~15sec --- benchmark/ao-render.rb | 42 +++++++++++++----------------------------- mrblib/class.rb | 6 +++--- src/kernel.c | 45 +++++++++++++++++++++++++++++++++++---------- 3 files changed, 51 insertions(+), 42 deletions(-) (limited to 'src') diff --git a/benchmark/ao-render.rb b/benchmark/ao-render.rb index 793804a7b..e7406b26b 100644 --- a/benchmark/ao-render.rb +++ b/benchmark/ao-render.rb @@ -6,8 +6,8 @@ # mruby version by Hideki Miura # -IMAGE_WIDTH = 256 -IMAGE_HEIGHT = 256 +IMAGE_WIDTH = 64 +IMAGE_HEIGHT = 64 NSUBSAMPLES = 2 NAO_SAMPLES = 8 @@ -30,19 +30,14 @@ module Rand end class Vec + attr_accessor :x, :y, :z + def initialize(x, y, z) @x = x @y = y @z = z end - def x=(v); @x = v; end - def y=(v); @y = v; end - def z=(v); @z = v; end - def x; @x; end - def y; @y; end - def z; @z; end - def vadd(b) Vec.new(@x + b.x, @y + b.y, @z + b.z) end @@ -80,14 +75,13 @@ end class Sphere + attr_reader :center, :radius + def initialize(center, radius) @center = center @radius = radius end - def center; @center; end - def radius; @radius; end - def intersect(ray, isect) rs = ray.org.vsub(@center) b = rs.vdot(ray.dir) @@ -140,33 +134,23 @@ class Plane end class Ray + attr_accessor :org, :dir + def initialize(org, dir) @org = org @dir = dir end - - def org; @org; end - def org=(v); @org = v; end - def dir; @dir; end - def dir=(v); @dir = v; end end class Isect + attr_accessor :t, :hit, :pl, :n + def initialize @t = 10000000.0 @hit = false @pl = Vec.new(0.0, 0.0, 0.0) @n = Vec.new(0.0, 0.0, 0.0) end - - def t; @t; end - def t=(v); @t = v; end - def hit; @hit; end - def hit=(v); @hit = v; end - def pl; @pl; end - def pl=(v); @pl = v; end - def n; @n; end - def n=(v); @n = v; end end def clamp(f) @@ -298,9 +282,9 @@ class Scene r = rad.x / (nsf * nsf) g = rad.y / (nsf * nsf) b = rad.z / (nsf * nsf) - printf("%c", clamp(r)) - printf("%c", clamp(g)) - printf("%c", clamp(b)) + # printf("%c", clamp(r)) + # printf("%c", clamp(g)) + # printf("%c", clamp(b)) end end end diff --git a/mrblib/class.rb b/mrblib/class.rb index 4f268b6c8..d6ef34f17 100644 --- a/mrblib/class.rb +++ b/mrblib/class.rb @@ -2,15 +2,15 @@ class Module # 15.2.2.4.13 def attr_reader(*names) names.each{|name| - name2 = ('@'+name.to_s).intern + name2 = ('@'+name.to_s) define_method(name){self.instance_variable_get(name2)} } end # 15.2.2.4.14 def attr_writer(*names) names.each{|name| - name2 = ('@'+name.to_s).intern - name = (name.to_s+"=").intern + name2 = ('@'+name.to_s) + name = (name.to_s+"=") define_method(name){|v|self.instance_variable_set(name2,v)} } end diff --git a/src/kernel.c b/src/kernel.c index ae8d24710..068b80f62 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -548,6 +548,14 @@ obj_is_instance_of(mrb_state *mrb, mrb_value self) return mrb_bool_value(instance_of_p); } +static void +valid_iv_name(mrb_state *mrb, mrb_sym id, const char* s, size_t len) +{ + if (len < 2 || !(s[0] == '@' && s[1] != '@')) { + mrb_name_error(mrb, id, "`%S' is not allowed as an instance variable name", mrb_sym2str(mrb, id)); + } +} + static void check_iv_name(mrb_state *mrb, mrb_sym id) { @@ -555,9 +563,23 @@ check_iv_name(mrb_state *mrb, mrb_sym id) size_t len; s = mrb_sym2name_len(mrb, id, &len); - if (len < 2 || !(s[0] == '@' && s[1] != '@')) { - mrb_name_error(mrb, id, "`%S' is not allowed as an instance variable name", mrb_sym2str(mrb, id)); + valid_iv_name(mrb, id, s, len); +} + +static mrb_sym +get_valid_iv_sym(mrb_state *mrb, mrb_value val) +{ + mrb_sym id; + + if (mrb_string_p(val)) { + id = mrb_intern_cstr(mrb, RSTRING_PTR(val)); + valid_iv_name(mrb, id, RSTRING_PTR(val), RSTRING_LEN(val)); + } else if(mrb_symbol_p(val)) { + id = mrb_symbol(val); + check_iv_name(mrb, id); } + + return id; } /* 15.3.1.3.20 */ @@ -582,10 +604,11 @@ mrb_value mrb_obj_ivar_defined(mrb_state *mrb, mrb_value self) { mrb_sym mid; + mrb_value sym; mrb_bool defined_p; - mrb_get_args(mrb, "n", &mid); - check_iv_name(mrb, mid); + mrb_get_args(mrb, "o", &sym); + mid = get_valid_iv_sym(mrb, sym); defined_p = mrb_obj_iv_defined(mrb, mrb_obj_ptr(self), mid); return mrb_bool_value(defined_p); @@ -615,10 +638,11 @@ mrb_value mrb_obj_ivar_get(mrb_state *mrb, mrb_value self) { mrb_sym id; + mrb_value sym; + + mrb_get_args(mrb, "o", &sym); - mrb_get_args(mrb, "n", &id); - - check_iv_name(mrb, id); + id = get_valid_iv_sym(mrb, sym); return mrb_iv_get(mrb, self, id); } @@ -646,10 +670,11 @@ mrb_value mrb_obj_ivar_set(mrb_state *mrb, mrb_value self) { mrb_sym id; - mrb_value val; + mrb_value sym, val; - mrb_get_args(mrb, "no", &id, &val); - check_iv_name(mrb, id); + mrb_get_args(mrb, "oo", &sym, &val); + + id = get_valid_iv_sym(mrb, sym); mrb_iv_set(mrb, self, id, val); return val; } -- cgit v1.2.3 From b9a32e434ab4e796c75aa98d29c65fb89024f3b0 Mon Sep 17 00:00:00 2001 From: Carson McDonald Date: Thu, 18 Jul 2013 09:47:48 -0400 Subject: Changed use of MRB_INT_MAX to MRB_INT_MAX-1 --- src/array.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/array.c b/src/array.c index ed087515a..b5bbdf0fa 100644 --- a/src/array.c +++ b/src/array.c @@ -19,7 +19,7 @@ #define ARY_DEFAULT_LEN 4 #define ARY_SHRINK_RATIO 5 /* must be larger than 2 */ #define ARY_C_MAX_SIZE (SIZE_MAX / sizeof(mrb_value)) -#define ARY_MAX_SIZE ((ARY_C_MAX_SIZE < (size_t)MRB_INT_MAX) ? (mrb_int)ARY_C_MAX_SIZE : MRB_INT_MAX) +#define ARY_MAX_SIZE ((ARY_C_MAX_SIZE < (size_t)MRB_INT_MAX) ? (mrb_int)ARY_C_MAX_SIZE : MRB_INT_MAX-1) static inline mrb_value ary_elt(mrb_value ary, mrb_int offset) @@ -40,7 +40,7 @@ ary_new_capa(mrb_state *mrb, mrb_int capa) if (capa > ARY_MAX_SIZE) { mrb_raise(mrb, E_ARGUMENT_ERROR, "array size too big"); } - blen = capa * sizeof(mrb_value) ; + blen = capa * sizeof(mrb_value); if (blen < capa) { mrb_raise(mrb, E_ARGUMENT_ERROR, "array size too big"); } -- cgit v1.2.3 From d4f375b48bc1701547dd53f0928cf920f1bfd0e5 Mon Sep 17 00:00:00 2001 From: fleuria Date: Fri, 19 Jul 2013 12:01:34 +0800 Subject: rename advance_phase to incremental_gc_until in fact advance_phace() is not really a "phase", but can be used as an utility function. --- src/gc.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/gc.c b/src/gc.c index a22ef1adf..a11f86007 100644 --- a/src/gc.c +++ b/src/gc.c @@ -891,7 +891,7 @@ incremental_gc(mrb_state *mrb, size_t limit) } static void -advance_phase(mrb_state *mrb, enum gc_state to_state) +incremental_gc_until(mrb_state *mrb, enum gc_state to_state) { while (mrb->gc_state != to_state) { incremental_gc(mrb, ~0); @@ -905,12 +905,12 @@ clear_all_old(mrb_state *mrb) gc_assert(is_generational(mrb)); if (is_major_gc(mrb)) { - advance_phase(mrb, GC_STATE_NONE); + incremental_gc_until(mrb, GC_STATE_NONE); } mrb->is_generational_gc_mode = FALSE; prepare_incremental_sweep(mrb); - advance_phase(mrb, GC_STATE_NONE); + incremental_gc_until(mrb, GC_STATE_NONE); mrb->variable_gray_list = mrb->gray_list = NULL; mrb->is_generational_gc_mode = origin_mode; } @@ -1190,7 +1190,7 @@ change_gen_gc_mode(mrb_state *mrb, mrb_int enable) mrb->gc_full = FALSE; } else if (!is_generational(mrb) && enable) { - advance_phase(mrb, GC_STATE_NONE); + incremental_gc_until(mrb, GC_STATE_NONE); mrb->majorgc_old_threshold = mrb->gc_live_after_mark/100 * DEFAULT_MAJOR_GC_INC_RATIO; mrb->gc_full = FALSE; } @@ -1444,7 +1444,7 @@ test_incremental_gc(void) incremental_gc(mrb, max); gc_assert(mrb->gc_state == GC_STATE_MARK); puts(" in GC_STATE_MARK"); - advance_phase(mrb, GC_STATE_SWEEP); + incremental_gc_until(mrb, GC_STATE_SWEEP); gc_assert(mrb->gc_state == GC_STATE_SWEEP); puts(" in GC_STATE_SWEEP"); @@ -1483,7 +1483,7 @@ test_incremental_gc(void) gc_assert(mrb->live == total-freed); puts("test_incremental_gc(gen)"); - advance_phase(mrb, GC_STATE_SWEEP); + incremental_gc_until(mrb, GC_STATE_SWEEP); change_gen_gc_mode(mrb, TRUE); gc_assert(mrb->gc_full == FALSE); -- cgit v1.2.3 From c49e2d766eb2ad06ce10dea6e0df436099795fbe Mon Sep 17 00:00:00 2001 From: fleuria Date: Fri, 19 Jul 2013 12:09:21 +0800 Subject: cleanup redundant codes with incremental_gc_until() --- src/gc.c | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/gc.c b/src/gc.c index a11f86007..02ef459d8 100644 --- a/src/gc.c +++ b/src/gc.c @@ -893,9 +893,9 @@ incremental_gc(mrb_state *mrb, size_t limit) static void incremental_gc_until(mrb_state *mrb, enum gc_state to_state) { - while (mrb->gc_state != to_state) { + do { incremental_gc(mrb, ~0); - } + } while (mrb->gc_state != to_state); } static void @@ -924,9 +924,7 @@ mrb_incremental_gc(mrb_state *mrb) GC_TIME_START; if (is_minor_gc(mrb)) { - do { - incremental_gc(mrb, ~0); - } while (mrb->gc_state != GC_STATE_NONE); + incremental_gc_until(mrb, GC_STATE_NONE); } else { size_t limit = 0, result = 0; @@ -966,17 +964,13 @@ mrb_incremental_gc(mrb_state *mrb) void mrb_garbage_collect(mrb_state *mrb) { - size_t max_limit = ~0; - if (mrb->gc_disabled) return; GC_INVOKE_TIME_REPORT("mrb_garbage_collect()"); GC_TIME_START; if (mrb->gc_state == GC_STATE_SWEEP) { /* finish sweep phase */ - while (mrb->gc_state != GC_STATE_NONE) { - incremental_gc(mrb, max_limit); - } + incremental_gc_until(mrb, GC_STATE_NONE); } /* clean all black object as old */ @@ -985,10 +979,7 @@ mrb_garbage_collect(mrb_state *mrb) mrb->gc_full = TRUE; } - do { - incremental_gc(mrb, max_limit); - } while (mrb->gc_state != GC_STATE_NONE); - + incremental_gc_until(mrb, GC_STATE_NONE); mrb->gc_threshold = (mrb->gc_live_after_mark/100) * mrb->gc_interval_ratio; if (is_generational(mrb)) { -- cgit v1.2.3 From 3ebd8167e149c66e7b9a822b196ea610fe07a419 Mon Sep 17 00:00:00 2001 From: Ryan Scott Date: Sun, 21 Jul 2013 18:05:45 +1000 Subject: Slight cleanup of code --- src/kernel.c | 50 +++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-) (limited to 'src') diff --git a/src/kernel.c b/src/kernel.c index 068b80f62..f2c7f182f 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -549,37 +549,37 @@ obj_is_instance_of(mrb_state *mrb, mrb_value self) } static void -valid_iv_name(mrb_state *mrb, mrb_sym id, const char* s, size_t len) +valid_iv_name(mrb_state *mrb, mrb_sym iv_name_id, const char* s, size_t len) { if (len < 2 || !(s[0] == '@' && s[1] != '@')) { - mrb_name_error(mrb, id, "`%S' is not allowed as an instance variable name", mrb_sym2str(mrb, id)); + mrb_name_error(mrb, iv_name_id, "`%S' is not allowed as an instance variable name", mrb_sym2str(mrb, iv_name_id)); } } static void -check_iv_name(mrb_state *mrb, mrb_sym id) +check_iv_name(mrb_state *mrb, mrb_sym iv_name_id) { const char *s; size_t len; - s = mrb_sym2name_len(mrb, id, &len); - valid_iv_name(mrb, id, s, len); + s = mrb_sym2name_len(mrb, iv_name_id, &len); + valid_iv_name(mrb, iv_name_id, s, len); } static mrb_sym -get_valid_iv_sym(mrb_state *mrb, mrb_value val) +get_valid_iv_sym(mrb_state *mrb, mrb_value iv_name) { - mrb_sym id; - - if (mrb_string_p(val)) { - id = mrb_intern_cstr(mrb, RSTRING_PTR(val)); - valid_iv_name(mrb, id, RSTRING_PTR(val), RSTRING_LEN(val)); - } else if(mrb_symbol_p(val)) { - id = mrb_symbol(val); - check_iv_name(mrb, id); + mrb_sym iv_name_id; + + if (mrb_string_p(iv_name)) { + iv_name_id = mrb_intern_cstr(mrb, RSTRING_PTR(iv_name)); + valid_iv_name(mrb, iv_name_id, RSTRING_PTR(iv_name), RSTRING_LEN(iv_name)); + } else if(mrb_symbol_p(iv_name)) { + iv_name_id = mrb_symbol(iv_name); + check_iv_name(mrb, iv_name_id); } - return id; + return iv_name_id; } /* 15.3.1.3.20 */ @@ -637,13 +637,13 @@ mrb_obj_ivar_defined(mrb_state *mrb, mrb_value self) mrb_value mrb_obj_ivar_get(mrb_state *mrb, mrb_value self) { - mrb_sym id; - mrb_value sym; + mrb_sym iv_name_id; + mrb_value iv_name; - mrb_get_args(mrb, "o", &sym); + mrb_get_args(mrb, "o", &iv_name); - id = get_valid_iv_sym(mrb, sym); - return mrb_iv_get(mrb, self, id); + iv_name_id = get_valid_iv_sym(mrb, iv_name); + return mrb_iv_get(mrb, self, iv_name_id); } /* 15.3.1.3.22 */ @@ -669,13 +669,13 @@ mrb_obj_ivar_get(mrb_state *mrb, mrb_value self) mrb_value mrb_obj_ivar_set(mrb_state *mrb, mrb_value self) { - mrb_sym id; - mrb_value sym, val; + mrb_sym iv_name_id; + mrb_value iv_name, val; - mrb_get_args(mrb, "oo", &sym, &val); + mrb_get_args(mrb, "oo", &iv_name, &val); - id = get_valid_iv_sym(mrb, sym); - mrb_iv_set(mrb, self, id, val); + iv_name_id = get_valid_iv_sym(mrb, iv_name); + mrb_iv_set(mrb, self, iv_name_id, val); return val; } -- cgit v1.2.3 From 2daf39ddc85c7c4d36e18580a6fb60dcf1f0ecf4 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Mon, 22 Jul 2013 09:52:06 +0900 Subject: change else formatting --- src/array.c | 3 ++- src/class.c | 15 ++++++++++----- src/error.c | 9 ++++++--- src/gc.c | 3 ++- src/kernel.c | 3 ++- src/numeric.c | 9 ++++++--- 6 files changed, 28 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/array.c b/src/array.c index b5bbdf0fa..526cf4973 100644 --- a/src/array.c +++ b/src/array.c @@ -926,7 +926,8 @@ inspect_ary(mrb_state *mrb, mrb_value ary, mrb_value list) } if (mrb_array_p(RARRAY_PTR(ary)[i])) { s = inspect_ary(mrb, RARRAY_PTR(ary)[i], list); - } else { + } + else { s = mrb_inspect(mrb, RARRAY_PTR(ary)[i]); } mrb_str_buf_cat(mrb, arystr, RSTRING_PTR(s), RSTRING_LEN(s)); diff --git a/src/class.c b/src/class.c index 606a54a7c..ad4c9eaa2 100644 --- a/src/class.c +++ b/src/class.c @@ -1437,7 +1437,8 @@ undef_method(mrb_state *mrb, struct RClass *c, mrb_sym a) if (!mrb_obj_respond_to(c, a)) { mrb_name_error(mrb, a, "undefined method '%S' for class '%S'", mrb_sym2str(mrb, a), mrb_obj_value(c)); - } else { + } + else { MRB_SET_VALUE(m, MRB_TT_PROC, value.p, 0); mrb_define_method_vm(mrb, c, a, m); } @@ -1519,7 +1520,8 @@ get_sym_or_str_arg(mrb_state *mrb) if (mrb_symbol_p(sym_or_str) || mrb_string_p(sym_or_str)) { return sym_or_str; - } else { + } + else { mrb_value obj = mrb_funcall(mrb, sym_or_str, "inspect", 0); mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a symbol", obj); return mrb_nil_value(); @@ -1551,7 +1553,8 @@ mrb_mod_cvar_defined(mrb_state *mrb, mrb_value mod) if (mrb_symbol_p(id)) { check_cv_name_sym(mrb, mrb_symbol(id)); defined_p = mrb_cv_defined(mrb, mod, mrb_symbol(id)); - } else { + } + else { mrb_value sym; check_cv_name_str(mrb, id); sym = mrb_check_intern_str(mrb, id); @@ -1703,7 +1706,8 @@ mrb_mod_method_defined(mrb_state *mrb, mrb_value mod) id = get_sym_or_str_arg(mrb); if (mrb_symbol_p(id)) { method_defined_p = mrb_obj_respond_to(mrb_class_ptr(mod), mrb_symbol(id)); - } else { + } + else { mrb_value sym = mrb_check_intern_str(mrb, id); if (mrb_nil_p(sym)) { method_defined_p = FALSE; @@ -1787,7 +1791,8 @@ mrb_mod_const_defined(mrb_state *mrb, mrb_value mod) if (mrb_type(id) == MRB_TT_SYMBOL) { check_const_name_sym(mrb, mrb_symbol(id)); const_defined_p = mrb_const_defined(mrb, mod, mrb_symbol(id)); - } else { + } + else { mrb_value sym; check_const_name_str(mrb, id); sym = mrb_check_intern_str(mrb, id); diff --git a/src/error.c b/src/error.c index bd3afd2e1..9f3a86cc8 100644 --- a/src/error.c +++ b/src/error.c @@ -147,7 +147,8 @@ exc_inspect(mrb_state *mrb, mrb_value exc) if (!mrb_nil_p(mesg) && RSTRING_LEN(mesg) > 0) { mrb_str_cat(mrb, str, ": ", 2); mrb_str_append(mrb, str, mesg); - } else { + } + else { mrb_str_cat(mrb, str, ": ", 2); mrb_str_cat_cstr(mrb, str, mrb_obj_classname(mrb, exc)); } @@ -425,10 +426,12 @@ mrb_sys_fail(mrb_state *mrb, const char *mesg) sce = mrb_class_get(mrb, "SystemCallError"); if (mesg != NULL) { mrb_funcall(mrb, mrb_obj_value(sce), "_sys_fail", 2, mrb_fixnum_value(no), mrb_str_new_cstr(mrb, mesg)); - } else { + } + else { mrb_funcall(mrb, mrb_obj_value(sce), "_sys_fail", 1, mrb_fixnum_value(no)); } - } else { + } + else { mrb_raise(mrb, E_RUNTIME_ERROR, mesg); } } diff --git a/src/gc.c b/src/gc.c index a22ef1adf..581a5ff9c 100644 --- a/src/gc.c +++ b/src/gc.c @@ -212,7 +212,8 @@ mrb_calloc(mrb_state *mrb, size_t nelem, size_t len) if (p) { memset(p, 0, size); } - } else { + } + else { p = NULL; } diff --git a/src/kernel.c b/src/kernel.c index f2c7f182f..4914b7285 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -574,7 +574,8 @@ get_valid_iv_sym(mrb_state *mrb, mrb_value iv_name) if (mrb_string_p(iv_name)) { iv_name_id = mrb_intern_cstr(mrb, RSTRING_PTR(iv_name)); valid_iv_name(mrb, iv_name_id, RSTRING_PTR(iv_name), RSTRING_LEN(iv_name)); - } else if(mrb_symbol_p(iv_name)) { + } + else if(mrb_symbol_p(iv_name)) { iv_name_id = mrb_symbol(iv_name); check_iv_name(mrb, iv_name_id); } diff --git a/src/numeric.c b/src/numeric.c index e1543c089..c734a595d 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -240,7 +240,8 @@ mrb_flo_to_str(mrb_state *mrb, mrb_value flo, int max_digit) *(c++) = 'e'; if (exp > 0) { *(c++) = '+'; - } else { + } + else { *(c++) = '-'; exp = -exp; } @@ -1253,12 +1254,14 @@ mrb_fixnum_to_str(mrb_state *mrb, mrb_value x, int base) if (val == 0) { *--b = '0'; - } else if (val < 0) { + } + else if (val < 0) { do { *--b = mrb_digitmap[-(val % base)]; } while (val /= base); *--b = '-'; - } else { + } + else { do { *--b = mrb_digitmap[(int)(val % base)]; } while (val /= base); -- cgit v1.2.3 From 6a1cb4465bfbc37b4a623dc513cbaf8b8380679b Mon Sep 17 00:00:00 2001 From: fleuria Date: Mon, 22 Jul 2013 16:12:43 +0800 Subject: revise the Two White Parts comments in gc.c --- src/gc.c | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/gc.c b/src/gc.c index 37d61ad35..05577f9c7 100644 --- a/src/gc.c +++ b/src/gc.c @@ -38,18 +38,23 @@ * Gray - Marked, But the child objects are unmarked. * Black - Marked, the child objects are also marked. - == Two white part - - The white has a different part of A and B. - In sweep phase, the sweep target white is either A or B. - The sweep target white is switched just before sweep phase. - e.g. A -> B -> A -> B ... - - All objects are painted white when allocated. - This white is another the sweep target white. - For example, if the sweep target white is A, it's B. - So objects when allocated in sweep phase will be next sweep phase target. - Therefore, these objects will not be released accidentally in sweep phase. + == Two White Types + + There're two white color types in a flip-flop fassion: White-A and White-B, + which respectively represent the Current White color (the newly allocated + objects in the current round of GC) and the Sweep Target White color (the + dead objects to be swept). + + A and B will be switched just at the beginning of the next round of GC. At + that time, all the dead objects have been swept, while the newly created + objects in the current round of GC which finally remains White are now + regarded as dead objects. Instead of traversing all the White-A objects and + paint them as White-B, just switch the meaning of White-A and White-B would + be much cheaper. + + As a result, the objects we sweep in the current round of GC are always + left from the previous round of GC. This allows us to sweep objects + incrementally, without the disturbance of the newly created objects. == Execution Timing -- cgit v1.2.3 From 9bce2eb8b399a27ffdd0073606ca3cb14268348f Mon Sep 17 00:00:00 2001 From: fleuria Date: Tue, 23 Jul 2013 17:00:55 +0800 Subject: gc: add comments for Generational Mode --- src/gc.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/gc.c b/src/gc.c index 05577f9c7..cfe48df68 100644 --- a/src/gc.c +++ b/src/gc.c @@ -66,7 +66,7 @@ For details, see the comments for each function. - = Write Barrier + == Write Barrier mruby implementer, C extension library writer must write a write barrier when writing a pointer to an object on object's field. @@ -75,6 +75,20 @@ * mrb_field_write_barrier * mrb_write_barrier + == Generational Mode + + mruby's GC offers an Generational Mode while re-using the tri-color GC + infrastructure. It will treat the Black objects as Old objects after each + sweep phase, instead of paint them to White. The key idea are still same as + the traditional generational GC: + + * Minor GC - just traverse the Young objects (Gray objects) in the mark + phase, then only sweep the newly created objects, and leave + the Old objects live. + + * Major GC - same as a full round of regular GC. + + For details, see the comments for each function. */ -- cgit v1.2.3 From 8d7e71615810b46d82c62bc96fd27aedbbd5ac88 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Tue, 23 Jul 2013 20:22:15 +0900 Subject: String `=~` and `match` to work with pluggable Regexp; close #1398 --- mrblib/string.rb | 12 ++++++++++++ src/string.c | 9 --------- 2 files changed, 12 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/mrblib/string.rb b/mrblib/string.rb index 131d30446..49f87be8b 100644 --- a/mrblib/string.rb +++ b/mrblib/string.rb @@ -133,6 +133,18 @@ class String a = self[pos+1..-1] self.replace([b, value, a].join('')) end + + ## + # ISO 15.2.10.5.5 + def =~(re) + re =~ self + end + + ## + # ISO 15.2.10.5.27 + def match(re, &block) + re.match(self, &block) + end end ## diff --git a/src/string.c b/src/string.c index 975f6cdb9..0c142958c 100644 --- a/src/string.c +++ b/src/string.c @@ -2534,7 +2534,6 @@ mrb_init_string(mrb_state *mrb) mrb_define_method(mrb, s, "*", mrb_str_times, MRB_ARGS_REQ(1)); /* 15.2.10.5.1 */ mrb_define_method(mrb, s, "<=>", mrb_str_cmp_m, MRB_ARGS_REQ(1)); /* 15.2.10.5.3 */ mrb_define_method(mrb, s, "==", mrb_str_equal_m, MRB_ARGS_REQ(1)); /* 15.2.10.5.4 */ - mrb_define_method(mrb, s, "=~", noregexp, MRB_ARGS_REQ(1)); /* 15.2.10.5.5 */ mrb_define_method(mrb, s, "[]", mrb_str_aref_m, MRB_ARGS_ANY()); /* 15.2.10.5.6 */ mrb_define_method(mrb, s, "capitalize", mrb_str_capitalize, MRB_ARGS_NONE()); /* 15.2.10.5.7 */ mrb_define_method(mrb, s, "capitalize!", mrb_str_capitalize_bang, MRB_ARGS_REQ(1)); /* 15.2.10.5.8 */ @@ -2547,26 +2546,18 @@ mrb_init_string(mrb_state *mrb) mrb_define_method(mrb, s, "empty?", mrb_str_empty_p, MRB_ARGS_NONE()); /* 15.2.10.5.16 */ mrb_define_method(mrb, s, "eql?", mrb_str_eql, MRB_ARGS_REQ(1)); /* 15.2.10.5.17 */ - // NOTE: Regexp not implemented - mrb_define_method(mrb, s, "gsub", noregexp, MRB_ARGS_REQ(1)); /* 15.2.10.5.18 */ - mrb_define_method(mrb, s, "gsub!", noregexp, MRB_ARGS_REQ(1)); /* 15.2.10.5.19 */ - mrb_define_method(mrb, s, "hash", mrb_str_hash_m, MRB_ARGS_REQ(1)); /* 15.2.10.5.20 */ mrb_define_method(mrb, s, "include?", mrb_str_include, MRB_ARGS_REQ(1)); /* 15.2.10.5.21 */ mrb_define_method(mrb, s, "index", mrb_str_index_m, MRB_ARGS_ANY()); /* 15.2.10.5.22 */ mrb_define_method(mrb, s, "initialize", mrb_str_init, MRB_ARGS_REQ(1)); /* 15.2.10.5.23 */ mrb_define_method(mrb, s, "initialize_copy", mrb_str_replace, MRB_ARGS_REQ(1)); /* 15.2.10.5.24 */ mrb_define_method(mrb, s, "intern", mrb_str_intern, MRB_ARGS_NONE()); /* 15.2.10.5.25 */ - mrb_define_method(mrb, s, "match", noregexp, MRB_ARGS_REQ(1)); /* 15.2.10.5.27 */ mrb_define_method(mrb, s, "replace", mrb_str_replace, MRB_ARGS_REQ(1)); /* 15.2.10.5.28 */ mrb_define_method(mrb, s, "reverse", mrb_str_reverse, MRB_ARGS_NONE()); /* 15.2.10.5.29 */ mrb_define_method(mrb, s, "reverse!", mrb_str_reverse_bang, MRB_ARGS_NONE()); /* 15.2.10.5.30 */ mrb_define_method(mrb, s, "rindex", mrb_str_rindex_m, MRB_ARGS_ANY()); /* 15.2.10.5.31 */ - mrb_define_method(mrb, s, "scan", noregexp, MRB_ARGS_REQ(1)); /* 15.2.10.5.32 */ mrb_define_method(mrb, s, "slice", mrb_str_aref_m, MRB_ARGS_ANY()); /* 15.2.10.5.34 */ mrb_define_method(mrb, s, "split", mrb_str_split_m, MRB_ARGS_ANY()); /* 15.2.10.5.35 */ - mrb_define_method(mrb, s, "sub", noregexp, MRB_ARGS_REQ(1)); /* 15.2.10.5.36 */ - mrb_define_method(mrb, s, "sub!", noregexp, MRB_ARGS_REQ(1)); /* 15.2.10.5.37 */ mrb_define_method(mrb, s, "to_i", mrb_str_to_i, MRB_ARGS_ANY()); /* 15.2.10.5.38 */ mrb_define_method(mrb, s, "to_f", mrb_str_to_f, MRB_ARGS_NONE()); /* 15.2.10.5.39 */ -- cgit v1.2.3 From 9cc43a970cf84f2d16f616e7875d480797d3660f Mon Sep 17 00:00:00 2001 From: fleuria Date: Wed, 24 Jul 2013 14:05:49 +0800 Subject: introduce incremental_gc_step() --- src/gc.c | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/gc.c b/src/gc.c index cfe48df68..1dcaf4dd0 100644 --- a/src/gc.c +++ b/src/gc.c @@ -918,6 +918,20 @@ incremental_gc_until(mrb_state *mrb, enum gc_state to_state) } while (mrb->gc_state != to_state); } +static void +incremental_gc_step(mrb_state *mrb) +{ + size_t limit = 0, result = 0; + limit = (GC_STEP_SIZE/100) * mrb->gc_step_ratio; + while (result < limit) { + result += incremental_gc(mrb, limit); + if (mrb->gc_state == GC_STATE_NONE) + break; + } + + mrb->gc_threshold = mrb->live + GC_STEP_SIZE; +} + static void clear_all_old(mrb_state *mrb) { @@ -947,13 +961,7 @@ mrb_incremental_gc(mrb_state *mrb) incremental_gc_until(mrb, GC_STATE_NONE); } else { - size_t limit = 0, result = 0; - limit = (GC_STEP_SIZE/100) * mrb->gc_step_ratio; - while (result < limit) { - result += incremental_gc(mrb, limit); - if (mrb->gc_state == GC_STATE_NONE) - break; - } + incremental_gc_step(mrb); } if (mrb->gc_state == GC_STATE_NONE) { @@ -962,6 +970,7 @@ mrb_incremental_gc(mrb_state *mrb) if (mrb->gc_threshold < GC_STEP_SIZE) { mrb->gc_threshold = GC_STEP_SIZE; } + if (is_major_gc(mrb)) { mrb->majorgc_old_threshold = mrb->gc_live_after_mark/100 * DEFAULT_MAJOR_GC_INC_RATIO; mrb->gc_full = FALSE; @@ -973,10 +982,6 @@ mrb_incremental_gc(mrb_state *mrb) } } } - else { - mrb->gc_threshold = mrb->live + GC_STEP_SIZE; - } - GC_TIME_STOP_AND_REPORT; } -- cgit v1.2.3 From c852626ea73136aa148f9bca92ecc3babfd28017 Mon Sep 17 00:00:00 2001 From: fleuria Date: Wed, 24 Jul 2013 15:42:56 +0800 Subject: rename mrb_garbage_collect() to mrb_full_gc() --- include/mruby.h | 2 +- src/gc.c | 15 ++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/include/mruby.h b/include/mruby.h index 85b464b8e..af6901b52 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -272,7 +272,7 @@ mrb_value mrb_Float(mrb_state *mrb, mrb_value val); mrb_value mrb_inspect(mrb_state *mrb, mrb_value obj); mrb_bool mrb_eql(mrb_state *mrb, mrb_value obj1, mrb_value obj2); -void mrb_garbage_collect(mrb_state*); +void mrb_full_gc(mrb_state*); void mrb_incremental_gc(mrb_state *); int mrb_gc_arena_save(mrb_state*); void mrb_gc_arena_restore(mrb_state*,int); diff --git a/src/gc.c b/src/gc.c index 1dcaf4dd0..9a8fea791 100644 --- a/src/gc.c +++ b/src/gc.c @@ -175,7 +175,7 @@ mrb_realloc_simple(mrb_state *mrb, void *p, size_t len) p2 = (mrb->allocf)(mrb, p, len, mrb->ud); if (!p2 && len > 0 && mrb->heaps) { - mrb_garbage_collect(mrb); + mrb_full_gc(mrb); p2 = (mrb->allocf)(mrb, p, len, mrb->ud); } @@ -390,7 +390,7 @@ mrb_obj_alloc(mrb_state *mrb, enum mrb_vtype ttype, struct RClass *cls) static const RVALUE RVALUE_zero = { { { MRB_TT_FALSE } } }; #ifdef MRB_GC_STRESS - mrb_garbage_collect(mrb); + mrb_full_gc(mrb); #endif if (mrb->gc_threshold < mrb->live) { mrb_incremental_gc(mrb); @@ -986,11 +986,12 @@ mrb_incremental_gc(mrb_state *mrb) GC_TIME_STOP_AND_REPORT; } +/* Perform a full gc cycle */ void -mrb_garbage_collect(mrb_state *mrb) +mrb_full_gc(mrb_state *mrb) { if (mrb->gc_disabled) return; - GC_INVOKE_TIME_REPORT("mrb_garbage_collect()"); + GC_INVOKE_TIME_REPORT("mrb_full_gc()"); GC_TIME_START; if (mrb->gc_state == GC_STATE_SWEEP) { @@ -1082,7 +1083,7 @@ mrb_write_barrier(mrb_state *mrb, struct RBasic *obj) static mrb_value gc_start(mrb_state *mrb, mrb_value obj) { - mrb_garbage_collect(mrb); + mrb_full_gc(mrb); return mrb_nil_value(); } @@ -1452,8 +1453,8 @@ test_incremental_gc(void) puts("test_incremental_gc"); change_gen_gc_mode(mrb, FALSE); - puts(" in mrb_garbage_collect"); - mrb_garbage_collect(mrb); + puts(" in mrb_full_gc"); + mrb_full_gc(mrb); gc_assert(mrb->gc_state == GC_STATE_NONE); puts(" in GC_STATE_NONE"); -- cgit v1.2.3 From 0c0efc16b08237d30fc30f03033140d2844d6e74 Mon Sep 17 00:00:00 2001 From: fleuria Date: Wed, 24 Jul 2013 16:22:38 +0800 Subject: gc: replace comment "a round of GC" to "a GC cycle" --- src/gc.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/gc.c b/src/gc.c index 9a8fea791..72db02f05 100644 --- a/src/gc.c +++ b/src/gc.c @@ -42,18 +42,18 @@ There're two white color types in a flip-flop fassion: White-A and White-B, which respectively represent the Current White color (the newly allocated - objects in the current round of GC) and the Sweep Target White color (the + objects in the current GC cycle) and the Sweep Target White color (the dead objects to be swept). - A and B will be switched just at the beginning of the next round of GC. At + A and B will be switched just at the beginning of the next GC cycle. At that time, all the dead objects have been swept, while the newly created - objects in the current round of GC which finally remains White are now + objects in the current GC cycle which finally remains White are now regarded as dead objects. Instead of traversing all the White-A objects and paint them as White-B, just switch the meaning of White-A and White-B would be much cheaper. - As a result, the objects we sweep in the current round of GC are always - left from the previous round of GC. This allows us to sweep objects + As a result, the objects we sweep in the current GC cycle are always + left from the previous GC cycle. This allows us to sweep objects incrementally, without the disturbance of the newly created objects. == Execution Timing @@ -86,7 +86,7 @@ phase, then only sweep the newly created objects, and leave the Old objects live. - * Major GC - same as a full round of regular GC. + * Major GC - same as a full regular GC cycle. For details, see the comments for each function. -- cgit v1.2.3 From 88eb0f54e9f484ded22c8aca6a33351217d824e0 Mon Sep 17 00:00:00 2001 From: fleuria Date: Wed, 24 Jul 2013 18:15:22 +0800 Subject: introduce gc_mark_gray_list(), and cleanup redaunt code with it --- src/gc.c | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/gc.c b/src/gc.c index cfe48df68..bc0623be1 100644 --- a/src/gc.c +++ b/src/gc.c @@ -774,6 +774,20 @@ gc_gray_mark(mrb_state *mrb, struct RBasic *obj) return children; } + +static void +gc_mark_gray_list(mrb_state *mrb, struct RBasic **gray_list) { + struct RBasic *obj; + + while (obj = *gray_list) { + if (is_gray(obj)) { + gc_mark_children(mrb, obj); + } + *gray_list = obj->gcnext; + } +} + + static size_t incremental_marking_phase(mrb_state *mrb, size_t limit) { @@ -790,21 +804,9 @@ static void final_marking_phase(mrb_state *mrb) { mark_context_stack(mrb, mrb->root_c); - while (mrb->gray_list) { - if (is_gray(mrb->gray_list)) - gc_mark_children(mrb, mrb->gray_list); - else - mrb->gray_list = mrb->gray_list->gcnext; - } + gc_mark_gray_list(mrb, &mrb->gray_list); + gc_mark_gray_list(mrb, &mrb->variable_gray_list); gc_assert(mrb->gray_list == NULL); - mrb->gray_list = mrb->variable_gray_list; - mrb->variable_gray_list = NULL; - while (mrb->gray_list) { - if (is_gray(mrb->gray_list)) - gc_mark_children(mrb, mrb->gray_list); - else - mrb->gray_list = mrb->gray_list->gcnext; - } gc_assert(mrb->gray_list == NULL); } -- cgit v1.2.3 From 2591922ec29681d60debe23ce99237cf6ec98b18 Mon Sep 17 00:00:00 2001 From: fleuria Date: Wed, 24 Jul 2013 18:18:09 +0800 Subject: rename variable_gray_list to atomic_gray_list --- include/mruby.h | 4 ++-- src/gc.c | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/include/mruby.h b/include/mruby.h index 85b464b8e..ba9bbf58d 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -134,8 +134,8 @@ typedef struct mrb_state { enum gc_state gc_state; /* state of gc */ int current_white_part; /* make white object by white_part */ - struct RBasic *gray_list; /* list of gray objects */ - struct RBasic *variable_gray_list; /* list of objects to be traversed atomically */ + struct RBasic *gray_list; /* list of gray objects to be traversed incrementally */ + struct RBasic *atomic_gray_list; /* list of objects to be traversed atomically */ size_t gc_live_after_mark; size_t gc_threshold; int gc_interval_ratio; diff --git a/src/gc.c b/src/gc.c index bc0623be1..f335345df 100644 --- a/src/gc.c +++ b/src/gc.c @@ -664,7 +664,7 @@ root_scan_phase(mrb_state *mrb) if (!is_minor_gc(mrb)) { mrb->gray_list = NULL; - mrb->variable_gray_list = NULL; + mrb->atomic_gray_list = NULL; } mrb_gc_mark_gv(mrb); @@ -805,7 +805,7 @@ final_marking_phase(mrb_state *mrb) { mark_context_stack(mrb, mrb->root_c); gc_mark_gray_list(mrb, &mrb->gray_list); - gc_mark_gray_list(mrb, &mrb->variable_gray_list); + gc_mark_gray_list(mrb, &mrb->atomic_gray_list); gc_assert(mrb->gray_list == NULL); gc_assert(mrb->gray_list == NULL); } @@ -933,7 +933,7 @@ clear_all_old(mrb_state *mrb) mrb->is_generational_gc_mode = FALSE; prepare_incremental_sweep(mrb); incremental_gc_until(mrb, GC_STATE_NONE); - mrb->variable_gray_list = mrb->gray_list = NULL; + mrb->atomic_gray_list = mrb->gray_list = NULL; mrb->is_generational_gc_mode = origin_mode; } @@ -1064,8 +1064,8 @@ mrb_write_barrier(mrb_state *mrb, struct RBasic *obj) gc_assert(!is_dead(mrb, obj)); gc_assert(is_generational(mrb) || mrb->gc_state != GC_STATE_NONE); paint_gray(obj); - obj->gcnext = mrb->variable_gray_list; - mrb->variable_gray_list = obj; + obj->gcnext = mrb->atomic_gray_list; + mrb->atomic_gray_list = obj; } /* @@ -1372,7 +1372,7 @@ test_mrb_write_barrier(void) mrb_write_barrier(mrb, obj); gc_assert(is_gray(obj)); - gc_assert(mrb->variable_gray_list == obj); + gc_assert(mrb->atomic_gray_list == obj); puts(" fail with gray"); -- cgit v1.2.3 From 7bfdcace527f763055481727011bb8d172297f04 Mon Sep 17 00:00:00 2001 From: fleuria Date: Wed, 24 Jul 2013 18:27:23 +0800 Subject: fix warning --- src/gc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/gc.c b/src/gc.c index f335345df..22d47c6fc 100644 --- a/src/gc.c +++ b/src/gc.c @@ -779,7 +779,7 @@ static void gc_mark_gray_list(mrb_state *mrb, struct RBasic **gray_list) { struct RBasic *obj; - while (obj = *gray_list) { + while ((obj = *gray_list)) { if (is_gray(obj)) { gc_mark_children(mrb, obj); } -- cgit v1.2.3 From 4a8e89db2bb586095a43eba46edbce0e58feb55f Mon Sep 17 00:00:00 2001 From: fleuria Date: Wed, 24 Jul 2013 19:10:10 +0800 Subject: suppress the warnings from get_valid_iv_sym() The parameter iv_name SHOULD be string or symbol, but there is no garantee on it. --- src/kernel.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/kernel.c b/src/kernel.c index 4914b7285..eb123b51e 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -4,6 +4,8 @@ ** See Copyright Notice in mruby.h */ +#include + #include "mruby.h" #include "mruby/array.h" #include "mruby/class.h" @@ -549,7 +551,7 @@ obj_is_instance_of(mrb_state *mrb, mrb_value self) } static void -valid_iv_name(mrb_state *mrb, mrb_sym iv_name_id, const char* s, size_t len) +valid_iv_name(mrb_state *mrb, mrb_sym iv_name_id, const char* s, size_t len) { if (len < 2 || !(s[0] == '@' && s[1] != '@')) { mrb_name_error(mrb, iv_name_id, "`%S' is not allowed as an instance variable name", mrb_sym2str(mrb, iv_name_id)); @@ -575,7 +577,8 @@ get_valid_iv_sym(mrb_state *mrb, mrb_value iv_name) iv_name_id = mrb_intern_cstr(mrb, RSTRING_PTR(iv_name)); valid_iv_name(mrb, iv_name_id, RSTRING_PTR(iv_name), RSTRING_LEN(iv_name)); } - else if(mrb_symbol_p(iv_name)) { + else { + assert(mrb_symbol_p(iv_name)); iv_name_id = mrb_symbol(iv_name); check_iv_name(mrb, iv_name_id); } @@ -640,7 +643,7 @@ mrb_obj_ivar_get(mrb_state *mrb, mrb_value self) { mrb_sym iv_name_id; mrb_value iv_name; - + mrb_get_args(mrb, "o", &iv_name); iv_name_id = get_valid_iv_sym(mrb, iv_name); @@ -674,7 +677,7 @@ mrb_obj_ivar_set(mrb_state *mrb, mrb_value self) mrb_value iv_name, val; mrb_get_args(mrb, "oo", &iv_name, &val); - + iv_name_id = get_valid_iv_sym(mrb, iv_name); mrb_iv_set(mrb, self, iv_name_id, val); return val; -- cgit v1.2.3 From a202446c79b1f723a4717ec9a121a3657a6b6b38 Mon Sep 17 00:00:00 2001 From: Jun Hiroe Date: Wed, 24 Jul 2013 22:22:54 +0900 Subject: I fix typos in variable.c. --- src/variable.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/variable.c b/src/variable.c index 52ffb42e7..048b63bca 100644 --- a/src/variable.c +++ b/src/variable.c @@ -35,7 +35,7 @@ typedef struct iv_tbl { } iv_tbl; /* - * Creates instance variable table. + * Creates the instance variable table. * * Parameters * mrb @@ -128,7 +128,7 @@ iv_put(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value val) * mrb * t the variable table to be searched. * sym the symbol to be used as the key. - * vp the value pointer. Recieves the value if if the specified symbol contains + * vp the value pointer. Recieves the value if the specified symbol contains * in the instance variable table. * Returns * true if the specfiyed symbol contains in the instance variable table. -- cgit v1.2.3 From 4ad4ce6cafb2d408f0d539362d60ad1620698037 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Wed, 24 Jul 2013 23:31:46 +0900 Subject: restore once removed mrb_garbage_collect() --- include/mruby.h | 1 + src/gc.c | 6 ++++++ 2 files changed, 7 insertions(+) (limited to 'src') diff --git a/include/mruby.h b/include/mruby.h index 33d866bd0..70d6940a1 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -272,6 +272,7 @@ mrb_value mrb_Float(mrb_state *mrb, mrb_value val); mrb_value mrb_inspect(mrb_state *mrb, mrb_value obj); mrb_bool mrb_eql(mrb_state *mrb, mrb_value obj1, mrb_value obj2); +void mrb_garbage_collect(mrb_state*); void mrb_full_gc(mrb_state*); void mrb_incremental_gc(mrb_state *); int mrb_gc_arena_save(mrb_state*); diff --git a/src/gc.c b/src/gc.c index 7004c8c6d..c1849885b 100644 --- a/src/gc.c +++ b/src/gc.c @@ -1018,6 +1018,12 @@ mrb_full_gc(mrb_state *mrb) GC_TIME_STOP_AND_REPORT; } +void +mrb_garbage_collect(mrb_state *mrb) +{ + mrb_full_gc(mrb); +} + int mrb_gc_arena_save(mrb_state *mrb) { -- cgit v1.2.3 From 5146219cbdb47b6619640fb9386fb27bbe799183 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Wed, 24 Jul 2013 23:47:52 +0900 Subject: revise gc_mark_gray_list() not to cause SEGV on Ubuntu 32bit --- src/gc.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/gc.c b/src/gc.c index c1849885b..0a9e1c3a5 100644 --- a/src/gc.c +++ b/src/gc.c @@ -776,14 +776,14 @@ gc_gray_mark(mrb_state *mrb, struct RBasic *obj) static void -gc_mark_gray_list(mrb_state *mrb, struct RBasic **gray_list) { +gc_mark_gray_list(mrb_state *mrb) { struct RBasic *obj; - while ((obj = *gray_list)) { - if (is_gray(obj)) { - gc_mark_children(mrb, obj); - } - *gray_list = obj->gcnext; + while (mrb->gray_list) { + if (is_gray(mrb->gray_list)) + gc_mark_children(mrb, mrb->gray_list); + else + mrb->gray_list = mrb->gray_list->gcnext; } } @@ -804,9 +804,11 @@ static void final_marking_phase(mrb_state *mrb) { mark_context_stack(mrb, mrb->root_c); - gc_mark_gray_list(mrb, &mrb->gray_list); - gc_mark_gray_list(mrb, &mrb->atomic_gray_list); + gc_mark_gray_list(mrb); gc_assert(mrb->gray_list == NULL); + mrb->gray_list = mrb->atomic_gray_list; + mrb->atomic_gray_list = NULL; + gc_mark_gray_list(mrb); gc_assert(mrb->gray_list == NULL); } -- cgit v1.2.3 From 8a298605e6667bfc15a1bef49b481f35829c0717 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Wed, 24 Jul 2013 23:58:10 +0900 Subject: remove an unused local variable --- src/gc.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'src') diff --git a/src/gc.c b/src/gc.c index 0a9e1c3a5..6e05730ca 100644 --- a/src/gc.c +++ b/src/gc.c @@ -777,8 +777,6 @@ gc_gray_mark(mrb_state *mrb, struct RBasic *obj) static void gc_mark_gray_list(mrb_state *mrb) { - struct RBasic *obj; - while (mrb->gray_list) { if (is_gray(mrb->gray_list)) gc_mark_children(mrb, mrb->gray_list); -- cgit v1.2.3 From bbbe996e0da745856af543158c39a2ae6bd966de Mon Sep 17 00:00:00 2001 From: fleuria Date: Thu, 25 Jul 2013 02:29:59 +0800 Subject: replace gc_assert with mrb_assert --- src/gc.c | 109 +++++++++++++++++++++++++++++++-------------------------------- 1 file changed, 53 insertions(+), 56 deletions(-) (limited to 'src') diff --git a/src/gc.c b/src/gc.c index 6e05730ca..8569cc085 100644 --- a/src/gc.c +++ b/src/gc.c @@ -157,11 +157,8 @@ gettimeofday_time(void) #endif #ifdef GC_DEBUG -#include -#define gc_assert(expect) assert(expect) #define DEBUG(x) (x) #else -#define gc_assert(expect) ((void)0) #define DEBUG(x) #endif @@ -471,7 +468,7 @@ mark_context(mrb_state *mrb, struct mrb_context *c) static void gc_mark_children(mrb_state *mrb, struct RBasic *obj) { - gc_assert(is_gray(obj)); + mrb_assert(is_gray(obj)); paint_black(obj); mrb->gray_list = obj->gcnext; mrb_gc_mark(mrb, (struct RBasic*)obj->c); @@ -568,7 +565,7 @@ mrb_gc_mark(mrb_state *mrb, struct RBasic *obj) { if (obj == 0) return; if (!is_white(obj)) return; - gc_assert((obj)->tt != MRB_TT_FREE); + mrb_assert((obj)->tt != MRB_TT_FREE); add_gray_list(mrb, obj); } @@ -803,11 +800,11 @@ final_marking_phase(mrb_state *mrb) { mark_context_stack(mrb, mrb->root_c); gc_mark_gray_list(mrb); - gc_assert(mrb->gray_list == NULL); + mrb_assert(mrb->gray_list == NULL); mrb->gray_list = mrb->atomic_gray_list; mrb->atomic_gray_list = NULL; gc_mark_gray_list(mrb); - gc_assert(mrb->gray_list == NULL); + mrb_assert(mrb->gray_list == NULL); } static void @@ -907,7 +904,7 @@ incremental_gc(mrb_state *mrb, size_t limit) } default: /* unknown state */ - gc_assert(0); + mrb_assert(0); return 0; } } @@ -939,7 +936,7 @@ clear_all_old(mrb_state *mrb) { size_t origin_mode = mrb->is_generational_gc_mode; - gc_assert(is_generational(mrb)); + mrb_assert(is_generational(mrb)); if (is_major_gc(mrb)) { incremental_gc_until(mrb, GC_STATE_NONE); } @@ -967,7 +964,7 @@ mrb_incremental_gc(mrb_state *mrb) } if (mrb->gc_state == GC_STATE_NONE) { - gc_assert(mrb->live >= mrb->gc_live_after_mark); + mrb_assert(mrb->live >= mrb->gc_live_after_mark); mrb->gc_threshold = (mrb->gc_live_after_mark/100) * mrb->gc_interval_ratio; if (mrb->gc_threshold < GC_STEP_SIZE) { mrb->gc_threshold = GC_STEP_SIZE; @@ -1047,14 +1044,14 @@ mrb_field_write_barrier(mrb_state *mrb, struct RBasic *obj, struct RBasic *value if (!is_black(obj)) return; if (!is_white(value)) return; - gc_assert(!is_dead(mrb, value) && !is_dead(mrb, obj)); - gc_assert(is_generational(mrb) || mrb->gc_state != GC_STATE_NONE); + mrb_assert(!is_dead(mrb, value) && !is_dead(mrb, obj)); + mrb_assert(is_generational(mrb) || mrb->gc_state != GC_STATE_NONE); if (is_generational(mrb) || mrb->gc_state == GC_STATE_MARK) { add_gray_list(mrb, value); } else { - gc_assert(mrb->gc_state == GC_STATE_SWEEP); + mrb_assert(mrb->gc_state == GC_STATE_SWEEP); paint_partial_white(mrb, obj); /* for never write barriers */ } } @@ -1073,8 +1070,8 @@ mrb_write_barrier(mrb_state *mrb, struct RBasic *obj) { if (!is_black(obj)) return; - gc_assert(!is_dead(mrb, obj)); - gc_assert(is_generational(mrb) || mrb->gc_state != GC_STATE_NONE); + mrb_assert(!is_dead(mrb, obj)); + mrb_assert(is_generational(mrb) || mrb->gc_state != GC_STATE_NONE); paint_gray(obj); obj->gcnext = mrb->atomic_gray_list; mrb->atomic_gray_list = obj; @@ -1211,7 +1208,7 @@ change_gen_gc_mode(mrb_state *mrb, mrb_int enable) { if (is_generational(mrb) && !enable) { clear_all_old(mrb); - gc_assert(mrb->gc_state == GC_STATE_NONE); + mrb_assert(mrb->gc_state == GC_STATE_NONE); mrb->gc_full = FALSE; } else if (!is_generational(mrb) && enable) { @@ -1323,7 +1320,7 @@ test_mrb_field_write_barrier(void) mrb->gc_state = GC_STATE_MARK; mrb_field_write_barrier(mrb, obj, value); - gc_assert(is_gray(value)); + mrb_assert(is_gray(value)); puts(" in GC_STATE_SWEEP"); @@ -1331,8 +1328,8 @@ test_mrb_field_write_barrier(void) mrb->gc_state = GC_STATE_SWEEP; mrb_field_write_barrier(mrb, obj, value); - gc_assert(obj->color & mrb->current_white_part); - gc_assert(value->color & mrb->current_white_part); + mrb_assert(obj->color & mrb->current_white_part); + mrb_assert(value->color & mrb->current_white_part); puts(" fail with black"); @@ -1341,7 +1338,7 @@ test_mrb_field_write_barrier(void) paint_partial_white(mrb,value); mrb_field_write_barrier(mrb, obj, value); - gc_assert(obj->color & mrb->current_white_part); + mrb_assert(obj->color & mrb->current_white_part); puts(" fail with gray"); @@ -1350,7 +1347,7 @@ test_mrb_field_write_barrier(void) paint_gray(value); mrb_field_write_barrier(mrb, obj, value); - gc_assert(is_gray(value)); + mrb_assert(is_gray(value)); { @@ -1363,7 +1360,7 @@ test_mrb_field_write_barrier(void) mrb->gc_state = GC_STATE_MARK; mrb_field_write_barrier_value(mrb, obj, value); - gc_assert(is_gray(mrb_basic_ptr(value))); + mrb_assert(is_gray(mrb_basic_ptr(value))); } mrb_close(mrb); @@ -1383,15 +1380,15 @@ test_mrb_write_barrier(void) mrb->gc_state = GC_STATE_MARK; mrb_write_barrier(mrb, obj); - gc_assert(is_gray(obj)); - gc_assert(mrb->atomic_gray_list == obj); + mrb_assert(is_gray(obj)); + mrb_assert(mrb->atomic_gray_list == obj); puts(" fail with gray"); paint_gray(obj); mrb_write_barrier(mrb, obj); - gc_assert(is_gray(obj)); + mrb_assert(is_gray(obj)); mrb_close(mrb); } @@ -1404,17 +1401,17 @@ test_add_gray_list(void) puts("test_add_gray_list"); change_gen_gc_mode(mrb, FALSE); - gc_assert(mrb->gray_list == NULL); + mrb_assert(mrb->gray_list == NULL); obj1 = mrb_basic_ptr(mrb_str_new_cstr(mrb, "test")); add_gray_list(mrb, obj1); - gc_assert(mrb->gray_list == obj1); - gc_assert(is_gray(obj1)); + mrb_assert(mrb->gray_list == obj1); + mrb_assert(is_gray(obj1)); obj2 = mrb_basic_ptr(mrb_str_new_cstr(mrb, "test")); add_gray_list(mrb, obj2); - gc_assert(mrb->gray_list == obj2); - gc_assert(mrb->gray_list->gcnext == obj1); - gc_assert(is_gray(obj2)); + mrb_assert(mrb->gray_list == obj2); + mrb_assert(mrb->gray_list->gcnext == obj1); + mrb_assert(is_gray(obj2)); mrb_close(mrb); } @@ -1433,8 +1430,8 @@ test_gc_gray_mark(void) obj = (struct RBasic*)mrb->object_class; paint_gray(obj); gray_num = gc_gray_mark(mrb, obj); - gc_assert(is_black(obj)); - gc_assert(gray_num > 1); + mrb_assert(is_black(obj)); + mrb_assert(gray_num > 1); puts(" in MRB_TT_ARRAY"); obj_v = mrb_ary_new(mrb); @@ -1443,9 +1440,9 @@ test_gc_gray_mark(void) paint_partial_white(mrb, mrb_basic_ptr(value_v)); mrb_ary_push(mrb, obj_v, value_v); gray_num = gc_gray_mark(mrb, mrb_basic_ptr(obj_v)); - gc_assert(is_black(mrb_basic_ptr(obj_v))); - gc_assert(is_gray(mrb_basic_ptr(value_v))); - gc_assert(gray_num == 1); + mrb_assert(is_black(mrb_basic_ptr(obj_v))); + mrb_assert(is_gray(mrb_basic_ptr(value_v))); + mrb_assert(gray_num == 1); mrb_close(mrb); } @@ -1464,13 +1461,13 @@ test_incremental_gc(void) puts(" in mrb_full_gc"); mrb_full_gc(mrb); - gc_assert(mrb->gc_state == GC_STATE_NONE); + mrb_assert(mrb->gc_state == GC_STATE_NONE); puts(" in GC_STATE_NONE"); incremental_gc(mrb, max); - gc_assert(mrb->gc_state == GC_STATE_MARK); + mrb_assert(mrb->gc_state == GC_STATE_MARK); puts(" in GC_STATE_MARK"); incremental_gc_until(mrb, GC_STATE_SWEEP); - gc_assert(mrb->gc_state == GC_STATE_SWEEP); + mrb_assert(mrb->gc_state == GC_STATE_SWEEP); puts(" in GC_STATE_SWEEP"); page = mrb->heaps; @@ -1490,13 +1487,13 @@ test_incremental_gc(void) total += MRB_HEAP_PAGE_SIZE; } - gc_assert(mrb->gray_list == NULL); + mrb_assert(mrb->gray_list == NULL); incremental_gc(mrb, max); - gc_assert(mrb->gc_state == GC_STATE_SWEEP); + mrb_assert(mrb->gc_state == GC_STATE_SWEEP); incremental_gc(mrb, max); - gc_assert(mrb->gc_state == GC_STATE_NONE); + mrb_assert(mrb->gc_state == GC_STATE_NONE); free = (RVALUE*)mrb->heaps->freelist; while (free) { @@ -1504,30 +1501,30 @@ test_incremental_gc(void) free = (RVALUE*)free->as.free.next; } - gc_assert(mrb->live == live); - gc_assert(mrb->live == total-freed); + mrb_assert(mrb->live == live); + mrb_assert(mrb->live == total-freed); puts("test_incremental_gc(gen)"); incremental_gc_until(mrb, GC_STATE_SWEEP); change_gen_gc_mode(mrb, TRUE); - gc_assert(mrb->gc_full == FALSE); - gc_assert(mrb->gc_state == GC_STATE_NONE); + mrb_assert(mrb->gc_full == FALSE); + mrb_assert(mrb->gc_state == GC_STATE_NONE); puts(" in minor"); - gc_assert(is_minor_gc(mrb)); - gc_assert(mrb->majorgc_old_threshold > 0); + mrb_assert(is_minor_gc(mrb)); + mrb_assert(mrb->majorgc_old_threshold > 0); mrb->majorgc_old_threshold = 0; mrb_incremental_gc(mrb); - gc_assert(mrb->gc_full == TRUE); - gc_assert(mrb->gc_state == GC_STATE_NONE); + mrb_assert(mrb->gc_full == TRUE); + mrb_assert(mrb->gc_state == GC_STATE_NONE); puts(" in major"); - gc_assert(is_major_gc(mrb)); + mrb_assert(is_major_gc(mrb)); do { mrb_incremental_gc(mrb); } while (mrb->gc_state != GC_STATE_NONE); - gc_assert(mrb->gc_full == FALSE); + mrb_assert(mrb->gc_full == FALSE); mrb_close(mrb); } @@ -1542,12 +1539,12 @@ test_incremental_sweep_phase(void) add_heap(mrb); mrb->sweeps = mrb->heaps; - gc_assert(mrb->heaps->next->next == NULL); - gc_assert(mrb->free_heaps->next->next == NULL); + mrb_assert(mrb->heaps->next->next == NULL); + mrb_assert(mrb->free_heaps->next->next == NULL); incremental_sweep_phase(mrb, MRB_HEAP_PAGE_SIZE*3); - gc_assert(mrb->heaps->next == NULL); - gc_assert(mrb->heaps == mrb->free_heaps); + mrb_assert(mrb->heaps->next == NULL); + mrb_assert(mrb->heaps == mrb->free_heaps); mrb_close(mrb); } -- cgit v1.2.3 From 620e323d156378f776b9914c45d460699ebfc41f Mon Sep 17 00:00:00 2001 From: fleuria Date: Thu, 25 Jul 2013 02:51:24 +0800 Subject: replace assert with mrb_assert --- src/kernel.c | 5 ++--- src/numeric.c | 3 +-- src/parse.y | 22 +++++++++++----------- src/state.c | 8 ++------ src/vm.c | 6 +++--- 5 files changed, 19 insertions(+), 25 deletions(-) (limited to 'src') diff --git a/src/kernel.c b/src/kernel.c index eb123b51e..ce3aa89f0 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -4,8 +4,6 @@ ** See Copyright Notice in mruby.h */ -#include - #include "mruby.h" #include "mruby/array.h" #include "mruby/class.h" @@ -573,12 +571,13 @@ get_valid_iv_sym(mrb_state *mrb, mrb_value iv_name) { mrb_sym iv_name_id; + mrb_assert(mrb_symbol_p(iv_name) || mrb_string_p(iv_name)); + if (mrb_string_p(iv_name)) { iv_name_id = mrb_intern_cstr(mrb, RSTRING_PTR(iv_name)); valid_iv_name(mrb, iv_name_id, RSTRING_PTR(iv_name), RSTRING_LEN(iv_name)); } else { - assert(mrb_symbol_p(iv_name)); iv_name_id = mrb_symbol(iv_name); check_iv_name(mrb, iv_name_id); } diff --git a/src/numeric.c b/src/numeric.c index c734a595d..4d794f8d8 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -4,7 +4,6 @@ ** See Copyright Notice in mruby.h */ -#include #include #if defined(__FreeBSD__) && __FreeBSD__ < 4 # include @@ -782,7 +781,7 @@ fixdivmod(mrb_state *mrb, mrb_int x, mrb_int y, mrb_int *divp, mrb_int *modp) { mrb_int div, mod; - /* TODO: add assert(y != 0) to make sure */ + /* TODO: add mrb_assert(y != 0) to make sure */ if (y < 0) { if (x < 0) diff --git a/src/parse.y b/src/parse.y index fda66e92c..9a83d5cbd 100644 --- a/src/parse.y +++ b/src/parse.y @@ -1,6 +1,6 @@ /* ** parse.y - mruby parser -** +** ** See Copyright Notice in mruby.h */ @@ -272,7 +272,7 @@ new_scope(parser_state *p, node *body) static node* new_begin(parser_state *p, node *body) { - if (body) + if (body) return list2((node*)NODE_BEGIN, body); return cons((node*)NODE_BEGIN, 0); } @@ -909,7 +909,7 @@ parsing_heredoc_inf(parser_state *p) node *nd = p->parsing_heredoc; if (nd == NULL) return NULL; - /* assert(nd->car->car == NODE_HEREDOC); */ + /* mrb_assert(nd->car->car == NODE_HEREDOC); */ return (parser_heredoc_info*)nd->car->cdr; } @@ -2744,7 +2744,7 @@ var_ref : variable { $$ = var_reference(p, $1); } - | keyword_nil + | keyword_nil { $$ = new_nil(p); } @@ -3408,7 +3408,7 @@ scan_oct(const int *start, int len, int *retlen) const int *s = start; int retval = 0; - /* assert(len <= 3) */ + /* mrb_assert(len <= 3) */ while (len-- && *s >= '0' && *s <= '7') { retval <<= 3; retval |= *s++ - '0'; @@ -3426,7 +3426,7 @@ scan_hex(const int *start, int len, int *retlen) register int retval = 0; char *tmp; - /* assert(len <= 2) */ + /* mrb_assert(len <= 2) */ while (len-- && *s && (tmp = (char*)strchr(hexdigit, *s))) { retval <<= 4; retval |= (tmp - hexdigit) & 15; @@ -3686,7 +3686,7 @@ parse_string(parser_state *p) tokadd(p, c); - } + } tokfix(p); p->lstate = EXPR_END; @@ -3731,7 +3731,7 @@ parse_string(parser_state *p) yylval.nd = new_str(p, tok(p), toklen(p)); return tSTRING; } - + static int heredoc_identifier(parser_state *p) @@ -4813,7 +4813,7 @@ parser_yylex(parser_state *p) pushback(p, c); if (last_state == EXPR_FNAME) goto gvar; tokfix(p); - yylval.nd = new_nth_ref(p, atoi(tok(p))); + yylval.nd = new_nth_ref(p, atoi(tok(p))); return tNTH_REF; default: @@ -5176,7 +5176,7 @@ parser_state* mrb_parse_file(mrb_state *mrb, FILE *f, mrbc_context *c) { parser_state *p; - + p = mrb_parser_new(mrb); if (!p) return 0; p->s = p->send = NULL; @@ -5561,7 +5561,7 @@ parser_dump(mrb_state *mrb, node *tree, int offset) printf("NODE_CALL:\n"); parser_dump(mrb, tree->car, offset+1); dump_prefix(offset+1); - printf("method='%s' (%d)\n", + printf("method='%s' (%d)\n", mrb_sym2name(mrb, sym(tree->cdr->car)), (int)(intptr_t)tree->cdr->car); tree = tree->cdr->cdr->car; diff --git a/src/state.c b/src/state.c index 34de1e45e..5dcc4a40a 100644 --- a/src/state.c +++ b/src/state.c @@ -21,10 +21,6 @@ inspect_main(mrb_state *mrb, mrb_value mod) return mrb_str_new(mrb, "main", 4); } -#ifdef MRB_NAN_BOXING -#include -#endif - mrb_state* mrb_open_allocf(mrb_allocf f, void *ud) { @@ -33,7 +29,7 @@ mrb_open_allocf(mrb_allocf f, void *ud) mrb_state *mrb; #ifdef MRB_NAN_BOXING - assert(sizeof(void*) == 4); + mrb_assert(sizeof(void*) == 4); #endif mrb = (mrb_state *)(f)(NULL, NULL, sizeof(mrb_state), ud); @@ -192,7 +188,7 @@ mrb_value mrb_top_self(mrb_state *mrb) { if (!mrb->top_self) { - mrb->top_self = (struct RObject*)mrb_obj_alloc(mrb, MRB_TT_OBJECT, mrb->object_class); + mrb->top_self = (struct RObject*)mrb_obj_alloc(mrb, MRB_TT_OBJECT, mrb->object_class); mrb_define_singleton_method(mrb, mrb->top_self, "inspect", inspect_main, MRB_ARGS_NONE()); mrb_define_singleton_method(mrb, mrb->top_self, "to_s", inspect_main, MRB_ARGS_NONE()); } diff --git a/src/vm.c b/src/vm.c index c9e80e0ed..f3c659e50 100644 --- a/src/vm.c +++ b/src/vm.c @@ -92,12 +92,12 @@ stack_init(mrb_state *mrb) { struct mrb_context *c = mrb->c; - /* assert(mrb->stack == NULL); */ + /* mrb_assert(mrb->stack == NULL); */ c->stbase = (mrb_value *)mrb_calloc(mrb, STACK_INIT_SIZE, sizeof(mrb_value)); c->stend = c->stbase + STACK_INIT_SIZE; c->stack = c->stbase; - /* assert(ci == NULL); */ + /* mrb_assert(ci == NULL); */ c->cibase = (mrb_callinfo *)mrb_calloc(mrb, CALLINFO_INIT_SIZE, sizeof(mrb_callinfo)); c->ciend = c->cibase + CALLINFO_INIT_SIZE; c->ci = c->cibase; @@ -544,7 +544,7 @@ void mrb_gv_val_set(mrb_state *mrb, mrb_sym sym, mrb_value val); mrb_value mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) { - /* assert(mrb_proc_cfunc_p(proc)) */ + /* mrb_assert(mrb_proc_cfunc_p(proc)) */ mrb_irep *irep = proc->body.irep; mrb_code *pc = irep->iseq; mrb_value *pool = irep->pool; -- cgit v1.2.3 From 63e5a3cfb10e238eaab2a77bcc83acd0d41e60fa Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Thu, 25 Jul 2013 14:54:17 +0900 Subject: refactor out longjmp() to a function --- src/codegen.c | 12 +++++++----- src/error.c | 3 +-- src/error.h | 1 + src/vm.c | 10 ++++++++-- 4 files changed, 17 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/codegen.c b/src/codegen.c index 37176653b..5681ce03a 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -2842,13 +2842,15 @@ codegen_start(mrb_state *mrb, parser_state *p) if (p->filename) { scope->filename = p->filename; } - if (setjmp(scope->jmp) != 0) { + if (setjmp(scope->jmp) == 0) { + // prepare irep + codegen(scope, p->tree, NOVAL); + mrb_pool_close(scope->mpool); + return 0; + } + else { return -1; } - // prepare irep - codegen(scope, p->tree, NOVAL); - mrb_pool_close(scope->mpool); - return 0; } int diff --git a/src/error.c b/src/error.c index 9f3a86cc8..df4bbc866 100644 --- a/src/error.c +++ b/src/error.c @@ -5,7 +5,6 @@ */ #include -#include #include #include #include @@ -219,7 +218,7 @@ mrb_exc_raise(mrb_state *mrb, mrb_value exc) mrb_p(mrb, exc); abort(); } - longjmp(*(jmp_buf*)mrb->jmp, 1); + mrb_longjmp(mrb); } void diff --git a/src/error.h b/src/error.h index 3726cb4c4..5aa4ca374 100644 --- a/src/error.h +++ b/src/error.h @@ -14,5 +14,6 @@ mrb_value make_exception(mrb_state *mrb, int argc, mrb_value *argv, int isstr); mrb_value mrb_make_exception(mrb_state *mrb, int argc, mrb_value *argv); mrb_value mrb_format(mrb_state *mrb, const char *format, ...); void mrb_exc_print(mrb_state *mrb, struct RObject *exc); +void mrb_longjmp(mrb_state *mrb); #endif /* MRUBY_ERROR_H */ diff --git a/src/vm.c b/src/vm.c index c9e80e0ed..d4ab1af46 100644 --- a/src/vm.c +++ b/src/vm.c @@ -1,4 +1,4 @@ -/* + /* ** vm.c - virtual machine for mruby ** ** See Copyright Notice in mruby.h @@ -1261,7 +1261,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) mrb->c->stack = mrb->c->stbase + ci[1].stackidx; if (ci[1].acc < 0 && prev_jmp) { mrb->jmp = prev_jmp; - longjmp(*(jmp_buf*)mrb->jmp, 1); + mrb_longjmp(mrb); } while (eidx > ci->eidx) { ecall(mrb, --eidx); @@ -2127,3 +2127,9 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) } END_DISPATCH; } + +void +mrb_longjmp(mrb_state *mrb) +{ + longjmp(*(jmp_buf*)mrb->jmp, 1); +} -- cgit v1.2.3