diff options
| -rw-r--r-- | AUTHORS | 4 | ||||
| -rw-r--r-- | doc/compile/README.md | 4 | ||||
| -rw-r--r-- | doc/mrbgems/README.md | 3 | ||||
| -rw-r--r-- | include/mruby.h | 24 | ||||
| -rw-r--r-- | include/mruby/khash.h | 55 | ||||
| -rwxr-xr-x | minirake | 5 | ||||
| -rw-r--r-- | src/class.c | 60 | ||||
| -rw-r--r-- | src/codegen.c | 5 | ||||
| -rw-r--r-- | src/dump.c | 6 | ||||
| -rw-r--r-- | src/numeric.c | 4 | ||||
| -rw-r--r-- | src/object.c | 64 | ||||
| -rw-r--r-- | src/range.c | 7 | ||||
| -rw-r--r-- | src/string.c | 4 | ||||
| -rw-r--r-- | tasks/mruby_build_commands.rake | 11 | ||||
| -rw-r--r-- | tasks/mruby_build_gem.rake | 18 | ||||
| -rw-r--r-- | tasks/toolchains/androideabi.rake | 13 | ||||
| -rw-r--r-- | test/t/integer.rb | 19 |
17 files changed, 175 insertions, 131 deletions
@@ -11,3 +11,7 @@ Original Authors "mruby developers" are: Masaki Muranaka Internet Initiative Japan Inc. Tadashi FUKUZAWA + MATSUMOTO Ryosuke + Yasuhiro Matsumoto + Koji Yoshioka + Jun Hiroe diff --git a/doc/compile/README.md b/doc/compile/README.md index a244d06b2..e7f382f15 100644 --- a/doc/compile/README.md +++ b/doc/compile/README.md @@ -33,7 +33,8 @@ customized path using the *$MRUBY_CONFIG* environment variable. To compile just call ```./minirake``` inside of the mruby source root. To generate and execute the test tools call ```./minirake test```. To clean -all build files call ```./minirake clean```. +all build files call ```./minirake clean```. To see full command line on +build, call ```./minirake -v```. ## Build Configuration @@ -177,6 +178,7 @@ Integrate GEMs in the build process. conf.gem 'path/to/another/gem' +See doc/mrbgems/README.md for more option about mrbgems. ### Mrbtest Configuration Mrbtest build process. diff --git a/doc/mrbgems/README.md b/doc/mrbgems/README.md index e89fd1a56..1062adc6b 100644 --- a/doc/mrbgems/README.md +++ b/doc/mrbgems/README.md @@ -25,6 +25,9 @@ A remote GIT repository location for a GEM is also supported: conf.gem :bitbucket => 'mruby/mrbgems-example', :branch => 'master' +To pull all gems from remote GIT repository on build, call ```./minirake -p```, +or ```./minirake --pull_gems```. + NOTE: `:bitbucket` option supports only git. Hg is unsupported in this version. ## GemBox diff --git a/include/mruby.h b/include/mruby.h index b602ba8c9..e5a5f2c69 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -73,15 +73,15 @@ enum mrb_fiber_state { struct mrb_context { struct mrb_context *prev; - mrb_value *stack; + mrb_value *stack; /* stack of virtual machine */ mrb_value *stbase, *stend; mrb_callinfo *ci; mrb_callinfo *cibase, *ciend; - mrb_code **rescue; + mrb_code **rescue; /* exception handler stack */ int rsize; - struct RProc **ensure; + struct RProc **ensure; /* ensure handler stack */ int esize; uint8_t status; @@ -97,19 +97,19 @@ enum gc_state { typedef struct mrb_state { void *jmp; - mrb_allocf allocf; + mrb_allocf allocf; /* memory allocation function */ struct mrb_context *c; struct mrb_context *root_c; - struct RObject *exc; - struct iv_tbl *globals; - struct mrb_irep **irep; + struct RObject *exc; /* exception */ + struct iv_tbl *globals; /* global variable table */ + struct mrb_irep **irep; /* program data array */ size_t irep_len, irep_capa; mrb_sym init_sym; struct RObject *top_self; - struct RClass *object_class; + struct RClass *object_class; /* Object class */ struct RClass *class_class; struct RClass *module_class; struct RClass *proc_class; @@ -125,11 +125,11 @@ typedef struct mrb_state { struct RClass *symbol_class; struct RClass *kernel_module; - struct heap_page *heaps; + struct heap_page *heaps; /* heaps for GC */ struct heap_page *sweeps; struct heap_page *free_heaps; size_t live; /* count of live objects */ - struct RBasic *arena[MRB_ARENA_SIZE]; + struct RBasic *arena[MRB_ARENA_SIZE]; /* GC protection array */ int arena_idx; enum gc_state gc_state; /* state of gc */ @@ -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/include/mruby/khash.h b/include/mruby/khash.h index db8048f5a..fb11586d2 100644 --- a/include/mruby/khash.h +++ b/include/mruby/khash.h @@ -27,12 +27,14 @@ typedef khint_t khiter_t; //extern uint8_t __m[]; /* mask for flags */ -static const uint8_t __m[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; +static const uint8_t __m_empty[8] = {0x02, 0x08, 0x20, 0x80}; +static const uint8_t __m_del[8] = {0x01, 0x04, 0x10, 0x40}; +static const uint8_t __m_either[8] = {0x03, 0x0c, 0x30, 0xc0}; -#define __ac_isempty(e_flag, d_flag, i) (e_flag[(i)/8]&__m[(i)%8]) -#define __ac_isdel(e_flag, d_flag, i) (d_flag[(i)/8]&__m[(i)%8]) -#define __ac_iseither(e_flag, d_flag, i) (__ac_isempty(e_flag,d_flag,i)||__ac_isdel(e_flag,d_flag,i)) +#define __ac_isempty(ed_flag, i) (ed_flag[(i)/4]&__m_empty[(i)%4]) +#define __ac_isdel(ed_flag, i) (ed_flag[(i)/4]&__m_del[(i)%4]) +#define __ac_iseither(ed_flag, i) (ed_flag[(i)/4]&__m_either[(i)%4]) #define khash_power2(v) do { \ v--;\ v |= v >> 1;\ @@ -56,8 +58,7 @@ static const uint8_t __m[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; khint_t size; \ khint_t n_occupied; \ khint_t upper_bound; \ - uint8_t *e_flags; \ - uint8_t *d_flags; \ + uint8_t *ed_flags; \ khkey_t *keys; \ khval_t *vals; \ khint_t mask; \ @@ -96,14 +97,13 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len) void kh_alloc_##name(kh_##name##_t *h) \ { \ khint_t sz = h->n_buckets; \ + uint8_t *p = mrb_malloc(h->mrb, sizeof(uint8_t)*sz/4+(sizeof(khkey_t)+sizeof(khval_t))*sz); \ h->size = h->n_occupied = 0; \ h->upper_bound = UPPER_BOUND(sz); \ - h->e_flags = (uint8_t *)mrb_malloc(h->mrb, sizeof(uint8_t)*sz/4); \ - h->d_flags = h->e_flags + sz/8; \ - kh_fill_flags(h->e_flags, 0xff, sz/8); \ - kh_fill_flags(h->d_flags, 0x00, sz/8); \ - h->keys = (khkey_t *)mrb_malloc(h->mrb, sizeof(khkey_t)*sz); \ - h->vals = (khval_t *)mrb_malloc(h->mrb, sizeof(khval_t)*sz); \ + h->keys = (khkey_t *)p; \ + h->vals = (khval_t *)(p+sizeof(khkey_t)*sz); \ + h->ed_flags = (p+sizeof(khkey_t)*sz+sizeof(khval_t)*sz); \ + kh_fill_flags(h->ed_flags, 0xaa, sz/4); \ h->mask = sz-1; \ h->inc = sz/2-1; \ } \ @@ -124,24 +124,21 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len) { \ if (h) { \ mrb_free(h->mrb, h->keys); \ - mrb_free(h->mrb, h->vals); \ - mrb_free(h->mrb, h->e_flags); \ mrb_free(h->mrb, h); \ } \ } \ void kh_clear_##name(kh_##name##_t *h) \ { \ - if (h && h->e_flags) { \ - kh_fill_flags(h->e_flags, 0xff, h->n_buckets/8); \ - kh_fill_flags(h->d_flags, 0x00, h->n_buckets/8); \ + if (h && h->ed_flags) { \ + kh_fill_flags(h->ed_flags, 0xaa, h->n_buckets/4); \ h->size = h->n_occupied = 0; \ } \ } \ khint_t kh_get_##name(kh_##name##_t *h, khkey_t key) \ { \ khint_t k = __hash_func(h->mrb,key) & (h->mask); \ - while (!__ac_isempty(h->e_flags, h->d_flags, k)) { \ - if (!__ac_isdel(h->e_flags, h->d_flags, k)) { \ + while (!__ac_isempty(h->ed_flags, k)) { \ + if (!__ac_isdel(h->ed_flags, k)) { \ if (__hash_equal(h->mrb,h->keys[k], key)) return k; \ } \ k = (k+h->inc) & (h->mask); \ @@ -154,7 +151,7 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len) new_n_buckets = KHASH_MIN_SIZE; \ khash_power2(new_n_buckets); \ { \ - uint8_t *old_e_flags = h->e_flags; \ + uint8_t *old_ed_flags = h->ed_flags; \ khkey_t *old_keys = h->keys; \ khval_t *old_vals = h->vals; \ khint_t old_n_buckets = h->n_buckets; \ @@ -163,14 +160,12 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len) kh_alloc_##name(h); \ /* relocate */ \ for (i=0 ; i<old_n_buckets ; i++) { \ - if (!__ac_isempty(old_e_flags, old_d_flags, i)) { \ + if (!__ac_iseither(old_ed_flags, i)) { \ khint_t k = kh_put_##name(h, old_keys[i]); \ kh_value(h,k) = old_vals[i]; \ } \ } \ - mrb_free(h->mrb, old_e_flags); \ mrb_free(h->mrb, old_keys); \ - mrb_free(h->mrb, old_vals); \ } \ } \ khint_t kh_put_##name(kh_##name##_t *h, khkey_t key) \ @@ -180,27 +175,27 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len) kh_resize_##name(h, h->n_buckets*2); \ } \ k = __hash_func(h->mrb,key) & (h->mask); \ - while (!__ac_iseither(h->e_flags, h->d_flags, k)) { \ + while (!__ac_iseither(h->ed_flags, k)) { \ if (__hash_equal(h->mrb,h->keys[k], key)) break; \ k = (k+h->inc) & (h->mask); \ } \ - if (__ac_isempty(h->e_flags, h->d_flags, k)) { \ + if (__ac_isempty(h->ed_flags, k)) { \ /* put at empty */ \ h->keys[k] = key; \ - h->e_flags[k/8] &= ~__m[k%8]; \ + h->ed_flags[k/4] &= ~__m_empty[k%4]; \ h->size++; \ h->n_occupied++; \ - } else if (__ac_isdel(h->e_flags, h->d_flags, k)) { \ + } else if (__ac_isdel(h->ed_flags, k)) { \ /* put at del */ \ h->keys[k] = key; \ - h->d_flags[k/8] &= ~__m[k%8]; \ + h->ed_flags[k/4] &= ~__m_del[k%4]; \ h->size++; \ } \ return k; \ } \ void kh_del_##name(kh_##name##_t *h, khint_t x) \ { \ - h->d_flags[x/8] |= __m[x%8]; \ + h->ed_flags[x/4] |= __m_del[x%4]; \ h->size--; \ } \ kh_##name##_t *kh_copy_##name(mrb_state *mrb, kh_##name##_t *h) \ @@ -231,7 +226,7 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len) #define kh_del(name, h, k) kh_del_##name(h, k) #define kh_copy(name, mrb, h) kh_copy_##name(mrb, h) -#define kh_exist(h, x) (!__ac_iseither((h)->e_flags, (h)->d_flags, (x))) +#define kh_exist(h, x) (!__ac_iseither((h)->ed_flags, (x))) #define kh_key(h, x) ((h)->keys[x]) #define kh_val(h, x) ((h)->vals[x]) #define kh_value(h, x) ((h)->vals[x]) @@ -317,6 +317,8 @@ class RakeApp "Require MODULE before executing rakefile."], ['--tasks', '-T', GetoptLong::NO_ARGUMENT, "Display the tasks and dependencies, then exit."], + ['--pull_gems','-p', GetoptLong::NO_ARGUMENT, + "Pull all git mrbgems."], ['--trace', '-t', GetoptLong::NO_ARGUMENT, "Turn on invoke/execute tracing."], ['--usage', '-h', GetoptLong::NO_ARGUMENT, @@ -401,6 +403,8 @@ class RakeApp require value when '--tasks' $show_tasks = true + when '--pull_gems' + $pull_gems = true when '--trace' $trace = true when '--usage' @@ -419,6 +423,7 @@ class RakeApp # Read and handle the command line options. def handle_options $verbose = false + $pull_gems = false opts = GetoptLong.new(*command_line_options) opts.each { |opt, value| do_option(opt, value) } end diff --git a/src/class.c b/src/class.c index e33ab0153..291642654 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* @@ -377,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, ...) @@ -909,6 +909,12 @@ mrb_mod_module_eval(mrb_state *mrb, mrb_value mod) } 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) { struct RBasic *obj; @@ -1075,6 +1081,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); } @@ -1140,14 +1147,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); @@ -1160,7 +1165,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(); } @@ -1416,10 +1421,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(); } @@ -1910,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()); diff --git a/src/codegen.c b/src/codegen.c index 091561b45..e240995e5 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; @@ -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; 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; } 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) { diff --git a/src/object.c b/src/object.c index 50f2c3ab9..c09ae3072 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 */ @@ -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(); } @@ -319,18 +313,18 @@ 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 -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 +338,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; @@ -355,8 +349,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 +494,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 +524,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 +540,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 +555,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: 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) */ 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'; } /* diff --git a/tasks/mruby_build_commands.rake b/tasks/mruby_build_commands.rake index 1d69fa54d..b678b1f0e 100644 --- a/tasks/mruby_build_commands.rake +++ b/tasks/mruby_build_commands.rake @@ -220,19 +220,28 @@ module MRuby class Command::Git < Command attr_accessor :flags - attr_accessor :clone_options + attr_accessor :clone_options, :pull_options def initialize(build) super @command = 'git' @flags = [] @clone_options = "clone %{flags} %{url} %{dir}" + @pull_options = "pull" end def run_clone(dir, url, _flags = []) _pp "GIT", url, dir.relative_path _run clone_options, { :flags => [flags, _flags].flatten.join(' '), :url => url, :dir => filename(dir) } end + + def run_pull(dir, url) + root = Dir.pwd + Dir.chdir dir + _pp "GIT PULL", url, dir.relative_path + _run pull_options + Dir.chdir root + end end class Command::Mrbc < Command diff --git a/tasks/mruby_build_gem.rake b/tasks/mruby_build_gem.rake index 870ccfa57..975b032a6 100644 --- a/tasks/mruby_build_gem.rake +++ b/tasks/mruby_build_gem.rake @@ -40,13 +40,19 @@ module MRuby elsif params[:git] url = params[:git] gemdir = "build/mrbgems/#{url.match(/([-\w]+)(\.[-\w]+|)$/).to_a[1]}" - return gemdir if File.exists?(gemdir) - options = [params[:options]] || [] - options << "--branch \"#{params[:branch]}\"" if params[:branch] - - FileUtils.mkdir_p "build/mrbgems" - git.run_clone gemdir, url, options + if File.exists?(gemdir) + if $pull_gems + git.run_pull gemdir, url + else + gemdir + end + else + options = [params[:options]] || [] + options << "--branch \"#{params[:branch]}\"" if params[:branch] + FileUtils.mkdir_p "build/mrbgems" + git.run_clone gemdir, url, options + end else fail "unknown gem option #{params}" end diff --git a/tasks/toolchains/androideabi.rake b/tasks/toolchains/androideabi.rake index a69fd1a9d..51897667e 100644 --- a/tasks/toolchains/androideabi.rake +++ b/tasks/toolchains/androideabi.rake @@ -41,20 +41,21 @@ MRuby::Toolchain.new(:androideabi) do |conf| end if ANDROID_STANDALONE_TOOLCHAIN == nil then - if RUBY_PLATFORM.include?('darwin') then + case RUBY_PLATFORM + when /cygwin|mswin|mingw|bccwin|wince|emx/i + HOST_PLATFORM = 'windows' + when /darwin/i HOST_PLATFORM = 'darwin-x86' - elsif RUBY_PLATFORM.include?('linux') then + when /linux/i HOST_PLATFORM = 'linux-x86' - elsif RUBY_PLATFORM.include?('win') then - HOST_PLATFORM = 'windows' else - # Unknown host platform. + # Unknown host platform end ANDROID_TARGET_PLATFORM = ENV['ANDROID_TARGET_PLATFORM'] || DEFAULT_ANDROID_TARGET_PLATFORM path_to_toolchain = ANDROID_NDK_HOME + '/toolchains/' - path_to_sysroot = ANDROID_NDK_HOME + '/platforms/' + ANDROID_TARGET_PLATFORM + path_to_sysroot = ANDROID_NDK_HOME + '/platforms/' + ANDROID_TARGET_PLATFORM if ANDROID_TOOLCHAIN.downcase == 'gcc' then case ANDROID_TARGET_ARCH.downcase when 'arch-arm', 'arm' then diff --git a/test/t/integer.rb b/test/t/integer.rb index 46011f94a..9b19216d9 100644 --- a/test/t/integer.rb +++ b/test/t/integer.rb @@ -104,6 +104,14 @@ assert('Integer#<<', '15.2.8.3.12') do # 00010111 (23) # = 00101110 (46) assert_equal 23 << 1, 46 + + # Left Shift by a negative is Right Shift + assert_equal 46 << -1, 23 + + # Raise when shift is too large + assert_raise(RangeError) do + 2 << 128 + end end assert('Integer#>>', '15.2.8.3.13') do @@ -111,6 +119,17 @@ assert('Integer#>>', '15.2.8.3.13') do # 00101110 (46) # = 00010111 (23) assert_equal 46 >> 1, 23 + + # Right Shift by a negative is Left Shift + assert_equal 23 >> -1, 46 + + # Don't raise on large Right Shift + assert_equal 23 >> 128, 0 + + # Raise when shift is too large + assert_raise(RangeError) do + 2 >> -128 + end end assert('Integer#ceil', '15.2.8.3.14') do |
