summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--AUTHORS4
-rw-r--r--doc/compile/README.md4
-rw-r--r--doc/mrbgems/README.md3
-rw-r--r--include/mruby.h24
-rw-r--r--include/mruby/khash.h55
-rwxr-xr-xminirake5
-rw-r--r--src/class.c60
-rw-r--r--src/codegen.c5
-rw-r--r--src/dump.c6
-rw-r--r--src/numeric.c4
-rw-r--r--src/object.c64
-rw-r--r--src/range.c7
-rw-r--r--src/string.c4
-rw-r--r--tasks/mruby_build_commands.rake11
-rw-r--r--tasks/mruby_build_gem.rake18
-rw-r--r--tasks/toolchains/androideabi.rake13
-rw-r--r--test/t/integer.rb19
17 files changed, 175 insertions, 131 deletions
diff --git a/AUTHORS b/AUTHORS
index 17fe246de..77b96f6d2 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -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])
diff --git a/minirake b/minirake
index f41b9b587..69d447a15 100755
--- a/minirake
+++ b/minirake
@@ -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