summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--AUTHORS1
-rw-r--r--doc/compile/README.md4
-rw-r--r--doc/mrbgems/README.md3
-rw-r--r--include/mruby.h4
-rw-r--r--src/numeric.c4
-rw-r--r--src/object.c58
-rw-r--r--src/range.c7
-rw-r--r--test/t/integer.rb19
8 files changed, 61 insertions, 39 deletions
diff --git a/AUTHORS b/AUTHORS
index 30ed7f571..77b96f6d2 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -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