diff options
| -rw-r--r-- | AUTHORS | 1 | ||||
| -rw-r--r-- | doc/compile/README.md | 4 | ||||
| -rw-r--r-- | doc/mrbgems/README.md | 3 | ||||
| -rw-r--r-- | include/mruby.h | 4 | ||||
| -rw-r--r-- | src/numeric.c | 4 | ||||
| -rw-r--r-- | src/object.c | 58 | ||||
| -rw-r--r-- | src/range.c | 7 | ||||
| -rw-r--r-- | test/t/integer.rb | 19 |
8 files changed, 61 insertions, 39 deletions
@@ -14,3 +14,4 @@ Original Authors "mruby developers" are: 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 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/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..aafd2d8fe 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,18 +319,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 +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; @@ -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: 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/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 |
