From a334cdc7afe285fbd0ed7f3c8ff6974528813552 Mon Sep 17 00:00:00 2001 From: Jon Date: Fri, 1 Jun 2012 11:12:07 -0400 Subject: Update CMake to enable normal Xcode workflows Similar to the existing CMake Visual Studio IDE support, allow CMake to generate Xcode project files in mruby's root directory. This enables workflows normally expected by Xcode IDE users. --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ee97ad8b4..8e176c08a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,8 +33,8 @@ project(mruby C) # TODO stop polluting source tree with CMakeFiles/ and CMakeCache.txt # on build location check failure # Make sure we are not trying to generate in in-tree build unless building -# with a MSVC IDE where it's OK. -if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR AND NOT MSVC_IDE) +# with an MSVC or Xcode IDE where it's OK. +if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR AND NOT (MSVC_IDE OR XCODE)) message(FATAL_ERROR "\nIn-source builds are not allowed as CMake would overwrite the " "Makefiles distributed with mruby. Please change to the 'build' " -- cgit v1.2.3 From 84207b2e0f14d2a8fd1ccc435b0c27f30b2ecce8 Mon Sep 17 00:00:00 2001 From: Jon Date: Fri, 1 Jun 2012 11:20:28 -0400 Subject: Update in-source build error message --- CMakeLists.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8e176c08a..c8b252d2d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,8 +37,9 @@ project(mruby C) if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR AND NOT (MSVC_IDE OR XCODE)) message(FATAL_ERROR "\nIn-source builds are not allowed as CMake would overwrite the " - "Makefiles distributed with mruby. Please change to the 'build' " - "subdirectory and run CMake from there.") + "Makefiles distributed with mruby. Delete any created 'CMakeFiles' " + "subdirectory and 'CMakeCache.txt' file from the current directory, " + "change to the 'build' subdirectory, and re-run CMake from there.") endif() if(COMMAND cmake_policy) -- cgit v1.2.3 From 49df2179578c34caefbe693a0eb74facb3ff9679 Mon Sep 17 00:00:00 2001 From: takahashim Date: Sat, 2 Jun 2012 01:14:45 +0900 Subject: use mrb_malloc instead of malloc --- src/struct.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/struct.c b/src/struct.c index d06124b50..fbe018930 100644 --- a/src/struct.c +++ b/src/struct.c @@ -416,7 +416,7 @@ mrb_struct_initialize_withArg(mrb_state *mrb, int argc, mrb_value *argv, mrb_val mrb_raise(mrb, E_ARGUMENT_ERROR, "struct size differs"); } st = RSTRUCT(self); - st->ptr = malloc(sizeof(mrb_value)*argc); + st->ptr = mrb_malloc(mrb, sizeof(mrb_value)*argc); st->len = n; memcpy(st->ptr, argv, sizeof(mrb_value)*argc); //if (n > argc) { -- cgit v1.2.3 From cb10b927836fcc56fc40e677497cc303e79625c5 Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Sat, 2 Jun 2012 01:33:04 +0800 Subject: Add Test Case for issue #210 --- test/t/module.rb | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/test/t/module.rb b/test/t/module.rb index 854be75a5..a5331e96d 100644 --- a/test/t/module.rb +++ b/test/t/module.rb @@ -5,6 +5,53 @@ assert('Module', '15.2.2') do Module.class == Class end +assert('Module#const_defined?', '15.2.2.4.20') do + module Test4ConstDefined + Const4Test4ConstDefined = true + end + + Test4ConstDefined.const_defined?(:Const4Test4ConstDefined) and + not Test4ConstDefined.const_defined?(:NotExisting) +end + +assert('Module#const_get', '15.2.2.4.21') do + module Test4ConstGet + Const4Test4ConstGet = 42 + end + + Test4ConstGet.const_get(:Const4Test4ConstGet) == 42 +end + +assert('Module.const_missing', '15.2.2.4.22') do + e1 = nil + + module Test4ConstMissing + def const_missing(sym) + # ATM this redirect doesn't work + puts "PLEASE GO TO TEST CASE Module.const_missing!" + puts "IT IS WORKING NOW!! PLEASE FINALIZE." + puts "Thanks :)" + end + end + + begin + Test4ConstMissing.const_get(:ConstDoesntExist) + rescue => e2 + e1 = e2 + end + + e1.class == NameError +end + +assert('Module#const_get', '15.2.2.4.23') do + module Test4ConstSet + Const4Test4ConstSet = 42 + end + + Test4ConstSet.const_set(:Const4Test4ConstSet, 23) + Test4ConstSet.const_get(:Const4Test4ConstSet) == 23 +end + # TODO not implemented ATM assert('Module.constants', '15.2.2') do # TODO not implemented ATM assert('Module.nesting', '15.2.2') do -- cgit v1.2.3 From 8804c7db6585d7cf3eda735f4758007704f237af Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Sat, 2 Jun 2012 01:39:53 +0800 Subject: Add Test Case for issue #211 --- test/t/kernel.rb | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/test/t/kernel.rb b/test/t/kernel.rb index cd1f2d99e..847f1baeb 100644 --- a/test/t/kernel.rb +++ b/test/t/kernel.rb @@ -112,7 +112,17 @@ assert('Kernel#respond_to?', '15.3.1.2.43') do respond_to? :nil? end -# TODO at the moment doesn't comply to ISO assert('Kernel#send', '15.3.1.2.44') do +assert('Kernel#send', '15.3.1.2.44') do + # test with block + l = send(:lambda) do + true + end + l.call and l.class == Proc and + # test with argument + send(:respond_to?, :nil?) and + # test without argument and without block + send(:public_methods).class == Array +end assert('Kernel#singleton_methods', '15.3.1.2.45') do singleton_methods.class == Array -- cgit v1.2.3 From 703e97d5b35ab9ed5e7798729b9034924cd216b9 Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Fri, 1 Jun 2012 11:26:12 +0900 Subject: Use "if" instead "switch". --- src/codegen.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/codegen.c b/src/codegen.c index 505f0ad5b..20799f9ae 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -208,23 +208,19 @@ genop_peep(codegen_scope *s, mrb_code i, int val) case OP_SETCV: case OP_SETCONST: case OP_SETMCNST: - switch (c0) { - case OP_MOVE: + if (c0 == OP_MOVE) { if (GETARG_A(i) == GETARG_A(i0)) { s->iseq[s->pc-1] = MKOP_ABx(c1, GETARG_B(i0), GETARG_Bx(i)); return; } - break; } break; case OP_SETUPVAR: - switch (c0) { - case OP_MOVE: + if (c0 == OP_MOVE) { if (GETARG_A(i) == GETARG_A(i0)) { s->iseq[s->pc-1] = MKOP_ABC(c1, GETARG_B(i0), GETARG_B(i), GETARG_C(i)); return; } - break; } break; case OP_EPOP: -- cgit v1.2.3 From e473ce1ac4cd2d08f25a5f4eee7e64db99f7f2e4 Mon Sep 17 00:00:00 2001 From: Yuichiro MASUI Date: Sat, 2 Jun 2012 17:00:11 +0900 Subject: fixed const_get && const_missing issue --- src/variable.c | 35 ++++++----------------------------- 1 file changed, 6 insertions(+), 29 deletions(-) diff --git a/src/variable.c b/src/variable.c index 82ab7bef3..941e7689d 100644 --- a/src/variable.c +++ b/src/variable.c @@ -186,7 +186,7 @@ mrb_vm_cv_set(mrb_state *mrb, mrb_sym sym, mrb_value v) if (k != kh_end(h)) { k = kh_put(iv, h, sym); kh_value(h, k) = v; - return; + return; } } c = c->super; @@ -233,26 +233,8 @@ const_get(mrb_state *mrb, struct RClass *base, mrb_sym sym) struct RClass *c = base; khash_t(iv) *h; khiter_t k; + mrb_sym cm = mrb_intern(mrb, "const_missing"); - if (c->iv) { - h = c->iv; - k = kh_get(iv, h, sym); - if (k != kh_end(h)) { - return kh_value(h, k); - } - } - for (;;) { - c = mrb_class_outer_module(mrb, c); - if (!c) break; - if (c->iv) { - h = c->iv; - k = kh_get(iv, h, sym); - if (k != kh_end(h)) { - return kh_value(h, k); - } - } - } - c = base->super; while (c) { if (c->iv) { h = c->iv; @@ -260,19 +242,14 @@ const_get(mrb_state *mrb, struct RClass *base, mrb_sym sym) if (k != kh_end(h)) { return kh_value(h, k); } + if (mrb_respond_to(mrb, mrb_obj_value(c), cm)) { + mrb_value argv = mrb_symbol_value(sym); + return mrb_funcall_argv(mrb, mrb_obj_value(c), "const_missing", 1, &argv); + } } c = c->super; } - if (!c) { - c = mrb->object_class; - } - - if (mrb_respond_to(mrb, mrb_obj_value(c), mrb_intern(mrb, "const_missing"))) { - mrb_value argv = mrb_symbol_value(sym); - return mrb_funcall_argv(mrb, mrb_obj_value(c), "const_missing", 1, &argv); - } - mrb_raise(mrb, E_NAME_ERROR, "uninitialized constant %s", mrb_sym2name(mrb, sym)); /* not reached */ -- cgit v1.2.3 From c5717476ab3db383fa84a265f886aa1e4ce5bba6 Mon Sep 17 00:00:00 2001 From: Yuichiro MASUI Date: Sat, 2 Jun 2012 17:09:12 +0900 Subject: Could you add me to AUTHORS? --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index c64e1846d..46d3e22f1 100644 --- a/AUTHORS +++ b/AUTHORS @@ -6,3 +6,4 @@ Original Authors "mruby developers" are: Daniel Bovensiepen Jon Maken Bjorn De Meyer + Yuichiro MASUI -- cgit v1.2.3 From e65d4938f373132f2ab5c75533e0bd18e188f9bc Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sat, 2 Jun 2012 17:25:18 +0900 Subject: 'mrb_sym' used as 'uint32_t'. it's broken portability; based on the work from @crimsonwoods; close #216 --- src/class.c | 4 ++-- src/kernel.c | 4 ++-- src/variable.c | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/class.c b/src/class.c index b13ab2288..9424e8d84 100644 --- a/src/class.c +++ b/src/class.c @@ -17,8 +17,8 @@ #include "mruby/khash.h" -KHASH_MAP_INIT_INT(mt, struct RProc*); -KHASH_MAP_INIT_INT(iv, mrb_value); +KHASH_INIT(mt, mrb_sym, struct RProc*, 1, kh_int_hash_func, kh_int_hash_equal) +KHASH_INIT(iv, mrb_sym, mrb_value, 1, kh_int_hash_func, kh_int_hash_equal) typedef struct fc_result { mrb_sym name; diff --git a/src/kernel.c b/src/kernel.c index 9092d239d..15a4158a4 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -39,8 +39,8 @@ typedef enum { #include "regint.h" #endif -KHASH_MAP_INIT_INT(mt, struct RProc*); -KHASH_MAP_INIT_INT(iv, mrb_value); +KHASH_INIT(mt, mrb_sym, struct RProc*, 1, kh_int_hash_func, kh_int_hash_equal) +KHASH_INIT(iv, mrb_sym, mrb_value, 1, kh_int_hash_func, kh_int_hash_equal) #ifndef FALSE #define FALSE 0 diff --git a/src/variable.c b/src/variable.c index 82ab7bef3..a17484903 100644 --- a/src/variable.c +++ b/src/variable.c @@ -19,7 +19,7 @@ #include "st.h" #endif -KHASH_MAP_INIT_INT(iv, mrb_value); +KHASH_INIT(iv, mrb_sym, mrb_value, 1, kh_int_hash_func, kh_int_hash_equal) #ifndef FALSE #define FALSE 0 -- cgit v1.2.3 From 6ec149c4e3da3b991a860250b32ca79775639592 Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Sat, 2 Jun 2012 16:44:16 +0800 Subject: Add string test for string interpolation --- test/t/string.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/t/string.rb b/test/t/string.rb index f38790c17..ee969a696 100644 --- a/test/t/string.rb +++ b/test/t/string.rb @@ -319,3 +319,11 @@ assert('String#upcase!', '15.2.10.5.43') do a == 'ABC' end + +# Not ISO specified + +assert('String interpolation (mrb_str_concat for shared strings)') do + a = "A" * 32 + "#{a}:" == "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA:" +end + -- cgit v1.2.3 From aeffe3f712ac9622f8e8a451bfb2d6100f89b413 Mon Sep 17 00:00:00 2001 From: Frank Celler Date: Sat, 2 Jun 2012 11:54:14 +0200 Subject: fixed prototype: g++ will complain about definition not being a prototype, should work with GCC and VC as well --- include/mruby.h | 8 ++++---- include/mruby/variable.h | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/include/mruby.h b/include/mruby.h index 3bbc6e6cc..777683ccd 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -147,7 +147,7 @@ mrb_obj_value(void *p) } static inline mrb_value -mrb_false_value() +mrb_false_value(void) { mrb_value v; @@ -157,7 +157,7 @@ mrb_false_value() } static inline mrb_value -mrb_nil_value() +mrb_nil_value(void) { mrb_value v; @@ -167,7 +167,7 @@ mrb_nil_value() } static inline mrb_value -mrb_true_value() +mrb_true_value(void) { mrb_value v; @@ -177,7 +177,7 @@ mrb_true_value() } static inline mrb_value -mrb_undef_value() +mrb_undef_value(void) { mrb_value v; diff --git a/include/mruby/variable.h b/include/mruby/variable.h index 880d6217e..400dd50b0 100644 --- a/include/mruby/variable.h +++ b/include/mruby/variable.h @@ -14,8 +14,8 @@ extern "C" { typedef struct global_variable { int counter; mrb_value *data; - mrb_value (*getter)(); - void (*setter)(); + mrb_value (*getter)(void); + void (*setter)(void); //void (*marker)(); //int block_trace; //struct trace_var *trace; -- cgit v1.2.3 From 231cb59566752ef3f742307e2b7108a51f6b6c7e Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sat, 2 Jun 2012 19:01:00 +0900 Subject: Array#reverse revisited --- src/array.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/array.c b/src/array.c index 187a8404d..eaead08b3 100644 --- a/src/array.c +++ b/src/array.c @@ -317,7 +317,16 @@ mrb_ary_reverse_bang(mrb_state *mrb, mrb_value self) struct RArray *a = mrb_ary_ptr(self); if (a->len > 1) { - ary_reverse(a); + mrb_value *p1, *p2; + + p1 = a->buf; + p2 = a->buf + a->len - 1; + + while(p1 < p2) { + mrb_value tmp = *p1; + *p1++ = *p2; + *p2-- = tmp; + } } return self; } @@ -325,13 +334,21 @@ mrb_ary_reverse_bang(mrb_state *mrb, mrb_value self) mrb_value mrb_ary_reverse(mrb_state *mrb, mrb_value self) { - struct RArray *a = mrb_ary_ptr(self); + struct RArray *a = mrb_ary_ptr(self), *b; mrb_value ary; ary = mrb_ary_new_capa(mrb, a->len); + b = mrb_ary_ptr(ary); if (a->len > 0) { - mrb_ary_replace(mrb, mrb_ary_ptr(ary), a->buf, a->len); - ary_reverse(mrb_ary_ptr(ary)); + mrb_value *p1, *p2, *e; + + p1 = a->buf; + e = p1 + a->len; + p2 = b->buf + a->len - 1; + while(p1 < e) { + *p2-- = *p1++; + } + b->len = a->len; } return ary; } -- cgit v1.2.3 From a3d00a902a64047de8b489952e78230716b7aa6b Mon Sep 17 00:00:00 2001 From: Frank Celler Date: Sat, 2 Jun 2012 12:04:08 +0200 Subject: fixed prototype: g++ will complain about definition not being a prototype, should work with GCC and VC as well --- src/symbol.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/symbol.c b/src/symbol.c index aa5b659fa..d09833689 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -188,8 +188,7 @@ sym_to_sym(mrb_state *mrb, mrb_value sym) #define is_identchar(c) (SIGN_EXTEND_CHAR(c)!=-1&&(ISALNUM(c) || (c) == '_')) static int -is_special_global_name(m) - const char *m; +is_special_global_name(const char* m) { switch (*m) { case '~': case '*': case '$': case '?': case '!': case '@': -- cgit v1.2.3 From c3e0aedece10344a6b3288e0e036273f6d5ba4ba Mon Sep 17 00:00:00 2001 From: Frank Celler Date: Sat, 2 Jun 2012 12:09:43 +0200 Subject: export exception handling --- include/mruby.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/include/mruby.h b/include/mruby.h index 777683ccd..70bbdf3c2 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -416,6 +416,9 @@ mrb_value mrb_check_funcall(mrb_state *mrb, mrb_value recv, mrb_sym mid, int arg #define ISXDIGIT(c) (ISASCII(c) && isxdigit((int)(unsigned char)(c))) #endif +mrb_value mrb_exc_new(mrb_state *mrb, struct RClass *c, const char *ptr, long len); +void mrb_exc_raise(mrb_state *mrb, mrb_value exc); + int mrb_block_given_p(void); void mrb_raise(mrb_state *mrb, struct RClass *c, const char *fmt, ...); void rb_raise(struct RClass *c, const char *fmt, ...); -- cgit v1.2.3 From ca4de06e60c684fca8892623c18631165f191442 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sat, 2 Jun 2012 21:05:33 +0900 Subject: avoid using mrb_value in Array#+ --- src/array.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/array.c b/src/array.c index eaead08b3..27e8e9aba 100644 --- a/src/array.c +++ b/src/array.c @@ -191,15 +191,16 @@ mrb_ary_plus(mrb_state *mrb, mrb_value self) { struct RArray *a1 = mrb_ary_ptr(self); struct RArray *a2; - mrb_value other; mrb_value ary; + mrb_value *buf; + int blen; - mrb_get_args(mrb, "A", &other); - ary = mrb_ary_new_capa(mrb, a1->len + RARRAY_LEN(other)); + mrb_get_args(mrb, "a", &buf, &blen); + ary = mrb_ary_new_capa(mrb, a1->len + blen); a2 = mrb_ary_ptr(ary); memcpy(a2->buf, a1->buf, sizeof(mrb_value)*a1->len); - memcpy(a2->buf + a1->len, RARRAY_PTR(other), sizeof(mrb_value)*RARRAY_LEN(other)); - a2->len = a1->len + RARRAY_LEN(other); + memcpy(a2->buf + a1->len, buf, sizeof(mrb_value)*blen); + a2->len = a1->len + blen; return ary; } -- cgit v1.2.3 From 3e9fc0b013ae0715aa5ff91e298d1baf3ca87bae Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sat, 2 Jun 2012 21:07:50 +0900 Subject: add proper type check (using mrb_get_args) in Array#replace --- src/array.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/array.c b/src/array.c index 27e8e9aba..4126cc7b5 100644 --- a/src/array.c +++ b/src/array.c @@ -261,10 +261,11 @@ mrb_ary_replace(mrb_state *mrb, struct RArray *a, mrb_value *argv, size_t len) mrb_value mrb_ary_replace_m(mrb_state *mrb, mrb_value self) { - mrb_value other; + mrb_value *buf; + int blen; - mrb_get_args(mrb, "o", &other); - mrb_ary_replace(mrb, mrb_ary_ptr(self), RARRAY_PTR(other), RARRAY_LEN(other)); + mrb_get_args(mrb, "a", &buf, &blen); + mrb_ary_replace(mrb, mrb_ary_ptr(self), buf, blen); return self; } -- cgit v1.2.3 From 687ec8e65ce42bef9734e10fc4b245e7007b84f4 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sat, 2 Jun 2012 21:08:25 +0900 Subject: remove ary_reverse that no longer used --- src/array.c | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/array.c b/src/array.c index 4126cc7b5..0a45f9ce3 100644 --- a/src/array.c +++ b/src/array.c @@ -298,21 +298,6 @@ mrb_ary_times(mrb_state *mrb, mrb_value self) return ary; } -static void -ary_reverse(struct RArray *a) -{ - mrb_value *p1, *p2; - - p1 = a->buf; - p2 = a->buf + a->len - 1; - - while(p1 < p2) { - mrb_value tmp = *p1; - *p1++ = *p2; - *p2-- = tmp; - } -} - mrb_value mrb_ary_reverse_bang(mrb_state *mrb, mrb_value self) { -- cgit v1.2.3 From c0c712d33b180aa0be5808577af5f6ee9016e4d7 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sat, 2 Jun 2012 21:17:14 +0900 Subject: small refactoring around Array#concat --- src/array.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/array.c b/src/array.c index 0a45f9ce3..1ca6eaf1c 100644 --- a/src/array.c +++ b/src/array.c @@ -163,26 +163,33 @@ mrb_ary_s_create(mrb_state *mrb, mrb_value self) return mrb_ary_new_from_values(mrb, (size_t)len, vals); } +static void +ary_concat(mrb_state *mrb, struct RArray *a, mrb_value *buf, size_t blen) +{ + size_t len = a->len + blen; + + if (a->capa < len) mrb_ary_expand_capa(mrb, a, len); + memcpy(a->buf+a->len, buf, sizeof(mrb_value)*blen); + mrb_write_barrier(mrb, (struct RBasic*)a); + a->len = len; +} + void mrb_ary_concat(mrb_state *mrb, mrb_value self, mrb_value other) { - struct RArray *a1 = mrb_ary_ptr(self); struct RArray *a2 = mrb_ary_ptr(other); - size_t len = a1->len + a2->len; - if (a1->capa < len) mrb_ary_expand_capa(mrb, a1, len); - memcpy(a1->buf+a1->len, a2->buf, sizeof(mrb_value)*a2->len); - mrb_write_barrier(mrb, (struct RBasic*)a1); - a1->len = len; + ary_concat(mrb, mrb_ary_ptr(self), a2->buf, a2->len); } mrb_value mrb_ary_concat_m(mrb_state *mrb, mrb_value self) { - mrb_value other; + mrb_value *buf; + int blen; - mrb_get_args(mrb, "A", &other); - mrb_ary_concat(mrb, self, other); + mrb_get_args(mrb, "a", &buf, &blen); + ary_concat(mrb, mrb_ary_ptr(self), buf, blen); return self; } -- cgit v1.2.3 From 0e46f49aaafe0ff8b9f0616ea50d0b17df966c12 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sat, 2 Jun 2012 21:26:30 +0900 Subject: changed prototype mrb_ary_replace to (mrb_state*,mrb_value,mrb_value) --- include/mruby/array.h | 3 +-- src/array.c | 19 +++++++++++++------ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/include/mruby/array.h b/include/mruby/array.h index e2acee535..17b26fc07 100644 --- a/include/mruby/array.h +++ b/include/mruby/array.h @@ -37,8 +37,7 @@ mrb_value mrb_ary_aget(mrb_state *mrb, mrb_value self); mrb_value mrb_ary_ref(mrb_state *mrb, mrb_value ary, mrb_int n); void mrb_ary_set(mrb_state *mrb, mrb_value ary, mrb_int n, mrb_value val); int mrb_ary_len(mrb_state *mrb, mrb_value ary); -mrb_value mrb_ary_replace_m(mrb_state *mrb, mrb_value self); -void mrb_ary_replace(mrb_state *mrb, struct RArray *a, mrb_value *argv, size_t len); +void mrb_ary_replace(mrb_state *mrb, mrb_value a, mrb_value b); mrb_value mrb_check_array_type(mrb_state *mrb, mrb_value self); mrb_value mrb_ary_unshift(mrb_state *mrb, mrb_value self, mrb_value item); mrb_value mrb_ary_new4(mrb_state *mrb, long n, const mrb_value *elts); diff --git a/src/array.c b/src/array.c index 1ca6eaf1c..0c31b0da0 100644 --- a/src/array.c +++ b/src/array.c @@ -256,8 +256,8 @@ mrb_ary_cmp(mrb_state *mrb, mrb_value ary1) return mrb_fixnum_value((len == 0)? 0: (len > 0)? 1: -1); } -void -mrb_ary_replace(mrb_state *mrb, struct RArray *a, mrb_value *argv, size_t len) +static void +ary_replace(mrb_state *mrb, struct RArray *a, mrb_value *argv, size_t len) { if (a->capa < len) mrb_ary_expand_capa(mrb, a, len); memcpy(a->buf, argv, sizeof(mrb_value)*len); @@ -265,14 +265,21 @@ mrb_ary_replace(mrb_state *mrb, struct RArray *a, mrb_value *argv, size_t len) a->len = len; } +void +mrb_ary_replace(mrb_state *mrb, mrb_value self, mrb_value other) +{ + struct RArray *a2 = mrb_ary_ptr(other); + + ary_replace(mrb, mrb_ary_ptr(self), a2->buf, a2->len); +} + mrb_value mrb_ary_replace_m(mrb_state *mrb, mrb_value self) { - mrb_value *buf; - int blen; + mrb_value other; - mrb_get_args(mrb, "a", &buf, &blen); - mrb_ary_replace(mrb, mrb_ary_ptr(self), buf, blen); + mrb_get_args(mrb, "A", &other); + mrb_ary_replace(mrb, self, other); return self; } -- cgit v1.2.3 From 92ee53146f72487787989847b02923215613278d Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sat, 2 Jun 2012 21:30:04 +0900 Subject: unify long,size_t to int in array.[ch] --- include/mruby/array.h | 18 +++++++------- src/array.c | 68 +++++++++++++++++++++++++-------------------------- 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/include/mruby/array.h b/include/mruby/array.h index 17b26fc07..192ad7c4c 100644 --- a/include/mruby/array.h +++ b/include/mruby/array.h @@ -13,8 +13,8 @@ extern "C" { struct RArray { MRUBY_OBJECT_HEADER; - size_t len; - size_t capa; + int len; + int capa; mrb_value *buf; }; @@ -25,14 +25,14 @@ struct RArray { #define RARRAY_LEN(a) (RARRAY(a)->len) #define RARRAY_PTR(a) (RARRAY(a)->buf) -mrb_value mrb_ary_new_capa(mrb_state*, size_t); +mrb_value mrb_ary_new_capa(mrb_state*, int); mrb_value mrb_ary_new(mrb_state *mrb); -mrb_value mrb_ary_new_elts(mrb_state *mrb, long n, const mrb_value *elts); +mrb_value mrb_ary_new_elts(mrb_state *mrb, int n, const mrb_value *elts); void mrb_ary_concat(mrb_state*, mrb_value, mrb_value); mrb_value mrb_ary_splat(mrb_state*, mrb_value); void mrb_ary_push(mrb_state*, mrb_value, mrb_value); mrb_value mrb_ary_pop(mrb_state *mrb, mrb_value ary); -mrb_value mrb_ary_new_from_values(mrb_state *mrb, size_t size, mrb_value *vals); +mrb_value mrb_ary_new_from_values(mrb_state *mrb, int size, mrb_value *vals); mrb_value mrb_ary_aget(mrb_state *mrb, mrb_value self); mrb_value mrb_ary_ref(mrb_state *mrb, mrb_value ary, mrb_int n); void mrb_ary_set(mrb_state *mrb, mrb_value ary, mrb_int n, mrb_value val); @@ -40,11 +40,11 @@ int mrb_ary_len(mrb_state *mrb, mrb_value ary); void mrb_ary_replace(mrb_state *mrb, mrb_value a, mrb_value b); mrb_value mrb_check_array_type(mrb_state *mrb, mrb_value self); mrb_value mrb_ary_unshift(mrb_state *mrb, mrb_value self, mrb_value item); -mrb_value mrb_ary_new4(mrb_state *mrb, long n, const mrb_value *elts); +mrb_value mrb_ary_new4(mrb_state *mrb, int n, const mrb_value *elts); mrb_value mrb_assoc_new(mrb_state *mrb, mrb_value car, mrb_value cdr); -mrb_value mrb_ary_entry(mrb_value ary, long offset); -void mrb_mem_clear(mrb_value *mem, long size); -mrb_value mrb_ary_tmp_new(mrb_state *mrb, long capa); +mrb_value mrb_ary_entry(mrb_value ary, int offset); +void mrb_mem_clear(mrb_value *mem, int size); +mrb_value mrb_ary_tmp_new(mrb_state *mrb, int capa); mrb_value mrb_ary_sort(mrb_state *mrb, mrb_value ary); mrb_value mrb_ary_shift(mrb_state *mrb, mrb_value self); diff --git a/src/array.c b/src/array.c index 0c31b0da0..9dc0e9d9c 100644 --- a/src/array.c +++ b/src/array.c @@ -56,7 +56,7 @@ ary_new_capa(mrb_state *mrb, size_t capa) } mrb_value -mrb_ary_new_capa(mrb_state *mrb, size_t capa) +mrb_ary_new_capa(mrb_state *mrb, int capa) { struct RArray *a = ary_new_capa(mrb, capa); return mrb_obj_value(a); @@ -69,7 +69,7 @@ mrb_ary_new(mrb_state *mrb) } mrb_value -mrb_ary_new_from_values(mrb_state *mrb, size_t size, mrb_value *vals) +mrb_ary_new_from_values(mrb_state *mrb, int size, mrb_value *vals) { mrb_value ary; struct RArray *a; @@ -92,7 +92,7 @@ mrb_assoc_new(mrb_state *mrb, mrb_value car, mrb_value cdr) } void -ary_fill_with_nil(mrb_value *buf, size_t size) +ary_fill_with_nil(mrb_value *buf, int size) { mrb_value nil = mrb_nil_value(); @@ -102,9 +102,9 @@ ary_fill_with_nil(mrb_value *buf, size_t size) } void -mrb_ary_expand_capa(mrb_state *mrb, struct RArray *a, size_t len) +mrb_ary_expand_capa(mrb_state *mrb, struct RArray *a, int len) { - size_t capa = a->capa; + int capa = a->capa; #ifdef LONG_MAX if (len > ARY_MAX_SIZE) { @@ -134,7 +134,7 @@ mrb_ary_expand_capa(mrb_state *mrb, struct RArray *a, size_t len) void mrb_ary_shrink_capa(mrb_state *mrb, struct RArray *a) { - size_t capa = a->capa; + int capa = a->capa; if (capa < ARY_DEFAULT_LEN * 2) return; if (capa <= a->len * ARY_SHRINK_RATIO) return; @@ -160,13 +160,13 @@ mrb_ary_s_create(mrb_state *mrb, mrb_value self) int len; mrb_get_args(mrb, "*", &vals, &len); - return mrb_ary_new_from_values(mrb, (size_t)len, vals); + return mrb_ary_new_from_values(mrb, (int)len, vals); } static void -ary_concat(mrb_state *mrb, struct RArray *a, mrb_value *buf, size_t blen) +ary_concat(mrb_state *mrb, struct RArray *a, mrb_value *buf, int blen) { - size_t len = a->len + blen; + int len = a->len + blen; if (a->capa < len) mrb_ary_expand_capa(mrb, a, len); memcpy(a->buf+a->len, buf, sizeof(mrb_value)*blen); @@ -257,7 +257,7 @@ mrb_ary_cmp(mrb_state *mrb, mrb_value ary1) } static void -ary_replace(mrb_state *mrb, struct RArray *a, mrb_value *argv, size_t len) +ary_replace(mrb_state *mrb, struct RArray *a, mrb_value *argv, int len) { if (a->capa < len) mrb_ary_expand_capa(mrb, a, len); memcpy(a->buf, argv, sizeof(mrb_value)*len); @@ -292,7 +292,7 @@ mrb_ary_times(mrb_state *mrb, mrb_value self) mrb_value ary; mrb_value *buf; mrb_int times; - //size_t len; + //int len; mrb_get_args(mrb, "i", ×); if (times < 0) { @@ -355,7 +355,7 @@ mrb_ary_reverse(mrb_state *mrb, mrb_value self) } mrb_value -mrb_ary_new4(mrb_state *mrb, long n, const mrb_value *elts) +mrb_ary_new4(mrb_state *mrb, int n, const mrb_value *elts) { mrb_value ary; @@ -369,7 +369,7 @@ mrb_ary_new4(mrb_state *mrb, long n, const mrb_value *elts) } mrb_value -mrb_ary_new_elts(mrb_state *mrb, long n, const mrb_value *elts) +mrb_ary_new_elts(mrb_state *mrb, int n, const mrb_value *elts) { return mrb_ary_new4(mrb, n, elts); } @@ -421,7 +421,7 @@ mrb_ary_shift(mrb_state *mrb, mrb_value self) { struct RArray *a = mrb_ary_ptr(self); mrb_value *buf = a->buf; - size_t size = a->len; + int size = a->len; mrb_value val; if (size == 0) return mrb_nil_value(); @@ -479,7 +479,7 @@ mrb_ary_ref(mrb_state *mrb, mrb_value ary, mrb_int n) /* range check */ if (n < 0) n += a->len; - if (n < 0 || a->len <= (size_t)n) return mrb_nil_value(); + if (n < 0 || a->len <= (int)n) return mrb_nil_value(); return a->buf[n]; } @@ -494,8 +494,8 @@ mrb_ary_set(mrb_state *mrb, mrb_value ary, mrb_int n, mrb_value val) /* rb_ary_s if (n < 0) { mrb_raise(mrb, E_INDEX_ERROR, "index %ld out of array", n - a->len); } - if (a->len <= (size_t)n) { - if (a->capa <= (size_t)n) mrb_ary_expand_capa(mrb, a, n + 1); + if (a->len <= (int)n) { + if (a->capa <= (int)n) mrb_ary_expand_capa(mrb, a, n + 1); ary_fill_with_nil(a->buf + a->len, n + 1 - a->len); a->len = n + 1; } @@ -509,7 +509,7 @@ mrb_ary_splice(mrb_state *mrb, mrb_value ary, mrb_int head, mrb_int len, mrb_val { struct RArray *a = mrb_ary_ptr(ary); mrb_int tail; - size_t size; + int size; mrb_value *argv; int i, argc; @@ -536,7 +536,7 @@ mrb_ary_splice(mrb_state *mrb, mrb_value ary, mrb_int head, mrb_int len, mrb_val if (size > a->capa) mrb_ary_expand_capa(mrb, a, size); if (head > a->len) { - ary_fill_with_nil(a->buf + a->len, (size_t)(head - a->len)); + ary_fill_with_nil(a->buf + a->len, (int)(head - a->len)); } else if (head < a->len) { memmove(a->buf + head + argc, a->buf + tail, sizeof(mrb_value)*(a->len - tail)); @@ -576,10 +576,10 @@ mrb_ary_aget(mrb_state *mrb, mrb_value self) } len = mrb_fixnum(argv[0]); if (index < 0) index += a->len; - if (index < 0 || a->len < (size_t)index) return mrb_nil_value(); + if (index < 0 || a->len < (int)index) return mrb_nil_value(); if ((len = mrb_fixnum(argv[0])) < 0) return mrb_nil_value(); - if (a->len == (size_t)index) return mrb_ary_new(mrb); - if ((size_t)len > a->len - index) len = a->len - index; + if (a->len == (int)index) return mrb_ary_new(mrb); + if ((int)len > a->len - index) len = a->len - index; return mrb_ary_new_from_values(mrb, len, a->buf + index); default: @@ -625,11 +625,11 @@ mrb_ary_delete_at(mrb_state *mrb, mrb_value self) mrb_int index; mrb_value val; mrb_value *buf; - size_t len; + int len; mrb_get_args(mrb, "i", &index); if (index < 0) index += a->len; - if (index < 0 || a->len <= (size_t)index) return mrb_nil_value(); + if (index < 0 || a->len <= (int)index) return mrb_nil_value(); val = a->buf[index]; @@ -651,7 +651,7 @@ mrb_ary_first(mrb_state *mrb, mrb_value self) { struct RArray *a = mrb_ary_ptr(self); //mrb_value ary; - size_t size; + int size; mrb_value *vals; int len; @@ -673,7 +673,7 @@ mrb_ary_last(mrb_state *mrb, mrb_value self) { struct RArray *a = mrb_ary_ptr(self); //mrb_value ary; - size_t size; + int size; mrb_value *vals; int len; @@ -765,7 +765,7 @@ mrb_check_array_type(mrb_state *mrb, mrb_value ary) } mrb_value -mrb_ary_entry(mrb_value ary, long offset) +mrb_ary_entry(mrb_value ary, int offset) { if (offset < 0) { offset += RARRAY_LEN(ary); @@ -774,7 +774,7 @@ mrb_ary_entry(mrb_value ary, long offset) } void -mrb_mem_clear(mrb_value *mem, long size) +mrb_mem_clear(mrb_value *mem, int size) { while (size--) { *mem++ = mrb_nil_value(); @@ -782,15 +782,15 @@ mrb_mem_clear(mrb_value *mem, long size) } mrb_value -mrb_ary_tmp_new(mrb_state *mrb, long capa) +mrb_ary_tmp_new(mrb_state *mrb, int capa) { - return mrb_ary_new_capa(mrb, capa);//ary_new(0, capa); + return mrb_ary_new_capa(mrb, capa); } static mrb_value inspect_ary(mrb_state *mrb, mrb_value ary, mrb_value list) { - long i; + int i; mrb_value s, arystr; char *head = "["; char *sep = ", "; @@ -853,7 +853,7 @@ mrb_ary_inspect(mrb_state *mrb, mrb_value ary) static mrb_value join_ary(mrb_state *mrb, mrb_value ary, mrb_value sep, mrb_value list) { - long i; + int i; mrb_value result, val, tmp; /* check recursive */ @@ -969,7 +969,7 @@ mrb_ary_equal(mrb_state *mrb, mrb_value ary1) } if (RARRAY_LEN(ary1) != RARRAY_LEN(ary2)) return mrb_false_value(); else { - long i; + int i; for (i=0; i Date: Sat, 2 Jun 2012 21:31:03 +0900 Subject: clean appendix comments from array.c --- src/array.c | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/array.c b/src/array.c index 9dc0e9d9c..6d41c0c3c 100644 --- a/src/array.c +++ b/src/array.c @@ -10,7 +10,6 @@ #include "mruby/string.h" #include "mruby/class.h" -//#define ARY_DEFAULT_LEN 16 #define ARY_DEFAULT_LEN 4 #define ARY_SHRINK_RATIO 5 /* must be larger than 2 */ #ifdef LONG_MAX @@ -292,7 +291,6 @@ mrb_ary_times(mrb_state *mrb, mrb_value self) mrb_value ary; mrb_value *buf; mrb_int times; - //int len; mrb_get_args(mrb, "i", ×); if (times < 0) { @@ -359,10 +357,10 @@ mrb_ary_new4(mrb_state *mrb, int n, const mrb_value *elts) { mrb_value ary; - ary = mrb_ary_new_capa(mrb, n);//mrb_ary_new2(n); + ary = mrb_ary_new_capa(mrb, n); if (n > 0 && elts) { memcpy(RARRAY_PTR(ary), elts, sizeof(mrb_value)*n); - RARRAY_LEN(ary) = n; //ARY_SET_LEN(ary, n); + RARRAY_LEN(ary) = n; } return ary; @@ -650,7 +648,6 @@ mrb_value mrb_ary_first(mrb_state *mrb, mrb_value self) { struct RArray *a = mrb_ary_ptr(self); - //mrb_value ary; int size; mrb_value *vals; int len; @@ -672,7 +669,6 @@ mrb_value mrb_ary_last(mrb_state *mrb, mrb_value self) { struct RArray *a = mrb_ary_ptr(self); - //mrb_value ary; int size; mrb_value *vals; int len; @@ -819,7 +815,6 @@ inspect_ary(mrb_state *mrb, mrb_value ary, mrb_value list) } else { s = mrb_inspect(mrb, RARRAY_PTR(ary)[i]); } - //mrb_str_buf_append(mrb, arystr, s); mrb_str_buf_cat(mrb, arystr, RSTRING_PTR(s), RSTRING_LEN(s)); mrb_gc_arena_restore(mrb, ai); } @@ -869,7 +864,6 @@ join_ary(mrb_state *mrb, mrb_value ary, mrb_value sep, mrb_value list) for(i=0; i 0 && !mrb_nil_p(sep)) { - //mrb_str_buf_append(mrb, result, sep); // segv (encoding error?) mrb_str_buf_cat(mrb, result, RSTRING_PTR(sep), RSTRING_LEN(sep)); } @@ -882,7 +876,6 @@ join_ary(mrb_state *mrb, mrb_value ary, mrb_value sep, mrb_value list) case MRB_TT_STRING: str_join: - //mrb_str_buf_append(mrb, result, val); mrb_str_buf_cat(mrb, result, RSTRING_PTR(val), RSTRING_LEN(val)); break; -- cgit v1.2.3 From 34c049c63e4c4c011fe1cfcbe954f20438919439 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sat, 2 Jun 2012 21:34:10 +0900 Subject: remove unused mrb_mem_clear --- include/mruby/array.h | 1 - src/array.c | 8 -------- src/struct.c | 4 +--- 3 files changed, 1 insertion(+), 12 deletions(-) diff --git a/include/mruby/array.h b/include/mruby/array.h index 192ad7c4c..21d50152f 100644 --- a/include/mruby/array.h +++ b/include/mruby/array.h @@ -43,7 +43,6 @@ mrb_value mrb_ary_unshift(mrb_state *mrb, mrb_value self, mrb_value item); mrb_value mrb_ary_new4(mrb_state *mrb, int n, const mrb_value *elts); mrb_value mrb_assoc_new(mrb_state *mrb, mrb_value car, mrb_value cdr); mrb_value mrb_ary_entry(mrb_value ary, int offset); -void mrb_mem_clear(mrb_value *mem, int size); mrb_value mrb_ary_tmp_new(mrb_state *mrb, int capa); mrb_value mrb_ary_sort(mrb_state *mrb, mrb_value ary); mrb_value mrb_ary_shift(mrb_state *mrb, mrb_value self); diff --git a/src/array.c b/src/array.c index 6d41c0c3c..ed207a2a2 100644 --- a/src/array.c +++ b/src/array.c @@ -769,14 +769,6 @@ mrb_ary_entry(mrb_value ary, int offset) return ary_elt(ary, offset); } -void -mrb_mem_clear(mrb_value *mem, int size) -{ - while (size--) { - *mem++ = mrb_nil_value(); - } -} - mrb_value mrb_ary_tmp_new(mrb_state *mrb, int capa) { diff --git a/src/struct.c b/src/struct.c index fbe018930..9f7010e0b 100644 --- a/src/struct.c +++ b/src/struct.c @@ -419,9 +419,7 @@ mrb_struct_initialize_withArg(mrb_state *mrb, int argc, mrb_value *argv, mrb_val st->ptr = mrb_malloc(mrb, sizeof(mrb_value)*argc); st->len = n; memcpy(st->ptr, argv, sizeof(mrb_value)*argc); - //if (n > argc) { - // mrb_mem_clear(RSTRUCT_PTR(self)+argc, n-argc); - //} + return self; } -- cgit v1.2.3 From d9dfbb044afa59413afbd62b3d59cbe3f1fee342 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sat, 2 Jun 2012 21:38:44 +0900 Subject: remove unused st_hash_end/unit reference --- include/mruby/hash.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/include/mruby/hash.h b/include/mruby/hash.h index 1bbd9bd97..6cb3d8ec8 100644 --- a/include/mruby/hash.h +++ b/include/mruby/hash.h @@ -17,9 +17,6 @@ struct RHash { struct kh_ht *ht; }; -#define mrb_hash_end(h) st_hash_end(h) -#define mrb_hash_uint(h, i) st_hash_uint(h, i) - #define mrb_hash_ptr(v) ((struct RHash*)((v).value.p)) #define mrb_hash_value(p) mrb_obj_value((void*)(p)) -- cgit v1.2.3 From de133c37154fc2d433961ab900411b3c8cd23bef Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sat, 2 Jun 2012 21:42:52 +0900 Subject: refactoring around mrb_hash_new --- include/mruby/hash.h | 4 ++-- src/hash.c | 10 ++++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/include/mruby/hash.h b/include/mruby/hash.h index 6cb3d8ec8..0e002052c 100644 --- a/include/mruby/hash.h +++ b/include/mruby/hash.h @@ -20,8 +20,8 @@ struct RHash { #define mrb_hash_ptr(v) ((struct RHash*)((v).value.p)) #define mrb_hash_value(p) mrb_obj_value((void*)(p)) -mrb_value mrb_hash_new_capa(mrb_state*, size_t); -mrb_value mrb_hash_new(mrb_state *mrb, int capa); +mrb_value mrb_hash_new_capa(mrb_state*, int); +mrb_value mrb_hash_new(mrb_state *mrb); void mrb_hash_set(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value val); mrb_value mrb_hash_get(mrb_state *mrb, mrb_value hash, mrb_value key); diff --git a/src/hash.c b/src/hash.c index a06becd91..6c19919e5 100644 --- a/src/hash.c +++ b/src/hash.c @@ -81,21 +81,23 @@ mrb_gc_free_ht(mrb_state *mrb, struct RHash *hash) mrb_value -mrb_hash_new_capa(mrb_state *mrb, size_t capa) +mrb_hash_new_capa(mrb_state *mrb, int capa) { struct RHash *h; h = (struct RHash*)mrb_obj_alloc(mrb, MRB_TT_HASH, mrb->hash_class); h->ht = kh_init(ht, mrb); - kh_resize(ht, h->ht, capa); + if (capa > 0) { + kh_resize(ht, h->ht, capa); + } h->iv = 0; return mrb_obj_value(h); } mrb_value -mrb_hash_new(mrb_state *mrb, int capa) +mrb_hash_new(mrb_state *mrb) { - return mrb_hash_new_capa(mrb, capa); + return mrb_hash_new_capa(mrb, 0); } mrb_value -- cgit v1.2.3 From 110cdd82e025999e07a448577cc5191aed113ac8 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sat, 2 Jun 2012 21:47:27 +0900 Subject: naming convention consistency for hash.h --- include/mruby/hash.h | 2 +- src/hash.c | 14 ++++---------- src/sprintf.c | 2 +- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/include/mruby/hash.h b/include/mruby/hash.h index 0e002052c..01b042d46 100644 --- a/include/mruby/hash.h +++ b/include/mruby/hash.h @@ -25,7 +25,7 @@ mrb_value mrb_hash_new(mrb_state *mrb); void mrb_hash_set(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value val); mrb_value mrb_hash_get(mrb_state *mrb, mrb_value hash, mrb_value key); -mrb_value mrb_hash_getWithDef(mrb_state *mrb, mrb_value hash, mrb_value vkey, mrb_value def); +mrb_value mrb_hash_fetch(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value def); mrb_value mrb_hash_delete_key(mrb_state *mrb, mrb_value hash, mrb_value key); mrb_value mrb_hash(mrb_state *mrb, mrb_value obj); mrb_value mrb_check_hash_type(mrb_state *mrb, mrb_value self); diff --git a/src/hash.c b/src/hash.c index 6c19919e5..6d176e80c 100644 --- a/src/hash.c +++ b/src/hash.c @@ -101,7 +101,7 @@ mrb_hash_new(mrb_state *mrb) } mrb_value -mrb_hash_get(mrb_state *mrb, mrb_value hash, mrb_value key) /* mrb_hash_aref */ /* mrb_hash_lookup */ +mrb_hash_get(mrb_state *mrb, mrb_value hash, mrb_value key) { khash_t(ht) *h = RHASH_TBL(hash); khiter_t k; @@ -118,13 +118,13 @@ mrb_hash_get(mrb_state *mrb, mrb_value hash, mrb_value key) /* mrb_hash_aref */ } mrb_value -mrb_hash_getWithDef(mrb_state *mrb, mrb_value hash, mrb_value vkey, mrb_value def) /* mrb_hash_lookup2 */ +mrb_hash_fetch(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value def) { khash_t(ht) *h = RHASH_TBL(hash); khiter_t k; if (h) { - k = kh_get(ht, h, vkey); + k = kh_get(ht, h, key); if (k != kh_end(h)) return kh_value(h, k); } @@ -332,16 +332,10 @@ mrb_hash_aget(mrb_state *mrb, mrb_value self) return mrb_hash_get(mrb, self, key); } -mrb_value -mrb_hash_lookup2(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value def) -{ - return mrb_hash_getWithDef(mrb, hash, key, def); -} - mrb_value mrb_hash_lookup(mrb_state *mrb, mrb_value hash, mrb_value key) { - return mrb_hash_lookup2(mrb, hash, key, mrb_nil_value()); + return mrb_hash_get(mrb, hash, key); } /* diff --git a/src/sprintf.c b/src/sprintf.c index 79bd101ad..296a7c73e 100644 --- a/src/sprintf.c +++ b/src/sprintf.c @@ -165,7 +165,7 @@ mrb_fix2binstr(mrb_state *mrb, mrb_value x, int base) (mrb_raise(mrb, E_ARGUMENT_ERROR, "named%.*s after unnumbered(%d)", (len), (name), posarg), mrb_undef_value()) : \ posarg == -1 ? \ (mrb_raise(mrb, E_ARGUMENT_ERROR, "named%.*s after numbered", (len), (name)), mrb_undef_value()) : \ - (posarg = -2, mrb_hash_getWithDef(mrb, get_hash(mrb, &hash, argc, argv), id, mrb_undef_value()))) + (posarg = -2, mrb_hash_fetch(mrb, get_hash(mrb, &hash, argc, argv), id, mrb_undef_value()))) #define GETNUM(n, val) \ for (; p < end && ISDIGIT(*p); p++) {\ -- cgit v1.2.3 From 9b53de0b3980d8e3fcf4995111137a4b66eeb4b7 Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Sat, 2 Jun 2012 21:31:28 +0800 Subject: Remove not used ary_reverse --- src/array.c | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/array.c b/src/array.c index eaead08b3..4e55e9ac1 100644 --- a/src/array.c +++ b/src/array.c @@ -296,21 +296,6 @@ mrb_ary_times(mrb_state *mrb, mrb_value self) return ary; } -static void -ary_reverse(struct RArray *a) -{ - mrb_value *p1, *p2; - - p1 = a->buf; - p2 = a->buf + a->len - 1; - - while(p1 < p2) { - mrb_value tmp = *p1; - *p1++ = *p2; - *p2-- = tmp; - } -} - mrb_value mrb_ary_reverse_bang(mrb_state *mrb, mrb_value self) { -- cgit v1.2.3 From d060c8a713cbfd356fd3814339bf6248d76f3507 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sat, 2 Jun 2012 23:21:12 +0900 Subject: add Hash#{select/reject} to return Hash as 1.9 --- mrblib/hash.rb | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/mrblib/hash.rb b/mrblib/hash.rb index d6ad55e47..dc85c8f5e 100644 --- a/mrblib/hash.rb +++ b/mrblib/hash.rb @@ -80,6 +80,62 @@ class Hash end h end + + # 1.8/1.9 Hash#reject! returns Hash; ISO says nothing. + def reject!(&b) + keys = [] + self.each_key{|k| + v = self[k] + if b.call(k, v) + keys.push(k) + end + } + return nil if keys.size == 0 + keys.each{|k| + self.delete(k) + } + self + end + + # 1.8/1.9 Hash#reject returns Hash; ISO says nothing. + def reject(&b) + h = {} + self.each_key{|k| + v = self[k] + unless b.call(k, v) + h[k] = v + end + } + h + end + + # 1.9 Hash#select! returns Hash; ISO says nothing. + def reject!(&b) + keys = [] + self.each_key{|k| + v = self[k] + unless b.call(k, v) + keys.push(k) + end + } + return nil if keys.size == 0 + keys.each{|k| + self.delete(k) + } + self + end + + # 1.9 Hash#select returns Hash; ISO says nothing. + def select(&b) + h = {} + self.each_key{|k| + v = self[k] + if b.call(k, v) + h[k] = v + end + } + h + end end ## -- cgit v1.2.3 From 81c0e2e03115ad0eec31ac314cdb46ca364937e2 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sat, 2 Jun 2012 23:43:13 +0900 Subject: make color in OBJECT_HEADER unsigned --- include/mruby/object.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/mruby/object.h b/include/mruby/object.h index 495c34083..4be060078 100644 --- a/include/mruby/object.h +++ b/include/mruby/object.h @@ -13,7 +13,7 @@ extern "C" { #define MRUBY_OBJECT_HEADER \ enum mrb_vtype tt:8; \ - int color:3;\ + unsigned int color:3;\ unsigned int flags:21;\ struct RClass *c;\ struct RBasic *gcnext -- cgit v1.2.3 From 090e896d48978def36bf9e2e2482186bf15f5917 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sat, 2 Jun 2012 23:46:30 +0900 Subject: hash->ht might be NULL; it shouldn't though --- src/hash.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/hash.c b/src/hash.c index 6d176e80c..c61a6f7b5 100644 --- a/src/hash.c +++ b/src/hash.c @@ -60,6 +60,7 @@ mrb_gc_mark_ht(mrb_state *mrb, struct RHash *hash) khiter_t k; khash_t(ht) *h = hash->ht; + if (!h) return; for (k = kh_begin(h); k != kh_end(h); k++) if (kh_exist(h, k)) { mrb_gc_mark_value(mrb, kh_key(h, k)); @@ -70,13 +71,14 @@ mrb_gc_mark_ht(mrb_state *mrb, struct RHash *hash) size_t mrb_gc_mark_ht_size(mrb_state *mrb, struct RHash *hash) { + if (!hash->ht) return 0; return kh_size(hash->ht)*2; } void mrb_gc_free_ht(mrb_state *mrb, struct RHash *hash) { - kh_destroy(ht, hash->ht); + if (hash->ht) kh_destroy(ht, hash->ht); } @@ -106,9 +108,11 @@ mrb_hash_get(mrb_state *mrb, mrb_value hash, mrb_value key) khash_t(ht) *h = RHASH_TBL(hash); khiter_t k; - k = kh_get(ht, h, key); - if (k != kh_end(h)) - return kh_value(h, k); + if (h) { + k = kh_get(ht, h, key); + if (k != kh_end(h)) + return kh_value(h, k); + } /* not found */ if (MRB_RHASH_PROCDEFAULT_P(hash)) { @@ -142,6 +146,7 @@ mrb_hash_set(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value val) /* mr mrb_hash_modify(mrb, hash); h = RHASH_TBL(hash); + if (!h) h = RHASH_TBL(hash) = kh_init(ht, mrb); k = kh_get(ht, h, key); if (k == kh_end(h)) { /* expand */ @@ -196,7 +201,7 @@ mrb_hash_tbl(mrb_state *mrb, mrb_value hash) { khash_t(ht) *h = RHASH_TBL(hash); - if (!RHASH_TBL(hash)) { + if (!h) { RHASH_TBL(hash) = kh_init(ht, mrb); } return h; -- cgit v1.2.3 From 8d0cc57a43ba71e0f8b113069a01d08cd8b0d8ec Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sat, 2 Jun 2012 23:50:34 +0900 Subject: hash->ht might be NULL; it shouldn't though --- src/hash.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hash.c b/src/hash.c index c61a6f7b5..4c7a64dea 100644 --- a/src/hash.c +++ b/src/hash.c @@ -701,7 +701,7 @@ mrb_hash_clear(mrb_state *mrb, mrb_value hash) { khash_t(ht) *h = RHASH_TBL(hash); - kh_clear(ht, h); + if (h) kh_clear(ht, h); return hash; } -- cgit v1.2.3 From ecbaf9cd99803a2fa121fe6aabea74590a36e0b2 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sat, 2 Jun 2012 23:52:32 +0900 Subject: simpler implementation of Hash#empty? --- src/hash.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/hash.c b/src/hash.c index 4c7a64dea..7b5481868 100644 --- a/src/hash.c +++ b/src/hash.c @@ -819,12 +819,12 @@ mrb_hash_empty_p(mrb_state *mrb, mrb_value self) { khash_t(ht) *h = RHASH_TBL(self); khiter_t k; + if (h) { - for (k = kh_begin(h); k != kh_end(h); k++) - if (kh_exist(h, k)) - return mrb_false_value(); + if (kh_size(h) == 0) + return mrb_true_value(); } - return mrb_true_value(); + return mrb_false_value(); } /* 15.2.13.4.11 */ -- cgit v1.2.3 From 8a41d646f1a801372e03928ae3e6bfea973fe6ed Mon Sep 17 00:00:00 2001 From: Yuichiro MASUI Date: Sat, 2 Jun 2012 23:40:10 +0900 Subject: support Class.new() --- src/class.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/class.c b/src/class.c index 9424e8d84..fa6adaf28 100644 --- a/src/class.c +++ b/src/class.c @@ -806,6 +806,20 @@ mrb_instance_new(mrb_state *mrb, mrb_value cv) return obj; } +mrb_value +mrb_class_new_class(mrb_state *mrb, mrb_value cv) +{ + mrb_value super; + if(mrb->ci->argc > 0) { + mrb_get_args(mrb, "o", &super); + } + else { + super = mrb_obj_value(mrb->object_class); + } + struct RClass *new_class = mrb_class_new(mrb, mrb_class_ptr(super)); + return mrb_obj_value(new_class); +} + static mrb_value mrb_bob_init(mrb_state *mrb, mrb_value cv) { @@ -1226,6 +1240,7 @@ mrb_init_class(mrb_state *mrb) mrb_define_method(mrb, bob, "initialize", mrb_bob_init, ARGS_NONE()); mrb_define_method(mrb, bob, "!", mrb_bob_not, ARGS_NONE()); mrb_define_method(mrb, bob, "method_missing", mrb_bob_missing, ARGS_ANY()); /* 15.3.1.3.30 */ + mrb_define_class_method(mrb, cls, "new", mrb_class_new_class, ARGS_ANY()); mrb_define_method(mrb, cls, "new", mrb_instance_new, ARGS_ANY()); mrb_define_method(mrb, cls, "inherited", mrb_bob_init, ARGS_REQ(1)); mrb_define_method(mrb, mod, "include", mrb_mod_include, ARGS_REQ(1)); -- cgit v1.2.3 From cc86250297c4a8d4a2e3e350fab8cf96929283c3 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 3 Jun 2012 00:23:59 +0900 Subject: remove unsafe macros in hash.h --- include/mruby/hash.h | 2 -- src/hash.c | 24 ++++++++++++++++-------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/include/mruby/hash.h b/include/mruby/hash.h index 01b042d46..369decdb4 100644 --- a/include/mruby/hash.h +++ b/include/mruby/hash.h @@ -33,8 +33,6 @@ mrb_value mrb_check_hash_type(mrb_state *mrb, mrb_value self); /* RHASH_TBL allocates st_table if not available. */ #define RHASH(obj) ((struct RHash*)((obj).value.p)) #define RHASH_TBL(h) (RHASH(h)->ht) -#define RHASH_SIZE(h) (RHASH_TBL(h)->size) -#define RHASH_EMPTY_P(h) (RHASH_SIZE(h) == 0) #define RHASH_IFNONE(h) mrb_iv_get(mrb, (h), mrb_intern(mrb, "ifnone")) #define RHASH_PROCDEFAULT(h) RHASH_IFNONE(h) struct kh_ht * mrb_hash_tbl(mrb_state *mrb, mrb_value hash); diff --git a/src/hash.c b/src/hash.c index 7b5481868..4a85fcec3 100644 --- a/src/hash.c +++ b/src/hash.c @@ -172,11 +172,11 @@ mrb_hash_dup(mrb_state *mrb, mrb_value hash) khash_t(ht) *h, *ret_h; khiter_t k, ret_k; + h = RHASH_TBL(hash); ret = (struct RHash*)mrb_obj_alloc(mrb, MRB_TT_HASH, mrb->hash_class); ret->ht = kh_init(ht, mrb); - if (!RHASH_EMPTY_P(hash)) { - h = RHASH_TBL(hash); + if (kh_size(h) > 0) { ret_h = ret->ht; for (k = kh_begin(h); k != kh_end(h); k++) { @@ -818,7 +818,6 @@ static mrb_value mrb_hash_empty_p(mrb_state *mrb, mrb_value self) { khash_t(ht) *h = RHASH_TBL(self); - khiter_t k; if (h) { if (kh_size(h) == 0) @@ -939,8 +938,10 @@ inspect_hash(mrb_state *mrb, mrb_value hash, int recur) static mrb_value mrb_hash_inspect(mrb_state *mrb, mrb_value hash) { - if (RHASH_EMPTY_P(hash)) - return mrb_str_new_cstr(mrb, "{}"); + khash_t(ht) *h = RHASH_TBL(hash); + + if (!h || kh_size(h) == 0) + return mrb_str_new_cstr(mrb, "{}"); return inspect_hash(mrb, hash, 0); } @@ -1107,6 +1108,8 @@ mrb_hash_has_value(mrb_state *mrb, mrb_value hash) static mrb_value hash_equal(mrb_state *mrb, mrb_value hash1, mrb_value hash2, int eql) { + khash_t(ht) *h1, *h2; + if (mrb_obj_equal(mrb, hash1, hash2)) return mrb_true_value(); if (mrb_type(hash2) != MRB_TT_HASH) { if (!mrb_respond_to(mrb, hash2, mrb_intern(mrb, "to_hash"))) { @@ -1117,10 +1120,15 @@ hash_equal(mrb_state *mrb, mrb_value hash1, mrb_value hash2, int eql) else return mrb_fixnum_value(mrb_equal(mrb, hash2, hash1)); } - if (RHASH_SIZE(hash1) != RHASH_SIZE(hash2)) return mrb_false_value(); + h1 = RHASH_TBL(hash1); + h2 = RHASH_TBL(hash2); + if (!h2) { + if (!h2) return mrb_true_value(); + return mrb_false_value(); + } + if (!h2) return mrb_false_value(); + if (kh_size(h1) != kh_size(h2)) return mrb_false_value(); else { - khash_t(ht) *h1 = RHASH_TBL(hash1); - khash_t(ht) *h2 = RHASH_TBL(hash2); khiter_t k1, k2; mrb_value key; -- cgit v1.2.3 From 2c58690df132a462619d62f85963cc5a330a1378 Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Sat, 2 Jun 2012 23:39:00 +0800 Subject: Add test cases for Hash --- test/t/hash.rb | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/test/t/hash.rb b/test/t/hash.rb index af662688a..df21dd1fa 100644 --- a/test/t/hash.rb +++ b/test/t/hash.rb @@ -224,3 +224,42 @@ assert('Hash#values', '15.2.13.4.28') do a.values == ['abc_value'] end + +# Not ISO specified + +assert('Hash#reject') do + h = {:one => 1, :two => 2, :three => 3, :four => 4} + ret = h.reject do |k,v| + v % 2 == 0 + end + ret == {:one => 1, :three => 3} and + h == {:one => 1, :two => 2, :three => 3, :four => 4} +end + +assert('Hash#reject!') do + h = {:one => 1, :two => 2, :three => 3, :four => 4} + ret = h.reject! do |k,v| + v % 2 == 0 + end + ret == {:one => 1, :three => 3} and + h == {:one => 1, :three => 3} +end + +assert('Hash#select') do + h = {:one => 1, :two => 2, :three => 3, :four => 4} + ret = h.select do |k,v| + v % 2 == 0 + end + ret == {:two => 2, :four => 4} and + h == {:one => 1, :two => 2, :three => 3, :four => 4} +end + +assert('Hash#select!') do + h = {:one => 1, :two => 2, :three => 3, :four => 4} + ret = h.select! do |k,v| + v % 2 == 0 + end + ret == {:two => 2, :four => 4} and + h == {:two => 2, :four => 4} +end + -- cgit v1.2.3 From 1c926e852ed85d1bffad83a0f4b650c0575c325d Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 3 Jun 2012 02:12:32 +0900 Subject: removed mruby directory created for xcode --- mruby/HelloMRuby/hello_mruby.c | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 mruby/HelloMRuby/hello_mruby.c diff --git a/mruby/HelloMRuby/hello_mruby.c b/mruby/HelloMRuby/hello_mruby.c deleted file mode 100644 index b727c95ec..000000000 --- a/mruby/HelloMRuby/hello_mruby.c +++ /dev/null @@ -1,9 +0,0 @@ -// -// hello_mruby.c -// mruby -// -// Created by Paolo Bosetti on 5/22/12. -// Copyright (c) 2012 __MyCompanyName__. All rights reserved. -// - -#include -- cgit v1.2.3 From 15b9d74fc7d043a6e62eecbbca14a4c2f89bfcb6 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 3 Jun 2012 02:14:30 +0900 Subject: stupid naming error --- mrblib/hash.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mrblib/hash.rb b/mrblib/hash.rb index dc85c8f5e..7b7b3f8ac 100644 --- a/mrblib/hash.rb +++ b/mrblib/hash.rb @@ -110,7 +110,7 @@ class Hash end # 1.9 Hash#select! returns Hash; ISO says nothing. - def reject!(&b) + def select!(&b) keys = [] self.each_key{|k| v = self[k] -- cgit v1.2.3 From 5fcd520514095fa9bbb31d2e7eca192b1be7dfc2 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 3 Jun 2012 02:19:12 +0900 Subject: small refactoring after mruby coding convention --- src/class.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/class.c b/src/class.c index fa6adaf28..544f36527 100644 --- a/src/class.c +++ b/src/class.c @@ -810,13 +810,12 @@ mrb_value mrb_class_new_class(mrb_state *mrb, mrb_value cv) { mrb_value super; - if(mrb->ci->argc > 0) { - mrb_get_args(mrb, "o", &super); - } - else { + struct RClass *new_class; + + if (mrb_get_args(mrb, "|o", &super) == 0) { super = mrb_obj_value(mrb->object_class); } - struct RClass *new_class = mrb_class_new(mrb, mrb_class_ptr(super)); + new_class = mrb_class_new(mrb, mrb_class_ptr(super)); return mrb_obj_value(new_class); } -- cgit v1.2.3 From 57bd8d49ec88c7f6a0432a09168af9420ae50c7e Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Sun, 3 Jun 2012 01:50:10 +0800 Subject: Add first test case for Class#new and prepare further feature tests for it --- test/t/class.rb | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/test/t/class.rb b/test/t/class.rb index 92f3df51d..3c398e923 100644 --- a/test/t/class.rb +++ b/test/t/class.rb @@ -5,6 +5,36 @@ assert('Class', '15.2.3') do Class.class == Class end +assert('Class#new', '15.2.3.3.3') do + # at the moment no exception on singleton class + #e1 = nil + #begin + # class1 = e1.singleton_class.new + #rescue => e1 + # e2 = e1 + #end + + class TestClass + def initialize args, &block + @result = if not args.nil? and block.nil? + # only arguments + :only_args + elsif not args.nil? and not block.nil? + # args and block is given + :args_and_block + else + # this should never happen + :broken + end + end + + def result; @result; end + end + + TestClass.new(:arg).result == :only_args + # with block doesn't work yet +end + # Not ISO specified assert('Class 1') do -- cgit v1.2.3 From 12d75223d62ed90f334980c3a15e96618250fe90 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 3 Jun 2012 07:55:39 +0900 Subject: make shared string to reference-counted C structure to reduce GC pressure --- include/mruby/string.h | 15 +++++++------- src/gc.c | 7 ------- src/print.c | 2 +- src/string.c | 53 ++++++++++++++++++++++++++------------------------ 4 files changed, 36 insertions(+), 41 deletions(-) diff --git a/include/mruby/string.h b/include/mruby/string.h index 39f119ae8..852c5ff02 100644 --- a/include/mruby/string.h +++ b/include/mruby/string.h @@ -25,12 +25,18 @@ extern "C" { extern const char mrb_digitmap[]; +struct mrb_shared_string { + int refcnt; + char *buf; + int len; +}; + struct RString { MRUBY_OBJECT_HEADER; int len; union { int capa; - struct RString *shared; + struct mrb_shared_string *shared; } aux; char *buf; }; @@ -41,14 +47,7 @@ struct RString { #define RSTRING_LEN(s) (RSTRING(s)->len) #define RSTRING_CAPA(s) (RSTRING(s)->aux.capa) #define RSTRING_END(s) (RSTRING(s)->buf + RSTRING(s)->len) - #define MRB_STR_SHARED 256 -#define MRB_STR_SHARED_P(s) (FL_ALL(s, MRB_STR_SHARED)) -#define MRB_STR_NOCAPA (MRB_STR_SHARED) -#define MRB_STR_NOCAPA_P(s) (FL_ANY(s, MRB_STR_NOCAPA)) -#define MRB_STR_UNSET_NOCAPA(s) do {\ - FL_UNSET(s, MRB_STR_NOCAPA);\ -} while (0) mrb_value mrb_str_literal(mrb_state*, mrb_value); void mrb_str_concat(mrb_state*, mrb_value, mrb_value); diff --git a/src/gc.c b/src/gc.c index 04be437c1..03428765c 100644 --- a/src/gc.c +++ b/src/gc.c @@ -372,13 +372,6 @@ gc_mark_children(mrb_state *mrb, struct RBasic *obj) break; case MRB_TT_STRING: - { - struct RString *s = (struct RString*)obj; - - if (s->flags & MRB_STR_SHARED) { - mrb_gc_mark(mrb, (struct RBasic*)s->aux.shared); - } - } break; case MRB_TT_RANGE: diff --git a/src/print.c b/src/print.c index 505597935..e6873913b 100644 --- a/src/print.c +++ b/src/print.c @@ -13,7 +13,7 @@ printstr(mrb_state *mrb, mrb_value obj) { struct RString *str; char *s; - size_t len; + int len; if (mrb_type(obj) == MRB_TT_STRING) { str = mrb_str_ptr(obj); diff --git a/src/string.c b/src/string.c index 26ed7b052..3d59948f3 100644 --- a/src/string.c +++ b/src/string.c @@ -49,6 +49,7 @@ str_modify(mrb_state *mrb, struct RString *s) if (s->flags & MRB_STR_SHARED) { char *ptr, *p; long len; + struct mrb_shared_string *shared = s->aux.shared; p = s->buf; len = s->len; @@ -61,6 +62,12 @@ str_modify(mrb_state *mrb, struct RString *s) s->len = len; s->aux.capa = len; s->flags &= ~MRB_STR_SHARED; + + shared->refcnt--; + if (shared->refcnt == 0) { + mrb_free(mrb, shared->buf); + mrb_free(mrb, shared); + } } } @@ -76,9 +83,7 @@ mrb_str_resize(mrb_state *mrb, mrb_value str, int len) if (slen < len || slen -len > 1024) { s->buf = mrb_realloc(mrb, s->buf, len+1); } - if (!(s->flags & MRB_STR_SHARED)) { - s->aux.capa = len; - } + s->aux.capa = len; s->len = len; s->buf[len] = '\0'; /* sentinel */ } @@ -178,13 +183,13 @@ str_buf_cat(mrb_state *mrb, struct RString *s, const char *ptr, int len) } if (len == 0) return; capa = s->aux.capa; - if (s->len >= LONG_MAX - len) { + if (s->len >= INT_MAX - len) { mrb_raise(mrb, E_ARGUMENT_ERROR, "string sizes too big"); } total = s->len+len; if (capa <= total) { while (total > capa) { - if (capa + 1 >= LONG_MAX / 2) { + if (capa + 1 >= INT_MAX / 2) { capa = (total + 4095) / 4096; break; } @@ -258,12 +263,16 @@ str_make_shared(mrb_state *mrb, mrb_value str) str_with_class(mrb, s, str); orig = mrb_str_ptr(str); if (!(orig->flags & MRB_STR_SHARED)) { - struct RString *shared = mrb_obj_alloc_string(mrb); + struct mrb_shared_string *shared = mrb_malloc(mrb, sizeof(struct mrb_shared_string)); - shared->buf = orig->buf; + shared->refcnt = 1; + if (orig->aux.capa > orig->len) { + shared->buf = mrb_realloc(mrb, shared->buf, orig->len+1); + } + else { + shared->buf = orig->buf; + } shared->len = orig->len; - shared->aux.capa = orig->aux.capa; - orig->aux.shared = shared; orig->flags |= MRB_STR_SHARED; } @@ -285,16 +294,19 @@ str_make_shared(mrb_state *mrb, mrb_value str) mrb_value mrb_str_literal(mrb_state *mrb, mrb_value str) { - struct RString *orig, *s; + struct RString *s, *orig; + struct mrb_shared_string *shared; s = str_new(mrb, 0, 0); orig = mrb_str_ptr(str); - while (orig->flags & MRB_STR_SHARED) { - orig = orig->aux.shared; + if (!(orig->flags & MRB_STR_SHARED)) { + str_make_shared(mrb, str); } - s->buf = orig->buf; - s->len = orig->len; - s->aux.shared = orig; + shared = orig->aux.shared; + shared->refcnt++; + s->buf = shared->buf; + s->len = shared->len; + s->aux.shared = shared; s->flags |= MRB_STR_SHARED; return mrb_obj_value(s); @@ -2849,19 +2861,10 @@ mrb_str_dump(mrb_state *mrb, mrb_value str) mrb_value mrb_str_cat(mrb_state *mrb, mrb_value str, const char *ptr, long len) { - struct RString *s = mrb_str_ptr(str); - if (len < 0) { mrb_raise(mrb, E_ARGUMENT_ERROR, "negative string size (or size too big)"); } - if (0/*STR_ASSOC_P(str)*/) { - mrb_realloc(mrb, s->buf, s->len+len+1); - memcpy(s->buf + s->len, ptr, len); - s->len += len; - s->buf[s->len] = '\0'; /* sentinel */ - return str; - } - str_buf_cat(mrb, s, ptr, len); + str_buf_cat(mrb, mrb_str_ptr(str), ptr, len); return str; } -- cgit v1.2.3 From df80b7835a5d99e2f5a25446abb53ea3e68e7709 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 3 Jun 2012 08:20:48 +0900 Subject: Add Class#superclass; a patch made by @bovi; close #234 --- src/class.c | 10 ++++++++++ test/t/class.rb | 5 +++++ 2 files changed, 15 insertions(+) diff --git a/src/class.c b/src/class.c index 544f36527..748996e62 100644 --- a/src/class.c +++ b/src/class.c @@ -819,6 +819,15 @@ mrb_class_new_class(mrb_state *mrb, mrb_value cv) return mrb_obj_value(new_class); } +mrb_value +mrb_class_superclass(mrb_state *mrb, mrb_value klass) +{ + struct RClass *c, *s; + c = mrb_class_ptr(klass); + s = c->super; + return mrb_obj_value(s); +} + static mrb_value mrb_bob_init(mrb_state *mrb, mrb_value cv) { @@ -1240,6 +1249,7 @@ mrb_init_class(mrb_state *mrb) mrb_define_method(mrb, bob, "!", mrb_bob_not, ARGS_NONE()); mrb_define_method(mrb, bob, "method_missing", mrb_bob_missing, ARGS_ANY()); /* 15.3.1.3.30 */ mrb_define_class_method(mrb, cls, "new", mrb_class_new_class, ARGS_ANY()); + mrb_define_method(mrb, cls, "superclass", mrb_class_superclass, ARGS_NONE()); mrb_define_method(mrb, cls, "new", mrb_instance_new, ARGS_ANY()); mrb_define_method(mrb, cls, "inherited", mrb_bob_init, ARGS_REQ(1)); mrb_define_method(mrb, mod, "include", mrb_mod_include, ARGS_REQ(1)); diff --git a/test/t/class.rb b/test/t/class.rb index 92f3df51d..cb056feff 100644 --- a/test/t/class.rb +++ b/test/t/class.rb @@ -5,6 +5,11 @@ assert('Class', '15.2.3') do Class.class == Class end +assert('Class#superclass', '15.2.3.3.4') do + class SubClass < String; end + SubClass.superclass == String +end + # Not ISO specified assert('Class 1') do -- cgit v1.2.3 From 52fdeb02253b31616f92ec4e5bdcd365998c21bd Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 3 Jun 2012 09:05:09 +0900 Subject: str_make_shared not to return new string --- src/string.c | 39 +++++++++++++++++---------------------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/src/string.c b/src/string.c index 3d59948f3..6d37597d8 100644 --- a/src/string.c +++ b/src/string.c @@ -36,7 +36,7 @@ const char mrb_digitmap[] = "0123456789abcdefghijklmnopqrstuvwxyz"; static mrb_value get_pat(mrb_state *mrb, mrb_value pat, mrb_int quote); #endif //INCLUDE_REGEXP static mrb_value str_replace(mrb_state *mrb, struct RString *s1, struct RString *s2); -static mrb_value mrb_str_subseq(mrb_state *mrb, mrb_value str, long beg, long len); +static mrb_value mrb_str_subseq(mrb_state *mrb, mrb_value str, int beg, int len); #define RESIZE_CAPA(s,capacity) do {\ s->buf = mrb_realloc(mrb, s->buf, (capacity)+1);\ @@ -254,34 +254,26 @@ mrb_str_new_cstr(mrb_state *mrb, const char *p) return mrb_obj_value(s); } -static struct RString* +static void str_make_shared(mrb_state *mrb, mrb_value str) { - struct RString *orig, *s; + struct RString *s; - s = str_new(mrb, 0, 0); - str_with_class(mrb, s, str); - orig = mrb_str_ptr(str); - if (!(orig->flags & MRB_STR_SHARED)) { + s = mrb_str_ptr(str); + if (!(s->flags & MRB_STR_SHARED)) { struct mrb_shared_string *shared = mrb_malloc(mrb, sizeof(struct mrb_shared_string)); shared->refcnt = 1; - if (orig->aux.capa > orig->len) { - shared->buf = mrb_realloc(mrb, shared->buf, orig->len+1); + if (s->aux.capa > s->len) { + shared->buf = mrb_realloc(mrb, shared->buf, s->len+1); } else { - shared->buf = orig->buf; + shared->buf = s->buf; } - shared->len = orig->len; - orig->aux.shared = shared; - orig->flags |= MRB_STR_SHARED; + shared->len = s->len; + s->aux.shared = shared; + s->flags |= MRB_STR_SHARED; } - s->buf = orig->buf; - s->len = orig->len; - s->aux.shared = orig->aux.shared; - s->flags |= MRB_STR_SHARED; - - return s; } /* @@ -1196,12 +1188,15 @@ mrb_str_eql(mrb_state *mrb, mrb_value self) } static mrb_value -mrb_str_subseq(mrb_state *mrb, mrb_value str, long beg, long len) +mrb_str_subseq(mrb_state *mrb, mrb_value str, int beg, int len) { struct RString *s; + struct mrb_shared_string *shared; - s = str_make_shared(mrb, str); - s->buf += beg; + str_make_shared(mrb, str); + shared = RSTRING(str)->aux.shared; + s = mrb_obj_alloc_string(mrb); + s->buf = shared->buf + beg; s->len = len; return mrb_obj_value(s); -- cgit v1.2.3 From 6c2c5540e2cb549579836d9a80417b18a296344c Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 3 Jun 2012 09:09:40 +0900 Subject: should initialize shared->buf as well as s->buf --- src/string.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/string.c b/src/string.c index 6d37597d8..8bc299987 100644 --- a/src/string.c +++ b/src/string.c @@ -265,7 +265,7 @@ str_make_shared(mrb_state *mrb, mrb_value str) shared->refcnt = 1; if (s->aux.capa > s->len) { - shared->buf = mrb_realloc(mrb, shared->buf, s->len+1); + s->buf = shared->buf = mrb_realloc(mrb, s->buf, s->len+1); } else { shared->buf = s->buf; -- cgit v1.2.3 From 27c2416d201de968789917f2b6923d96ce1b953f Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 3 Jun 2012 14:13:25 +0900 Subject: stack_extend boundary condition was wrong --- src/vm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vm.c b/src/vm.c index be55a0124..865241a24 100644 --- a/src/vm.c +++ b/src/vm.c @@ -46,7 +46,7 @@ stack_extend(mrb_state *mrb, int room, int keep) { int size, off; - if (mrb->stack + room > mrb->stend) { + if (mrb->stack + room >= mrb->stend) { size = mrb->stend - mrb->stbase; off = mrb->stack - mrb->stbase; -- cgit v1.2.3 From e88e30524ee878bf0bbf665c1a6bea11a60f07d4 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 3 Jun 2012 14:44:46 +0900 Subject: should have adjusted stack address kept in closures; close #222 --- src/vm.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/vm.c b/src/vm.c index 865241a24..4f6deb877 100644 --- a/src/vm.c +++ b/src/vm.c @@ -41,12 +41,30 @@ stack_init(mrb_state *mrb) mrb->ci->target_class = mrb->object_class; } +static void +envadjust(mrb_state *mrb, mrb_value *oldbase, mrb_value *newbase) +{ + mrb_callinfo *ci = mrb->cibase; + + while (ci <= mrb->ci) { + struct REnv *e = ci->env; + if (e && e->cioff >= 0) { + int off = e->stack - oldbase; + + e->stack = newbase + off; + } + ci++; + } +} + static void stack_extend(mrb_state *mrb, int room, int keep) { int size, off; if (mrb->stack + room >= mrb->stend) { + mrb_value *oldbase = mrb->stbase; + size = mrb->stend - mrb->stbase; off = mrb->stack - mrb->stbase; @@ -57,6 +75,7 @@ stack_extend(mrb_state *mrb, int room, int keep) mrb->stbase = mrb_realloc(mrb, mrb->stbase, sizeof(mrb_value) * size); mrb->stack = mrb->stbase + off; mrb->stend = mrb->stbase + size; + envadjust(mrb, oldbase, mrb->stbase); } if (room > keep) { memset(mrb->stack+keep, 0, sizeof(mrb_value) * (room-keep)); -- cgit v1.2.3 From 5b3628051b975a899082ec25847100ad2b291564 Mon Sep 17 00:00:00 2001 From: liyuray Date: Sun, 3 Jun 2012 14:04:33 +0800 Subject: issue: make test fail on mingw. solution: initialize memory allocated. --- src/state.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/state.c b/src/state.c index b3946bad9..727bd8ecb 100644 --- a/src/state.c +++ b/src/state.c @@ -76,6 +76,7 @@ mrb_add_irep(mrb_state *mrb, int idx) if (idx > max) max = idx+1; mrb->irep = mrb_malloc(mrb, sizeof(mrb_irep*)*max); + memset(mrb->irep, 0, sizeof(mrb_irep*)*max); mrb->irep_capa = max; } else if (mrb->irep_capa <= idx) { -- cgit v1.2.3 From 48ff4f2d36de313591f222708eaf43260a4d39df Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 3 Jun 2012 15:05:18 +0900 Subject: time - time should not return time, but number --- src/time.c | 66 ++++++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 38 insertions(+), 28 deletions(-) diff --git a/src/time.c b/src/time.c index 63b763a08..516365da5 100644 --- a/src/time.c +++ b/src/time.c @@ -136,13 +136,13 @@ mrb_time_update_datetime(struct mrb_time *self) { struct tm *aid; - if(self->timezone == MRB_TIMEZONE_UTC) { + if (self->timezone == MRB_TIMEZONE_UTC) { aid = gmtime_r(&self->sec, &self->datetime); } else { aid = localtime_r(&self->sec, &self->datetime); } - if(!aid) return NULL; + if (!aid) return NULL; #ifdef NO_GMTIME_R self->datetime = *aid; // copy data #endif @@ -339,7 +339,7 @@ mrb_time_plus(mrb_state *mrb, mrb_value self) mrb_get_args(mrb, "f", &f); tm = mrb_get_datatype(mrb, self, &mrb_time_type); - if(!tm) return mrb_nil_value(); + if (!tm) return mrb_nil_value(); f += tm->sec; f += (mrb_float)tm->usec / 1.0e6; return mrb_time_make(mrb, mrb_obj_class(mrb, self), f, tm->timezone); @@ -349,14 +349,24 @@ static mrb_value mrb_time_minus(mrb_state *mrb, mrb_value self) { mrb_float f; - struct mrb_time *tm; + mrb_value other; + struct mrb_time *tm, *tm2; - mrb_get_args(mrb, "f", &f); + mrb_get_args(mrb, "o", &other); tm = mrb_get_datatype(mrb, self, &mrb_time_type); - if(!tm) return mrb_nil_value(); - f -= tm->sec; - f -= (mrb_float)tm->usec / 1.0e6; - return mrb_time_make(mrb, mrb_obj_class(mrb, self), f, tm->timezone); + if (!tm) return mrb_nil_value(); + + tm2 = mrb_get_datatype(mrb, other, &mrb_time_type); + if (tm2) { + + f = (mrb_float)(tm->sec - tm2->sec) + + (mrb_float)(tm->usec - tm2->usec) / 1.0e6; + return mrb_float_value(f); + } + else { + mrb_get_args(mrb, "f", &f); + return mrb_time_make(mrb, mrb_obj_class(mrb, self), f, tm->timezone); + } } /* 15.2.19.7.30 */ @@ -367,7 +377,7 @@ mrb_time_wday(mrb_state *mrb, mrb_value self) struct mrb_time *tm; tm = mrb_get_datatype(mrb, self, &mrb_time_type); - if(!tm) return mrb_nil_value(); + if (!tm) return mrb_nil_value(); return mrb_fixnum_value(tm->datetime.tm_wday); } @@ -379,7 +389,7 @@ mrb_time_yday(mrb_state *mrb, mrb_value self) struct mrb_time *tm; tm = mrb_check_datatype(mrb, self, &mrb_time_type); - if(!tm) return mrb_nil_value(); + if (!tm) return mrb_nil_value(); return mrb_fixnum_value(tm->datetime.tm_yday); } @@ -391,7 +401,7 @@ mrb_time_year(mrb_state *mrb, mrb_value self) struct mrb_time *tm; tm = mrb_get_datatype(mrb, self, &mrb_time_type); - if(!tm) return mrb_nil_value(); + if (!tm) return mrb_nil_value(); return mrb_fixnum_value(tm->datetime.tm_year + 1900); } @@ -403,9 +413,9 @@ mrb_time_zone(mrb_state *mrb, mrb_value self) struct mrb_time *tm; tm = mrb_get_datatype(mrb, self, &mrb_time_type); - if(!tm) return mrb_nil_value(); - if(tm->timezone <= MRB_TIMEZONE_NONE) return mrb_nil_value(); - if(tm->timezone >= MRB_TIMEZONE_LAST) return mrb_nil_value(); + if (!tm) return mrb_nil_value(); + if (tm->timezone <= MRB_TIMEZONE_NONE) return mrb_nil_value(); + if (tm->timezone >= MRB_TIMEZONE_LAST) return mrb_nil_value(); return mrb_str_new_cstr(mrb, timezone_names[tm->timezone]); } @@ -419,7 +429,7 @@ mrb_time_asctime(mrb_state *mrb, mrb_value self) char buf[256]; tm = mrb_get_datatype(mrb, self, &mrb_time_type); - if(!tm) return mrb_nil_value(); + if (!tm) return mrb_nil_value(); d = &tm->datetime; snprintf(buf, 256, "%s %s %02d %02d:%02d:%02d %s%d", wday_names[d->tm_wday], mon_names[d->tm_mon], d->tm_mday, @@ -437,7 +447,7 @@ mrb_time_day(mrb_state *mrb, mrb_value self) struct mrb_time *tm; tm = mrb_get_datatype(mrb, self, &mrb_time_type); - if(!tm) return mrb_nil_value(); + if (!tm) return mrb_nil_value(); return mrb_fixnum_value(tm->datetime.tm_mday); } @@ -450,7 +460,7 @@ mrb_time_dstp(mrb_state *mrb, mrb_value self) struct mrb_time *tm; tm = mrb_get_datatype(mrb, self, &mrb_time_type); - if(!tm) return mrb_nil_value(); + if (!tm) return mrb_nil_value(); return mrb_bool_value(tm->datetime.tm_isdst); } @@ -462,7 +472,7 @@ mrb_time_hour(mrb_state *mrb, mrb_value self) struct mrb_time *tm; tm = mrb_get_datatype(mrb, self, &mrb_time_type); - if(!tm) return mrb_nil_value(); + if (!tm) return mrb_nil_value(); return mrb_fixnum_value(tm->datetime.tm_hour); } @@ -520,7 +530,7 @@ mrb_time_localtime(mrb_state *mrb, mrb_value self) struct mrb_time *tm; tm = mrb_get_datatype(mrb, self, &mrb_time_type); - if(!tm) return self; + if (!tm) return self; tm->timezone = MRB_TIMEZONE_LOCAL; mrb_time_update_datetime(tm); return self; @@ -534,7 +544,7 @@ mrb_time_mday(mrb_state *mrb, mrb_value self) struct mrb_time *tm; tm = mrb_get_datatype(mrb, self, &mrb_time_type); - if(!tm) return mrb_nil_value(); + if (!tm) return mrb_nil_value(); return mrb_fixnum_value(tm->datetime.tm_mday); } @@ -546,7 +556,7 @@ mrb_time_min(mrb_state *mrb, mrb_value self) struct mrb_time *tm; tm = mrb_get_datatype(mrb, self, &mrb_time_type); - if(!tm) return mrb_nil_value(); + if (!tm) return mrb_nil_value(); return mrb_fixnum_value(tm->datetime.tm_min); } @@ -558,7 +568,7 @@ mrb_time_mon(mrb_state *mrb, mrb_value self) struct mrb_time *tm; tm = mrb_get_datatype(mrb, self, &mrb_time_type); - if(!tm) return mrb_nil_value(); + if (!tm) return mrb_nil_value(); return mrb_fixnum_value(tm->datetime.tm_mon + 1); } @@ -570,7 +580,7 @@ mrb_time_sec(mrb_state *mrb, mrb_value self) struct mrb_time *tm; tm = mrb_get_datatype(mrb, self, &mrb_time_type); - if(!tm) return mrb_nil_value(); + if (!tm) return mrb_nil_value(); return mrb_fixnum_value(tm->datetime.tm_sec); } @@ -583,7 +593,7 @@ mrb_time_to_f(mrb_state *mrb, mrb_value self) struct mrb_time *tm; tm = mrb_get_datatype(mrb, self, &mrb_time_type); - if(!tm) return mrb_nil_value(); + if (!tm) return mrb_nil_value(); return mrb_float_value((mrb_float)tm->sec + (mrb_float)tm->usec/1.0e6); } @@ -595,7 +605,7 @@ mrb_time_to_i(mrb_state *mrb, mrb_value self) struct mrb_time *tm; tm = mrb_get_datatype(mrb, self, &mrb_time_type); - if(!tm) return mrb_nil_value(); + if (!tm) return mrb_nil_value(); return mrb_fixnum_value(tm->sec); } @@ -607,7 +617,7 @@ mrb_time_usec(mrb_state *mrb, mrb_value self) struct mrb_time *tm; tm = mrb_get_datatype(mrb, self, &mrb_time_type); - if(!tm) return mrb_nil_value(); + if (!tm) return mrb_nil_value(); return mrb_fixnum_value(tm->usec); } @@ -633,7 +643,7 @@ mrb_time_utcp(mrb_state *mrb, mrb_value self) { struct mrb_time *tm; tm = mrb_get_datatype(mrb, self, &mrb_time_type); - if(!tm) return mrb_nil_value(); + if (!tm) return mrb_nil_value(); return mrb_bool_value(tm->timezone == MRB_TIMEZONE_UTC); } -- cgit v1.2.3 From 5b47ec7a8bbe913b89e8432579bde7965bd37084 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 3 Jun 2012 15:08:43 +0900 Subject: remove a blank line --- src/time.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/time.c b/src/time.c index 516365da5..a6f1e4d1f 100644 --- a/src/time.c +++ b/src/time.c @@ -358,7 +358,6 @@ mrb_time_minus(mrb_state *mrb, mrb_value self) tm2 = mrb_get_datatype(mrb, other, &mrb_time_type); if (tm2) { - f = (mrb_float)(tm->sec - tm2->sec) + (mrb_float)(tm->usec - tm2->usec) / 1.0e6; return mrb_float_value(f); -- cgit v1.2.3 From 28b9619bb4c1a560392e0f958a5a5d9cedf12bc7 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 3 Jun 2012 15:45:06 +0900 Subject: should decref shared string body on gc_free --- include/mruby/string.h | 1 + src/gc.c | 4 +++- src/string.c | 16 +++++++++++----- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/include/mruby/string.h b/include/mruby/string.h index 852c5ff02..91a59d92d 100644 --- a/include/mruby/string.h +++ b/include/mruby/string.h @@ -49,6 +49,7 @@ struct RString { #define RSTRING_END(s) (RSTRING(s)->buf + RSTRING(s)->len) #define MRB_STR_SHARED 256 +void mrb_str_decref(mrb_state*, struct mrb_shared_string*); mrb_value mrb_str_literal(mrb_state*, mrb_value); void mrb_str_concat(mrb_state*, mrb_value, mrb_value); mrb_value mrb_obj_to_str(mrb_state*, mrb_value); diff --git a/src/gc.c b/src/gc.c index 03428765c..cce35efa4 100644 --- a/src/gc.c +++ b/src/gc.c @@ -460,7 +460,9 @@ obj_free(mrb_state *mrb, struct RBasic *obj) break; case MRB_TT_STRING: - if (!(obj->flags & MRB_STR_SHARED)) + if (obj->flags & MRB_STR_SHARED) + mrb_str_decref(mrb, ((struct RString*)obj)->aux.shared); + else mrb_free(mrb, ((struct RString*)obj)->buf); break; diff --git a/src/string.c b/src/string.c index 8bc299987..6eba9cb20 100644 --- a/src/string.c +++ b/src/string.c @@ -43,6 +43,16 @@ static mrb_value mrb_str_subseq(mrb_state *mrb, mrb_value str, int beg, int len) s->aux.capa = capacity;\ } while (0) +void +mrb_str_decref(mrb_state *mrb, struct mrb_shared_string *shared) +{ + shared->refcnt--; + if (shared->refcnt == 0) { + mrb_free(mrb, shared->buf); + mrb_free(mrb, shared); + } +} + static void str_modify(mrb_state *mrb, struct RString *s) { @@ -63,11 +73,7 @@ str_modify(mrb_state *mrb, struct RString *s) s->aux.capa = len; s->flags &= ~MRB_STR_SHARED; - shared->refcnt--; - if (shared->refcnt == 0) { - mrb_free(mrb, shared->buf); - mrb_free(mrb, shared); - } + mrb_str_decref(mrb, shared); } } -- cgit v1.2.3 From 479df23bc0985d0050c27c87285291b43b8bcfbc Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 3 Jun 2012 15:58:15 +0900 Subject: puts should return nil; close #215 --- mrblib/print.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/mrblib/print.rb b/mrblib/print.rb index 52beb26cb..0d33c66d2 100644 --- a/mrblib/print.rb +++ b/mrblib/print.rb @@ -30,6 +30,7 @@ module Kernel i += 1 end __printstr__ "\n" if len == 0 + nil end ## -- cgit v1.2.3 From 597978c1690ca25b6a1ca99f8dd4c70190765bea Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 3 Jun 2012 17:34:23 +0900 Subject: mrb_malloc/calloc/realloc should call mrb_garbage_collect before returning NULL --- src/gc.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/gc.c b/src/gc.c index cce35efa4..b269ecfb4 100644 --- a/src/gc.c +++ b/src/gc.c @@ -121,25 +121,31 @@ gettimeofday_time(void) #define GC_STEP_SIZE 1024 - void* mrb_realloc(mrb_state *mrb, void *p, size_t len) { - return (mrb->allocf)(mrb, p, len); + p = (mrb->allocf)(mrb, p, len); + + if (!p && len > 0 && mrb->heaps) { + mrb_garbage_collect(mrb); + p = (mrb->allocf)(mrb, p, len); + } + return p; } void* mrb_malloc(mrb_state *mrb, size_t len) { - return (mrb->allocf)(mrb, 0, len); + return mrb_realloc(mrb, 0, len); } void* mrb_calloc(mrb_state *mrb, size_t nelem, size_t len) { - void *p = (mrb->allocf)(mrb, 0, nelem*len); + void *p = mrb_realloc(mrb, 0, nelem*len); - memset(p, 0, nelem*len); + if (len > 0) + memset(p, 0, nelem*len); return p; } -- cgit v1.2.3 From 0629cf21baefd83765206036e4ceac45f7a55ca4 Mon Sep 17 00:00:00 2001 From: Kazuki Tsujimoto Date: Sun, 3 Jun 2012 17:48:02 +0900 Subject: A rescue clause with no parameter list rescues only StandardErrors --- src/codegen.c | 38 ++++++++++++++++++++++---------------- test/t/exception.rb | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 16 deletions(-) diff --git a/src/codegen.c b/src/codegen.c index 20799f9ae..117588b6e 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -834,28 +834,34 @@ codegen(codegen_scope *s, node *tree, int val) push(); while (n2) { node *n3 = n2->car; + node *n4 = n3->car; if (pos1) dispatch(s, pos1); - if (n3->car) { - node *n4 = n3->car; - - pos2 = 0; - while (n4) { + pos2 = 0; + do { + if (n4) { codegen(s, n4->car, VAL); - genop(s, MKOP_AB(OP_MOVE, cursp(), exc)); + } + else { + genop(s, MKOP_ABx(OP_GETCONST, cursp(), new_msym(s, mrb_intern(s->mrb, "StandardError")))); push(); - genop(s, MKOP_A(OP_LOADNIL, cursp())); - pop(); pop(); - genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern(s->mrb, "===")), 1)); - tmp = new_label(s); - genop(s, MKOP_AsBx(OP_JMPIF, cursp(), pos2)); - pos2 = tmp; + } + genop(s, MKOP_AB(OP_MOVE, cursp(), exc)); + push(); + genop(s, MKOP_A(OP_LOADNIL, cursp())); + pop(); pop(); + genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern(s->mrb, "===")), 1)); + tmp = new_label(s); + genop(s, MKOP_AsBx(OP_JMPIF, cursp(), pos2)); + pos2 = tmp; + if (n4) { n4 = n4->cdr; } - pos1 = new_label(s); - genop(s, MKOP_Bx(OP_JMP, 0)); - dispatch_linked(s, pos2); - } + } while (n4); + pos1 = new_label(s); + genop(s, MKOP_Bx(OP_JMP, 0)); + dispatch_linked(s, pos2); + pop(); if (n3->cdr->car) { gen_assignment(s, n3->cdr->car, exc, NOVAL); diff --git a/test/t/exception.rb b/test/t/exception.rb index 6b46314d0..d68ed8bd7 100644 --- a/test/t/exception.rb +++ b/test/t/exception.rb @@ -193,3 +193,39 @@ assert('Exception 10') do 7+7 end == 12 end + +assert('Exception 11') do + a = :ok + begin + begin + raise Exception + rescue + a = :ng + end + rescue Exception + end + a == :ok +end + +assert('Exception 12') do + a = :ok + begin + raise Exception rescue a = :ng + rescue Exception + end + a == :ok +end + +assert('Exception 13') do + a = :ng + begin + raise StandardError + rescue TypeError, ArgumentError + a = :ng + rescue + a = :ok + else + a = :ng + end + a == :ok +end -- cgit v1.2.3 From 4e46abb86914b36e70b5f3ad0826d0b648e9b4ef Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 3 Jun 2012 17:52:04 +0900 Subject: remove unused mrb_exec_recursive --- include/mruby.h | 2 -- src/etc.c | 8 -------- 2 files changed, 10 deletions(-) diff --git a/include/mruby.h b/include/mruby.h index 70bbdf3c2..3dc160535 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -469,8 +469,6 @@ mrb_value mrb_yield_with_self(mrb_state *mrb, mrb_value b, int argc, mrb_value * mrb_value mrb_class_new_instance(mrb_state *mrb, int, mrb_value*, struct RClass *); mrb_value mrb_class_new_instance_m(mrb_state *mrb, mrb_value klass); -mrb_value mrb_exec_recursive(mrb_state *mrb, mrb_value(*)(mrb_state *, mrb_value, mrb_value, int),mrb_value,void *); - #ifndef xmalloc #define xmalloc malloc #define xrealloc realloc diff --git a/src/etc.c b/src/etc.c index 90ec47fb9..5d70c8bc7 100644 --- a/src/etc.c +++ b/src/etc.c @@ -111,14 +111,6 @@ mrb_exec_recursive(mrb_state *mrb, mrb_value (*func) (mrb_state *, mrb_value, mr * current method is called recursively on the ordered pair */ -mrb_value -mrb_exec_recursive_paired(mrb_state *mrb, mrb_value (*func) (mrb_state *, mrb_value, mrb_value, int), - mrb_value obj, mrb_value paired_obj, void* arg) -{ - // return mrb_exec_recursive_paired(mrb, recursive_eql, hash1, hash2, mrb_fixnum_value((int)&data)); - return func(mrb, obj, paired_obj, 0); -} - mrb_sym mrb_to_id(mrb_state *mrb, mrb_value name) { -- cgit v1.2.3 From 80c8908c4e6672670a0fef426baa6e79d1dcd518 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 3 Jun 2012 17:59:59 +0900 Subject: remove mrb_exec_recursive --- src/range.c | 33 ++++++++++++--------------------- src/struct.c | 57 ++++++++++++++++++--------------------------------------- 2 files changed, 30 insertions(+), 60 deletions(-) diff --git a/src/range.c b/src/range.c index c1fb580b5..b8b1d3926 100644 --- a/src/range.c +++ b/src/range.c @@ -29,9 +29,6 @@ #define RANGE_CLASS (mrb_class_obj_get(mrb, "Range")) -mrb_value mrb_exec_recursive_paired(mrb_state *mrb, mrb_value (*func) (mrb_state *, mrb_value, mrb_value, int), - mrb_value obj, mrb_value paired_obj, void* arg); - mrb_value mrb_range_new(mrb_state *mrb, mrb_value beg, mrb_value end, int excl) { @@ -397,23 +394,6 @@ range_inspect(mrb_state *mrb, mrb_value range) return inspect_range(mrb, range, range, 0); } -static mrb_value -recursive_eql(mrb_state *mrb, mrb_value range, mrb_value obj, int recur) -{ - struct RRange *r = mrb_range_ptr(range); - struct RRange *o = mrb_range_ptr(obj); - - if (recur) return mrb_true_value(); /* Subtle! */ - if (!mrb_eql(mrb, r->edges->beg, o->edges->beg)) - return mrb_false_value(); - if (!mrb_eql(mrb, r->edges->end, o->edges->end)) - return mrb_false_value(); - - if (r->excl != o->excl) - return mrb_false_value(); - return mrb_true_value(); -} - /* 15.2.14.4.14(x) */ /* * call-seq: @@ -433,13 +413,24 @@ static mrb_value range_eql(mrb_state *mrb, mrb_value range) { mrb_value obj; + struct RRange *r, *o; mrb_get_args(mrb, "o", &obj); 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(); - return mrb_exec_recursive_paired(mrb, recursive_eql, range, obj, &obj); + + r = mrb_range_ptr(range); + if (obj.tt != MRB_TT_RANGE) return mrb_false_value(); + o = mrb_range_ptr(obj); + if (!mrb_eql(mrb, r->edges->beg, o->edges->beg)) + return mrb_false_value(); + if (!mrb_eql(mrb, r->edges->end, o->edges->end)) + return mrb_false_value(); + if (r->excl != o->excl) + return mrb_false_value(); + return mrb_true_value(); } /* 15.2.14.4.15(x) */ diff --git a/src/struct.c b/src/struct.c index 9f7010e0b..e9266ad17 100644 --- a/src/struct.c +++ b/src/struct.c @@ -15,10 +15,6 @@ #ifdef INCLUDE_REGEXP #include "encoding.h" #endif -mrb_sym rb_frame_this_func(mrb_state *mrb); -mrb_sym mrb_frame_callee(mrb_state *mrb); -mrb_value mrb_exec_recursive_paired(mrb_state *mrb, mrb_value (*func) (mrb_state *, mrb_value, mrb_value, int), - mrb_value obj, mrb_value paired_obj, void* arg); #include "mruby/numeric.h" #include "mruby/hash.h" @@ -688,22 +684,6 @@ mrb_struct_aset(mrb_state *mrb, mrb_value s) return RSTRUCT_PTR(s)[i] = val; } -static mrb_value -recursive_equal(mrb_state *mrb, mrb_value s, mrb_value s2, int recur) -{ - mrb_value *ptr, *ptr2; - long i, len; - - if (recur) return mrb_true_value(); /* Subtle! */ - ptr = RSTRUCT_PTR(s); - ptr2 = RSTRUCT_PTR(s2); - len = RSTRUCT_LEN(s); - for (i=0; i Date: Sun, 3 Jun 2012 20:59:33 +0900 Subject: strig.c should properly decref shared entities --- src/string.c | 45 +++++++++++++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/src/string.c b/src/string.c index 6eba9cb20..2d5c67655 100644 --- a/src/string.c +++ b/src/string.c @@ -261,11 +261,8 @@ mrb_str_new_cstr(mrb_state *mrb, const char *p) } static void -str_make_shared(mrb_state *mrb, mrb_value str) +str_make_shared(mrb_state *mrb, struct RString *s) { - struct RString *s; - - s = mrb_str_ptr(str); if (!(s->flags & MRB_STR_SHARED)) { struct mrb_shared_string *shared = mrb_malloc(mrb, sizeof(struct mrb_shared_string)); @@ -298,7 +295,7 @@ mrb_str_literal(mrb_state *mrb, mrb_value str) s = str_new(mrb, 0, 0); orig = mrb_str_ptr(str); if (!(orig->flags & MRB_STR_SHARED)) { - str_make_shared(mrb, str); + str_make_shared(mrb, mrb_str_ptr(str)); } shared = orig->aux.shared; shared->refcnt++; @@ -1199,8 +1196,9 @@ mrb_str_subseq(mrb_state *mrb, mrb_value str, int beg, int len) struct RString *s; struct mrb_shared_string *shared; - str_make_shared(mrb, str); - shared = RSTRING(str)->aux.shared; + s = mrb_str_ptr(str); + str_make_shared(mrb, s); + shared = s->aux.shared; s = mrb_obj_alloc_string(mrb); s->buf = shared->buf + beg; s->len = len; @@ -1541,16 +1539,35 @@ mrb_str_index_m(mrb_state *mrb, mrb_value str) return mrb_fixnum_value(pos); } +#define STR_REPLACE_SHARED_MIN 10 + static mrb_value str_replace(mrb_state *mrb, struct RString *s1, struct RString *s2) { - int len = s2->len; - - str_modify(mrb, s1); - s1->buf = mrb_realloc(mrb, s1->buf, len); - memcpy(s1->buf, s2->buf, len); - s1->len = s2->len; - s2->aux.capa = s2->len; + if (s2->flags & MRB_STR_SHARED) { + L_SHARE: + s1->buf = s2->buf; + s1->len = s2->len; + s1->aux.shared = s2->aux.shared; + s1->flags |= MRB_STR_SHARED; + } + else if (s2->len > STR_REPLACE_SHARED_MIN) { + str_make_shared(mrb, s2); + goto L_SHARE; + } + else { + if (s1->flags & MRB_STR_SHARED) { + mrb_str_decref(mrb, s1->aux.shared); + s1->buf = mrb_malloc(mrb, s2->len+1); + } + else { + s1->buf = mrb_realloc(mrb, s1->buf, s2->len+1); + } + memcpy(s1->buf, s2->buf, s2->len); + s1->buf[s2->len] = 0; + s1->len = s2->len; + s2->aux.capa = s2->len; + } return mrb_obj_value(s1); } -- cgit v1.2.3 From dece49750d161d74992854fb18d64d50bdaad0a9 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 3 Jun 2012 21:06:04 +0900 Subject: string.subseq should update shared refcnt --- src/string.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/string.c b/src/string.c index 2d5c67655..d7749c27b 100644 --- a/src/string.c +++ b/src/string.c @@ -1202,6 +1202,9 @@ mrb_str_subseq(mrb_state *mrb, mrb_value str, int beg, int len) s = mrb_obj_alloc_string(mrb); s->buf = shared->buf + beg; s->len = len; + s->aux.shared = shared; + s->flags |= MRB_STR_SHARED; + shared->refcnt++; return mrb_obj_value(s); } -- cgit v1.2.3 From 3be1c8890774c04d65bbed87914e9453d1496eed Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 3 Jun 2012 22:59:40 +0900 Subject: str_modify() revives string buffer kept in shared structure if refcnt == 1 --- src/string.c | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/src/string.c b/src/string.c index d7749c27b..d09d8942b 100644 --- a/src/string.c +++ b/src/string.c @@ -57,23 +57,29 @@ static void str_modify(mrb_state *mrb, struct RString *s) { if (s->flags & MRB_STR_SHARED) { - char *ptr, *p; - long len; struct mrb_shared_string *shared = s->aux.shared; - p = s->buf; - len = s->len; - ptr = mrb_malloc(mrb, sizeof(char)*(len+1)); - if (p) { - memcpy(ptr, p, len); + if (shared->refcnt == 1 && s->buf == shared->buf) { + s->buf = shared->buf; + s->aux.capa = shared->len; + mrb_free(mrb, shared); + } + else { + char *ptr, *p; + long len; + + p = s->buf; + len = s->len; + ptr = mrb_malloc(mrb, len+1); + if (p) { + memcpy(ptr, p, len); + } + ptr[len] = 0; + s->buf = ptr; + s->aux.capa = len; + mrb_str_decref(mrb, shared); } - ptr[len] = 0; - s->buf = ptr; - s->len = len; - s->aux.capa = len; s->flags &= ~MRB_STR_SHARED; - - mrb_str_decref(mrb, shared); } } -- cgit v1.2.3 From e4529c065dfcd844dbea11ba3822af7528393450 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 3 Jun 2012 23:05:31 +0900 Subject: make arrays to share bodies --- include/mruby/array.h | 14 ++- src/array.c | 231 ++++++++++++++++++++++++++++++++++---------------- src/gc.c | 5 +- src/struct.c | 2 +- 4 files changed, 175 insertions(+), 77 deletions(-) diff --git a/include/mruby/array.h b/include/mruby/array.h index 21d50152f..c6c35a4e4 100644 --- a/include/mruby/array.h +++ b/include/mruby/array.h @@ -11,10 +11,19 @@ extern "C" { #endif +struct mrb_shared_array { + int refcnt; + mrb_value *buf; + int len; +}; + struct RArray { MRUBY_OBJECT_HEADER; int len; - int capa; + union { + int capa; + struct mrb_shared_array *shared; + } aux; mrb_value *buf; }; @@ -24,7 +33,9 @@ struct RArray { #define RARRAY_LEN(a) (RARRAY(a)->len) #define RARRAY_PTR(a) (RARRAY(a)->buf) +#define MRB_ARY_SHARED 256 +void mrb_ary_decref(mrb_state*, struct mrb_shared_array*); mrb_value mrb_ary_new_capa(mrb_state*, int); mrb_value mrb_ary_new(mrb_state *mrb); mrb_value mrb_ary_new_elts(mrb_state *mrb, int n, const mrb_value *elts); @@ -43,7 +54,6 @@ mrb_value mrb_ary_unshift(mrb_state *mrb, mrb_value self, mrb_value item); mrb_value mrb_ary_new4(mrb_state *mrb, int n, const mrb_value *elts); mrb_value mrb_assoc_new(mrb_state *mrb, mrb_value car, mrb_value cdr); mrb_value mrb_ary_entry(mrb_value ary, int offset); -mrb_value mrb_ary_tmp_new(mrb_state *mrb, int capa); mrb_value mrb_ary_sort(mrb_state *mrb, mrb_value ary); mrb_value mrb_ary_shift(mrb_state *mrb, mrb_value self); diff --git a/src/array.c b/src/array.c index ed207a2a2..8f2e4824e 100644 --- a/src/array.c +++ b/src/array.c @@ -12,12 +12,12 @@ #define ARY_DEFAULT_LEN 4 #define ARY_SHRINK_RATIO 5 /* must be larger than 2 */ -#ifdef LONG_MAX -# define ARY_MAX_SIZE (LONG_MAX / sizeof(mrb_value)) +#ifdef INT_MAX +# define ARY_MAX_SIZE (INT_MAX / sizeof(mrb_value)) #endif static inline mrb_value -ary_elt(mrb_value ary, long offset) +ary_elt(mrb_value ary, int offset) { if (RARRAY_LEN(ary) == 0) return mrb_nil_value(); if (offset < 0 || RARRAY_LEN(ary) <= offset) { @@ -27,12 +27,12 @@ ary_elt(mrb_value ary, long offset) } static struct RArray* -ary_new_capa(mrb_state *mrb, size_t capa) +ary_new_capa(mrb_state *mrb, int capa) { struct RArray *a; - size_t blen; + int blen; -#ifdef LONG_MAX +#ifdef INT_MAX if (capa > ARY_MAX_SIZE) { mrb_raise(mrb, E_ARGUMENT_ERROR, "ary size too big"); } @@ -48,7 +48,7 @@ ary_new_capa(mrb_state *mrb, size_t capa) a = (struct RArray*)mrb_obj_alloc(mrb, MRB_TT_ARRAY, mrb->array_class); a->buf = mrb_malloc(mrb, blen); memset(a->buf, 0, blen); - a->capa = capa; + a->aux.capa = capa; a->len = 0; return a; @@ -90,7 +90,7 @@ mrb_assoc_new(mrb_state *mrb, mrb_value car, mrb_value cdr) return mrb_ary_new_from_values(mrb, 2, arv); } -void +static void ary_fill_with_nil(mrb_value *buf, int size) { mrb_value nil = mrb_nil_value(); @@ -100,12 +100,60 @@ ary_fill_with_nil(mrb_value *buf, int size) } } -void -mrb_ary_expand_capa(mrb_state *mrb, struct RArray *a, int len) +static void +ary_modify(mrb_state *mrb, struct RArray *a) +{ + if (a->flags & MRB_ARY_SHARED) { + struct mrb_shared_array *shared = a->aux.shared; + + if (shared->refcnt == 1 && a->buf == shared->buf) { + a->buf = shared->buf; + a->aux.capa = a->len; + mrb_free(mrb, shared); + } + else { + mrb_value *ptr, *p; + int len; + + p = a->buf; + len = a->len * sizeof(mrb_value); + ptr = mrb_malloc(mrb, len); + if (p) { + memcpy(ptr, p, len); + } + a->buf = ptr; + a->aux.capa = len; + mrb_ary_decref(mrb, shared); + } + a->flags &= ~MRB_ARY_SHARED; + } +} + +static void +ary_make_shared(mrb_state *mrb, struct RArray *a) { - int capa = a->capa; + if (!(a->flags & MRB_ARY_SHARED)) { + struct mrb_shared_array *shared = mrb_malloc(mrb, sizeof(struct mrb_shared_array)); -#ifdef LONG_MAX + shared->refcnt = 1; + if (a->aux.capa > a->len) { + a->buf = shared->buf = mrb_realloc(mrb, a->buf, sizeof(mrb_value)*a->len+1); + } + else { + shared->buf = a->buf; + } + shared->len = a->len; + a->aux.shared = shared; + a->flags |= MRB_ARY_SHARED; + } +} + +static void +ary_expand_capa(mrb_state *mrb, struct RArray *a, int len) +{ + int capa = a->aux.capa; + +#ifdef INT_MAX if (len > ARY_MAX_SIZE) { mrb_raise(mrb, E_ARGUMENT_ERROR, "array size too big"); } @@ -120,20 +168,20 @@ mrb_ary_expand_capa(mrb_state *mrb, struct RArray *a, int len) } } -#ifdef LONG_MAX +#ifdef INT_MAX if (capa > ARY_MAX_SIZE) capa = ARY_MAX_SIZE; /* len <= capa <= ARY_MAX_SIZE */ #endif - if (capa > a->capa) { - a->capa = capa; + if (capa > a->aux.capa) { + a->aux.capa = capa; a->buf = mrb_realloc(mrb, a->buf, sizeof(mrb_value)*capa); } } -void -mrb_ary_shrink_capa(mrb_state *mrb, struct RArray *a) +static void +ary_shrink_capa(mrb_state *mrb, struct RArray *a) { - int capa = a->capa; + int capa = a->aux.capa; if (capa < ARY_DEFAULT_LEN * 2) return; if (capa <= a->len * ARY_SHRINK_RATIO) return; @@ -146,8 +194,8 @@ mrb_ary_shrink_capa(mrb_state *mrb, struct RArray *a) } } while(capa > a->len * ARY_SHRINK_RATIO); - if (capa > a->len && capa < a->capa) { - a->capa = capa; + if (capa > a->len && capa < a->aux.capa) { + a->aux.capa = capa; a->buf = mrb_realloc(mrb, a->buf, sizeof(mrb_value)*capa); } } @@ -167,7 +215,8 @@ ary_concat(mrb_state *mrb, struct RArray *a, mrb_value *buf, int blen) { int len = a->len + blen; - if (a->capa < len) mrb_ary_expand_capa(mrb, a, len); + ary_modify(mrb, a); + if (a->aux.capa < len) ary_expand_capa(mrb, a, len); memcpy(a->buf+a->len, buf, sizeof(mrb_value)*blen); mrb_write_barrier(mrb, (struct RBasic*)a); a->len = len; @@ -235,7 +284,7 @@ mrb_ary_cmp(mrb_state *mrb, mrb_value ary1) mrb_value ary2; struct RArray *a1, *a2; mrb_value r = mrb_nil_value(); - long i, len; + int i, len; mrb_get_args(mrb, "o", &ary2); if (mrb_type(ary2) != MRB_TT_ARRAY) return mrb_nil_value(); @@ -258,7 +307,9 @@ mrb_ary_cmp(mrb_state *mrb, mrb_value ary1) static void ary_replace(mrb_state *mrb, struct RArray *a, mrb_value *argv, int len) { - if (a->capa < len) mrb_ary_expand_capa(mrb, a, len); + ary_modify(mrb, a); + if (a->aux.capa < len) + ary_expand_capa(mrb, a, len); memcpy(a->buf, argv, sizeof(mrb_value)*len); mrb_write_barrier(mrb, (struct RBasic*)a); a->len = len; @@ -377,21 +428,13 @@ mrb_ary_push(mrb_state *mrb, mrb_value ary, mrb_value elem) /* mrb_ary_push */ { struct RArray *a = mrb_ary_ptr(ary); - if (a->len == a->capa) mrb_ary_expand_capa(mrb, a, a->len + 1); + ary_modify(mrb, a); + if (a->len == a->aux.capa) + ary_expand_capa(mrb, a, a->len + 1); a->buf[a->len++] = elem; mrb_write_barrier(mrb, (struct RBasic*)a); } -mrb_value -mrb_ary_pop(mrb_state *mrb, mrb_value ary) -{ - struct RArray *a = mrb_ary_ptr(ary); - - if (a->len == 0) return mrb_nil_value(); - - return a->buf[--a->len]; -} - mrb_value mrb_ary_push_m(mrb_state *mrb, mrb_value self) { @@ -407,30 +450,45 @@ mrb_ary_push_m(mrb_state *mrb, mrb_value self) } mrb_value -mrb_ary_pop_m(mrb_state *mrb, mrb_value self) +mrb_ary_pop(mrb_state *mrb, mrb_value ary) { - struct RArray *a = mrb_ary_ptr(self); + struct RArray *a = mrb_ary_ptr(ary); - return ((a->len == 0)? mrb_nil_value(): mrb_ary_pop(mrb, self)); + if (a->len == 0) return mrb_nil_value(); + return a->buf[--a->len]; } +#define ARY_SHIFT_SHARED_MIN 10 + mrb_value mrb_ary_shift(mrb_state *mrb, mrb_value self) { struct RArray *a = mrb_ary_ptr(self); - mrb_value *buf = a->buf; - int size = a->len; mrb_value val; - if (size == 0) return mrb_nil_value(); - - val = *buf; - while((int)(--size)) { - *buf = *(buf+1); - ++buf; + if (a->len == 0) return mrb_nil_value(); + if (a->flags & MRB_ARY_SHARED) { + L_SHIFT: + val = a->buf[0]; + a->buf++; + a->len--; + return val; } - --a->len; + if (a->len > ARY_SHIFT_SHARED_MIN) { + ary_make_shared(mrb, a); + goto L_SHIFT; + } + else { + mrb_value *buf = a->buf; + int size = a->len; + val = *buf; + while((int)(--size)) { + *buf = *(buf+1); + ++buf; + } + --a->len; + } return val; } @@ -443,7 +501,9 @@ mrb_ary_unshift(mrb_state *mrb, mrb_value self, mrb_value item) { struct RArray *a = mrb_ary_ptr(self); - if (a->capa < a->len + 1) mrb_ary_expand_capa(mrb, a, a->len + 1); + ary_modify(mrb, a); + if (a->aux.capa < a->len + 1) + ary_expand_capa(mrb, a, a->len + 1); memmove(a->buf + 1, a->buf, sizeof(mrb_value)*a->len); memcpy(a->buf, &item, sizeof(mrb_value)); a->len += 1; @@ -459,9 +519,11 @@ mrb_ary_unshift_m(mrb_state *mrb, mrb_value self) mrb_value *vals; int len; + ary_modify(mrb, a); mrb_get_args(mrb, "*", &vals, &len); if (len == 0) return self; - if (a->capa < a->len + len) mrb_ary_expand_capa(mrb, a, a->len + len); + if (a->aux.capa < a->len + len) + ary_expand_capa(mrb, a, a->len + len); memmove(a->buf + len, a->buf, sizeof(mrb_value)*a->len); memcpy(a->buf, vals, sizeof(mrb_value)*len); a->len += len; @@ -487,13 +549,15 @@ mrb_ary_set(mrb_state *mrb, mrb_value ary, mrb_int n, mrb_value val) /* rb_ary_s { struct RArray *a = mrb_ary_ptr(ary); + ary_modify(mrb, a); /* range check */ if (n < 0) n += a->len; if (n < 0) { mrb_raise(mrb, E_INDEX_ERROR, "index %ld out of array", n - a->len); } if (a->len <= (int)n) { - if (a->capa <= (int)n) mrb_ary_expand_capa(mrb, a, n + 1); + if (a->aux.capa <= (int)n) + ary_expand_capa(mrb, a, n + 1); ary_fill_with_nil(a->buf + a->len, n + 1 - a->len); a->len = n + 1; } @@ -511,6 +575,7 @@ mrb_ary_splice(mrb_state *mrb, mrb_value ary, mrb_int head, mrb_int len, mrb_val mrb_value *argv; int i, argc; + ary_modify(mrb, a); /* range check */ if (head < 0) head += a->len; if (head < 0) { @@ -531,7 +596,8 @@ mrb_ary_splice(mrb_state *mrb, mrb_value ary, mrb_int head, mrb_int len, mrb_val if (tail < a->len) size += a->len - tail; - if (size > a->capa) mrb_ary_expand_capa(mrb, a, size); + if (size > a->aux.capa) + ary_expand_capa(mrb, a, size); if (head > a->len) { ary_fill_with_nil(a->buf + a->len, (int)(head - a->len)); @@ -555,6 +621,32 @@ mrb_ary_alen(mrb_state *mrb, mrb_value ary) return RARRAY_LEN(ary); } +void +mrb_ary_decref(mrb_state *mrb, struct mrb_shared_array *shared) +{ + shared->refcnt--; + if (shared->refcnt == 0) { + mrb_free(mrb, shared->buf); + mrb_free(mrb, shared); + } +} + +static mrb_value +ary_subseq(mrb_state *mrb, struct RArray *a, int beg, int len) +{ + struct RArray *b; + + ary_make_shared(mrb, a); + b = (struct RArray*)mrb_obj_alloc(mrb, MRB_TT_ARRAY, mrb->array_class); + b->buf = a->buf + beg; + b->len = len; + b->aux.shared = a->aux.shared; + b->aux.shared->refcnt++; + b->flags |= MRB_ARY_SHARED; + + return mrb_obj_value(b); +} + mrb_value mrb_ary_aget(mrb_state *mrb, mrb_value self) { @@ -578,7 +670,7 @@ mrb_ary_aget(mrb_state *mrb, mrb_value self) if ((len = mrb_fixnum(argv[0])) < 0) return mrb_nil_value(); if (a->len == (int)index) return mrb_ary_new(mrb); if ((int)len > a->len - index) len = a->len - index; - return mrb_ary_new_from_values(mrb, len, a->buf + index); + return ary_subseq(mrb, a, index, len); default: mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments"); @@ -639,7 +731,7 @@ mrb_ary_delete_at(mrb_state *mrb, mrb_value self) } --a->len; - mrb_ary_shrink_capa(mrb, a); + ary_shrink_capa(mrb, a); return val; } @@ -649,19 +741,15 @@ mrb_ary_first(mrb_state *mrb, mrb_value self) { struct RArray *a = mrb_ary_ptr(self); int size; - mrb_value *vals; - int len; - mrb_get_args(mrb, "*", &vals, &len); - if (len > 1) { - mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments"); + if (mrb_get_args(mrb, "|i", &size) == 0) { + return (a->len > 0)? a->buf[0]: mrb_nil_value(); } - if (len == 0) return (a->len > 0)? a->buf[0]: mrb_nil_value(); - - /* len == 1 */ - size = mrb_fixnum(*vals); if (size > a->len) size = a->len; + if (a->flags & MRB_ARY_SHARED) { + return ary_subseq(mrb, a, 0, size); + } return mrb_ary_new_from_values(mrb, size, a->buf); } @@ -683,6 +771,9 @@ mrb_ary_last(mrb_state *mrb, mrb_value self) /* len == 1 */ size = mrb_fixnum(*vals); if (size > a->len) size = a->len; + if ((a->flags & MRB_ARY_SHARED) || size > ARY_DEFAULT_LEN) { + return ary_subseq(mrb, a, a->len - size, size); + } return mrb_ary_new_from_values(mrb, size, a->buf + a->len - size); } @@ -690,7 +781,7 @@ mrb_value mrb_ary_index_m(mrb_state *mrb, mrb_value self) { mrb_value obj; - long i; + int i; mrb_get_args(mrb, "o", &obj); for (i = 0; i < RARRAY_LEN(self); i++) { @@ -705,7 +796,7 @@ mrb_value mrb_ary_rindex_m(mrb_state *mrb, mrb_value self) { mrb_value obj; - long i; + int i; mrb_get_args(mrb, "o", &obj); for (i = RARRAY_LEN(self) - 1; i >= 0; i--) { @@ -741,7 +832,7 @@ mrb_ary_clear(mrb_state *mrb, mrb_value self) struct RArray *a = mrb_ary_ptr(self); a->len = 0; - mrb_ary_shrink_capa(mrb, a); + ary_shrink_capa(mrb, a); return self; } @@ -769,12 +860,6 @@ mrb_ary_entry(mrb_value ary, int offset) return ary_elt(ary, offset); } -mrb_value -mrb_ary_tmp_new(mrb_state *mrb, int capa) -{ - return mrb_ary_new_capa(mrb, capa); -} - static mrb_value inspect_ary(mrb_state *mrb, mrb_value ary, mrb_value list) { @@ -1013,13 +1098,13 @@ mrb_init_array(mrb_state *mrb) mrb_define_method(mrb, a, "concat", mrb_ary_concat_m, ARGS_REQ(1)); /* 15.2.12.5.8 */ mrb_define_method(mrb, a, "delete_at", mrb_ary_delete_at, ARGS_REQ(1)); /* 15.2.12.5.9 */ mrb_define_method(mrb, a, "empty?", mrb_ary_empty_p, ARGS_NONE()); /* 15.2.12.5.12 */ - mrb_define_method(mrb, a, "first", mrb_ary_first, ARGS_ANY()); /* 15.2.12.5.13 */ + mrb_define_method(mrb, a, "first", mrb_ary_first, ARGS_OPT(1)); /* 15.2.12.5.13 */ mrb_define_method(mrb, a, "index", mrb_ary_index_m, ARGS_REQ(1)); /* 15.2.12.5.14 */ mrb_define_method(mrb, a, "initialize_copy", mrb_ary_replace_m, ARGS_REQ(1)); /* 15.2.12.5.16 */ mrb_define_method(mrb, a, "join", mrb_ary_join_m, ARGS_ANY()); /* 15.2.12.5.17 */ mrb_define_method(mrb, a, "last", mrb_ary_last, ARGS_ANY()); /* 15.2.12.5.18 */ mrb_define_method(mrb, a, "length", mrb_ary_size, ARGS_NONE()); /* 15.2.12.5.19 */ - mrb_define_method(mrb, a, "pop", mrb_ary_pop_m, ARGS_NONE()); /* 15.2.12.5.21 */ + mrb_define_method(mrb, a, "pop", mrb_ary_pop, ARGS_NONE()); /* 15.2.12.5.21 */ mrb_define_method(mrb, a, "push", mrb_ary_push_m, ARGS_ANY()); /* 15.2.12.5.22 */ mrb_define_method(mrb, a, "replace", mrb_ary_replace_m, ARGS_REQ(1)); /* 15.2.12.5.23 */ mrb_define_method(mrb, a, "reverse", mrb_ary_reverse, ARGS_NONE()); /* 15.2.12.5.24 */ @@ -1034,5 +1119,5 @@ mrb_init_array(mrb_state *mrb) mrb_define_alias(mrb, a, "to_s", "inspect"); /* 15.2.12.5.32 (x) */ mrb_define_method(mrb, a, "==", mrb_ary_equal, ARGS_REQ(1)); /* 15.2.12.5.33 (x) */ mrb_define_method(mrb, a, "eql?", mrb_ary_eql, ARGS_REQ(1)); /* 15.2.12.5.34 (x) */ - mrb_define_method(mrb, a, "<=>", mrb_ary_cmp, ARGS_REQ(1)); /* 15.2.12.5.36 (x) */ + mrb_define_method(mrb, a, "<=>", mrb_ary_cmp, ARGS_REQ(1)); /* 15.2.12.5.36 (x) */ } diff --git a/src/gc.c b/src/gc.c index b269ecfb4..b7c08de65 100644 --- a/src/gc.c +++ b/src/gc.c @@ -457,7 +457,10 @@ obj_free(mrb_state *mrb, struct RBasic *obj) break; case MRB_TT_ARRAY: - mrb_free(mrb, ((struct RArray*)obj)->buf); + if (obj->flags & MRB_ARY_SHARED) + mrb_ary_decref(mrb, ((struct RArray*)obj)->aux.shared); + else + mrb_free(mrb, ((struct RArray*)obj)->buf); break; case MRB_TT_HASH: diff --git a/src/struct.c b/src/struct.c index e9266ad17..2e2e0c10f 100644 --- a/src/struct.c +++ b/src/struct.c @@ -450,7 +450,7 @@ mrb_struct_new(mrb_state *mrb, struct RClass *klass, ...) size = mrb_long2int(num_members(mrb, klass)); if (size > numberof(tmpargs)) { - tmpargs[0] = mrb_ary_tmp_new(mrb, size); + tmpargs[0] = mrb_ary_new_capa(mrb, size); mem = RARRAY_PTR(tmpargs[0]); } va_start(args, klass); -- cgit v1.2.3 From 7009a1d8f5271fcd0b06a86645ad28e40c2bc5d9 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 3 Jun 2012 23:26:40 +0900 Subject: should not disclose metaclass; close #238 --- src/class.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class.c b/src/class.c index 748996e62..c689552f5 100644 --- a/src/class.c +++ b/src/class.c @@ -824,7 +824,7 @@ mrb_class_superclass(mrb_state *mrb, mrb_value klass) { struct RClass *c, *s; c = mrb_class_ptr(klass); - s = c->super; + s = mrb_class_real(c->super); return mrb_obj_value(s); } -- cgit v1.2.3 From 49aa42f3a99195bb64f97f37ebb4748716be5ecd Mon Sep 17 00:00:00 2001 From: Jon Date: Sun, 3 Jun 2012 09:27:32 -0400 Subject: Verify that memory for mrb_state was allocated --- src/state.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/state.c b/src/state.c index 727bd8ecb..e4729ca70 100644 --- a/src/state.c +++ b/src/state.c @@ -16,6 +16,7 @@ mrb_state* mrb_open_allocf(mrb_allocf f) { mrb_state *mrb = (f)(NULL, NULL, sizeof(mrb_state)); + if (mrb == NULL) return NULL; memset(mrb, 0, sizeof(mrb_state)); mrb->allocf = f; -- cgit v1.2.3 From 2fff59dc8674ad6689acc5080463eede4c5bb2ab Mon Sep 17 00:00:00 2001 From: Jon Date: Sun, 3 Jun 2012 10:04:51 -0400 Subject: Check mrb_open return value for NULL --- src/codegen.c | 5 +++++ src/gc.c | 40 ++++++++++++++++++++++++++++++++++++++++ src/parse.y | 5 +++++ test/driver.c | 5 +++++ tools/mirb/mirb.c | 5 +++++ tools/mrbc/mrbc.c | 5 +++++ tools/mruby/mruby.c | 5 +++++ 7 files changed, 70 insertions(+) diff --git a/src/codegen.c b/src/codegen.c index 117588b6e..027b6777f 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -2292,6 +2292,11 @@ main() mrb_state *mrb = mrb_open(); int n; + if (mrb == NULL) { + fprintf(stderr, "Invalid mrb_state, exiting codegen test"); + return EXIT_FAILURE; + } + #if 1 n = mrb_compile_string(mrb, "p(__FILE__)\np(__LINE__)"); #else diff --git a/src/gc.c b/src/gc.c index b7c08de65..64a92d11e 100644 --- a/src/gc.c +++ b/src/gc.c @@ -934,6 +934,11 @@ test_mrb_field_write_barrier(void) mrb_state *mrb = mrb_open(); struct RBasic *obj, *value; + if (mrb == NULL) { + fprintf(stderr, "Invalid mrb_state, exiting test_mrb_field_write_barrier"); + return; + } + puts("test_mrb_field_write_barrier"); obj = RBASIC(mrb_ary_new(mrb)); value = RBASIC(mrb_str_new_cstr(mrb, "value")); @@ -997,6 +1002,11 @@ test_mrb_write_barrier(void) mrb_state *mrb = mrb_open(); struct RBasic *obj; + if (mrb == NULL) { + fprintf(stderr, "Invalid mrb_state, exiting test_mrb_write_barrier"); + return; + } + puts("test_mrb_write_barrier"); obj = RBASIC(mrb_ary_new(mrb)); paint_black(obj); @@ -1024,6 +1034,11 @@ test_add_gray_list(void) mrb_state *mrb = mrb_open(); struct RBasic *obj1, *obj2; + if (mrb == NULL) { + fprintf(stderr, "Invalid mrb_state, exiting test_add_gray_list"); + return; + } + puts("test_add_gray_list"); gc_assert(mrb->gray_list == NULL); obj1 = RBASIC(mrb_str_new_cstr(mrb, "test")); @@ -1048,6 +1063,11 @@ test_gc_gray_mark(void) struct RBasic *obj; size_t gray_num = 0; + if (mrb == NULL) { + fprintf(stderr, "Invalid mrb_state, exiting test_gc_gray_mark"); + return; + } + puts("test_gc_gray_mark"); puts(" in MRB_TT_CLASS"); @@ -1079,6 +1099,11 @@ test_incremental_gc(void) RVALUE *free; struct heap_page *page; + if (mrb == NULL) { + fprintf(stderr, "Invalid mrb_state, exiting test_incremental_gc"); + return; + } + puts("test_incremental_gc"); mrb_garbage_collect(mrb); @@ -1135,6 +1160,11 @@ test_incremental_sweep_phase(void) { mrb_state *mrb = mrb_open(); + if (mrb == NULL) { + fprintf(stderr, "Invalid mrb_state, exiting test_incremental_sweep_phase"); + return; + } + puts("test_incremental_sweep_phase"); add_heap(mrb); @@ -1158,6 +1188,11 @@ test_gc_api(void) mrb_value argv[1]; + if (mrb == NULL) { + fprintf(stderr, "Invalid mrb_state, exiting test_gc_api"); + return; + } + puts("test_gc_api"); gc_start(mrb, mrb_nil_value()); @@ -1191,6 +1226,11 @@ test_many_object_benchmark(void) mrb_value ary = mrb_ary_new(mrb); int save_point = mrb_gc_arena_save(mrb); + if (mrb == NULL) { + fprintf(stderr, "Invalid mrb_state, test_many_object_benchmark"); + return; + } + puts("test_many_object_benchmark"); for (i=0; i<1000; i++) { diff --git a/src/parse.y b/src/parse.y index eae9fb373..884290961 100644 --- a/src/parse.y +++ b/src/parse.y @@ -5518,6 +5518,11 @@ main() mrb_state *mrb = mrb_open(); int n; + if (mrb == NULL) { + fprintf(stderr, "Invalid mrb_state, exiting parser test"); + return EXIT_FAILURE; + } + n = mrb_compile_string(mrb, "\ def fib(n)\n\ if n<2\n\ diff --git a/test/driver.c b/test/driver.c index 4651d75fc..6b42d025b 100644 --- a/test/driver.c +++ b/test/driver.c @@ -36,6 +36,11 @@ main(void) /* new interpreter instance */ mrb = mrb_open(); + if (mrb == NULL) { + fprintf(stderr, "Invalid mrb_state, exiting test driver"); + return EXIT_FAILURE; + } + mrb_init_mrbtest(mrb); parser = mrb_parse_nstring(mrb, prog, strlen(prog)); diff --git a/tools/mirb/mirb.c b/tools/mirb/mirb.c index 59e5046cb..35558acfb 100644 --- a/tools/mirb/mirb.c +++ b/tools/mirb/mirb.c @@ -142,6 +142,11 @@ main(void) /* new interpreter instance */ mrb_interpreter = mrb_open(); + if (mrb_interpreter == NULL) { + fprintf(stderr, "Invalid mrb_interpreter, exiting mirb"); + return EXIT_FAILURE; + } + /* new parser instance */ parser = mrb_parser_new(mrb_interpreter); memset(ruby_code, 0, sizeof(*ruby_code)); diff --git a/tools/mrbc/mrbc.c b/tools/mrbc/mrbc.c index 3553fe646..99fea76d8 100644 --- a/tools/mrbc/mrbc.c +++ b/tools/mrbc/mrbc.c @@ -158,6 +158,11 @@ main(int argc, char **argv) struct _args args; struct mrb_parser_state *p; + if (mrb == NULL) { + fprintf(stderr, "Invalid mrb_state, exiting mrbc"); + return EXIT_FAILURE; + } + n = parse_args(mrb, argc, argv, &args); if (n < 0 || args.rfp == NULL) { diff --git a/tools/mruby/mruby.c b/tools/mruby/mruby.c index 8b227df5d..0e38879db 100644 --- a/tools/mruby/mruby.c +++ b/tools/mruby/mruby.c @@ -142,6 +142,11 @@ main(int argc, char **argv) struct _args args; struct mrb_parser_state *p; + if (mrb == NULL) { + fprintf(stderr, "Invalid mrb_state, exiting mruby"); + return EXIT_FAILURE; + } + n = parse_args(mrb, argc, argv, &args); if (n < 0 || (args.cmdline == NULL && args.rfp == NULL)) { cleanup(mrb, &args); -- cgit v1.2.3 From 5612d195ec39612b7216ff3f28d05ed089452767 Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Sun, 3 Jun 2012 23:29:40 +0800 Subject: Improve Class#superclass to ISO --- src/class.c | 12 +++++++++--- test/t/class.rb | 10 +++++++--- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/class.c b/src/class.c index c689552f5..594ed08bc 100644 --- a/src/class.c +++ b/src/class.c @@ -822,10 +822,16 @@ mrb_class_new_class(mrb_state *mrb, mrb_value cv) mrb_value mrb_class_superclass(mrb_state *mrb, mrb_value klass) { - struct RClass *c, *s; + struct RClass *c; + mrb_value superclass; + c = mrb_class_ptr(klass); - s = mrb_class_real(c->super); - return mrb_obj_value(s); + if (c->super) + superclass = mrb_obj_value(mrb_class_real(c->super)); + else + superclass = mrb_nil_value(); + + return superclass; } static mrb_value diff --git a/test/t/class.rb b/test/t/class.rb index d252cf590..1b809a832 100644 --- a/test/t/class.rb +++ b/test/t/class.rb @@ -5,9 +5,8 @@ assert('Class', '15.2.3') do Class.class == Class end -assert('Class#superclass', '15.2.3.3.4') do - class SubClass < String; end - SubClass.superclass == String +assert('Class superclass', '15.2.3.2') do + Class.superclass == Module end assert('Class#new', '15.2.3.3.3') do @@ -40,6 +39,11 @@ assert('Class#new', '15.2.3.3.3') do # with block doesn't work yet end +assert('Class#superclass', '15.2.3.3.4') do + class SubClass < String; end + SubClass.superclass == String +end + # Not ISO specified assert('Class 1') do -- cgit v1.2.3 From 00caf25b523b9ab6858e704f26f9b4bb20639a8e Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Sun, 3 Jun 2012 23:30:15 +0800 Subject: Add BasicObject Tests --- test/t/basicobject.rb | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 test/t/basicobject.rb diff --git a/test/t/basicobject.rb b/test/t/basicobject.rb new file mode 100644 index 000000000..f7e95af89 --- /dev/null +++ b/test/t/basicobject.rb @@ -0,0 +1,11 @@ +## +# BasicObject + +assert('BasicObject') do + BasicObject.class == Class +end + +assert('BasicObject superclass') do + BasicObject.superclass == nil +end + -- cgit v1.2.3 From c78dc2930c6b8c927e6c1415ecbc13e727c3637c Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Sun, 3 Jun 2012 23:31:17 +0800 Subject: Add superclass tests for Exceptions --- test/t/argumenterror.rb | 5 +++++ test/t/exception.rb | 4 ++++ test/t/indexerror.rb | 5 +++++ test/t/nameerror.rb | 4 ++++ test/t/nomethoderror.rb | 5 +++++ test/t/rangeerror.rb | 5 +++++ test/t/standarderror.rb | 5 +++++ test/t/typeerror.rb | 5 +++++ 8 files changed, 38 insertions(+) diff --git a/test/t/argumenterror.rb b/test/t/argumenterror.rb index ca998f8de..71cf38e26 100644 --- a/test/t/argumenterror.rb +++ b/test/t/argumenterror.rb @@ -13,3 +13,8 @@ assert('ArgumentError', '15.2.24') do ArgumentError.class == Class and e2.class == ArgumentError end + +assert('ArgumentError superclass', '15.2.24.2') do + ArgumentError.superclass == StandardError +end + diff --git a/test/t/exception.rb b/test/t/exception.rb index d68ed8bd7..22795161f 100644 --- a/test/t/exception.rb +++ b/test/t/exception.rb @@ -5,6 +5,10 @@ assert('Exception', '15.2.22') do Exception.class == Class end +assert('Exception superclass', '15.2.22.2') do + Exception.superclass == Object +end + assert('Exception.exception', '15.2.22.4.1') do e = Exception.exception('a') diff --git a/test/t/indexerror.rb b/test/t/indexerror.rb index d0cb81f32..d7c8ba148 100644 --- a/test/t/indexerror.rb +++ b/test/t/indexerror.rb @@ -4,3 +4,8 @@ assert('IndexError', '15.2.33') do IndexError.class == Class end + +assert('IndexError superclass', '15.2.33.2') do + IndexError.superclass == StandardError +end + diff --git a/test/t/nameerror.rb b/test/t/nameerror.rb index 67451ecf8..8e57ac18b 100644 --- a/test/t/nameerror.rb +++ b/test/t/nameerror.rb @@ -5,6 +5,10 @@ assert('NameError', '15.2.31') do NameError.class == Class end +assert('NameError superclass', '15.2.31.2') do + NameError.superclass == StandardError +end + # TODO 15.2.31.2.1 NameError#name assert('NameError#initialize', '15.2.31.2.2') do diff --git a/test/t/nomethoderror.rb b/test/t/nomethoderror.rb index 9eb122158..caab04a41 100644 --- a/test/t/nomethoderror.rb +++ b/test/t/nomethoderror.rb @@ -11,3 +11,8 @@ assert('NoMethodError', '15.2.32') do NoMethodError.class == Class and e2.class == NoMethodError end + +assert('NoMethodError superclass', '15.2.32.2') do + NoMethodError.superclass == NameError +end + diff --git a/test/t/rangeerror.rb b/test/t/rangeerror.rb index 7edb5d2d9..57afdc4bd 100644 --- a/test/t/rangeerror.rb +++ b/test/t/rangeerror.rb @@ -4,3 +4,8 @@ assert('RangeError', '15.2.26') do RangeError.class == Class end + +assert('RangeError superclass', '15.2.26.2') do + RangeError.superclass == StandardError +end + diff --git a/test/t/standarderror.rb b/test/t/standarderror.rb index 550c337c1..3868d7567 100644 --- a/test/t/standarderror.rb +++ b/test/t/standarderror.rb @@ -4,3 +4,8 @@ assert('StandardError', '15.2.23') do StandardError.class == Class end + +assert('StandardError superclass', '15.2.23.2') do + StandardError.superclass == Exception +end + diff --git a/test/t/typeerror.rb b/test/t/typeerror.rb index c4434aa24..d48db111a 100644 --- a/test/t/typeerror.rb +++ b/test/t/typeerror.rb @@ -4,3 +4,8 @@ assert('TypeError', '15.2.29') do TypeError.class == Class end + +assert('TypeError superclass', '15.2.29.2') do + TypeError.superclass == StandardError +end + -- cgit v1.2.3 From 0c2d74020a925fa86235ae7c716aa0ede856e6e6 Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Sun, 3 Jun 2012 23:31:53 +0800 Subject: Add more superclass tests --- test/t/array.rb | 4 ++++ test/t/false.rb | 4 ++++ test/t/float.rb | 4 ++++ test/t/hash.rb | 4 ++++ test/t/integer.rb | 4 ++++ test/t/module.rb | 4 ++++ test/t/numeric.rb | 4 ++++ test/t/object.rb | 5 +++++ test/t/proc.rb | 4 ++++ test/t/range.rb | 4 ++++ test/t/string.rb | 4 ++++ test/t/struct.rb | 5 +++++ test/t/symbol.rb | 4 ++++ test/t/time.rb | 4 ++++ test/t/true.rb | 4 ++++ 15 files changed, 62 insertions(+) diff --git a/test/t/array.rb b/test/t/array.rb index dba1b035d..4e53f1120 100644 --- a/test/t/array.rb +++ b/test/t/array.rb @@ -5,6 +5,10 @@ assert('Array', '15.2.12') do Array.class == Class end +assert('Array superclass', '15.2.12.2') do + Array.superclass == Object +end + assert('Array.[]', '15.2.12.4.1') do Array.[](1,2,3) == [1, 2, 3] end diff --git a/test/t/false.rb b/test/t/false.rb index c2db283c8..ae605205d 100644 --- a/test/t/false.rb +++ b/test/t/false.rb @@ -5,6 +5,10 @@ assert('FalseClass', '15.2.6') do FalseClass.class == Class end +assert('FalseClass superclass', '15.2.6.2') do + FalseClass.superclass == Object +end + assert('FalseClass false', '15.2.6.1') do not false end diff --git a/test/t/float.rb b/test/t/float.rb index fc87a5b22..5c5245c73 100644 --- a/test/t/float.rb +++ b/test/t/float.rb @@ -5,6 +5,10 @@ assert('Float', '15.2.9') do Float.class == Class end +assert('Float superclass', '15.2.9.2') do + Float.superclass == Numeric +end + assert('Float#+', '15.2.9.3.1') do a = 3.123456788 + 0.000000001 b = 3.123456789 + 1 diff --git a/test/t/hash.rb b/test/t/hash.rb index df21dd1fa..04a9a1c24 100644 --- a/test/t/hash.rb +++ b/test/t/hash.rb @@ -5,6 +5,10 @@ assert('Hash', '15.2.13') do Hash.class == Class end +assert('Hash superclass', '15.2.13.2') do + Hash.superclass == Object +end + assert('Hash#==', '15.2.13.4.1') do ({ 'abc' => 'abc' } == { 'abc' => 'abc' }) and not ({ 'abc' => 'abc' } == { 'cba' => 'cba' }) diff --git a/test/t/integer.rb b/test/t/integer.rb index 8c112861a..872723445 100644 --- a/test/t/integer.rb +++ b/test/t/integer.rb @@ -5,6 +5,10 @@ assert('Integer', '15.2.8') do Integer.class == Class end +assert('Integer superclass', '15.2.8.2') do + Integer.superclass == Numeric +end + assert('Integer#+', '15.2.8.3.1') do a = 1+1 b = 1+1.0 diff --git a/test/t/module.rb b/test/t/module.rb index a5331e96d..95fbb7a86 100644 --- a/test/t/module.rb +++ b/test/t/module.rb @@ -5,6 +5,10 @@ assert('Module', '15.2.2') do Module.class == Class end +assert('Module superclass', '15.2.2.2') do + Module.superclass == Object +end + assert('Module#const_defined?', '15.2.2.4.20') do module Test4ConstDefined Const4Test4ConstDefined = true diff --git a/test/t/numeric.rb b/test/t/numeric.rb index 924889a0e..3cdb9a8cf 100644 --- a/test/t/numeric.rb +++ b/test/t/numeric.rb @@ -5,6 +5,10 @@ assert('Numeric', '15.2.7') do Numeric.class == Class end +assert('Numeric superclass', '15.2.7.2') do + Numeric.superclass == Object +end + assert('Numeric#+@', '15.2.7.4.1') do +1 == +1 end diff --git a/test/t/object.rb b/test/t/object.rb index 96929031b..7dfaf6589 100644 --- a/test/t/object.rb +++ b/test/t/object.rb @@ -4,3 +4,8 @@ assert('Object', '15.2.1') do Object.class == Class end + +assert('Object superclass', '15.2.1.2') do + Object.superclass == BasicObject +end + diff --git a/test/t/proc.rb b/test/t/proc.rb index 6d98cb40c..c0a1cf90f 100644 --- a/test/t/proc.rb +++ b/test/t/proc.rb @@ -5,6 +5,10 @@ assert('Proc', '15.2.17') do Proc.class == Class end +assert('Proc superclass', '15.2.17.2') do + Proc.superclass == Object +end + assert('Proc.new', '15.2.17.3.1') do a = nil diff --git a/test/t/range.rb b/test/t/range.rb index 05bac8779..691ca7898 100644 --- a/test/t/range.rb +++ b/test/t/range.rb @@ -5,6 +5,10 @@ assert('Range', '15.2.14') do Range.class == Class end +assert('Range superclass', '15.2.14.2') do + Range.superclass == Object +end + assert('Range#==', '15.2.14.4.1') do (1..10) == (1..10) and not (1..10) == (1..100) end diff --git a/test/t/string.rb b/test/t/string.rb index ee969a696..964ec0e63 100644 --- a/test/t/string.rb +++ b/test/t/string.rb @@ -5,6 +5,10 @@ assert('String', '15.2.10') do String.class == Class end +assert('String superclass', '15.2.10.2') do + String.superclass == Object +end + assert('String#*', '15.2.10.5.1') do 'a' * 5 == 'aaaaa' end diff --git a/test/t/struct.rb b/test/t/struct.rb index c41319f8a..798cf6728 100644 --- a/test/t/struct.rb +++ b/test/t/struct.rb @@ -4,3 +4,8 @@ assert('Struct', '15.2.18') do Struct.class == Class end + +assert('Struct superclass', '15.2.18.2') do + Struct.superclass == Object +end + diff --git a/test/t/symbol.rb b/test/t/symbol.rb index e9c310971..b28573e92 100644 --- a/test/t/symbol.rb +++ b/test/t/symbol.rb @@ -5,6 +5,10 @@ assert('Symbol', '15.2.11') do Symbol.class == Class end +assert('Symbol superclass', '15.2.11.2') do + Symbol.superclass == Object +end + assert('Symbol#===', '15.2.11.3.1') do :abc === :abc and not :abc === :cba end diff --git a/test/t/time.rb b/test/t/time.rb index 22fc2e7c3..7d1519f63 100644 --- a/test/t/time.rb +++ b/test/t/time.rb @@ -5,6 +5,10 @@ assert('Time', '15.2.19') do Time.class == Class end +assert('Time superclass', '15.2.19.2') do + Time.superclass == Object +end + assert('Time.at', '15.2.19.6.1') do Time.at(1300000000.0) end diff --git a/test/t/true.rb b/test/t/true.rb index bb648a7cd..2662f7cd8 100644 --- a/test/t/true.rb +++ b/test/t/true.rb @@ -5,6 +5,10 @@ assert('TrueClass', '15.2.5') do TrueClass.class == Class end +assert('TrueClass superclass', '15.2.5.2') do + TrueClass.superclass == Object +end + assert('TrueClass true', '15.2.5.1') do true end -- cgit v1.2.3 From f24a52b04a70b8d69c51ba11b722352f61b8da9b Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 4 Jun 2012 01:46:04 +0900 Subject: remove mrb_open NULL check for small test programs. They are only for proof-on-concept test, not production code. Adding precise checks are not needed for those code --- src/codegen.c | 5 ----- src/gc.c | 40 ---------------------------------------- src/parse.y | 5 ----- 3 files changed, 50 deletions(-) diff --git a/src/codegen.c b/src/codegen.c index 027b6777f..117588b6e 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -2292,11 +2292,6 @@ main() mrb_state *mrb = mrb_open(); int n; - if (mrb == NULL) { - fprintf(stderr, "Invalid mrb_state, exiting codegen test"); - return EXIT_FAILURE; - } - #if 1 n = mrb_compile_string(mrb, "p(__FILE__)\np(__LINE__)"); #else diff --git a/src/gc.c b/src/gc.c index 64a92d11e..b7c08de65 100644 --- a/src/gc.c +++ b/src/gc.c @@ -934,11 +934,6 @@ test_mrb_field_write_barrier(void) mrb_state *mrb = mrb_open(); struct RBasic *obj, *value; - if (mrb == NULL) { - fprintf(stderr, "Invalid mrb_state, exiting test_mrb_field_write_barrier"); - return; - } - puts("test_mrb_field_write_barrier"); obj = RBASIC(mrb_ary_new(mrb)); value = RBASIC(mrb_str_new_cstr(mrb, "value")); @@ -1002,11 +997,6 @@ test_mrb_write_barrier(void) mrb_state *mrb = mrb_open(); struct RBasic *obj; - if (mrb == NULL) { - fprintf(stderr, "Invalid mrb_state, exiting test_mrb_write_barrier"); - return; - } - puts("test_mrb_write_barrier"); obj = RBASIC(mrb_ary_new(mrb)); paint_black(obj); @@ -1034,11 +1024,6 @@ test_add_gray_list(void) mrb_state *mrb = mrb_open(); struct RBasic *obj1, *obj2; - if (mrb == NULL) { - fprintf(stderr, "Invalid mrb_state, exiting test_add_gray_list"); - return; - } - puts("test_add_gray_list"); gc_assert(mrb->gray_list == NULL); obj1 = RBASIC(mrb_str_new_cstr(mrb, "test")); @@ -1063,11 +1048,6 @@ test_gc_gray_mark(void) struct RBasic *obj; size_t gray_num = 0; - if (mrb == NULL) { - fprintf(stderr, "Invalid mrb_state, exiting test_gc_gray_mark"); - return; - } - puts("test_gc_gray_mark"); puts(" in MRB_TT_CLASS"); @@ -1099,11 +1079,6 @@ test_incremental_gc(void) RVALUE *free; struct heap_page *page; - if (mrb == NULL) { - fprintf(stderr, "Invalid mrb_state, exiting test_incremental_gc"); - return; - } - puts("test_incremental_gc"); mrb_garbage_collect(mrb); @@ -1160,11 +1135,6 @@ test_incremental_sweep_phase(void) { mrb_state *mrb = mrb_open(); - if (mrb == NULL) { - fprintf(stderr, "Invalid mrb_state, exiting test_incremental_sweep_phase"); - return; - } - puts("test_incremental_sweep_phase"); add_heap(mrb); @@ -1188,11 +1158,6 @@ test_gc_api(void) mrb_value argv[1]; - if (mrb == NULL) { - fprintf(stderr, "Invalid mrb_state, exiting test_gc_api"); - return; - } - puts("test_gc_api"); gc_start(mrb, mrb_nil_value()); @@ -1226,11 +1191,6 @@ test_many_object_benchmark(void) mrb_value ary = mrb_ary_new(mrb); int save_point = mrb_gc_arena_save(mrb); - if (mrb == NULL) { - fprintf(stderr, "Invalid mrb_state, test_many_object_benchmark"); - return; - } - puts("test_many_object_benchmark"); for (i=0; i<1000; i++) { diff --git a/src/parse.y b/src/parse.y index 884290961..eae9fb373 100644 --- a/src/parse.y +++ b/src/parse.y @@ -5518,11 +5518,6 @@ main() mrb_state *mrb = mrb_open(); int n; - if (mrb == NULL) { - fprintf(stderr, "Invalid mrb_state, exiting parser test"); - return EXIT_FAILURE; - } - n = mrb_compile_string(mrb, "\ def fib(n)\n\ if n<2\n\ -- cgit v1.2.3 From 30b6507817a349cd1bdc5139533010b58faf9d14 Mon Sep 17 00:00:00 2001 From: Jon Date: Sun, 3 Jun 2012 18:58:19 -0400 Subject: Refactor hardcoded PARSER_DUMP macro --- include/mrbconf.h | 7 +++++++ src/parse.y | 2 -- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/include/mrbconf.h b/include/mrbconf.h index e90b685bb..5a54ebeef 100644 --- a/include/mrbconf.h +++ b/include/mrbconf.h @@ -21,6 +21,9 @@ typedef int mrb_int; typedef intptr_t mrb_sym; #define readint(p,base) strtol((p),NULL,(base)) +#undef PARSER_DUMP /* do not print out parser state */ +//#define PARSER_DUMP /* print out parser state */ + #undef INCLUDE_ENCODING /* not use encoding classes (ascii only) */ //#define INCLUDE_ENCODING /* use UTF-8 encoding classes */ @@ -31,6 +34,10 @@ typedef intptr_t mrb_sym; # define INCLUDE_ENCODING /* Regexp depends Encoding */ #endif +#ifdef MRUBY_DEBUG_BUILD +# define PARSER_DUMP +#endif + #undef HAVE_UNISTD_H /* WINDOWS */ #define HAVE_UNISTD_H /* LINUX */ diff --git a/src/parse.y b/src/parse.y index eae9fb373..495954538 100644 --- a/src/parse.y +++ b/src/parse.y @@ -4761,8 +4761,6 @@ mrb_parse_string(mrb_state *mrb, const char *s) return mrb_parse_nstring(mrb, s, strlen(s)); } -#define PARSER_DUMP - void parser_dump(mrb_state *mrb, node *tree, int offset); int -- cgit v1.2.3 From 531124f0573e939d07d23ea0927483e0fb3954eb Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 4 Jun 2012 08:34:24 +0900 Subject: time.c add ISO section numbers --- src/time.c | 70 ++++++++++++++++++++++++++++++++++---------------------------- 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/src/time.c b/src/time.c index a6f1e4d1f..08f746707 100644 --- a/src/time.c +++ b/src/time.c @@ -656,41 +656,49 @@ mrb_init_time(mrb_state *mrb) tc = mrb_define_class(mrb, "Time", mrb->object_class); MRB_SET_INSTANCE_TT(tc, MRB_TT_DATA); mrb_include_module(mrb, tc, mrb_class_get(mrb, "Comparable")); - mrb_define_class_method(mrb, tc, "now", mrb_time_now, ARGS_NONE()); - mrb_define_class_method(mrb, tc, "at", mrb_time_at, ARGS_ANY()); - mrb_define_class_method(mrb, tc, "gm", mrb_time_gm, ARGS_REQ(1)|ARGS_OPT(6)); - mrb_define_class_method(mrb, tc, "local", mrb_time_local, ARGS_REQ(1)|ARGS_OPT(6)); + mrb_define_class_method(mrb, tc, "at", mrb_time_at, ARGS_ANY()); /* 15.2.19.6.1 */ + mrb_define_class_method(mrb, tc, "gm", mrb_time_gm, ARGS_REQ(1)|ARGS_OPT(6)); /* 15.2.19.6.2 */ + mrb_define_class_method(mrb, tc, "local", mrb_time_local, ARGS_REQ(1)|ARGS_OPT(6)); /* 15.2.19.6.3 */ + mrb_define_class_method(mrb, tc, "mktime", mrb_time_local, ARGS_REQ(1)|ARGS_OPT(6));/* 15.2.19.6.4 */ + mrb_define_class_method(mrb, tc, "now", mrb_time_now, ARGS_NONE()); /* 15.2.19.6.5 */ mrb_define_method(mrb, tc, "==" , mrb_time_eq , ARGS_REQ(1)); - mrb_define_method(mrb, tc, "<=>" , mrb_time_cmp , ARGS_REQ(1)); - mrb_define_method(mrb, tc, "+" , mrb_time_plus , ARGS_REQ(1)); - mrb_define_method(mrb, tc, "-" , mrb_time_minus , ARGS_REQ(1)); + mrb_define_method(mrb, tc, "<=>" , mrb_time_cmp , ARGS_REQ(1)); /* 15.2.19.7.1 */ + mrb_define_method(mrb, tc, "+" , mrb_time_plus , ARGS_REQ(1)); /* 15.2.19.7.2 */ + mrb_define_method(mrb, tc, "-" , mrb_time_minus , ARGS_REQ(1)); /* 15.2.19.7.3 */ mrb_define_method(mrb, tc, "to_s" , mrb_time_asctime, ARGS_NONE()); - mrb_define_method(mrb, tc, "asctime", mrb_time_asctime, ARGS_NONE()); - mrb_define_method(mrb, tc, "ctime" , mrb_time_asctime, ARGS_NONE()); - mrb_define_method(mrb, tc, "day" , mrb_time_day , ARGS_NONE()); - mrb_define_method(mrb, tc, "dst?" , mrb_time_dstp , ARGS_NONE()); - mrb_define_method(mrb, tc, "gmt?" , mrb_time_utcp , ARGS_NONE()); - mrb_define_method(mrb, tc, "gmtime" , mrb_time_utc , ARGS_NONE()); - mrb_define_method(mrb, tc, "hour" , mrb_time_hour, ARGS_NONE()); - mrb_define_method(mrb, tc, "localtime", mrb_time_localtime, ARGS_NONE()); - mrb_define_method(mrb, tc, "mday" , mrb_time_mday, ARGS_NONE()); - mrb_define_method(mrb, tc, "min" , mrb_time_min, ARGS_NONE()); + mrb_define_method(mrb, tc, "asctime", mrb_time_asctime, ARGS_NONE()); /* 15.2.19.7.4 */ + mrb_define_method(mrb, tc, "ctime" , mrb_time_asctime, ARGS_NONE()); /* 15.2.19.7.5 */ + mrb_define_method(mrb, tc, "day" , mrb_time_day , ARGS_NONE()); /* 15.2.19.7.6 */ + mrb_define_method(mrb, tc, "dst?" , mrb_time_dstp , ARGS_NONE()); /* 15.2.19.7.7 */ + mrb_define_method(mrb, tc, "gmt?" , mrb_time_utcp , ARGS_NONE()); /* 15.2.19.7.11 */ + mrb_define_method(mrb, tc, "gmtime" , mrb_time_utc , ARGS_NONE()); /* 15.2.19.7.13 */ + mrb_define_method(mrb, tc, "hour" , mrb_time_hour, ARGS_NONE()); /* 15.2.19.7.15 */ + mrb_define_method(mrb, tc, "localtime", mrb_time_localtime, ARGS_NONE()); /* 15.2.19.7.18 */ + mrb_define_method(mrb, tc, "mday" , mrb_time_mday, ARGS_NONE()); /* 15.2.19.7.19 */ + mrb_define_method(mrb, tc, "min" , mrb_time_min, ARGS_NONE()); /* 15.2.19.7.20 */ - mrb_define_method(mrb, tc, "mon" , mrb_time_mon, ARGS_NONE()); - mrb_define_method(mrb, tc, "month", mrb_time_mon, ARGS_NONE()); + mrb_define_method(mrb, tc, "mon" , mrb_time_mon, ARGS_NONE()); /* 15.2.19.7.21 */ + mrb_define_method(mrb, tc, "month", mrb_time_mon, ARGS_NONE()); /* 15.2.19.7.22 */ - mrb_define_method(mrb, tc, "sec" , mrb_time_sec, ARGS_NONE()); - mrb_define_method(mrb, tc, "to_i", mrb_time_to_i, ARGS_NONE()); - mrb_define_method(mrb, tc, "to_f", mrb_time_to_f, ARGS_NONE()); - mrb_define_method(mrb, tc, "usec", mrb_time_usec, ARGS_NONE()); - mrb_define_method(mrb, tc, "utc" , mrb_time_utc, ARGS_NONE()); - mrb_define_method(mrb, tc, "utc?", mrb_time_utcp, ARGS_NONE()); - mrb_define_method(mrb, tc, "wday", mrb_time_wday, ARGS_NONE()); - mrb_define_method(mrb, tc, "yday", mrb_time_yday, ARGS_NONE()); - mrb_define_method(mrb, tc, "year", mrb_time_year, ARGS_NONE()); - mrb_define_method(mrb, tc, "zone", mrb_time_zone, ARGS_NONE()); + mrb_define_method(mrb, tc, "sec" , mrb_time_sec, ARGS_NONE()); /* 15.2.19.7.23 */ + mrb_define_method(mrb, tc, "to_i", mrb_time_to_i, ARGS_NONE()); /* 15.2.19.7.25 */ + mrb_define_method(mrb, tc, "to_f", mrb_time_to_f, ARGS_NONE()); /* 15.2.19.7.24 */ + mrb_define_method(mrb, tc, "usec", mrb_time_usec, ARGS_NONE()); /* 15.2.19.7.26 */ + mrb_define_method(mrb, tc, "utc" , mrb_time_utc, ARGS_NONE()); /* 15.2.19.7.27 */ + mrb_define_method(mrb, tc, "utc?", mrb_time_utcp, ARGS_NONE()); /* 15.2.19.7.28 */ + mrb_define_method(mrb, tc, "wday", mrb_time_wday, ARGS_NONE()); /* 15.2.19.7.30 */ + mrb_define_method(mrb, tc, "yday", mrb_time_yday, ARGS_NONE()); /* 15.2.19.7.31 */ + mrb_define_method(mrb, tc, "year", mrb_time_year, ARGS_NONE()); /* 15.2.19.7.32 */ + mrb_define_method(mrb, tc, "zone", mrb_time_zone, ARGS_NONE()); /* 15.2.19.7.33 */ - mrb_define_method(mrb, tc, "initialize", mrb_time_initialize, ARGS_REQ(1)); - mrb_define_method(mrb, tc, "initialize_copy", mrb_time_initialize_copy, ARGS_REQ(1)); + mrb_define_method(mrb, tc, "initialize", mrb_time_initialize, ARGS_REQ(1)); /* 15.2.19.7.16 */ + mrb_define_method(mrb, tc, "initialize_copy", mrb_time_initialize_copy, ARGS_REQ(1)); /* 15.2.19.7.17 */ + + /* + methods not available: + gmt_offset(15.2.19.7.12) + gmtoff(15.2.19.7.14) + utc_offset(15.2.19.7.29) + */ } -- cgit v1.2.3 From ab3c178a5f9742ff1fd6522c87b5cfd56e685e89 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 4 Jun 2012 08:34:56 +0900 Subject: add Time#getlocal/getgm/getutc --- src/time.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/time.c b/src/time.c index 08f746707..eea92e604 100644 --- a/src/time.c +++ b/src/time.c @@ -463,6 +463,39 @@ mrb_time_dstp(mrb_state *mrb, mrb_value self) return mrb_bool_value(tm->datetime.tm_isdst); } +/* 15.2.19.7.8 */ +/* 15.2.19.7.10 */ +/* Returns the Time object of the UTC(GMT) timezone. */ +static mrb_value +mrb_time_getutc(mrb_state *mrb, mrb_value self) +{ + struct mrb_time *tm, *tm2; + + tm = mrb_get_datatype(mrb, self, &mrb_time_type); + if (!tm) return self; + tm2 = mrb_malloc(mrb, sizeof(*tm)); + *tm2 = *tm; + tm2->timezone = MRB_TIMEZONE_UTC; + mrb_time_update_datetime(tm2); + return mrb_time_wrap(mrb, mrb_obj_class(mrb, self), tm2); +} + +/* 15.2.19.7.9 */ +/* Returns the Time object of the LOCAL timezone. */ +static mrb_value +mrb_time_getlocal(mrb_state *mrb, mrb_value self) +{ + struct mrb_time *tm, *tm2; + + tm = mrb_get_datatype(mrb, self, &mrb_time_type); + if (!tm) return self; + tm2 = mrb_malloc(mrb, sizeof(*tm)); + *tm2 = *tm; + tm2->timezone = MRB_TIMEZONE_LOCAL; + mrb_time_update_datetime(tm2); + return mrb_time_wrap(mrb, mrb_obj_class(mrb, self), tm2); +} + /* 15.2.19.7.15 */ /* Returns hour of time. */ static mrb_value @@ -671,6 +704,9 @@ mrb_init_time(mrb_state *mrb) mrb_define_method(mrb, tc, "ctime" , mrb_time_asctime, ARGS_NONE()); /* 15.2.19.7.5 */ mrb_define_method(mrb, tc, "day" , mrb_time_day , ARGS_NONE()); /* 15.2.19.7.6 */ mrb_define_method(mrb, tc, "dst?" , mrb_time_dstp , ARGS_NONE()); /* 15.2.19.7.7 */ + mrb_define_method(mrb, tc, "getgm" , mrb_time_getutc , ARGS_NONE()); /* 15.2.19.7.8 */ + mrb_define_method(mrb, tc, "getlocal",mrb_time_getlocal,ARGS_NONE()); /* 15.2.19.7.9 */ + mrb_define_method(mrb, tc, "getutc" , mrb_time_getutc , ARGS_NONE()); /* 15.2.19.7.10 */ mrb_define_method(mrb, tc, "gmt?" , mrb_time_utcp , ARGS_NONE()); /* 15.2.19.7.11 */ mrb_define_method(mrb, tc, "gmtime" , mrb_time_utc , ARGS_NONE()); /* 15.2.19.7.13 */ mrb_define_method(mrb, tc, "hour" , mrb_time_hour, ARGS_NONE()); /* 15.2.19.7.15 */ -- cgit v1.2.3 From b2e6a0fc04f6237f5118bf6c2f404a0d8fa4d2c4 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 4 Jun 2012 20:34:43 +0900 Subject: symbol can contain non printable characters --- include/mruby.h | 2 ++ src/string.c | 8 +---- src/symbol.c | 110 +++++++++++++++++++++++++++++++++++++++++--------------- 3 files changed, 85 insertions(+), 35 deletions(-) diff --git a/include/mruby.h b/include/mruby.h index 3dc160535..0ce4926a8 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -332,6 +332,8 @@ mrb_value mrb_funcall(mrb_state*, mrb_value, const char*, int,...); mrb_value mrb_funcall_argv(mrb_state*, mrb_value, const char*, int, mrb_value*); mrb_value mrb_funcall_with_block(mrb_state*, mrb_value, const char*, int, mrb_value*, mrb_value); mrb_sym mrb_intern(mrb_state*,const char*); +mrb_sym mrb_intern2(mrb_state*,const char*, int); +mrb_sym mrb_intern_str(mrb_state*,mrb_value); const char *mrb_sym2name(mrb_state*,mrb_sym); mrb_value mrb_str_format(mrb_state *, int, const mrb_value *, mrb_value); diff --git a/src/string.c b/src/string.c index d09d8942b..805b52a28 100644 --- a/src/string.c +++ b/src/string.c @@ -1616,12 +1616,6 @@ mrb_str_init(mrb_state *mrb, mrb_value self) return self; } -mrb_sym -mrb_intern_str(mrb_state *mrb, mrb_value str) -{ - return mrb_intern(mrb, RSTRING_PTR(str)); -} - /* 15.2.10.5.25 */ /* 15.2.10.5.41 */ /* @@ -2817,7 +2811,7 @@ mrb_str_dump(mrb_state *mrb, mrb_value str) len++; } else { - len += 4; /* \xNN */ + len += 4; /* \NNN */ } break; } diff --git a/src/symbol.c b/src/symbol.c index d09833689..fffe2fae9 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -17,59 +17,94 @@ #include /* ------------------------------------------------------ */ -KHASH_INIT(s2n, mrb_sym, const char*, 1, kh_int_hash_func, kh_int_hash_equal) -KHASH_MAP_INIT_STR(n2s, mrb_sym); +typedef struct symbol_name { + int len; + const char *name; +} symbol_name; + +static inline khint_t +sym_hash_func(mrb_state *mrb, const symbol_name s) +{ + khint_t h = 0; + size_t i; + const char *p = s.name; + + for (i=0; iname2sym; - khash_t(s2n) *rh = mrb->sym2name; + symbol_name sname; khiter_t k; - size_t len; - char *p; mrb_sym sym; + char *p; - k = kh_get(n2s, h, name); + sname.len = len; + sname.name = name; + k = kh_get(n2s, h, sname); if (k != kh_end(h)) return kh_value(h, k); sym = ++mrb->symidx; - len = strlen(name); p = mrb_malloc(mrb, len+1); memcpy(p, name, len); p[len] = 0; - k = kh_put(n2s, h, p); + sname.name = (const char*)p; + k = kh_put(n2s, h, sname); kh_value(h, k) = sym; - k = kh_put(s2n, rh, sym); - kh_value(rh, k) = p; - return sym; } -const char* -mrb_sym2name(mrb_state *mrb, mrb_sym sym) +mrb_sym +mrb_intern(mrb_state *mrb, const char *name) +{ + return mrb_intern2(mrb, name, strlen(name)); +} + +mrb_sym +mrb_intern_str(mrb_state *mrb, mrb_value str) +{ + return mrb_intern2(mrb, RSTRING_PTR(str), RSTRING_LEN(str)); +} + +static const char* +sym2name_len(mrb_state *mrb, mrb_sym sym, int *lenp) { - khash_t(s2n) *h = mrb->sym2name; + khash_t(n2s) *h = mrb->name2sym; khiter_t k; + symbol_name sname; - k = kh_get(s2n, h, sym); + for (k = kh_begin(h); k != kh_end(h); k++) { + if (kh_exist(h, k)) { + if (kh_value(h, k) == sym) break; + } + } if (k == kh_end(h)) { - return NULL; /* missing */ + *lenp = 0; + return NULL; /* missing */ } - return kh_value(h, k); + sname = kh_key(h, k); + *lenp = sname.len; + return sname.name; } void mrb_free_symtbls(mrb_state *mrb) { - khash_t(s2n) *h = mrb->sym2name; + khash_t(n2s) *h = mrb->name2sym; khiter_t k; - for (k = kh_begin(h); k != kh_end(h); ++k) - if (kh_exist(h, k)) mrb_free(mrb, (char*)kh_value(h, k)); - kh_destroy(s2n,mrb->sym2name); + for (k = kh_begin(h); k != kh_end(h); k++) + if (kh_exist(h, k)) mrb_free(mrb, (char*)kh_key(h, k).name); kh_destroy(n2s,mrb->name2sym); } @@ -77,7 +112,6 @@ void mrb_init_symtbl(mrb_state *mrb) { mrb->name2sym = kh_init(n2s, mrb); - mrb->sym2name = kh_init(s2n, mrb); } /********************************************************************** @@ -148,8 +182,11 @@ mrb_value mrb_sym_to_s(mrb_state *mrb, mrb_value sym) { mrb_sym id = SYM2ID(sym); + const char *p; + int len; - return mrb_str_new_cstr(mrb, mrb_sym2name(mrb, id)); + p = sym2name_len(mrb, id, &len); + return mrb_str_new(mrb, p, len); } /* 15.2.11.3.4 */ @@ -287,19 +324,36 @@ sym_inspect(mrb_state *mrb, mrb_value sym) { mrb_value str; const char *name; + int len; mrb_sym id = SYM2ID(sym); - name = mrb_sym2name(mrb, id); //mrb_id2name(id); - str = mrb_str_new(mrb, 0, strlen(name)+1); + name = sym2name_len(mrb, id, &len); + str = mrb_str_new(mrb, 0, len+1); RSTRING(str)->buf[0] = ':'; - strcpy(RSTRING(str)->buf+1, name); - if (!symname_p(name)) { + memcpy(RSTRING(str)->buf+1, name, len); + if (!symname_p(name) || strlen(name) != len) { str = mrb_str_dump(mrb, str); strncpy(RSTRING(str)->buf, ":\"", 2); } return str; } +const char* +mrb_sym2name(mrb_state *mrb, mrb_sym sym) +{ + int len; + const char *name = sym2name_len(mrb, sym, &len); + + if (!name) return NULL; + if (symname_p(name) && strlen(name) == len) { + return name; + } + else { + mrb_value str = mrb_str_dump(mrb, mrb_str_new(mrb, name, len)); + return RSTRING(str)->buf; + } +} + void mrb_init_symbols(mrb_state *mrb) -- cgit v1.2.3 From 7bedf583a0b6913c9fb1d761d08d12d3fbb4fb42 Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Tue, 5 Jun 2012 03:11:41 +0800 Subject: Add Time#utc --- src/time.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/time.c b/src/time.c index eea92e604..24d86bc33 100644 --- a/src/time.c +++ b/src/time.c @@ -694,6 +694,7 @@ mrb_init_time(mrb_state *mrb) mrb_define_class_method(mrb, tc, "local", mrb_time_local, ARGS_REQ(1)|ARGS_OPT(6)); /* 15.2.19.6.3 */ mrb_define_class_method(mrb, tc, "mktime", mrb_time_local, ARGS_REQ(1)|ARGS_OPT(6));/* 15.2.19.6.4 */ mrb_define_class_method(mrb, tc, "now", mrb_time_now, ARGS_NONE()); /* 15.2.19.6.5 */ + mrb_define_class_method(mrb, tc, "utc", mrb_time_gm, ARGS_REQ(1)|ARGS_OPT(6)); /* 15.2.19.6.6 */ mrb_define_method(mrb, tc, "==" , mrb_time_eq , ARGS_REQ(1)); mrb_define_method(mrb, tc, "<=>" , mrb_time_cmp , ARGS_REQ(1)); /* 15.2.19.7.1 */ -- cgit v1.2.3 From db6c374301421245ef4746f71891ec03509a4085 Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Tue, 5 Jun 2012 03:11:56 +0800 Subject: Add Time tests --- test/t/time.rb | 126 +++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 119 insertions(+), 7 deletions(-) diff --git a/test/t/time.rb b/test/t/time.rb index 7d1519f63..045c5b185 100644 --- a/test/t/time.rb +++ b/test/t/time.rb @@ -1,6 +1,10 @@ ## # Time ISO Test +assert('Time.new', '15.2.3.3.3') do + Time.new.class == Time +end + assert('Time', '15.2.19') do Time.class == Class end @@ -17,23 +21,133 @@ assert('Time.gm', '15.2.19.6.2') do Time.gm(2012, 12, 23) end +assert('Time.local', '15.2.19.6.3') do + Time.local(2012, 12, 23) +end + +assert('Time.mktime', '15.2.19.6.4') do + Time.mktime(2012, 12, 23) +end + +assert('Time.now', '15.2.19.6.5') do + Time.now.class == Time +end + +assert('Time.utc', '15.2.19.6.6') do + Time.utc(2012, 12, 23) +end + +assert('Time#+', '15.2.19.7.1') do + t1 = Time.at(1300000000.0) + t2 = t1.+(60) + + t2.utc.asctime == "Sun Mar 13 07:07:40 UTC 2011" +end + +assert('Time#-', '15.2.19.7.2') do + t1 = Time.at(1300000000.0) + t2 = t1.-(60) + + t2.utc.asctime == "Sun Mar 13 07:05:40 UTC 2011" +end + +assert('Time#<=>', '15.2.19.7.3') do + t1 = Time.at(1300000000.0) + t2 = Time.at(1400000000.0) + t3 = Time.at(1500000000.0) + + t2.<=>(t1) == 1 and + t2.<=>(t2) == 0 and + t2.<=>(t3) == -1 and + t2.<=>(nil) == nil +end + assert('Time#asctime', '15.2.19.7.4') do Time.at(1300000000.0).utc.asctime == "Sun Mar 13 07:06:40 UTC 2011" end +assert('Time#ctime', '15.2.19.7.5') do + Time.at(1300000000.0).utc.ctime == "Sun Mar 13 07:06:40 UTC 2011" +end + +assert('Time#day', '15.2.19.7.6') do + Time.gm(2012, 12, 23).day == 23 +end + +assert('Time#dst?', '15.2.19.7.7') do + not Time.gm(2012, 12, 23).utc.dst? +end + +assert('Time#getgm', '15.2.19.7.8') do + Time.at(1300000000.0).getgm.asctime == "Sun Mar 13 07:06:40 UTC 2011" +end + +assert('Time#getlocal', '15.2.19.7.9') do + t1 = Time.at(1300000000.0) + t2 = Time.at(1300000000.0) + t3 = t1.getlocal + + t1 == t3 and t3 == t2.getlocal +end + +assert('Time#getutc', '15.2.19.7.10') do + Time.at(1300000000.0).getutc.asctime == "Sun Mar 13 07:06:40 UTC 2011" +end + +assert('Time#gmt?', '15.2.19.7.11') do + Time.at(1300000000.0).utc.gmt? +end + +# ATM not implemented +# assert('Time#gmt_offset', '15.2.19.7.12') do + +assert('Time#gmtime', '15.2.19.7.13') do + Time.at(1300000000.0).gmtime +end + +# ATM not implemented +# assert('Time#gmtoff', '15.2.19.7.14') do + +assert('Time#hour', '15.2.19.7.15') do + Time.gm(2012, 12, 23, 7, 6).hour == 7 +end + +# ATM doesn't really work +# assert('Time#initialize', '15.2.19.7.16') do + assert('Time#initialize_copy', '15.2.19.7.17') do time_tmp_2 = Time.at(7.0e6) time_tmp_2.clone == time_tmp_2 end +assert('Time#localtime', '15.2.19.7.18') do + t1 = Time.at(1300000000.0) + t2 = Time.at(1300000000.0) + + t1.localtime + t1 == t2.getlocal +end + assert('Time#mday', '15.2.19.7.19') do Time.gm(2012, 12, 23).mday == 23 end +assert('Time#min', '15.2.19.7.20') do + Time.gm(2012, 12, 23, 7, 6).min == 6 +end + +assert('Time#mon', '15.2.19.7.21') do + Time.gm(2012, 12, 23).mon == 12 +end + assert('Time#month', '15.2.19.7.22') do Time.gm(2012, 12, 23).month == 12 end +assert('Times#sec', '15.2.19.7.23') do + Time.gm(2012, 12, 23, 7, 6, 40).sec == 40 +end + assert('Time#to_f', '15.2.19.7.24') do Time.at(1300000000.0).to_f == 1300000000.0 end @@ -54,12 +168,15 @@ assert('Time#utc?', '15.2.19.7.28') do Time.at(1300000000.0).utc.utc? end +# ATM not implemented +# assert('Time#utc_offset', '15.2.19.7.29') do + assert('Time#wday', '15.2.19.7.30') do - Time.at(1300000000.0).utc.wday == 0 + Time.gm(2012, 12, 23).wday == 0 end assert('Time#yday', '15.2.19.7.31') do - Time.at(1300000000.0).utc.yday == 71 + Time.gm(2012, 12, 23).yday == 357 end assert('Time#year', '15.2.19.7.32') do @@ -70,8 +187,3 @@ assert('Time#zone', '15.2.19.7.33') do Time.at(1300000000.0).utc.zone == 'UTC' end -# Not ISO specified - -assert('Time#new') do - Time.new.class == Time -end -- cgit v1.2.3 From 2c7cee8a1a7886691f5103a4319fca411408b500 Mon Sep 17 00:00:00 2001 From: Paolo Bosetti Date: Mon, 4 Jun 2012 15:56:51 -0700 Subject: Added Math.sqrt() that was missing in math.c, and added relevant test case --- src/math.c | 20 ++++++++++++++++++++ test/t/math.rb | 10 ++++++++++ 2 files changed, 30 insertions(+) diff --git a/src/math.c b/src/math.c index b0d911573..eff2edcad 100644 --- a/src/math.c +++ b/src/math.c @@ -463,6 +463,25 @@ math_log10(mrb_state *mrb, mrb_value obj) return mrb_float_value(x); } +/* + * call-seq: + * Math.sqrt(numeric) -> float + * + * Returns the square root of numeric. + * + */ +static mrb_value +math_sqrt(mrb_state *mrb, mrb_value obj) +{ + mrb_float x; + + mrb_get_args(mrb, "f", &x); + x = sqrt(x); + + return mrb_float_value(x); +} + + /* * call-seq: * Math.cbrt(numeric) -> float @@ -646,6 +665,7 @@ mrb_init_math(mrb_state *mrb) mrb_define_module_function(mrb, mrb_math, "log", math_log, -1); mrb_define_module_function(mrb, mrb_math, "log2", math_log2, 1); mrb_define_module_function(mrb, mrb_math, "log10", math_log10, 1); + mrb_define_module_function(mrb, mrb_math, "sqrt", math_sqrt, 1); mrb_define_module_function(mrb, mrb_math, "cbrt", math_cbrt, 1); mrb_define_module_function(mrb, mrb_math, "frexp", math_frexp, 1); diff --git a/test/t/math.rb b/test/t/math.rb index 5b9da4cb3..47a3bf527 100644 --- a/test/t/math.rb +++ b/test/t/math.rb @@ -76,6 +76,16 @@ assert('Math.log10 10**100') do check_float(Math.log10(10**100), 100.0) end +assert('Math.sqrt') do + num = [0.0, 1.0, 2.0, 3.0, 4.0] + sqr = [0, 1, 4, 9, 16] + result = true + sqr.each_with_index do |v,i| + result &= check_float(Math.sqrt(v), num[i]) + end + result +end + assert('Math.cbrt') do num = [-2.0, -1.0, 0.0, 1.0, 2.0] cub = [-8, -1, 0, 1, 8] -- cgit v1.2.3 From b7cc7fffe7030834c160ce2cb78c398ba23ac145 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 5 Jun 2012 08:34:09 +0900 Subject: symbol can contain non printable characters --- include/mruby.h | 3 ++ src/dump.c | 6 ++-- src/load.c | 2 +- src/string.c | 6 ---- src/symbol.c | 99 +++++++++++++++++++++++++++++++++++++++++++-------------- 5 files changed, 83 insertions(+), 33 deletions(-) diff --git a/include/mruby.h b/include/mruby.h index 3dc160535..579375d9f 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -332,7 +332,10 @@ mrb_value mrb_funcall(mrb_state*, mrb_value, const char*, int,...); mrb_value mrb_funcall_argv(mrb_state*, mrb_value, const char*, int, mrb_value*); mrb_value mrb_funcall_with_block(mrb_state*, mrb_value, const char*, int, mrb_value*, mrb_value); mrb_sym mrb_intern(mrb_state*,const char*); +mrb_sym mrb_intern2(mrb_state*,const char*,int); +mrb_sym mrb_intern_str(mrb_state*,mrb_value); const char *mrb_sym2name(mrb_state*,mrb_sym); +const char *mrb_sym2name_len(mrb_state*,mrb_sym,int*); mrb_value mrb_str_format(mrb_state *, int, const mrb_value *, mrb_value); void *mrb_malloc(mrb_state*, size_t); diff --git a/src/dump.c b/src/dump.c index f3cbef3a0..7b2199a02 100644 --- a/src/dump.c +++ b/src/dump.c @@ -268,8 +268,10 @@ get_syms_block_size(mrb_state *mrb, mrb_irep *irep, int type) size += DUMP_SIZE(MRB_DUMP_SIZE_OF_SHORT, type); /* snl(n) */ if (irep->syms[sym_no] != 0) { - name = mrb_sym2name(mrb, irep->syms[sym_no]); - nlen = str_dump_len((char*)name, strlen(name), type); + int len; + + name = mrb_sym2name_len(mrb, irep->syms[sym_no], &len); + nlen = str_dump_len((char*)name, len, type); size += nlen; /* sn(n) */ } } diff --git a/src/load.c b/src/load.c index c0684f1aa..1b607909c 100644 --- a/src/load.c +++ b/src/load.c @@ -477,7 +477,7 @@ read_rite_irep_record(mrb_state *mrb, unsigned char *src, mrb_irep *irep, uint32 memcpy(buf, src, snl); //symbol name src += snl; buf[snl] = '\0'; - irep->syms[i] = mrb_intern(mrb, buf); + irep->syms[i] = mrb_intern2(mrb, buf, snl); } } crc = calc_crc_16_ccitt((unsigned char*)pStart, src - pStart); //Calculate CRC diff --git a/src/string.c b/src/string.c index d09d8942b..eabf9f8ef 100644 --- a/src/string.c +++ b/src/string.c @@ -1616,12 +1616,6 @@ mrb_str_init(mrb_state *mrb, mrb_value self) return self; } -mrb_sym -mrb_intern_str(mrb_state *mrb, mrb_value str) -{ - return mrb_intern(mrb, RSTRING_PTR(str)); -} - /* 15.2.10.5.25 */ /* 15.2.10.5.41 */ /* diff --git a/src/symbol.c b/src/symbol.c index d09833689..986709520 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -17,59 +17,92 @@ #include /* ------------------------------------------------------ */ -KHASH_INIT(s2n, mrb_sym, const char*, 1, kh_int_hash_func, kh_int_hash_equal) -KHASH_MAP_INIT_STR(n2s, mrb_sym); +typedef struct symbol_name { + int len; + const char *name; +} symbol_name; + +static inline khint_t +sym_hash_func(mrb_state *mrb, const symbol_name s) +{ + khint_t h = 0; + size_t i; + const char *p = s.name; + + for (i=0; iname2sym; - khash_t(s2n) *rh = mrb->sym2name; khiter_t k; - size_t len; char *p; mrb_sym sym; + symbol_name sname; - k = kh_get(n2s, h, name); + sname.name = name; + sname.len = len; + k = kh_get(n2s, h, sname); if (k != kh_end(h)) return kh_value(h, k); sym = ++mrb->symidx; - len = strlen(name); p = mrb_malloc(mrb, len+1); memcpy(p, name, len); p[len] = 0; - k = kh_put(n2s, h, p); + sname.name = p; + k = kh_put(n2s, h, sname); kh_value(h, k) = sym; - k = kh_put(s2n, rh, sym); - kh_value(rh, k) = p; - return sym; } +mrb_sym +mrb_intern(mrb_state *mrb, const char *name) +{ + return mrb_intern2(mrb, name, strlen(name)); +} + +mrb_sym +mrb_intern_str(mrb_state *mrb, mrb_value str) +{ + return mrb_intern(mrb, RSTRING_PTR(str)); +} + const char* -mrb_sym2name(mrb_state *mrb, mrb_sym sym) +mrb_sym2name_len(mrb_state *mrb, mrb_sym sym, int *lenp) { - khash_t(s2n) *h = mrb->sym2name; + khash_t(n2s) *h = mrb->name2sym; khiter_t k; + symbol_name sname; - k = kh_get(s2n, h, sym); + for (k = kh_begin(h); k != kh_end(h); k++) { + if (kh_exist(h, k) && kh_value(h, k) == sym) break; + } if (k == kh_end(h)) { + *lenp = 0; return NULL; /* missing */ } - return kh_value(h, k); + sname = kh_key(h, k); + *lenp = sname.len; + return sname.name; } void mrb_free_symtbls(mrb_state *mrb) { - khash_t(s2n) *h = mrb->sym2name; + khash_t(n2s) *h = mrb->name2sym; khiter_t k; - for (k = kh_begin(h); k != kh_end(h); ++k) - if (kh_exist(h, k)) mrb_free(mrb, (char*)kh_value(h, k)); - kh_destroy(s2n,mrb->sym2name); + for (k = kh_begin(h); k != kh_end(h); k++) + if (kh_exist(h, k)) mrb_free(mrb, (char*)kh_key(h, k).name); kh_destroy(n2s,mrb->name2sym); } @@ -77,7 +110,6 @@ void mrb_init_symtbl(mrb_state *mrb) { mrb->name2sym = kh_init(n2s, mrb); - mrb->sym2name = kh_init(s2n, mrb); } /********************************************************************** @@ -148,8 +180,11 @@ mrb_value mrb_sym_to_s(mrb_state *mrb, mrb_value sym) { mrb_sym id = SYM2ID(sym); + const char *p; + int len; - return mrb_str_new_cstr(mrb, mrb_sym2name(mrb, id)); + p = mrb_sym2name_len(mrb, id, &len); + return mrb_str_new(mrb, p, len); } /* 15.2.11.3.4 */ @@ -258,7 +293,7 @@ symname_p(const char *name) if (*++m == '@') ++m; break; - case '|': case '^': case '&': case '/': case '%': case '~': case '`': + case '|': case '^': case '&': case '/': case '%': case '~': case '`': case '!': ++m; break; @@ -288,9 +323,10 @@ sym_inspect(mrb_state *mrb, mrb_value sym) mrb_value str; const char *name; mrb_sym id = SYM2ID(sym); + int len; - name = mrb_sym2name(mrb, id); //mrb_id2name(id); - str = mrb_str_new(mrb, 0, strlen(name)+1); + name = mrb_sym2name_len(mrb, id, &len); + str = mrb_str_new(mrb, 0, len+1); RSTRING(str)->buf[0] = ':'; strcpy(RSTRING(str)->buf+1, name); if (!symname_p(name)) { @@ -300,6 +336,21 @@ sym_inspect(mrb_state *mrb, mrb_value sym) return str; } +const char* +mrb_sym2name(mrb_state *mrb, mrb_sym sym) +{ + int len; + const char *name = mrb_sym2name_len(mrb, sym, &len); + + if (!name) return NULL; + if (symname_p(name) && strlen(name) == len) { + return name; + } + else { + mrb_value str = mrb_str_dump(mrb, mrb_str_new(mrb, name, len)); + return RSTRING(str)->buf; + } +} void mrb_init_symbols(mrb_state *mrb) -- cgit v1.2.3 From f06eceaa1965794fd2ba9910c83b4e0459550a21 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 5 Jun 2012 08:43:58 +0900 Subject: since 1.9 "!=" op is a method call --- src/symbol.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/symbol.c b/src/symbol.c index 986709520..a236ba9ae 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -288,12 +288,14 @@ symname_p(const char *name) case '*': if (*++m == '*') ++m; break; - + case '!': + if (*++m == '=') ++m; + break; case '+': case '-': if (*++m == '@') ++m; break; - case '|': case '^': case '&': case '/': case '%': case '~': case '`': case '!': + case '|': case '^': case '&': case '/': case '%': case '~': case '`': ++m; break; -- cgit v1.2.3 From 41baf125f21e3fd49a7849e4b8bbf99e06a31b9e Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 5 Jun 2012 08:58:50 +0900 Subject: Time#- should return time if operand is a number --- src/time.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/time.c b/src/time.c index 24d86bc33..862ff57a9 100644 --- a/src/time.c +++ b/src/time.c @@ -363,8 +363,11 @@ mrb_time_minus(mrb_state *mrb, mrb_value self) return mrb_float_value(f); } else { - mrb_get_args(mrb, "f", &f); - return mrb_time_make(mrb, mrb_obj_class(mrb, self), f, tm->timezone); + mrb_float f, f2; + mrb_get_args(mrb, "f", &f2); + + f = ((mrb_float)tm->sec + (mrb_float)tm->usec/1.0e6); + return mrb_time_make(mrb, mrb_obj_class(mrb, self), f-f2, tm->timezone); } } -- cgit v1.2.3 From 501f7f6027b99416b94f093bb30691c5ae43d7d0 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 5 Jun 2012 09:09:50 +0900 Subject: stop introducing Math::TORELANCE --- src/math.c | 6 +++--- test/assert.rb | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/math.c b/src/math.c index eff2edcad..63daa58d1 100644 --- a/src/math.c +++ b/src/math.c @@ -10,10 +10,11 @@ #define domain_error(msg) \ mrb_raise(mrb, E_RANGE_ERROR, "Numerical argument is out of domain - " #msg); -#define MATH_TOLERANCE 1E-12 - /* math functions not provided under Microsoft Visual C++ */ #ifdef _MSC_VER + +#define MATH_TOLERANCE 1E-12 + #define asinh(x) log(x + sqrt(pow(x,2.0) + 1)) #define acosh(x) log(x + sqrt(pow(x,2.0) - 1)) #define atanh(x) (log(1+x) - log(1-x))/2.0 @@ -631,7 +632,6 @@ mrb_init_math(mrb_state *mrb) struct RClass *mrb_math; mrb_math = mrb_define_module(mrb, "Math"); - mrb_define_const(mrb, mrb_math, "TOLERANCE", mrb_float_value(MATH_TOLERANCE)); #ifdef M_PI mrb_define_const(mrb, mrb_math, "PI", mrb_float_value(M_PI)); #else diff --git a/test/assert.rb b/test/assert.rb index 239730cb9..5cca59187 100644 --- a/test/assert.rb +++ b/test/assert.rb @@ -74,12 +74,12 @@ end # Performs fuzzy check for equality on methods returning floats # on the basis of the Math::TOLERANCE constant. def check_float(a, b) + tolerance = 1e-12 a = a.to_f b = b.to_f if a.finite? and b.finite? - (a-b).abs < Math::TOLERANCE + (a-b).abs < tolerance else true end end - -- cgit v1.2.3 From dfce4a7b33464b39f7677cfb4d093f19c566e756 Mon Sep 17 00:00:00 2001 From: Jon Date: Mon, 4 Jun 2012 20:11:55 -0400 Subject: Add Ubuntu -> Linux-on-ARM CMake toolchain files Add separate sample CMake toolchain files targeting Linux running on ARM, with and without hardware floating point support. Samples use the `gcc-arm-linux-gnueabihf` and `gcc-arm-linux-gnueabi` cross toolchains from the standard Ubuntu package repositories. --- cmake/Toolchain-Ubuntu-gnueabi.cmake.sample | 29 +++++++++++++++++++++++++++ cmake/Toolchain-Ubuntu-gnueabihf.cmake.sample | 29 +++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 cmake/Toolchain-Ubuntu-gnueabi.cmake.sample create mode 100644 cmake/Toolchain-Ubuntu-gnueabihf.cmake.sample diff --git a/cmake/Toolchain-Ubuntu-gnueabi.cmake.sample b/cmake/Toolchain-Ubuntu-gnueabi.cmake.sample new file mode 100644 index 000000000..bf29a5cad --- /dev/null +++ b/cmake/Toolchain-Ubuntu-gnueabi.cmake.sample @@ -0,0 +1,29 @@ +# Sample toolchain file for building for ARM from an Ubuntu Linux system. +# +# Typical usage: +# 1) install cross compiler: `sudo apt-get install gcc-arm-linux-gnueabi` +# 2) cp cmake/Toolchain-Ubuntu-gnueabi.cmake.sample ~/Toolchain-Ubuntu-gnueabi.cmake +# 3) tweak toolchain values as needed +# 4) cd build +# 5) cmake -DCMAKE_TOOLCHAIN_FILE=~/Toolchain-Ubuntu-gnueabi.cmake .. + +# name of the target OS on which the built artifacts will run and the +# toolchain prefix. if target is an embedded system without an OS, set +# CMAKE_SYSTEM_NAME to `Generic` +set(CMAKE_SYSTEM_NAME Linux) +set(TOOLCHAIN_PREFIX arm-linux-gnueabi) + +# cross compilers to use for C +set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}-gcc) + +# target environment on the build host system +# set 1st to dir with the cross compiler's C/C++ headers/libs +# set 2nd to dir containing personal cross development headers/libs +set(CMAKE_FIND_ROOT_PATH /usr/${TOOLCHAIN_PREFIX} ~/crossdev/eabi) + +# modify default behavior of FIND_XXX() commands to +# search for headers/libs in the target environment and +# search for programs in the build host environment +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) diff --git a/cmake/Toolchain-Ubuntu-gnueabihf.cmake.sample b/cmake/Toolchain-Ubuntu-gnueabihf.cmake.sample new file mode 100644 index 000000000..2d7f2769c --- /dev/null +++ b/cmake/Toolchain-Ubuntu-gnueabihf.cmake.sample @@ -0,0 +1,29 @@ +# Sample toolchain file for building for ARM (w/hw float support) from an Ubuntu Linux system. +# +# Typical usage: +# 1) install cross compiler: `sudo apt-get install gcc-arm-linux-gnueabihf` +# 2) cp cmake/Toolchain-Ubuntu-gnueabihf.cmake.sample ~/Toolchain-Ubuntu-gnueabihf.cmake +# 3) tweak toolchain values as needed +# 4) cd build +# 5) cmake -DCMAKE_TOOLCHAIN_FILE=~/Toolchain-Ubuntu-gnueabihf.cmake .. + +# name of the target OS on which the built artifacts will run and the +# toolchain prefix. if target is an embedded system without an OS, set +# CMAKE_SYSTEM_NAME to `Generic` +set(CMAKE_SYSTEM_NAME Linux) +set(TOOLCHAIN_PREFIX arm-linux-gnueabihf) + +# cross compilers to use for C +set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}-gcc) + +# target environment on the build host system +# set 1st to dir with the cross compiler's C/C++ headers/libs +# set 2nd to dir containing personal cross development headers/libs +set(CMAKE_FIND_ROOT_PATH /usr/${TOOLCHAIN_PREFIX} ~/crossdev/eabihf) + +# modify default behavior of FIND_XXX() commands to +# search for headers/libs in the target environment and +# search for programs in the build host environment +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) -- cgit v1.2.3 From e3d17e54f83d442e72a18be26425f58ad6d51078 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 5 Jun 2012 23:17:09 +0900 Subject: mruby/string.h: rename buf to ptr --- include/mruby/string.h | 8 ++-- src/class.c | 8 ++-- src/gc.c | 2 +- src/object.c | 6 +-- src/print.c | 2 +- src/string.c | 124 ++++++++++++++++++++++++------------------------- src/symbol.c | 8 ++-- 7 files changed, 79 insertions(+), 79 deletions(-) diff --git a/include/mruby/string.h b/include/mruby/string.h index 91a59d92d..1449a2edf 100644 --- a/include/mruby/string.h +++ b/include/mruby/string.h @@ -27,7 +27,7 @@ extern const char mrb_digitmap[]; struct mrb_shared_string { int refcnt; - char *buf; + char *ptr; int len; }; @@ -38,15 +38,15 @@ struct RString { int capa; struct mrb_shared_string *shared; } aux; - char *buf; + char *ptr; }; #define mrb_str_ptr(s) ((struct RString*)((s).value.p)) #define RSTRING(s) ((struct RString*)((s).value.p)) -#define RSTRING_PTR(s) (RSTRING(s)->buf) +#define RSTRING_PTR(s) (RSTRING(s)->ptr) #define RSTRING_LEN(s) (RSTRING(s)->len) #define RSTRING_CAPA(s) (RSTRING(s)->aux.capa) -#define RSTRING_END(s) (RSTRING(s)->buf + RSTRING(s)->len) +#define RSTRING_END(s) (RSTRING(s)->ptr + RSTRING(s)->len) #define MRB_STR_SHARED 256 void mrb_str_decref(mrb_state*, struct mrb_shared_string*); diff --git a/src/class.c b/src/class.c index 594ed08bc..554f98550 100644 --- a/src/class.c +++ b/src/class.c @@ -449,7 +449,7 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) ss = to_str(mrb, *sp); s = mrb_str_ptr(ss); ps = va_arg(ap, char**); - *ps = s->buf; + *ps = s->ptr; pl = va_arg(ap, int*); *pl = s->len; i++; sp++; @@ -463,11 +463,11 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) ss = to_str(mrb, *sp); s = mrb_str_ptr(ss); - if (strlen(s->buf) != s->len) { + if (strlen(s->ptr) != s->len) { mrb_raise(mrb, E_ARGUMENT_ERROR, "String contains NUL"); } ps = va_arg(ap, char**); - *ps = s->buf; + *ps = s->ptr; i++; sp++; } break; @@ -959,7 +959,7 @@ mrb_class_name(mrb_state *mrb, struct RClass* c) { mrb_value path = mrb_class_path(mrb, c); if (mrb_nil_p(path)) return 0; - return mrb_str_ptr(path)->buf; + return mrb_str_ptr(path)->ptr; } const char* diff --git a/src/gc.c b/src/gc.c index b7c08de65..247c1ad85 100644 --- a/src/gc.c +++ b/src/gc.c @@ -472,7 +472,7 @@ obj_free(mrb_state *mrb, struct RBasic *obj) if (obj->flags & MRB_STR_SHARED) mrb_str_decref(mrb, ((struct RString*)obj)->aux.shared); else - mrb_free(mrb, ((struct RString*)obj)->buf); + mrb_free(mrb, ((struct RString*)obj)->ptr); break; case MRB_TT_RANGE: diff --git a/src/object.c b/src/object.c index 81e3867a7..817137d8e 100644 --- a/src/object.c +++ b/src/object.c @@ -433,7 +433,7 @@ mrb_check_type(mrb_state *mrb, mrb_value x, enum mrb_vtype t) } else if (mrb_special_const_p(x)) { s = mrb_str_ptr(mrb_obj_as_string(mrb, x)); - etype = s->buf; + etype = s->ptr; } else { etype = mrb_obj_classname(mrb, x); @@ -471,8 +471,8 @@ mrb_any_to_s(mrb_state *mrb, mrb_value obj) str = mrb_str_new(mrb, 0, len); /* 6:tags 16:addr */ s = mrb_str_ptr(str); // snprintf(RSTRING(str)->ptr, len+1, "#<%s:0x%lx>", cname, obj); - sprintf(s->buf, "#<%s:0x%lx>", cname, (unsigned long)(obj.value.p)); - s->len = strlen(s->buf); + sprintf(s->ptr, "#<%s:0x%lx>", cname, (unsigned long)(obj.value.p)); + s->len = strlen(s->ptr); return str; } diff --git a/src/print.c b/src/print.c index e6873913b..e27a723dc 100644 --- a/src/print.c +++ b/src/print.c @@ -17,7 +17,7 @@ printstr(mrb_state *mrb, mrb_value obj) if (mrb_type(obj) == MRB_TT_STRING) { str = mrb_str_ptr(obj); - s = str->buf; + s = str->ptr; len = str->len; while (len--) { putc(*s, stdout); diff --git a/src/string.c b/src/string.c index 805b52a28..e955b3f22 100644 --- a/src/string.c +++ b/src/string.c @@ -39,7 +39,7 @@ static mrb_value str_replace(mrb_state *mrb, struct RString *s1, struct RString static mrb_value mrb_str_subseq(mrb_state *mrb, mrb_value str, int beg, int len); #define RESIZE_CAPA(s,capacity) do {\ - s->buf = mrb_realloc(mrb, s->buf, (capacity)+1);\ + s->ptr = mrb_realloc(mrb, s->ptr, (capacity)+1);\ s->aux.capa = capacity;\ } while (0) @@ -48,7 +48,7 @@ mrb_str_decref(mrb_state *mrb, struct mrb_shared_string *shared) { shared->refcnt--; if (shared->refcnt == 0) { - mrb_free(mrb, shared->buf); + mrb_free(mrb, shared->ptr); mrb_free(mrb, shared); } } @@ -59,8 +59,8 @@ str_modify(mrb_state *mrb, struct RString *s) if (s->flags & MRB_STR_SHARED) { struct mrb_shared_string *shared = s->aux.shared; - if (shared->refcnt == 1 && s->buf == shared->buf) { - s->buf = shared->buf; + if (shared->refcnt == 1 && s->ptr == shared->ptr) { + s->ptr = shared->ptr; s->aux.capa = shared->len; mrb_free(mrb, shared); } @@ -68,14 +68,14 @@ str_modify(mrb_state *mrb, struct RString *s) char *ptr, *p; long len; - p = s->buf; + p = s->ptr; len = s->len; ptr = mrb_malloc(mrb, len+1); if (p) { memcpy(ptr, p, len); } ptr[len] = 0; - s->buf = ptr; + s->ptr = ptr; s->aux.capa = len; mrb_str_decref(mrb, shared); } @@ -93,11 +93,11 @@ mrb_str_resize(mrb_state *mrb, mrb_value str, int len) slen = s->len; if (len != slen) { if (slen < len || slen -len > 1024) { - s->buf = mrb_realloc(mrb, s->buf, len+1); + s->ptr = mrb_realloc(mrb, s->ptr, len+1); } s->aux.capa = len; s->len = len; - s->buf[len] = '\0'; /* sentinel */ + s->ptr[len] = '\0'; /* sentinel */ } return str; } @@ -107,7 +107,7 @@ str_mod_check(mrb_state *mrb, mrb_value str, char *p, mrb_int len) { struct RString *s = mrb_str_ptr(str); - if (s->buf != p || s->len != len) { + if (s->ptr != p || s->len != len) { mrb_raise(mrb, mrb->eRuntimeError_class, "string modified"); } } @@ -122,7 +122,7 @@ str_alloc(mrb_state *mrb, struct RClass *c) s = mrb_obj_alloc_string(mrb); s->c = c; - s->buf = 0; + s->ptr = 0; s->len = 0; s->aux.capa = 0; @@ -143,11 +143,11 @@ str_new(mrb_state *mrb, const char *p, int len) s->len = len; s->aux.capa = len; - s->buf = mrb_malloc(mrb, len+1); + s->ptr = mrb_malloc(mrb, len+1); if (p) { - memcpy(s->buf, p, len); + memcpy(s->ptr, p, len); } - s->buf[len] = '\0'; + s->ptr[len] = '\0'; return s; } @@ -178,8 +178,8 @@ mrb_str_buf_new(mrb_state *mrb, int capa) } s->len = 0; s->aux.capa = capa; - s->buf = mrb_malloc(mrb, capa+1); - s->buf[0] = '\0'; + s->ptr = mrb_malloc(mrb, capa+1); + s->ptr[0] = '\0'; return mrb_obj_value(s); } @@ -190,8 +190,8 @@ str_buf_cat(mrb_state *mrb, struct RString *s, const char *ptr, int len) long capa, total, off = -1; str_modify(mrb, s); - if (ptr >= s->buf && ptr <= s->buf + s->len) { - off = ptr - s->buf; + if (ptr >= s->ptr && ptr <= s->ptr + s->len) { + off = ptr - s->ptr; } if (len == 0) return; capa = s->aux.capa; @@ -210,11 +210,11 @@ str_buf_cat(mrb_state *mrb, struct RString *s, const char *ptr, int len) RESIZE_CAPA(s, capa); } if (off != -1) { - ptr = s->buf + off; + ptr = s->ptr + off; } - memcpy(s->buf + s->len, ptr, len); + memcpy(s->ptr + s->len, ptr, len); s->len = total; - s->buf[total] = '\0'; /* sentinel */ + s->ptr[total] = '\0'; /* sentinel */ } mrb_value @@ -257,9 +257,9 @@ mrb_str_new_cstr(mrb_state *mrb, const char *p) int len = strlen(p); s = mrb_obj_alloc_string(mrb); - s->buf = mrb_malloc(mrb, len+1); - memcpy(s->buf, p, len); - s->buf[len] = 0; + s->ptr = mrb_malloc(mrb, len+1); + memcpy(s->ptr, p, len); + s->ptr[len] = 0; s->len = len; s->aux.capa = len; @@ -274,10 +274,10 @@ str_make_shared(mrb_state *mrb, struct RString *s) shared->refcnt = 1; if (s->aux.capa > s->len) { - s->buf = shared->buf = mrb_realloc(mrb, s->buf, s->len+1); + s->ptr = shared->ptr = mrb_realloc(mrb, s->ptr, s->len+1); } else { - shared->buf = s->buf; + shared->ptr = s->ptr; } shared->len = s->len; s->aux.shared = shared; @@ -305,7 +305,7 @@ mrb_str_literal(mrb_state *mrb, mrb_value str) } shared = orig->aux.shared; shared->refcnt++; - s->buf = shared->buf; + s->ptr = shared->ptr; s->len = shared->len; s->aux.shared = shared; s->flags |= MRB_STR_SHARED; @@ -325,7 +325,7 @@ mrb_str_body(mrb_value str, int *len_p) struct RString *s = mrb_str_ptr(str); *len_p = s->len; - return s->buf; + return s->ptr; } /* @@ -349,11 +349,11 @@ mrb_str_concat(mrb_state *mrb, mrb_value self, mrb_value other) if (s1->aux.capa < len) { s1->aux.capa = len; - s1->buf = mrb_realloc(mrb, s1->buf, len+1); + s1->ptr = mrb_realloc(mrb, s1->ptr, len+1); } - memcpy(s1->buf+s1->len, s2->buf, s2->len); + memcpy(s1->ptr+s1->len, s2->ptr, s2->len); s1->len = len; - s1->buf[len] = 0; + s1->ptr[len] = 0; } /* @@ -370,8 +370,8 @@ mrb_str_plus(mrb_state *mrb, mrb_value a, mrb_value b) struct RString *t; t = str_new(mrb, 0, s->len + s2->len); - memcpy(t->buf, s->buf, s->len); - memcpy(t->buf + s->len, s2->buf, s2->len); + memcpy(t->ptr, s->ptr, s->len); + memcpy(t->ptr + s->len, s2->ptr, s2->len); return mrb_obj_value(t); } @@ -446,7 +446,7 @@ mrb_str_times(mrb_state *mrb, mrb_value self) len = RSTRING_LEN(self)*times; str2 = str_new(mrb, 0, len); str_with_class(mrb, str2, self); - p = str2->buf; + p = str2->ptr; if (len > 0) { n = RSTRING_LEN(self); memcpy(p, RSTRING_PTR(self), n); @@ -481,7 +481,7 @@ mrb_str_cmp(mrb_state *mrb, mrb_value str1, mrb_value str2) struct RString *s2 = mrb_str_ptr(str2); len = lesser(s1->len, s2->len); - retval = memcmp(s1->buf, s2->buf, len); + retval = memcmp(s1->ptr, s2->ptr, len); if (retval == 0) { if (s1->len == s2->len) return 0; if (s1->len > s2->len) return 1; @@ -725,7 +725,7 @@ mrb_str_dup(mrb_state *mrb, mrb_value str) /* should return shared string */ struct RString *s = mrb_str_ptr(str); - return mrb_str_new(mrb, s->buf, s->len); + return mrb_str_new(mrb, s->ptr, s->len); } static mrb_value @@ -871,8 +871,8 @@ mrb_str_capitalize_bang(mrb_state *mrb, mrb_value str) struct RString *s = mrb_str_ptr(str); str_modify(mrb, s); - if (s->len == 0 || !s->buf) return mrb_nil_value(); - p = s->buf; pend = s->buf + s->len; + if (s->len == 0 || !s->ptr) return mrb_nil_value(); + p = s->ptr; pend = s->ptr + s->len; if (ISLOWER(*p)) { *p = toupper(*p); modify = 1; @@ -931,14 +931,14 @@ mrb_str_chomp_bang(mrb_state *mrb, mrb_value str) if (mrb_get_args(mrb, "|S", &rs) == 0) { if (len == 0) return mrb_nil_value(); smart_chomp: - if (s->buf[len-1] == '\n') { + if (s->ptr[len-1] == '\n') { s->len--; if (s->len > 0 && - s->buf[s->len-1] == '\r') { + s->ptr[s->len-1] == '\r') { s->len--; } } - else if (s->buf[len-1] == '\r') { + else if (s->ptr[len-1] == '\r') { s->len--; } else { @@ -948,7 +948,7 @@ mrb_str_chomp_bang(mrb_state *mrb, mrb_value str) } if (len == 0 || mrb_nil_p(rs)) return mrb_nil_value(); - p = s->buf; + p = s->ptr; rslen = RSTRING_LEN(rs); if (rslen == 0) { while (len>0 && p[len-1] == '\n') { @@ -1028,14 +1028,14 @@ mrb_str_chop_bang(mrb_state *mrb, mrb_value str) if (s->len > 0) { int len; len = s->len - 1; - if (s->buf[len] == '\n') { + if (s->ptr[len] == '\n') { if (len > 0 && - s->buf[len-1] == '\r') { + s->ptr[len-1] == '\r') { len--; } } s->len = len; - s->buf[len] = '\0'; + s->ptr[len] = '\0'; return str; } return mrb_nil_value(); @@ -1083,8 +1083,8 @@ mrb_str_downcase_bang(mrb_state *mrb, mrb_value str) struct RString *s = mrb_str_ptr(str); str_modify(mrb, s); - p = s->buf; - pend = s->buf + s->len; + p = s->ptr; + pend = s->ptr + s->len; while (p < pend) { if (ISUPPER(*p)) { *p = tolower(*p); @@ -1206,7 +1206,7 @@ mrb_str_subseq(mrb_state *mrb, mrb_value str, int beg, int len) str_make_shared(mrb, s); shared = s->aux.shared; s = mrb_obj_alloc_string(mrb); - s->buf = shared->buf + beg; + s->ptr = shared->ptr + beg; s->len = len; s->aux.shared = shared; s->flags |= MRB_STR_SHARED; @@ -1391,7 +1391,7 @@ mrb_str_hash(mrb_state *mrb, mrb_value str) /* 1-8-7 */ struct RString *s = mrb_str_ptr(str); long len = s->len; - char *p = s->buf; + char *p = s->ptr; mrb_int key = 0; while (len--) { @@ -1555,7 +1555,7 @@ str_replace(mrb_state *mrb, struct RString *s1, struct RString *s2) { if (s2->flags & MRB_STR_SHARED) { L_SHARE: - s1->buf = s2->buf; + s1->ptr = s2->ptr; s1->len = s2->len; s1->aux.shared = s2->aux.shared; s1->flags |= MRB_STR_SHARED; @@ -1567,13 +1567,13 @@ str_replace(mrb_state *mrb, struct RString *s1, struct RString *s2) else { if (s1->flags & MRB_STR_SHARED) { mrb_str_decref(mrb, s1->aux.shared); - s1->buf = mrb_malloc(mrb, s2->len+1); + s1->ptr = mrb_malloc(mrb, s2->len+1); } else { - s1->buf = mrb_realloc(mrb, s1->buf, s2->len+1); + s1->ptr = mrb_realloc(mrb, s1->ptr, s2->len+1); } - memcpy(s1->buf, s2->buf, s2->len); - s1->buf[s2->len] = 0; + memcpy(s1->ptr, s2->ptr, s2->len); + s1->ptr[s2->len] = 0; s1->len = s2->len; s2->aux.capa = s2->len; } @@ -1754,7 +1754,7 @@ mrb_str_reverse(mrb_state *mrb, mrb_value str) s2 = str_new(mrb, 0, RSTRING(str)->len); str_with_class(mrb, s2, str); s = RSTRING_PTR(str); e = RSTRING_END(str) - 1; - p = s2->buf; + p = s2->ptr; while (e >= s) { *p++ = *e--; @@ -1778,7 +1778,7 @@ mrb_str_reverse_bang(mrb_state *mrb, mrb_value str) str_modify(mrb, s); if (s->len > 1) { - p = s->buf; + p = s->ptr; e = p + s->len - 1; while (p < e) { c = *p; @@ -1820,13 +1820,13 @@ mrb_str_rindex(mrb_state *mrb, mrb_value str, mrb_value sub, mrb_int pos) if (ps->len - pos < len) { pos = ps->len - len; } - sbeg = ps->buf; - s = ps->buf + pos; - t = psub->buf; + sbeg = ps->ptr; + s = ps->ptr + pos; + t = psub->ptr; if (len) { while (sbeg <= s) { if (memcmp(s, t, len) == 0) { - return s - ps->buf; + return s - ps->ptr; } s--; } @@ -2028,7 +2028,7 @@ mrb_str_scan(mrb_state *mrb, mrb_value str) mrb_int start = 0; mrb_value match = mrb_nil_value(); struct RString *ps = mrb_str_ptr(str); - char *p = ps->buf; + char *p = ps->ptr; long len = ps->len; mrb_get_args(mrb, "o&", &pat, &b); @@ -2513,7 +2513,7 @@ char * mrb_string_value_cstr(mrb_state *mrb, mrb_value *ptr) { struct RString *ps = mrb_str_ptr(*ptr); - char *s = ps->buf; + char *s = ps->ptr; if (!s || ps->len != strlen(s)) { mrb_raise(mrb, E_ARGUMENT_ERROR, "string contains null byte"); @@ -2820,7 +2820,7 @@ mrb_str_dump(mrb_state *mrb, mrb_value str) result = str_new(mrb, 0, len); str_with_class(mrb, result, str); p = RSTRING_PTR(str); pend = p + RSTRING_LEN(str); - q = result->buf; + q = result->ptr; *q++ = '"'; while (p < pend) { diff --git a/src/symbol.c b/src/symbol.c index 6754325a5..2658b35dc 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -331,11 +331,11 @@ sym_inspect(mrb_state *mrb, mrb_value sym) name = mrb_sym2name_len(mrb, id, &len); str = mrb_str_new(mrb, 0, len+1); - RSTRING(str)->buf[0] = ':'; - memcpy(RSTRING(str)->buf+1, name, len); + RSTRING(str)->ptr[0] = ':'; + memcpy(RSTRING(str)->ptr+1, name, len); if (!symname_p(name) || strlen(name) != len) { str = mrb_str_dump(mrb, str); - strncpy(RSTRING(str)->buf, ":\"", 2); + strncpy(RSTRING(str)->ptr, ":\"", 2); } return str; } @@ -352,7 +352,7 @@ mrb_sym2name(mrb_state *mrb, mrb_sym sym) } else { mrb_value str = mrb_str_dump(mrb, mrb_str_new(mrb, name, len)); - return RSTRING(str)->buf; + return RSTRING(str)->ptr; } } -- cgit v1.2.3 From 4c01f002fdd234aa0a03f1eeb3c216b9638ea170 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 5 Jun 2012 23:20:36 +0900 Subject: mruby/array.h: rename buf to ptr --- include/mruby/array.h | 6 +-- src/array.c | 126 +++++++++++++++++++++++++------------------------- src/class.c | 4 +- src/gc.c | 4 +- src/vm.c | 18 ++++---- 5 files changed, 79 insertions(+), 79 deletions(-) diff --git a/include/mruby/array.h b/include/mruby/array.h index c6c35a4e4..f42146f3e 100644 --- a/include/mruby/array.h +++ b/include/mruby/array.h @@ -13,7 +13,7 @@ extern "C" { struct mrb_shared_array { int refcnt; - mrb_value *buf; + mrb_value *ptr; int len; }; @@ -24,7 +24,7 @@ struct RArray { int capa; struct mrb_shared_array *shared; } aux; - mrb_value *buf; + mrb_value *ptr; }; #define mrb_ary_ptr(v) ((struct RArray*)((v).value.p)) @@ -32,7 +32,7 @@ struct RArray { #define RARRAY(v) ((struct RArray*)((v).value.p)) #define RARRAY_LEN(a) (RARRAY(a)->len) -#define RARRAY_PTR(a) (RARRAY(a)->buf) +#define RARRAY_PTR(a) (RARRAY(a)->ptr) #define MRB_ARY_SHARED 256 void mrb_ary_decref(mrb_state*, struct mrb_shared_array*); diff --git a/src/array.c b/src/array.c index 8f2e4824e..2403a783d 100644 --- a/src/array.c +++ b/src/array.c @@ -46,8 +46,8 @@ ary_new_capa(mrb_state *mrb, int capa) } a = (struct RArray*)mrb_obj_alloc(mrb, MRB_TT_ARRAY, mrb->array_class); - a->buf = mrb_malloc(mrb, blen); - memset(a->buf, 0, blen); + a->ptr = mrb_malloc(mrb, blen); + memset(a->ptr, 0, blen); a->aux.capa = capa; a->len = 0; @@ -75,7 +75,7 @@ mrb_ary_new_from_values(mrb_state *mrb, int size, mrb_value *vals) ary = mrb_ary_new_capa(mrb, size); a = mrb_ary_ptr(ary); - memcpy(a->buf, vals, sizeof(mrb_value)*size); + memcpy(a->ptr, vals, sizeof(mrb_value)*size); a->len = size; return ary; @@ -91,12 +91,12 @@ mrb_assoc_new(mrb_state *mrb, mrb_value car, mrb_value cdr) } static void -ary_fill_with_nil(mrb_value *buf, int size) +ary_fill_with_nil(mrb_value *ptr, int size) { mrb_value nil = mrb_nil_value(); while((int)(size--)) { - *buf++ = nil; + *ptr++ = nil; } } @@ -106,8 +106,8 @@ ary_modify(mrb_state *mrb, struct RArray *a) if (a->flags & MRB_ARY_SHARED) { struct mrb_shared_array *shared = a->aux.shared; - if (shared->refcnt == 1 && a->buf == shared->buf) { - a->buf = shared->buf; + if (shared->refcnt == 1 && a->ptr == shared->ptr) { + a->ptr = shared->ptr; a->aux.capa = a->len; mrb_free(mrb, shared); } @@ -115,13 +115,13 @@ ary_modify(mrb_state *mrb, struct RArray *a) mrb_value *ptr, *p; int len; - p = a->buf; + p = a->ptr; len = a->len * sizeof(mrb_value); ptr = mrb_malloc(mrb, len); if (p) { memcpy(ptr, p, len); } - a->buf = ptr; + a->ptr = ptr; a->aux.capa = len; mrb_ary_decref(mrb, shared); } @@ -137,10 +137,10 @@ ary_make_shared(mrb_state *mrb, struct RArray *a) shared->refcnt = 1; if (a->aux.capa > a->len) { - a->buf = shared->buf = mrb_realloc(mrb, a->buf, sizeof(mrb_value)*a->len+1); + a->ptr = shared->ptr = mrb_realloc(mrb, a->ptr, sizeof(mrb_value)*a->len+1); } else { - shared->buf = a->buf; + shared->ptr = a->ptr; } shared->len = a->len; a->aux.shared = shared; @@ -174,7 +174,7 @@ ary_expand_capa(mrb_state *mrb, struct RArray *a, int len) if (capa > a->aux.capa) { a->aux.capa = capa; - a->buf = mrb_realloc(mrb, a->buf, sizeof(mrb_value)*capa); + a->ptr = mrb_realloc(mrb, a->ptr, sizeof(mrb_value)*capa); } } @@ -196,7 +196,7 @@ ary_shrink_capa(mrb_state *mrb, struct RArray *a) if (capa > a->len && capa < a->aux.capa) { a->aux.capa = capa; - a->buf = mrb_realloc(mrb, a->buf, sizeof(mrb_value)*capa); + a->ptr = mrb_realloc(mrb, a->ptr, sizeof(mrb_value)*capa); } } @@ -211,13 +211,13 @@ mrb_ary_s_create(mrb_state *mrb, mrb_value self) } static void -ary_concat(mrb_state *mrb, struct RArray *a, mrb_value *buf, int blen) +ary_concat(mrb_state *mrb, struct RArray *a, mrb_value *ptr, int blen) { int len = a->len + blen; ary_modify(mrb, a); if (a->aux.capa < len) ary_expand_capa(mrb, a, len); - memcpy(a->buf+a->len, buf, sizeof(mrb_value)*blen); + memcpy(a->ptr+a->len, ptr, sizeof(mrb_value)*blen); mrb_write_barrier(mrb, (struct RBasic*)a); a->len = len; } @@ -227,17 +227,17 @@ mrb_ary_concat(mrb_state *mrb, mrb_value self, mrb_value other) { struct RArray *a2 = mrb_ary_ptr(other); - ary_concat(mrb, mrb_ary_ptr(self), a2->buf, a2->len); + ary_concat(mrb, mrb_ary_ptr(self), a2->ptr, a2->len); } mrb_value mrb_ary_concat_m(mrb_state *mrb, mrb_value self) { - mrb_value *buf; + mrb_value *ptr; int blen; - mrb_get_args(mrb, "a", &buf, &blen); - ary_concat(mrb, mrb_ary_ptr(self), buf, blen); + mrb_get_args(mrb, "a", &ptr, &blen); + ary_concat(mrb, mrb_ary_ptr(self), ptr, blen); return self; } @@ -247,14 +247,14 @@ mrb_ary_plus(mrb_state *mrb, mrb_value self) struct RArray *a1 = mrb_ary_ptr(self); struct RArray *a2; mrb_value ary; - mrb_value *buf; + mrb_value *ptr; int blen; - mrb_get_args(mrb, "a", &buf, &blen); + mrb_get_args(mrb, "a", &ptr, &blen); ary = mrb_ary_new_capa(mrb, a1->len + blen); a2 = mrb_ary_ptr(ary); - memcpy(a2->buf, a1->buf, sizeof(mrb_value)*a1->len); - memcpy(a2->buf + a1->len, buf, sizeof(mrb_value)*blen); + memcpy(a2->ptr, a1->ptr, sizeof(mrb_value)*a1->len); + memcpy(a2->ptr + a1->len, ptr, sizeof(mrb_value)*blen); a2->len = a1->len + blen; return ary; @@ -289,7 +289,7 @@ mrb_ary_cmp(mrb_state *mrb, mrb_value ary1) mrb_get_args(mrb, "o", &ary2); if (mrb_type(ary2) != MRB_TT_ARRAY) return mrb_nil_value(); a1 = RARRAY(ary1); a2 = RARRAY(ary2); - if (a1->len == a2->len && a1->buf == a2->buf) return mrb_fixnum_value(0); + if (a1->len == a2->len && a1->ptr == a2->ptr) return mrb_fixnum_value(0); else { len = RARRAY_LEN(ary1); if (len > RARRAY_LEN(ary2)) { @@ -310,7 +310,7 @@ ary_replace(mrb_state *mrb, struct RArray *a, mrb_value *argv, int len) ary_modify(mrb, a); if (a->aux.capa < len) ary_expand_capa(mrb, a, len); - memcpy(a->buf, argv, sizeof(mrb_value)*len); + memcpy(a->ptr, argv, sizeof(mrb_value)*len); mrb_write_barrier(mrb, (struct RBasic*)a); a->len = len; } @@ -320,7 +320,7 @@ mrb_ary_replace(mrb_state *mrb, mrb_value self, mrb_value other) { struct RArray *a2 = mrb_ary_ptr(other); - ary_replace(mrb, mrb_ary_ptr(self), a2->buf, a2->len); + ary_replace(mrb, mrb_ary_ptr(self), a2->ptr, a2->len); } mrb_value @@ -340,7 +340,7 @@ mrb_ary_times(mrb_state *mrb, mrb_value self) struct RArray *a1 = mrb_ary_ptr(self); struct RArray *a2; mrb_value ary; - mrb_value *buf; + mrb_value *ptr; mrb_int times; mrb_get_args(mrb, "i", ×); @@ -351,10 +351,10 @@ mrb_ary_times(mrb_state *mrb, mrb_value self) ary = mrb_ary_new_capa(mrb, a1->len * times); a2 = mrb_ary_ptr(ary); - buf = a2->buf; + ptr = a2->ptr; while(times--) { - memcpy(buf, a1->buf, sizeof(mrb_value)*(a1->len)); - buf += a1->len; + memcpy(ptr, a1->ptr, sizeof(mrb_value)*(a1->len)); + ptr += a1->len; a2->len += a1->len; } @@ -369,8 +369,8 @@ mrb_ary_reverse_bang(mrb_state *mrb, mrb_value self) if (a->len > 1) { mrb_value *p1, *p2; - p1 = a->buf; - p2 = a->buf + a->len - 1; + p1 = a->ptr; + p2 = a->ptr + a->len - 1; while(p1 < p2) { mrb_value tmp = *p1; @@ -392,9 +392,9 @@ mrb_ary_reverse(mrb_state *mrb, mrb_value self) if (a->len > 0) { mrb_value *p1, *p2, *e; - p1 = a->buf; + p1 = a->ptr; e = p1 + a->len; - p2 = b->buf + a->len - 1; + p2 = b->ptr + a->len - 1; while(p1 < e) { *p2-- = *p1++; } @@ -431,7 +431,7 @@ mrb_ary_push(mrb_state *mrb, mrb_value ary, mrb_value elem) /* mrb_ary_push */ ary_modify(mrb, a); if (a->len == a->aux.capa) ary_expand_capa(mrb, a, a->len + 1); - a->buf[a->len++] = elem; + a->ptr[a->len++] = elem; mrb_write_barrier(mrb, (struct RBasic*)a); } @@ -455,7 +455,7 @@ mrb_ary_pop(mrb_state *mrb, mrb_value ary) struct RArray *a = mrb_ary_ptr(ary); if (a->len == 0) return mrb_nil_value(); - return a->buf[--a->len]; + return a->ptr[--a->len]; } #define ARY_SHIFT_SHARED_MIN 10 @@ -469,8 +469,8 @@ mrb_ary_shift(mrb_state *mrb, mrb_value self) if (a->len == 0) return mrb_nil_value(); if (a->flags & MRB_ARY_SHARED) { L_SHIFT: - val = a->buf[0]; - a->buf++; + val = a->ptr[0]; + a->ptr++; a->len--; return val; } @@ -479,13 +479,13 @@ mrb_ary_shift(mrb_state *mrb, mrb_value self) goto L_SHIFT; } else { - mrb_value *buf = a->buf; + mrb_value *ptr = a->ptr; int size = a->len; - val = *buf; + val = *ptr; while((int)(--size)) { - *buf = *(buf+1); - ++buf; + *ptr = *(ptr+1); + ++ptr; } --a->len; } @@ -504,8 +504,8 @@ mrb_ary_unshift(mrb_state *mrb, mrb_value self, mrb_value item) ary_modify(mrb, a); if (a->aux.capa < a->len + 1) ary_expand_capa(mrb, a, a->len + 1); - memmove(a->buf + 1, a->buf, sizeof(mrb_value)*a->len); - memcpy(a->buf, &item, sizeof(mrb_value)); + memmove(a->ptr + 1, a->ptr, sizeof(mrb_value)*a->len); + memcpy(a->ptr, &item, sizeof(mrb_value)); a->len += 1; mrb_write_barrier(mrb, (struct RBasic*)a); @@ -524,8 +524,8 @@ mrb_ary_unshift_m(mrb_state *mrb, mrb_value self) if (len == 0) return self; if (a->aux.capa < a->len + len) ary_expand_capa(mrb, a, a->len + len); - memmove(a->buf + len, a->buf, sizeof(mrb_value)*a->len); - memcpy(a->buf, vals, sizeof(mrb_value)*len); + memmove(a->ptr + len, a->ptr, sizeof(mrb_value)*a->len); + memcpy(a->ptr, vals, sizeof(mrb_value)*len); a->len += len; mrb_write_barrier(mrb, (struct RBasic*)a); @@ -541,7 +541,7 @@ mrb_ary_ref(mrb_state *mrb, mrb_value ary, mrb_int n) if (n < 0) n += a->len; if (n < 0 || a->len <= (int)n) return mrb_nil_value(); - return a->buf[n]; + return a->ptr[n]; } void @@ -558,11 +558,11 @@ mrb_ary_set(mrb_state *mrb, mrb_value ary, mrb_int n, mrb_value val) /* rb_ary_s if (a->len <= (int)n) { if (a->aux.capa <= (int)n) ary_expand_capa(mrb, a, n + 1); - ary_fill_with_nil(a->buf + a->len, n + 1 - a->len); + ary_fill_with_nil(a->ptr + a->len, n + 1 - a->len); a->len = n + 1; } - a->buf[n] = val; + a->ptr[n] = val; mrb_write_barrier(mrb, (struct RBasic*)a); } @@ -600,14 +600,14 @@ mrb_ary_splice(mrb_state *mrb, mrb_value ary, mrb_int head, mrb_int len, mrb_val ary_expand_capa(mrb, a, size); if (head > a->len) { - ary_fill_with_nil(a->buf + a->len, (int)(head - a->len)); + ary_fill_with_nil(a->ptr + a->len, (int)(head - a->len)); } else if (head < a->len) { - memmove(a->buf + head + argc, a->buf + tail, sizeof(mrb_value)*(a->len - tail)); + memmove(a->ptr + head + argc, a->ptr + tail, sizeof(mrb_value)*(a->len - tail)); } for(i = 0; i < argc; i++) { - *(a->buf + head + i) = *(argv + i); + *(a->ptr + head + i) = *(argv + i); } a->len = size; @@ -626,7 +626,7 @@ mrb_ary_decref(mrb_state *mrb, struct mrb_shared_array *shared) { shared->refcnt--; if (shared->refcnt == 0) { - mrb_free(mrb, shared->buf); + mrb_free(mrb, shared->ptr); mrb_free(mrb, shared); } } @@ -638,7 +638,7 @@ ary_subseq(mrb_state *mrb, struct RArray *a, int beg, int len) ary_make_shared(mrb, a); b = (struct RArray*)mrb_obj_alloc(mrb, MRB_TT_ARRAY, mrb->array_class); - b->buf = a->buf + beg; + b->ptr = a->ptr + beg; b->len = len; b->aux.shared = a->aux.shared; b->aux.shared->refcnt++; @@ -714,20 +714,20 @@ mrb_ary_delete_at(mrb_state *mrb, mrb_value self) struct RArray *a = mrb_ary_ptr(self); mrb_int index; mrb_value val; - mrb_value *buf; + mrb_value *ptr; int len; mrb_get_args(mrb, "i", &index); if (index < 0) index += a->len; if (index < 0 || a->len <= (int)index) return mrb_nil_value(); - val = a->buf[index]; + val = a->ptr[index]; - buf = a->buf + index; + ptr = a->ptr + index; len = a->len - index; while((int)(--len)) { - *buf = *(buf+1); - ++buf; + *ptr = *(ptr+1); + ++ptr; } --a->len; @@ -743,14 +743,14 @@ mrb_ary_first(mrb_state *mrb, mrb_value self) int size; if (mrb_get_args(mrb, "|i", &size) == 0) { - return (a->len > 0)? a->buf[0]: mrb_nil_value(); + return (a->len > 0)? a->ptr[0]: mrb_nil_value(); } if (size > a->len) size = a->len; if (a->flags & MRB_ARY_SHARED) { return ary_subseq(mrb, a, 0, size); } - return mrb_ary_new_from_values(mrb, size, a->buf); + return mrb_ary_new_from_values(mrb, size, a->ptr); } mrb_value @@ -766,7 +766,7 @@ mrb_ary_last(mrb_state *mrb, mrb_value self) mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments"); } - if (len == 0) return (a->len > 0)? a->buf[a->len - 1]: mrb_nil_value(); + if (len == 0) return (a->len > 0)? a->ptr[a->len - 1]: mrb_nil_value(); /* len == 1 */ size = mrb_fixnum(*vals); @@ -774,7 +774,7 @@ mrb_ary_last(mrb_state *mrb, mrb_value self) if ((a->flags & MRB_ARY_SHARED) || size > ARY_DEFAULT_LEN) { return ary_subseq(mrb, a, a->len - size, size); } - return mrb_ary_new_from_values(mrb, size, a->buf + a->len - size); + return mrb_ary_new_from_values(mrb, size, a->ptr + a->len - size); } mrb_value diff --git a/src/class.c b/src/class.c index 554f98550..b49ce00f8 100644 --- a/src/class.c +++ b/src/class.c @@ -389,7 +389,7 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) struct RArray *a = mrb_ary_ptr(mrb->stack[1]); argc = a->len; - sp = a->buf; + sp = a->ptr; } while ((c = *format++)) { switch (c) { @@ -481,7 +481,7 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) aa = to_ary(mrb, *sp); a = mrb_ary_ptr(aa); pb = va_arg(ap, mrb_value**); - *pb = a->buf; + *pb = a->ptr; pl = va_arg(ap, int*); *pl = a->len; i++; sp++; diff --git a/src/gc.c b/src/gc.c index 247c1ad85..6d22bf275 100644 --- a/src/gc.c +++ b/src/gc.c @@ -367,7 +367,7 @@ gc_mark_children(mrb_state *mrb, struct RBasic *obj) size_t i, e; for (i=0,e=a->len; ibuf[i]); + mrb_gc_mark_value(mrb, a->ptr[i]); } } break; @@ -460,7 +460,7 @@ obj_free(mrb_state *mrb, struct RBasic *obj) if (obj->flags & MRB_ARY_SHARED) mrb_ary_decref(mrb, ((struct RArray*)obj)->aux.shared); else - mrb_free(mrb, ((struct RArray*)obj)->buf); + mrb_free(mrb, ((struct RArray*)obj)->ptr); break; case MRB_TT_HASH: diff --git a/src/vm.c b/src/vm.c index 4f6deb877..f74315fb2 100644 --- a/src/vm.c +++ b/src/vm.c @@ -899,17 +899,17 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) if (stack[m1].tt == MRB_TT_ARRAY) { struct RArray *ary = mrb_ary_ptr(stack[m1]); - pp = ary->buf; + pp = ary->ptr; len = ary->len; } regs[a] = mrb_ary_new_capa(mrb, m1+len+m2); rest = mrb_ary_ptr(regs[a]); - memcpy(rest->buf, stack, sizeof(mrb_value)*m1); + memcpy(rest->ptr, stack, sizeof(mrb_value)*m1); if (len > 0) { - memcpy(rest->buf+m1, pp, sizeof(mrb_value)*len); + memcpy(rest->ptr+m1, pp, sizeof(mrb_value)*len); } if (m2 > 0) { - memcpy(rest->buf+m1+len, stack+m1+1, sizeof(mrb_value)*m2); + memcpy(rest->ptr+m1+len, stack+m1+1, sizeof(mrb_value)*m2); } rest->len = m1+len+m2; } @@ -936,7 +936,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) if (argc < 0) { struct RArray *ary = mrb_ary_ptr(regs[1]); - argv = ary->buf; + argv = ary->ptr; argc = ary->len; regs[len+2] = regs[1]; /* save argary in register */ } @@ -950,7 +950,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) } else if (len > 1 && argc == 1 && argv[0].tt == MRB_TT_ARRAY) { argc = mrb_ary_ptr(argv[0])->len; - argv = mrb_ary_ptr(argv[0])->buf; + argv = mrb_ary_ptr(argv[0])->ptr; } mrb->ci->argc = len; if (argc < len) { @@ -1398,15 +1398,15 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) int i; if (len > pre + post) { - regs[a++] = mrb_ary_new_elts(mrb, len - pre - post, ary->buf+pre); + regs[a++] = mrb_ary_new_elts(mrb, len - pre - post, ary->ptr+pre); while (post--) { - regs[a++] = ary->buf[len-post-1]; + regs[a++] = ary->ptr[len-post-1]; } } else { regs[a++] = mrb_ary_new_capa(mrb, 0); for (i=0; i+prebuf[pre+i]; + regs[a+i] = ary->ptr[pre+i]; } while (i < post) { SET_NIL_VALUE(regs[a+i]); -- cgit v1.2.3 From 1a369de4897eb4764c30146d56761444beb5b46c Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 7 Jun 2012 01:18:17 +0900 Subject: remove src/gc.h --- include/mruby/class.h | 4 ++++ include/mruby/hash.h | 5 +++++ include/mruby/variable.h | 7 +++++++ src/gc.c | 25 +++++++++++++++++++++- src/gc.h | 54 ------------------------------------------------ 5 files changed, 40 insertions(+), 55 deletions(-) delete mode 100644 src/gc.h diff --git a/include/mruby/class.h b/include/mruby/class.h index 0afd331b0..28365ee58 100644 --- a/include/mruby/class.h +++ b/include/mruby/class.h @@ -78,6 +78,10 @@ struct RClass* mrb_class_real(struct RClass* cl); void mrb_obj_call_init(mrb_state *mrb, mrb_value obj, int argc, mrb_value *argv); +void mrb_gc_mark_mt(mrb_state*, struct RClass*); +size_t mrb_gc_mark_mt_size(mrb_state*, struct RClass*); +void mrb_gc_free_mt(mrb_state*, struct RClass*); + #if defined(__cplusplus) } /* extern "C" { */ #endif diff --git a/include/mruby/hash.h b/include/mruby/hash.h index 369decdb4..e7162c3ab 100644 --- a/include/mruby/hash.h +++ b/include/mruby/hash.h @@ -42,6 +42,11 @@ struct kh_ht * mrb_hash_tbl(mrb_state *mrb, mrb_value hash); mrb_value mrb_obj_is_proc(mrb_value proc); +/* GC functions */ +void mrb_gc_mark_ht(mrb_state*, struct RHash*); +size_t mrb_gc_mark_ht_size(mrb_state*, struct RHash*); +void mrb_gc_free_ht(mrb_state*, struct RHash*); + #if defined(__cplusplus) } /* extern "C" { */ #endif diff --git a/include/mruby/variable.h b/include/mruby/variable.h index 400dd50b0..fb686fd47 100644 --- a/include/mruby/variable.h +++ b/include/mruby/variable.h @@ -48,6 +48,13 @@ mrb_value mrb_f_global_variables(mrb_state *mrb, mrb_value self); mrb_value mrb_gv_get(mrb_state *mrb, mrb_sym sym); void mrb_gv_set(mrb_state *mrb, mrb_sym sym, mrb_value val); +/* GC functions */ +void mrb_gc_mark_gv(mrb_state*); +void mrb_gc_free_gv(mrb_state*); +void mrb_gc_mark_iv(mrb_state*, struct RObject*); +size_t mrb_gc_mark_iv_size(mrb_state*, struct RObject*); +void mrb_gc_free_iv(mrb_state*, struct RObject*); + #if defined(__cplusplus) } /* extern "C" { */ #endif diff --git a/src/gc.c b/src/gc.c index 6d22bf275..1b4b3eed4 100644 --- a/src/gc.c +++ b/src/gc.c @@ -18,6 +18,7 @@ #include "mruby/proc.h" #include "mruby/data.h" #include "mruby/numeric.h" +#include "mruby/variable.h" /* = Tri-color Incremental Garbage Collection @@ -74,7 +75,29 @@ #include "re.h" #endif -#include "gc.h" +struct free_obj { + MRUBY_OBJECT_HEADER; + struct RBasic *next; +}; + +typedef struct { + union { + struct free_obj free; + struct RBasic basic; + struct RObject object; + struct RClass klass; + struct RString string; + struct RArray array; + struct RHash hash; + struct RRange range; + struct RStruct structdata; + struct RProc procdata; +#ifdef INCLUDE_REGEXP + struct RMatch match; + struct RRegexp regexp; +#endif + } as; +} RVALUE; #ifdef GC_PROFILE #include diff --git a/src/gc.h b/src/gc.h deleted file mode 100644 index fea761d1b..000000000 --- a/src/gc.h +++ /dev/null @@ -1,54 +0,0 @@ -/* -** gc.h - garbage collector for RiteVM -** -** See Copyright Notice in mruby.h -*/ - -#ifndef MRUBY_GC_H -#define MRUBY_GC_H - -#if defined(__cplusplus) -extern "C" { -#endif - -struct free_obj { - MRUBY_OBJECT_HEADER; - struct RBasic *next; -}; - -typedef struct { - union { - struct free_obj free; - struct RBasic basic; - struct RObject object; - struct RClass klass; - struct RString string; - struct RArray array; - struct RHash hash; - struct RRange range; - struct RStruct structdata; - struct RProc procdata; -#ifdef INCLUDE_REGEXP - struct RMatch match; - struct RRegexp regexp; -#endif - } as; -} RVALUE; - -void mrb_gc_mark_gv(mrb_state*); -void mrb_gc_free_gv(mrb_state*); -void mrb_gc_mark_iv(mrb_state*, struct RObject*); -size_t mrb_gc_mark_iv_size(mrb_state*, struct RObject*); -void mrb_gc_free_iv(mrb_state*, struct RObject*); -void mrb_gc_mark_mt(mrb_state*, struct RClass*); -size_t mrb_gc_mark_mt_size(mrb_state*, struct RClass*); -void mrb_gc_free_mt(mrb_state*, struct RClass*); -void mrb_gc_mark_ht(mrb_state*, struct RHash*); -size_t mrb_gc_mark_ht_size(mrb_state*, struct RHash*); -void mrb_gc_free_ht(mrb_state*, struct RHash*); - -#if defined(__cplusplus) -} /* extern "C" { */ -#endif - -#endif /* MRUBY_GC_H */ -- cgit v1.2.3 From e0909fef4471976c72e04ad2cc8c8d55eed047a7 Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Thu, 7 Jun 2012 09:34:27 +0900 Subject: Use value.i for nil/false check. --- include/mruby/class.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/mruby/class.h b/include/mruby/class.h index 0afd331b0..58b648579 100644 --- a/include/mruby/class.h +++ b/include/mruby/class.h @@ -28,7 +28,7 @@ mrb_class(mrb_state *mrb, mrb_value v) { switch (mrb_type(v)) { case MRB_TT_FALSE: - if (v.value.p) + if (v.value.i) return mrb->false_class; return mrb->nil_class; case MRB_TT_TRUE: -- cgit v1.2.3 From 9ecc209ca02f84db5a8d87ad19568d4025cea68f Mon Sep 17 00:00:00 2001 From: SatoshiOdawara Date: Thu, 7 Jun 2012 16:03:53 +0900 Subject: memory leak in kh_resize_##name() --- include/mruby/khash.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/include/mruby/khash.h b/include/mruby/khash.h index 06c451e44..f8958781a 100644 --- a/include/mruby/khash.h +++ b/include/mruby/khash.h @@ -129,6 +129,9 @@ static const uint8_t __m[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; 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); \ } \ } \ static inline khint_t kh_put_##name(kh_##name##_t *h, khkey_t key) \ -- cgit v1.2.3 From 5046375d518b77721559df0571e6caee1fa0ae26 Mon Sep 17 00:00:00 2001 From: Yuichiro MASUI Date: Fri, 8 Jun 2012 00:59:26 +0900 Subject: add auxiliary data pointer to mrb_state --- include/mruby.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/mruby.h b/include/mruby.h index 579375d9f..167808b14 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -280,6 +280,8 @@ typedef struct mrb_state { struct RClass *eException_class; struct RClass *eStandardError_class; struct RClass *eRuntimeError_class; + + void *ud; /* auxiliary data */ } mrb_state; typedef mrb_value (*mrb_func_t)(mrb_state *mrb, mrb_value); -- cgit v1.2.3 From f75c277058341a5432cb3de5beda16cb78faafc6 Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Fri, 8 Jun 2012 22:54:42 +0800 Subject: Add first sample for MIPS cross compile --- cmake/Toolchain-Linux-openwrt-mips.cmake.sample | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 cmake/Toolchain-Linux-openwrt-mips.cmake.sample diff --git a/cmake/Toolchain-Linux-openwrt-mips.cmake.sample b/cmake/Toolchain-Linux-openwrt-mips.cmake.sample new file mode 100644 index 000000000..73ec9874b --- /dev/null +++ b/cmake/Toolchain-Linux-openwrt-mips.cmake.sample @@ -0,0 +1,10 @@ +# Toolchain file for building with OpenWRT Toolchain for MIPS. +# This is a preliminary version for mips outside of the buildroot-ng. +# The next version should be target independent. +# Further improvements: +# - use ENV variables in OpenWRT toolchain (like HOSTCC, TARGET_CC) +# - set flags properly for host and target + +set(CMAKE_SYSTEM_NAME Linux) +set(TOOLCHAIN_PREFIX mips-openwrt-linux) +set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}-gcc) -- cgit v1.2.3 From 85901e05469d644e2bb63700fbd1bbc80934dc0d Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 10 Jun 2012 21:44:57 +0900 Subject: fixed typo DISPACTH to DISPATCH --- src/vm.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/vm.c b/src/vm.c index f74315fb2..508d8fe77 100644 --- a/src/vm.c +++ b/src/vm.c @@ -356,20 +356,20 @@ argnum_error(mrb_state *mrb, int num) #ifndef DIRECT_THREADED -#define INIT_DISPACTH for (;;) { i = *pc; switch (GET_OPCODE(i)) { +#define INIT_DISPATCH for (;;) { i = *pc; switch (GET_OPCODE(i)) { #define CASE(op) case op: #define NEXT mrb->arena_idx = ai; pc++; break #define JUMP break -#define END_DISPACTH }} +#define END_DISPATCH }} #else -#define INIT_DISPACTH JUMP; return mrb_nil_value(); +#define INIT_DISPATCH JUMP; return mrb_nil_value(); #define CASE(op) L_ ## op: #define NEXT mrb->arena_idx = ai; i=*++pc; goto *optable[GET_OPCODE(i)] #define JUMP i=*pc; goto *optable[GET_OPCODE(i)] -#define END_DISPACTH +#define END_DISPATCH #endif @@ -432,7 +432,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) mrb->ci->nregs = irep->nregs + 2; regs = mrb->stack; - INIT_DISPACTH { + INIT_DISPATCH { CASE(OP_NOP) { /* do nothing */ NEXT; @@ -1594,5 +1594,5 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) goto L_RAISE; } } - END_DISPACTH; + END_DISPATCH; } -- cgit v1.2.3 From 8607002f86110c696f301ee3eaaccf58b030dfdf Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Mon, 11 Jun 2012 00:27:38 +0800 Subject: cmake Toolchain file for any OpenWRT Target (x86, mips, AVR32, ARM, etc.) --- cmake/Toolchain-Linux-openwrt-mips.cmake.sample | 10 ---------- cmake/Toolchain-OpenWRT-ANY.cmake | 13 +++++++++++++ 2 files changed, 13 insertions(+), 10 deletions(-) delete mode 100644 cmake/Toolchain-Linux-openwrt-mips.cmake.sample create mode 100644 cmake/Toolchain-OpenWRT-ANY.cmake diff --git a/cmake/Toolchain-Linux-openwrt-mips.cmake.sample b/cmake/Toolchain-Linux-openwrt-mips.cmake.sample deleted file mode 100644 index 73ec9874b..000000000 --- a/cmake/Toolchain-Linux-openwrt-mips.cmake.sample +++ /dev/null @@ -1,10 +0,0 @@ -# Toolchain file for building with OpenWRT Toolchain for MIPS. -# This is a preliminary version for mips outside of the buildroot-ng. -# The next version should be target independent. -# Further improvements: -# - use ENV variables in OpenWRT toolchain (like HOSTCC, TARGET_CC) -# - set flags properly for host and target - -set(CMAKE_SYSTEM_NAME Linux) -set(TOOLCHAIN_PREFIX mips-openwrt-linux) -set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}-gcc) diff --git a/cmake/Toolchain-OpenWRT-ANY.cmake b/cmake/Toolchain-OpenWRT-ANY.cmake new file mode 100644 index 000000000..888c51ebe --- /dev/null +++ b/cmake/Toolchain-OpenWRT-ANY.cmake @@ -0,0 +1,13 @@ +# Toolchain file for building with OpenWRT Toolchain for ANY OpenWRT Target. +# Following prequisition are necessary: +# - latest cmake version +# - mruby OpenWRT Package file (not yet in distribution) + +# Switch to Cross Compile by setting the system name +SET(CMAKE_SYSTEM_NAME Linux) + +# We show CMAKE the compiler, the rest will be guessed by the Toolchain +SET(CMAKE_C_COMPILER "$ENV{OPENWRT_TOOLCHAIN}/bin/$ENV{OPENWRT_TARGETCC}") + +# We define an own release flag so that we can adapt the optimal C_FLAGS +SET(CMAKE_C_FLAGS_OPENWRT "$ENV{OPENWRT_TARGETFLAGS}") -- cgit v1.2.3 From 46c9260305a7acc7ee2e1bd1d2441b56cee89f3f Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Mon, 11 Jun 2012 01:39:45 +0900 Subject: Add test for slice of shared string. --- test/t/string.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/t/string.rb b/test/t/string.rb index 964ec0e63..d7182fc38 100644 --- a/test/t/string.rb +++ b/test/t/string.rb @@ -256,6 +256,9 @@ assert('String#slice', '15.2.10.5.34') do d1 = 'abc'.slice(0, 0) e1 = 'abc'.slice(1, 2) + # slice of shared string + e11 = e1.slice(0) + # args is RegExp # TODO SEGFAULT ATM @@ -265,7 +268,7 @@ assert('String#slice', '15.2.10.5.34') do a == 'a' and b == 'c' and c == nil and d == nil and a1 == nil and b1 == nil and c1 == nil and d1 == '' and - e1 == 'bc' and + e1 == 'bc' and e11 == 'b' and a3 == 'bc' and b3 == nil end -- cgit v1.2.3 From 3bb09f99284d6da3ee5192fb4636ad73981ad1f1 Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Mon, 11 Jun 2012 01:56:46 +0900 Subject: string.subseq should create new string based on 'ptr' not on 'aux.shared'. --- src/string.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/string.c b/src/string.c index e955b3f22..67cc32137 100644 --- a/src/string.c +++ b/src/string.c @@ -1199,14 +1199,14 @@ mrb_str_eql(mrb_state *mrb, mrb_value self) static mrb_value mrb_str_subseq(mrb_state *mrb, mrb_value str, int beg, int len) { - struct RString *s; + struct RString *orig, *s; struct mrb_shared_string *shared; - s = mrb_str_ptr(str); - str_make_shared(mrb, s); - shared = s->aux.shared; + orig = mrb_str_ptr(str); + str_make_shared(mrb, orig); + shared = orig->aux.shared; s = mrb_obj_alloc_string(mrb); - s->ptr = shared->ptr + beg; + s->ptr = orig->ptr + beg; s->len = len; s->aux.shared = shared; s->flags |= MRB_STR_SHARED; -- cgit v1.2.3 From 9067cf6a75d7180ebba6c3ecf04d96b2f3831bb1 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 11 Jun 2012 14:24:26 +0900 Subject: should not quote || and && operators; close #253 --- src/symbol.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/symbol.c b/src/symbol.c index 2658b35dc..e1b9925eb 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -296,8 +296,14 @@ symname_p(const char *name) case '+': case '-': if (*++m == '@') ++m; break; + case '|': + if (*++m == '|') ++m; + break; + case '&': + if (*++m == '&') ++m; + break; - case '|': case '^': case '&': case '/': case '%': case '~': case '`': + case '^': case '/': case '%': case '~': case '`': ++m; break; -- cgit v1.2.3 From dd550ca0d494e35efc60142606976a5a41acd5be Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 11 Jun 2012 14:33:01 +0900 Subject: should increment p on every iteration; close #254 --- src/string.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/string.c b/src/string.c index 67cc32137..1de0d9592 100644 --- a/src/string.c +++ b/src/string.c @@ -2945,11 +2945,11 @@ mrb_str_inspect(mrb_state *mrb, mrb_value str) p = RSTRING_PTR(str); pend = RSTRING_END(str); prev = p; - while (p < pend) { + for (;p < pend; p++) { unsigned int c, cc; int n; - c = *p++; + c = *p; n = 1; if (c == '"'|| c == '\\' || (c == '#' && IS_EVSTR(p, pend))) { buf[0] = '\\'; buf[1] = c; @@ -2988,9 +2988,6 @@ mrb_str_inspect(mrb_state *mrb, mrb_value str) continue; } } -#ifdef INCLUDE_ENCODING - if (p > prev) mrb_str_buf_cat(mrb, result, prev, p - prev); -#endif mrb_str_buf_cat(mrb, result, "\"", strlen("\"")); return result; -- cgit v1.2.3 From 8f020f28c6b5b9c64cbd66db8369f89809b20d0a Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 11 Jun 2012 14:50:51 +0900 Subject: parser_dump: no print "local variables" if no local variables --- src/parse.y | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/parse.y b/src/parse.y index 495954538..3f542a3b3 100644 --- a/src/parse.y +++ b/src/parse.y @@ -5050,15 +5050,19 @@ parser_dump(mrb_state *mrb, node *tree, int offset) case NODE_SCOPE: printf("NODE_SCOPE:\n"); - dump_prefix(offset+1); - printf("local variables:\n"); { node *n2 = tree->car; - while (n2) { - dump_prefix(offset+2); - printf("%s\n", mrb_sym2name(mrb, (mrb_sym)n2->car)); - n2 = n2->cdr; + if (n2) { + dump_prefix(offset+1); + printf("local variables:\n"); + + while (n2) { + dump_prefix(offset+2); + printf("%s ", mrb_sym2name(mrb, (mrb_sym)n2->car)); + n2 = n2->cdr; + } + printf("\n"); } } tree = tree->cdr; -- cgit v1.2.3 From 13a542d48d5d86b866dbc4d6a4f0ec17bee49c12 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 11 Jun 2012 15:55:04 +0900 Subject: zsuper should respect block given; close #185 --- src/codegen.c | 9 +++++++-- src/parse.y | 16 +++++++++++++--- src/vm.c | 7 ++++--- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/codegen.c b/src/codegen.c index 117588b6e..105a27cef 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -1280,7 +1280,7 @@ codegen(codegen_scope *s, node *tree, int val) { int n = 0; - push(); + push(); /* room for receiver */ if (tree) { node *args = tree->car; while (args) { @@ -1307,14 +1307,19 @@ codegen(codegen_scope *s, node *tree, int val) codegen_scope *s2 = s; int lv = 0, ainfo = 0; + push(); /* room for receiver */ while (s2->ainfo < 0) { lv++; s2 = s2->prev; if (!s2) break; } if (s2) ainfo = s2->ainfo; - push(); genop(s, MKOP_ABx(OP_ARGARY, cursp(), (ainfo<<4)|(lv & 0xf))); + if (tree && tree->cdr) { + push(); + codegen(s, tree->cdr, VAL); + pop_n(2); + } pop(); genop(s, MKOP_ABC(OP_SUPER, cursp(), 0, CALL_MAXARGS)); if (val) push(); diff --git a/src/parse.y b/src/parse.y index 3f542a3b3..d31711b68 100644 --- a/src/parse.y +++ b/src/parse.y @@ -754,11 +754,21 @@ args_with_block(parser_state *p, node *a, node *b) static void call_with_block(parser_state *p, node *a, node *b) { - node *n = a->cdr->cdr->cdr; + node *n; - if (!n->car) n->car = cons(0, b); + if (a->car == (node*)NODE_SUPER || + a->car == (node*)NODE_ZSUPER) { + if (!a->cdr) a->cdr = cons(0, b); + else { + args_with_block(p, a->cdr, b); + } + } else { - args_with_block(p, n->car, b); + n = a->cdr->cdr->cdr; + if (!n->car) n->car = cons(0, b); + else { + args_with_block(p, n->car, b); + } } } diff --git a/src/vm.c b/src/vm.c index 508d8fe77..5a521c357 100644 --- a/src/vm.c +++ b/src/vm.c @@ -933,12 +933,13 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) int argc = mrb->ci->argc; mrb_value *argv = regs+1; int len = m1 + o + r + m2; + mrb_value *blk = &argv[argc < 0 ? 1 : argc]; if (argc < 0) { struct RArray *ary = mrb_ary_ptr(regs[1]); argv = ary->ptr; argc = ary->len; - regs[len+2] = regs[1]; /* save argary in register */ + mrb_gc_protect(mrb, regs[1]); } if (mrb->ci->proc && MRB_PROC_STRICT_P(mrb->ci->proc)) { if (argc >= 0) { @@ -954,7 +955,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) } mrb->ci->argc = len; if (argc < len) { - regs[len+1] = argv[argc]; /* move block */ + regs[len+1] = *blk; /* move block */ memmove(®s[1], argv, sizeof(mrb_value)*(argc-m2)); /* m1 + o */ memmove(®s[len-m2+1], &argv[argc-m2], sizeof(mrb_value)*m2); /* m2 */ if (r) { /* r */ @@ -968,7 +969,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) regs[m1+o+1] = mrb_ary_new_elts(mrb, argc-m1-o-m2, argv+m1+o); } memmove(®s[m1+o+r+1], &argv[argc-m2], sizeof(mrb_value)*m2); - regs[len+1] = argv[argc]; /* move block */ + regs[len+1] = *blk; /* move block */ pc += o + 1; } JUMP; -- cgit v1.2.3 From 6247eafc7167d5f18a5dae4d7508be06c370c1f9 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 12 Jun 2012 01:24:11 +0900 Subject: should raise error on top-level super/yield --- src/vm.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/vm.c b/src/vm.c index 5a521c357..c449a9b3c 100644 --- a/src/vm.c +++ b/src/vm.c @@ -886,6 +886,13 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) if (lv == 0) stack = regs + 1; else { struct REnv *e = uvenv(mrb, lv-1); + if (!e) { + mrb_value exc; + const char *m = "super called outside of method"; + exc = mrb_exc_new(mrb, E_NOMETHOD_ERROR, m, strlen(m)); + mrb->exc = (struct RObject*)mrb_object(exc); + goto L_RAISE; + } stack = e->stack + 1; } if (r == 0) { @@ -1140,6 +1147,10 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) if (lv == 0) stack = regs + 1; else { struct REnv *e = uvenv(mrb, lv-1); + if (!e) { + localjump_error(mrb, "yield"); + goto L_RAISE; + } stack = e->stack + 1; } regs[a] = stack[m1+r+m2]; -- cgit v1.2.3 From 21304086cdd6297feb8dc754357a7b9d35fff742 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 12 Jun 2012 01:41:20 +0900 Subject: remove khash#kh_debug --- include/mruby/khash.h | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/include/mruby/khash.h b/include/mruby/khash.h index f8958781a..22df48ebb 100644 --- a/include/mruby/khash.h +++ b/include/mruby/khash.h @@ -163,15 +163,7 @@ static const uint8_t __m[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; { \ h->d_flags[x/8] |= __m[x%8]; \ h->size--; \ - } \ - static inline void kh_debug_##name(kh_##name##_t *h) \ - { \ - khint_t i; \ - printf("idx:e_flag:d_flag\n"); \ - for( i=0 ; in_buckets/8 ; i++ ){ \ - printf("%4d:%02X:%02X\n", i, h->e_flags[i], h->d_flags[i]); \ - } \ - } \ + } #define khash_t(name) kh_##name##_t @@ -182,7 +174,6 @@ static const uint8_t __m[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; #define kh_put(name, h, k) kh_put_##name(h, k) #define kh_get(name, h, k) kh_get_##name(h, k) #define kh_del(name, h, k) kh_del_##name(h, k) -#define kh_debug(name, h) kh_debug_##name(h) #define kh_exist(h, x) (!__ac_iseither((h)->e_flags, (h)->d_flags, (x))) #define kh_key(h, x) ((h)->keys[x]) -- cgit v1.2.3 From c76abc70ff77be971a0139c397a6050cd5737c78 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 12 Jun 2012 01:51:50 +0900 Subject: GETARG_x should return int, not int32_t --- src/opcode.h | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/opcode.h b/src/opcode.h index 9e7cf7f34..40ba9d126 100644 --- a/src/opcode.h +++ b/src/opcode.h @@ -14,15 +14,15 @@ /* OP:A:Bx = 7:9:16 */ /* OP:Ax = 7:25 */ -#define GET_OPCODE(i) (((mrb_code)(i)) & 0x7f) -#define GETARG_A(i) ((((mrb_code)(i)) >> 23) & 0x1ff) -#define GETARG_B(i) ((((mrb_code)(i)) >> 14) & 0x1ff) -#define GETARG_C(i) ((((mrb_code)(i)) >> 7) & 0x7f) -#define GETARG_Bx(i) ((((mrb_code)(i)) >> 7) & 0xffff) -#define GETARG_sBx(i) (GETARG_Bx(i)-MAXARG_sBx) -#define GETARG_Ax(i) ((((mrb_code)(i)) >> 7) & 0x1ffffff) -#define GETARG_UNPACK_b(i,n1,n2) ((((mrb_code)(i)) >> (7+n2)) & (((1<> 7) & (((1<> 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) ((int)((((mrb_code)(i)) >> 7) & 0x1ffffff)) +#define GETARG_UNPACK_b(i,n1,n2) ((int)((((mrb_code)(i)) >> (7+n2)) & (((1<> 7) & (((1< Date: Tue, 12 Jun 2012 09:51:10 +0900 Subject: String#split now understands string sep --- src/string.c | 43 ++++++++++++++++++++++++------------------- test/t/string.rb | 4 +++- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/src/string.c b/src/string.c index 1de0d9592..340402e26 100644 --- a/src/string.c +++ b/src/string.c @@ -2122,27 +2122,16 @@ static const char isspacetable[256] = { static mrb_value mrb_str_split_m(mrb_state *mrb, mrb_value str) { - mrb_value *argv; int argc; mrb_value spat = mrb_nil_value(); - mrb_value limit; enum {awk, string, regexp} split_type = string; long beg, end, i = 0; - int lim = 0; + int lim = -1; mrb_value result, tmp; - mrb_get_args(mrb, "*", &argv, &argc); - if (argc > 0) - spat = argv[0]; - if (argc > 1) - limit = argv[1]; - else - limit = mrb_nil_value(); - + argc = mrb_get_args(mrb, "|oi", &spat, &lim); if (argc == 2) { - lim = mrb_fixnum(limit); - if (lim <= 0) limit = mrb_nil_value(); - else if (lim == 1) { + if (lim == 1) { if (RSTRING_LEN(str) == 0) return mrb_ary_new_capa(mrb, 0); return mrb_ary_new_from_values(mrb, 1, &str); @@ -2201,20 +2190,36 @@ mrb_str_split_m(mrb_state *mrb, mrb_value str) else { end = ptr - bptr; skip = 0; - if (!mrb_nil_p(limit) && lim <= i) break; + if (lim >= 0 && lim <= i) break; } } else if (ascii_isspace(c)) { mrb_ary_push(mrb, result, mrb_str_subseq(mrb, str, beg, end-beg)); skip = 1; beg = ptr - bptr; - if (!mrb_nil_p(limit)) ++i; + if (lim >= 0) ++i; } else { end = ptr - bptr; } } } + else if (split_type == string) { + char *ptr = RSTRING_PTR(str); + char *temp = ptr; + char *eptr = RSTRING_END(str); + char *sptr = RSTRING_PTR(spat); + long slen = RSTRING_LEN(spat); + + while (ptr < eptr && + (end = mrb_memsearch(sptr, slen, ptr, eptr - ptr)) >= 0) { + /* Check we are at the start of a char */ + mrb_ary_push(mrb, result, mrb_str_subseq(mrb, str, ptr - temp, end)); + ptr += end + slen; + if (lim >= 0 && lim <= ++i) break; + } + beg = ptr - temp; + } else { #ifdef INCLUDE_REGEXP char *ptr = RSTRING_PTR(str); @@ -2258,20 +2263,20 @@ mrb_str_split_m(mrb_state *mrb, mrb_value str) tmp = mrb_str_subseq(mrb, str, BEG(idx), END(idx)-BEG(idx)); mrb_ary_push(mrb, result, tmp); } - if (!mrb_nil_p(limit) && lim <= ++i) break; + if (lim >= 0 && lim <= ++i) break; } #else mrb_raise(mrb, E_TYPE_ERROR, "Regexp Class not supported"); #endif //INCLUDE_REGEXP } - if (RSTRING_LEN(str) > 0 && (!mrb_nil_p(limit) || RSTRING_LEN(str) > beg || lim < 0)) { + if (RSTRING_LEN(str) > 0 && (lim >= 0 || RSTRING_LEN(str) > beg || lim < 0)) { if (RSTRING_LEN(str) == beg) tmp = mrb_str_new_empty(mrb, str); else tmp = mrb_str_subseq(mrb, str, beg, RSTRING_LEN(str)-beg); mrb_ary_push(mrb, result, tmp); } - if (mrb_nil_p(limit) && lim == 0) { + if (lim < 0) { long len; while ((len = RARRAY_LEN(result)) > 0 && (tmp = RARRAY_PTR(result)[len-1], RSTRING_LEN(tmp) == 0)) diff --git a/test/t/string.rb b/test/t/string.rb index d7182fc38..718b005a9 100644 --- a/test/t/string.rb +++ b/test/t/string.rb @@ -276,8 +276,10 @@ end assert('String#split', '15.2.10.5.35') do # without RegExp behavior is actually unspecified a = 'abc abc abc'.split + b = 'a,b,c,,d'.split(',') - a == ['abc', 'abc', 'abc'] + a == ['abc', 'abc', 'abc'] and + b == ["a", "b", "c", "", "d"] end # TODO ATM broken assert('String#sub', '15.2.10.5.36') do -- cgit v1.2.3 From debf296843ff21324d710163a0e49a074c85d4b3 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 12 Jun 2012 10:22:56 +0900 Subject: remove obsolete comment --- src/string.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/string.c b/src/string.c index 340402e26..172b8422c 100644 --- a/src/string.c +++ b/src/string.c @@ -2213,7 +2213,6 @@ mrb_str_split_m(mrb_state *mrb, mrb_value str) while (ptr < eptr && (end = mrb_memsearch(sptr, slen, ptr, eptr - ptr)) >= 0) { - /* Check we are at the start of a char */ mrb_ary_push(mrb, result, mrb_str_subseq(mrb, str, ptr - temp, end)); ptr += end + slen; if (lim >= 0 && lim <= ++i) break; -- cgit v1.2.3 From 3403f19cb55b8474abc213d52293ff1b69d2a455 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 12 Jun 2012 12:14:59 +0900 Subject: should handle splat in super arguments --- src/codegen.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/codegen.c b/src/codegen.c index 105a27cef..b8500292e 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -1278,16 +1278,18 @@ codegen(codegen_scope *s, node *tree, int val) case NODE_SUPER: { - int n = 0; + int n = 0, noop = 0, sendv = 0; push(); /* room for receiver */ if (tree) { node *args = tree->car; - while (args) { - codegen(s, args->car, VAL); - n++; - args = args->cdr; - } + if (args) { + n = gen_values(s, args); + if (n < 0) { + n = noop = sendv = 1; + push(); + } + } } if (tree && tree->cdr) { codegen(s, tree->cdr, VAL); @@ -1297,6 +1299,7 @@ codegen(codegen_scope *s, node *tree, int val) genop(s, MKOP_A(OP_LOADNIL, cursp())); } pop_n(n+1); + if (sendv) n = CALL_MAXARGS; genop(s, MKOP_ABC(OP_SUPER, cursp(), 0, n)); if (val) push(); } -- cgit v1.2.3 From 46b098e0799f67915e4deb3bf7bdfb6d4d4bcf2d Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 12 Jun 2012 12:16:18 +0900 Subject: minor correction in test/t/syntax.rb --- test/t/syntax.rb | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 test/t/syntax.rb diff --git a/test/t/syntax.rb b/test/t/syntax.rb new file mode 100644 index 000000000..7898a0b7d --- /dev/null +++ b/test/t/syntax.rb @@ -0,0 +1,47 @@ +assert('super', '11.3.4') do + test = false + begin + super + rescue NoMethodError + test = true + end + + class SuperFoo + def foo + true + end + def bar(*a) + a + end + end + class SuperBar < SuperFoo + def foo + super + end + def bar(*a) + super(*a) + end + end + bar = SuperBar.new + test &&= bar.foo + test &&= (bar.bar(1,2,3) == [1,2,3]) + test +end + +assert('yield', '11.3.5') do + begin + yield + rescue LocalJumpError + true + else + false + end +end + +assert('Abbreviated variable assignment', '11.4.2.3.2') do + a ||= 1 + b &&= 1 + c = 1 + c += 2 + a == 1 and b == nil and c == 3 +end -- cgit v1.2.3 From b32e586099d8a59bd497031f27e9763b028c0bad Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 12 Jun 2012 12:19:25 +0900 Subject: should enhance test for Array#slice --- test/t/array.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/t/array.rb b/test/t/array.rb index 4e53f1120..1cfe02af7 100644 --- a/test/t/array.rb +++ b/test/t/array.rb @@ -222,7 +222,9 @@ assert('Array#size', '15.2.12.5.28') do end assert('Array#slice', '15.2.12.5.29') do - [1,2,3].[](1) == 2 + a = "12345".slice(1, 3) + b = a.slice(0) + "#{b}:" == "2:" and [1,2,3].[](1) == 2 end assert('Array#unshift', '15.2.12.5.30') do -- cgit v1.2.3 From 5937c29281d9bf51ca85b79c8f3dea204909a073 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 12 Jun 2012 12:29:20 +0900 Subject: s.split(nil) should work like s.split() --- src/string.c | 2 +- test/t/string.rb | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/string.c b/src/string.c index 172b8422c..fae3392cf 100644 --- a/src/string.c +++ b/src/string.c @@ -2139,7 +2139,7 @@ mrb_str_split_m(mrb_state *mrb, mrb_value str) i = 1; } - if (argc == 0) { + if (argc == 0 || mrb_nil_p(spat)) { split_type = awk; } else { diff --git a/test/t/string.rb b/test/t/string.rb index 718b005a9..c422133e3 100644 --- a/test/t/string.rb +++ b/test/t/string.rb @@ -277,9 +277,11 @@ assert('String#split', '15.2.10.5.35') do # without RegExp behavior is actually unspecified a = 'abc abc abc'.split b = 'a,b,c,,d'.split(',') + c = 'abc abc abc'.split(nil) a == ['abc', 'abc', 'abc'] and - b == ["a", "b", "c", "", "d"] + b == ["a", "b", "c", "", "d"] and + c == ['abc', 'abc', 'abc'] end # TODO ATM broken assert('String#sub', '15.2.10.5.36') do -- cgit v1.2.3 From ff4925b804cc70aa8571e9aed2793114ef0223f6 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 12 Jun 2012 12:56:21 +0900 Subject: corrupted String#inspect on backslash escapes --- src/string.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/string.c b/src/string.c index fae3392cf..fcd68a2f2 100644 --- a/src/string.c +++ b/src/string.c @@ -2943,18 +2943,15 @@ mrb_str_append(mrb_state *mrb, mrb_value str, mrb_value str2) mrb_value mrb_str_inspect(mrb_state *mrb, mrb_value str) { - const char *p, *pend, *prev; + const char *p, *pend; char buf[CHAR_ESC_LEN + 1]; mrb_value result = mrb_str_new_cstr(mrb, "\""); p = RSTRING_PTR(str); pend = RSTRING_END(str); - prev = p; for (;p < pend; p++) { unsigned int c, cc; - int n; c = *p; - n = 1; if (c == '"'|| c == '\\' || (c == '#' && IS_EVSTR(p, pend))) { buf[0] = '\\'; buf[1] = c; mrb_str_buf_cat(mrb, result, buf, 2); @@ -2977,18 +2974,14 @@ mrb_str_inspect(mrb_state *mrb, mrb_value str) default: cc = 0; break; } if (cc) { - if (p - n > prev) mrb_str_buf_cat(mrb, result, prev, p - n - prev); buf[0] = '\\'; buf[1] = (char)cc; mrb_str_buf_cat(mrb, result, buf, 2); - prev = p; continue; } else { - if (p - n > prev) mrb_str_buf_cat(mrb, result, prev, p - n - prev); sprintf(buf, "\\%03o", c & 0377); mrb_str_buf_cat(mrb, result, buf, strlen(buf)); - prev = p; continue; } } -- cgit v1.2.3 From 30a062c165f31f31f8be65bd51d313a2d25f0bd9 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 12 Jun 2012 12:58:49 +0900 Subject: String#split("") should split per character (byte for now) --- src/string.c | 22 ++++++++++++++++------ test/t/string.rb | 11 ++++------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/string.c b/src/string.c index fcd68a2f2..14041127a 100644 --- a/src/string.c +++ b/src/string.c @@ -2208,14 +2208,24 @@ mrb_str_split_m(mrb_state *mrb, mrb_value str) char *ptr = RSTRING_PTR(str); char *temp = ptr; char *eptr = RSTRING_END(str); - char *sptr = RSTRING_PTR(spat); long slen = RSTRING_LEN(spat); - while (ptr < eptr && - (end = mrb_memsearch(sptr, slen, ptr, eptr - ptr)) >= 0) { - mrb_ary_push(mrb, result, mrb_str_subseq(mrb, str, ptr - temp, end)); - ptr += end + slen; - if (lim >= 0 && lim <= ++i) break; + if (slen == 0) { + while (ptr < eptr) { + mrb_ary_push(mrb, result, mrb_str_subseq(mrb, str, ptr-temp, 1)); + ptr++; + if (lim >= 0 && lim <= ++i) break; + } + } + else { + char *sptr = RSTRING_PTR(spat); + + while (ptr < eptr && + (end = mrb_memsearch(sptr, slen, ptr, eptr - ptr)) >= 0) { + mrb_ary_push(mrb, result, mrb_str_subseq(mrb, str, ptr - temp, end)); + ptr += end + slen; + if (lim >= 0 && lim <= ++i) break; + } } beg = ptr - temp; } diff --git a/test/t/string.rb b/test/t/string.rb index c422133e3..3338e4318 100644 --- a/test/t/string.rb +++ b/test/t/string.rb @@ -275,13 +275,10 @@ end # TODO Broken ATM assert('String#split', '15.2.10.5.35') do # without RegExp behavior is actually unspecified - a = 'abc abc abc'.split - b = 'a,b,c,,d'.split(',') - c = 'abc abc abc'.split(nil) - - a == ['abc', 'abc', 'abc'] and - b == ["a", "b", "c", "", "d"] and - c == ['abc', 'abc', 'abc'] + 'abc abc abc'.split == ['abc', 'abc', 'abc'] and + 'a,b,c,,d'.split(',') == ["a", "b", "c", "", "d"] and + 'abc abc abc'.split(nil) == ['abc', 'abc', 'abc'] and + 'abc'.split("") == ['a', 'b', 'c'] end # TODO ATM broken assert('String#sub', '15.2.10.5.36') do -- cgit v1.2.3 From e1e4ceb3e42dab35038a52d89064ca6378a08c7d Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Tue, 12 Jun 2012 17:46:38 +0900 Subject: Make sprintf/format optional. --- include/mrbconf.h | 3 +++ src/kernel.c | 2 ++ src/sprintf.c | 5 +++++ 3 files changed, 10 insertions(+) diff --git a/include/mrbconf.h b/include/mrbconf.h index 5a54ebeef..f2b23258e 100644 --- a/include/mrbconf.h +++ b/include/mrbconf.h @@ -34,6 +34,9 @@ typedef intptr_t mrb_sym; # define INCLUDE_ENCODING /* Regexp depends Encoding */ #endif +//#undef INCLUDE_KERNEL_SPRINTF /* not use Kernel.sprintf method. */ +#define INCLUDE_KERNEL_SPRINTF /* not use Kernel.sprintf method. */ + #ifdef MRUBY_DEBUG_BUILD # define PARSER_DUMP #endif diff --git a/src/kernel.c b/src/kernel.c index 15a4158a4..bc8e0059b 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -1425,8 +1425,10 @@ mrb_init_kernel(mrb_state *mrb) mrb_define_method(mrb, krn, "singleton_methods", mrb_obj_singleton_methods_m, ARGS_ANY()); /* 15.3.1.3.45 */ mrb_define_method(mrb, krn, "to_s", mrb_any_to_s, ARGS_NONE()); /* 15.3.1.3.46 */ +#ifdef INCLUDE_KERNEL_SPRINTF mrb_define_method(mrb, krn, "sprintf", mrb_f_sprintf, ARGS_ANY()); /* in sprintf.c */ mrb_define_method(mrb, krn, "format", mrb_f_sprintf, ARGS_ANY()); /* in sprintf.c */ +#endif mrb_include_module(mrb, mrb->object_class, mrb->kernel_module); } diff --git a/src/sprintf.c b/src/sprintf.c index 296a7c73e..c7e7badc4 100644 --- a/src/sprintf.c +++ b/src/sprintf.c @@ -5,6 +5,9 @@ */ #include "mruby.h" + +#ifdef INCLUDE_KERNEL_SPRINTF + #include #include #include "encoding.h" @@ -1078,3 +1081,5 @@ fmt_setup(char *buf, size_t size, int c, int flags, int width, int prec) *buf++ = c; *buf = '\0'; } + +#endif //INCLUDE_KERNEL_SPRINTF -- cgit v1.2.3 From 324de1a00227d8dbebc428cdae04dec9f07a6c81 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 12 Jun 2012 18:05:36 +0900 Subject: remove Kernel#eval from the core; close #261 --- src/kernel.c | 36 ------------------------------------ 1 file changed, 36 deletions(-) diff --git a/src/kernel.c b/src/kernel.c index 15a4158a4..49538e256 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -466,40 +466,6 @@ mrb_obj_dup(mrb_state *mrb, mrb_value obj) return dup; } -/* 15.3.1.2.3 */ -/* 15.3.1.3.12 */ -/* - * call-seq: - * eval(string [, binding [, filename [,lineno]]]) -> obj - * - * Evaluates the Ruby expression(s) in string. If - * binding is given, which must be a Binding - * object, the evaluation is performed in its context. If the - * optional filename and lineno parameters are - * present, they will be used when reporting syntax errors. - * - * def getBinding(str) - * return binding - * end - * str = "hello" - * eval "str + ' Fred'" #=> "hello Fred" - * eval "str + ' Fred'", getBinding("bye") #=> "bye Fred" - */ -mrb_value -mrb_f_eval(int argc, mrb_value *argv, mrb_value self) -{ - return mrb_false_value(); /* dummy */ -} -mrb_value -mrb_f_eval_m(mrb_state *mrb, mrb_value self) -{ - mrb_value *argv; - int argc; - - mrb_get_args(mrb, "*", &argv, &argc); - return mrb_f_eval(argc, argv, self); -} - static mrb_value mrb_obj_extend(mrb_state *mrb, int argc, mrb_value *argv, mrb_value obj) { @@ -1370,7 +1336,6 @@ mrb_init_kernel(mrb_state *mrb) krn = mrb->kernel_module = mrb_define_module(mrb, "Kernel"); mrb_define_class_method(mrb, krn, "block_given?", mrb_f_block_given_p_m, ARGS_NONE()); /* 15.3.1.2.2 */ - mrb_define_class_method(mrb, krn, "eval", mrb_f_eval_m, ARGS_ANY()); /* 15.3.1.2.3 */ mrb_define_class_method(mrb, krn, "global_variables", mrb_f_global_variables, ARGS_NONE()); /* 15.3.1.2.4 */ mrb_define_class_method(mrb, krn, "iterator?", mrb_f_block_given_p_m, ARGS_NONE()); /* 15.3.1.2.5 */ mrb_define_class_method(mrb, krn, "lambda", proc_lambda, ARGS_NONE()); /* 15.3.1.2.6 */ @@ -1393,7 +1358,6 @@ mrb_init_kernel(mrb_state *mrb) mrb_define_method(mrb, krn, "dup", mrb_obj_dup, ARGS_NONE()); /* 15.3.1.3.9 */ mrb_define_method(mrb, krn, "eql?", mrb_obj_equal_m, ARGS_REQ(1)); /* 15.3.1.3.10 */ mrb_define_method(mrb, krn, "equal?", mrb_obj_equal_m, ARGS_REQ(1)); /* 15.3.1.3.11 */ - mrb_define_method(mrb, krn, "eval", mrb_f_eval_m, ARGS_ANY()); /* 15.3.1.3.12 */ mrb_define_method(mrb, krn, "extend", mrb_obj_extend_m, ARGS_ANY()); /* 15.3.1.3.13 */ mrb_define_method(mrb, krn, "global_variables", mrb_f_global_variables, ARGS_NONE()); /* 15.3.1.3.14 */ mrb_define_method(mrb, krn, "hash", mrb_obj_hash, ARGS_NONE()); /* 15.3.1.3.15 */ -- cgit v1.2.3 From 216a846bd9b6c0fa192ec9b3381e1a9143a180f2 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 12 Jun 2012 18:32:05 +0900 Subject: mrb_get_args should honor optinal arguments --- src/class.c | 149 ++++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 84 insertions(+), 65 deletions(-) diff --git a/src/class.c b/src/class.c index b49ce00f8..914785120 100644 --- a/src/class.c +++ b/src/class.c @@ -396,8 +396,7 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) case '|': case '*': case '&': break; default: - if (argc <= i) { - if (opt) continue; + if (argc <= i && !opt) { mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments"); } } @@ -408,8 +407,10 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) mrb_value *p; p = va_arg(ap, mrb_value*); - *p = *sp; - i++; sp++; + if (i < argc) { + *p = *sp++; + i++; + } } break; case 'S': @@ -417,8 +418,10 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) mrb_value *p; p = va_arg(ap, mrb_value*); - *p = to_str(mrb, *sp); - i++; sp++; + if (i < argc) { + *p = to_str(mrb, *sp++); + i++; + } } break; case 'A': @@ -426,8 +429,10 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) mrb_value *p; p = va_arg(ap, mrb_value*); - *p = to_ary(mrb, *sp); - i++; sp++; + if (i < argc) { + *p = to_ary(mrb, *sp++); + i++; + } } break; case 'H': @@ -435,8 +440,10 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) mrb_value *p; p = va_arg(ap, mrb_value*); - *p = to_hash(mrb, *sp); - i++; sp++; + if (i < argc) { + *p = to_hash(mrb, *sp++); + i++; + } } break; case 's': @@ -446,13 +453,15 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) char **ps = 0; int *pl = 0; - ss = to_str(mrb, *sp); - s = mrb_str_ptr(ss); ps = va_arg(ap, char**); - *ps = s->ptr; pl = va_arg(ap, int*); - *pl = s->len; - i++; sp++; + if (i < argc) { + ss = to_str(mrb, *sp++); + s = mrb_str_ptr(ss); + *ps = s->ptr; + *pl = s->len; + i++; + } } break; case 'z': @@ -461,14 +470,16 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) struct RString *s; char **ps; - ss = to_str(mrb, *sp); - s = mrb_str_ptr(ss); - if (strlen(s->ptr) != s->len) { - mrb_raise(mrb, E_ARGUMENT_ERROR, "String contains NUL"); - } ps = va_arg(ap, char**); - *ps = s->ptr; - i++; sp++; + if (i < argc) { + ss = to_str(mrb, *sp++); + s = mrb_str_ptr(ss); + if (strlen(s->ptr) != s->len) { + mrb_raise(mrb, E_ARGUMENT_ERROR, "String contains NUL"); + } + *ps = s->ptr; + i++; + } } break; case 'a': @@ -478,13 +489,15 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) mrb_value **pb; int *pl; - aa = to_ary(mrb, *sp); - a = mrb_ary_ptr(aa); pb = va_arg(ap, mrb_value**); - *pb = a->ptr; pl = va_arg(ap, int*); - *pl = a->len; - i++; sp++; + if (i < argc) { + aa = to_ary(mrb, *sp++); + a = mrb_ary_ptr(aa); + *pb = a->ptr; + *pl = a->len; + i++; + } } break; case 'f': @@ -492,26 +505,29 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) mrb_float *p; p = va_arg(ap, mrb_float*); - switch (sp->tt) { - case MRB_TT_FLOAT: - *p = mrb_float(*sp); - break; - case MRB_TT_FIXNUM: - *p = (mrb_float)mrb_fixnum(*sp); - break; - case MRB_TT_FALSE: - *p = 0.0; - break; - default: - { - mrb_value tmp; - - tmp = mrb_convert_type(mrb, *sp, MRB_TT_FLOAT, "Float", "to_f"); - *p = mrb_float(tmp); + if (i < argc) { + switch (sp->tt) { + case MRB_TT_FLOAT: + *p = mrb_float(*sp); + break; + case MRB_TT_FIXNUM: + *p = (mrb_float)mrb_fixnum(*sp); + break; + case MRB_TT_FALSE: + *p = 0.0; + break; + default: + { + mrb_value tmp; + + tmp = mrb_convert_type(mrb, *sp, MRB_TT_FLOAT, "Float", "to_f"); + *p = mrb_float(tmp); + } + break; } - break; - } - i++; sp++; + sp++; + i++; + } } break; case 'i': @@ -519,26 +535,29 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) mrb_int *p; p = va_arg(ap, mrb_int*); - switch (sp->tt) { - case MRB_TT_FIXNUM: - *p = mrb_fixnum(*sp); - break; - case MRB_TT_FLOAT: - *p = (mrb_int)mrb_float(*sp); - break; - case MRB_TT_FALSE: - *p = 0; - break; - default: - { - mrb_value tmp; - - tmp = mrb_convert_type(mrb, *sp, MRB_TT_FIXNUM, "Integer", "to_int"); - *p = mrb_fixnum(tmp); + if (i < argc) { + switch (sp->tt) { + case MRB_TT_FIXNUM: + *p = mrb_fixnum(*sp); + break; + case MRB_TT_FLOAT: + *p = (mrb_int)mrb_float(*sp); + break; + case MRB_TT_FALSE: + *p = 0; + break; + default: + { + mrb_value tmp; + + tmp = mrb_convert_type(mrb, *sp, MRB_TT_FIXNUM, "Integer", "to_int"); + *p = mrb_fixnum(tmp); + } + break; } - break; - } - i++; sp++; + sp++; + i++; + } } break; -- cgit v1.2.3 From b5ffbea4c2f914409465aa87d906f12b5a57972e Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 12 Jun 2012 18:32:42 +0900 Subject: remove Ruby version of Kernel#instance_eval --- mrblib/kernel.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mrblib/kernel.rb b/mrblib/kernel.rb index e769741b7..f5099c561 100644 --- a/mrblib/kernel.rb +++ b/mrblib/kernel.rb @@ -33,10 +33,10 @@ module Kernel #end # 15.3.1.3.18 - def instance_eval(string=nil, &block) - ### *** TODO *** ### - raise "Not implemented yet" - end + #def instance_eval(string=nil, &block) + # ### *** TODO *** ### + # raise "Not implemented yet" + #end ## # Alias for +Kernel.lambda+. -- cgit v1.2.3 From 4348639e1c608b7e6ad56f4c4f7d5bc0f9f6bd06 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 12 Jun 2012 18:33:17 +0900 Subject: raise error if string arg is given to Kernel#instance_eval --- src/kernel.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/kernel.c b/src/kernel.c index 49538e256..04e427327 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -557,12 +557,10 @@ mrb_obj_init_copy(mrb_state *mrb, mrb_value self) /* 15.3.1.3.18 */ /* * call-seq: - * obj.instance_eval(string [, filename [, lineno]] ) -> obj * obj.instance_eval {| | block } -> obj * - * Evaluates a string containing Ruby source code, or the given block, - * within the context of the receiver (_obj_). In order to set the - * context, the variable +self+ is set to _obj_ while + * Evaluates the given block,within the context of the receiver (_obj_). + * In order to set the context, the variable +self+ is set to _obj_ while * the code is executing, giving the code access to _obj_'s * instance variables. In the version of instance_eval * that takes a +String+, the optional second and third @@ -580,9 +578,11 @@ mrb_obj_init_copy(mrb_state *mrb, mrb_value self) mrb_value mrb_obj_instance_eval(mrb_state *mrb, mrb_value self) { - mrb_value b; + mrb_value a, b; - mrb_get_args(mrb, "&", &b); + if (mrb_get_args(mrb, "|S&", &a, &b) == 1) { + mrb_raise(mrb, mrb->eRuntimeError_class, "instance_eval with string not implemented"); + } return mrb_yield_with_self(mrb, b, 0, 0, self); } -- cgit v1.2.3 From f537e2bb96a85d7ca75777f64cad13fea8d4937c Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 12 Jun 2012 19:09:11 +0900 Subject: block_given? should work; close #262 --- src/kernel.c | 19 ++++++++++++------- test/t/kernel.rb | 9 ++++++++- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/kernel.c b/src/kernel.c index 04e427327..f233fdf6d 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -269,12 +269,6 @@ mrb_f_send(mrb_state *mrb, mrb_value self) return mrb_funcall_with_block(mrb,self, mrb_string_value_ptr(mrb, name), argc, argv, block); } -static mrb_value -mrb_f_block_given_p(void) -{ - return mrb_false_value(); /* dummy */ -} - /* 15.3.1.2.2 */ /* 15.3.1.2.5 */ /* 15.3.1.3.6 */ @@ -302,7 +296,18 @@ mrb_f_block_given_p(void) static mrb_value mrb_f_block_given_p_m(mrb_state *mrb, mrb_value self) { - return mrb_f_block_given_p(); + mrb_callinfo *ci = mrb->ci; + mrb_value *bp, *p; + + p = mrb->stbase + ci->stackidx; + bp = mrb->stbase + ci->stackidx + 1; + ci--; + if (ci <= mrb->cibase) return mrb_false_value(); + if (ci->argc > 0) { + bp += ci->argc; + } + if (mrb_nil_p(*bp)) return mrb_false_value(); + return mrb_true_value(); } /* 15.3.1.3.7 */ diff --git a/test/t/kernel.rb b/test/t/kernel.rb index 847f1baeb..5e25d6516 100644 --- a/test/t/kernel.rb +++ b/test/t/kernel.rb @@ -6,7 +6,14 @@ assert('Kernel', '15.3.1') do end assert('Kernel.block_given?', '15.3.1.2.2') do - Kernel.block_given? == false + def bg_try(&b) + if block_given? + yield + else + "no block" + end + end + (Kernel.block_given? == false) && (bg_try == "no block") && ((bg_try { "block" }) == "block") && ((bg_try do "block" end) == "block") end assert('Kernel.global_variables', '15.3.1.2.4') do -- cgit v1.2.3 From 8bc506e25825620c356a61e0db8825b669409159 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 12 Jun 2012 23:39:27 +0900 Subject: a bug in contant reference from modules --- src/variable.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/variable.c b/src/variable.c index 33cd6ba14..b8957fb6a 100644 --- a/src/variable.c +++ b/src/variable.c @@ -235,6 +235,7 @@ const_get(mrb_state *mrb, struct RClass *base, mrb_sym sym) khiter_t k; mrb_sym cm = mrb_intern(mrb, "const_missing"); + L_RETRY: while (c) { if (c->iv) { h = c->iv; @@ -250,6 +251,10 @@ const_get(mrb_state *mrb, struct RClass *base, mrb_sym sym) c = c->super; } + if (base->tt == MRB_TT_MODULE) { + c = base = mrb->object_class; + goto L_RETRY; + } mrb_raise(mrb, E_NAME_ERROR, "uninitialized constant %s", mrb_sym2name(mrb, sym)); /* not reached */ -- cgit v1.2.3 From a74ab0c2daf1855b968ef8498b9161eadb04a386 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 12 Jun 2012 23:39:54 +0900 Subject: Kernel.eval to raise NotImplementedError --- mrblib/error.rb | 7 +++++++ mrblib/kernel.rb | 14 +++++++++----- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/mrblib/error.rb b/mrblib/error.rb index 5660d8235..3fa7f21e3 100644 --- a/mrblib/error.rb +++ b/mrblib/error.rb @@ -12,3 +12,10 @@ class Exception self.new(*args, &block) end end + +# ISO 15.2.37 +class ScriptError < Exception +end + +class NotImplementedError < ScriptError +end diff --git a/mrblib/kernel.rb b/mrblib/kernel.rb index f5099c561..c263ec403 100644 --- a/mrblib/kernel.rb +++ b/mrblib/kernel.rb @@ -24,6 +24,11 @@ module Kernel end end + # 15.3.1.2.3 + def self.eval(s) + raise NotImplementedError.new("eval not implemented") + end + ## # Alias for +send+. # @@ -32,11 +37,10 @@ module Kernel ### *** TODO *** ### #end - # 15.3.1.3.18 - #def instance_eval(string=nil, &block) - # ### *** TODO *** ### - # raise "Not implemented yet" - #end + # 15.3.1.3.12 + def eval(s) + Kernel.eval(s) + end ## # Alias for +Kernel.lambda+. -- cgit v1.2.3 From c5536326a1daa97ba3e49e963e2cf8e288bcb543 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 12 Jun 2012 23:47:23 +0900 Subject: replace * and == by optimization instructions OP_MUL and OP_EQ respectively; close #264 --- src/codegen.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/codegen.c b/src/codegen.c index b8500292e..e31e722eb 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -645,6 +645,9 @@ gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val) else if (!noop && name[0] == '-' && strlen(name) == 1) { genop(s, MKOP_ABC(OP_SUB, cursp(), idx, n)); } + else if (!noop && name[0] == '*' && strlen(name) == 1) { + genop(s, MKOP_ABC(OP_MUL, cursp(), idx, n)); + } else if (!noop && name[0] == '<' && strlen(name) == 1) { genop(s, MKOP_ABC(OP_LT, cursp(), idx, n)); } @@ -657,6 +660,9 @@ gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val) else if (!noop && name[0] == '>' && strlen(name) == 2 && name[1] == '=') { genop(s, MKOP_ABC(OP_GE, cursp(), idx, n)); } + else if (!noop && name[0] == '=' && strlen(name) == 2 && name[1] == '=') { + genop(s, MKOP_ABC(OP_EQ, cursp(), idx, n)); + } else { if (sendv) n = CALL_MAXARGS; genop(s, MKOP_ABC(OP_SEND, cursp(), idx, n)); @@ -2152,6 +2158,11 @@ codedump(mrb_state *mrb, int n) mrb_sym2name(mrb, irep->syms[GETARG_B(c)]), GETARG_C(c)); break; + case OP_MUL: + printf("OP_MUL\tR%d\t'%s'\t%d\n", GETARG_A(c), + mrb_sym2name(mrb, irep->syms[GETARG_B(c)]), + GETARG_C(c)); + break; case OP_LT: printf("OP_LT\tR%d\t'%s'\t%d\n", GETARG_A(c), mrb_sym2name(mrb, irep->syms[GETARG_B(c)]), @@ -2172,6 +2183,11 @@ codedump(mrb_state *mrb, int n) mrb_sym2name(mrb, irep->syms[GETARG_B(c)]), GETARG_C(c)); break; + case OP_EQ: + printf("OP_EQ\tR%d\t'%s'\t%d\n", GETARG_A(c), + mrb_sym2name(mrb, irep->syms[GETARG_B(c)]), + GETARG_C(c)); + break; case OP_STOP: printf("OP_STOP\n"); -- cgit v1.2.3 From d39a355af39eb8dee42ee31eed34297dd748c3a5 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 13 Jun 2012 02:27:51 +0900 Subject: wrong ary->capa size was set in ary_modify() --- src/array.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/array.c b/src/array.c index 2403a783d..b0f5febbe 100644 --- a/src/array.c +++ b/src/array.c @@ -122,7 +122,7 @@ ary_modify(mrb_state *mrb, struct RArray *a) memcpy(ptr, p, len); } a->ptr = ptr; - a->aux.capa = len; + a->aux.capa = a->len; mrb_ary_decref(mrb, shared); } a->flags &= ~MRB_ARY_SHARED; -- cgit v1.2.3 From 3b1b9b050b20240d1c90d0fe9bd7129377b22b90 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 13 Jun 2012 02:29:13 +0900 Subject: optimize Array#unshift using shared body object --- src/array.c | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/src/array.c b/src/array.c index b0f5febbe..3b42abc74 100644 --- a/src/array.c +++ b/src/array.c @@ -501,12 +501,20 @@ mrb_ary_unshift(mrb_state *mrb, mrb_value self, mrb_value item) { struct RArray *a = mrb_ary_ptr(self); - ary_modify(mrb, a); - if (a->aux.capa < a->len + 1) - ary_expand_capa(mrb, a, a->len + 1); - memmove(a->ptr + 1, a->ptr, sizeof(mrb_value)*a->len); - memcpy(a->ptr, &item, sizeof(mrb_value)); - a->len += 1; + if ((a->flags & MRB_ARY_SHARED) + && a->aux.shared->refcnt == 1 /* shared only referenced from this array */ + && a->ptr - a->aux.shared->ptr >= 1) /* there's room for unshifted item */ { + a->ptr--; + a->ptr[0] = item; + } + else { + ary_modify(mrb, a); + if (a->aux.capa < a->len + 1) + ary_expand_capa(mrb, a, a->len + 1); + memmove(a->ptr + 1, a->ptr, sizeof(mrb_value)*a->len); + a->ptr[0] = item; + } + a->len++; mrb_write_barrier(mrb, (struct RBasic*)a); return self; @@ -519,12 +527,19 @@ mrb_ary_unshift_m(mrb_state *mrb, mrb_value self) mrb_value *vals; int len; - ary_modify(mrb, a); mrb_get_args(mrb, "*", &vals, &len); - if (len == 0) return self; - if (a->aux.capa < a->len + len) - ary_expand_capa(mrb, a, a->len + len); - memmove(a->ptr + len, a->ptr, sizeof(mrb_value)*a->len); + if ((a->flags & MRB_ARY_SHARED) + && a->aux.shared->refcnt == 1 /* shared only referenced from this array */ + && a->ptr - a->aux.shared->ptr >= len) /* there's room for unshifted item */ { + a->ptr -= len; + } + else { + ary_modify(mrb, a); + if (len == 0) return self; + if (a->aux.capa < a->len + len) + ary_expand_capa(mrb, a, a->len + len); + memmove(a->ptr + len, a->ptr, sizeof(mrb_value)*a->len); + } memcpy(a->ptr, vals, sizeof(mrb_value)*len); a->len += len; mrb_write_barrier(mrb, (struct RBasic*)a); -- cgit v1.2.3 From bddbf20785c322111441d9e9569cf8e85c7d8c3e Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Wed, 13 Jun 2012 09:41:24 +0900 Subject: Assert should handle all exceptions. --- test/assert.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/assert.rb b/test/assert.rb index 5cca59187..2fc11f149 100644 --- a/test/assert.rb +++ b/test/assert.rb @@ -32,7 +32,7 @@ def assert(str = 'Assertion failed', iso = '') $ok_test += 1 print('.') end - rescue => e + rescue Exception => e $asserts.push(['Error: ', str, iso, e]) $kill_test += 1 print('X') -- cgit v1.2.3 From 38941772333d5d9298b76dfc8a97c5b076daedc2 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 13 Jun 2012 15:37:11 +0900 Subject: generate optimized OP_DIV instruction --- src/codegen.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/codegen.c b/src/codegen.c index e31e722eb..e76443a20 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -648,6 +648,9 @@ gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val) else if (!noop && name[0] == '*' && strlen(name) == 1) { genop(s, MKOP_ABC(OP_MUL, cursp(), idx, n)); } + else if (!noop && name[0] == '/' && strlen(name) == 1) { + genop(s, MKOP_ABC(OP_DIV, cursp(), idx, n)); + } else if (!noop && name[0] == '<' && strlen(name) == 1) { genop(s, MKOP_ABC(OP_LT, cursp(), idx, n)); } @@ -2163,6 +2166,11 @@ codedump(mrb_state *mrb, int n) mrb_sym2name(mrb, irep->syms[GETARG_B(c)]), GETARG_C(c)); break; + case OP_DIV: + printf("OP_DIV\tR%d\t'%s'\t%d\n", GETARG_A(c), + mrb_sym2name(mrb, irep->syms[GETARG_B(c)]), + GETARG_C(c)); + break; case OP_LT: printf("OP_LT\tR%d\t'%s'\t%d\n", GETARG_A(c), mrb_sym2name(mrb, irep->syms[GETARG_B(c)]), -- cgit v1.2.3 From 6a5019d37fd595abd9e8297bb3d35a1ee054becf Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 13 Jun 2012 15:38:18 +0900 Subject: optimized OP_{ADD,SUB,MUL,DIV} to use numeric function for fixnums to handle overflow --- include/mruby/numeric.h | 5 ++ src/numeric.c | 198 +++++++++++++++++++++++++++++------------------- src/vm.c | 39 +++------- 3 files changed, 133 insertions(+), 109 deletions(-) diff --git a/include/mruby/numeric.h b/include/mruby/numeric.h index 1bea51152..95792e9a6 100644 --- a/include/mruby/numeric.h +++ b/include/mruby/numeric.h @@ -22,6 +22,11 @@ mrb_value mrb_flt2big(mrb_state *mrb, mrb_float d); void mrb_num_zerodiv(mrb_state *mrb); mrb_value mrb_fix2str(mrb_state *mrb, mrb_value x, int base); +mrb_value mrb_fixnum_plus(mrb_state *mrb, mrb_value x, mrb_value y); +mrb_value mrb_fixnum_minus(mrb_state *mrb, mrb_value x, mrb_value y); +mrb_value mrb_fixnum_mul(mrb_state *mrb, mrb_value x, mrb_value y); +mrb_value mrb_num_div(mrb_state *mrb, mrb_value x, mrb_value y); + #if defined(__cplusplus) } /* extern "C" { */ #endif diff --git a/src/numeric.c b/src/numeric.c index e1f711478..2d668fa79 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -118,6 +118,12 @@ num_pow(mrb_state *mrb, mrb_value x) * result. */ +mrb_value +mrb_num_div(mrb_state *mrb, mrb_value x, mrb_value y) +{ + return mrb_float_value(mrb_to_flo(mrb, x) / mrb_to_flo(mrb, y)); +} + /* 15.2.9.3.19(x) */ /* * call-seq: @@ -404,7 +410,7 @@ flo_to_f(mrb_state *mrb, mrb_value num) */ static mrb_value -flo_is_infinite_p(mrb_state *mrb, mrb_value num) +flo_infinite_p(mrb_state *mrb, mrb_value num) { mrb_float value = mrb_float(num); @@ -426,7 +432,7 @@ flo_is_infinite_p(mrb_state *mrb, mrb_value num) */ static mrb_value -flo_is_finite_p(mrb_state *mrb, mrb_value num) +flo_finite_p(mrb_state *mrb, mrb_value num) { mrb_float value = mrb_float(num); @@ -691,9 +697,31 @@ int_succ(mrb_state *mrb, mrb_value num) return mrb_funcall(mrb, num, "+", 1, mrb_fixnum_value(1)); } -#define SQRT_LONG_MAX ((SIGNED_VALUE)1<<((sizeof(mrb_int)*CHAR_BIT-1)/2)) +#define SQRT_INT_MAX ((SIGNED_VALUE)1<<((sizeof(mrb_int)*CHAR_BIT-1)/2)) /*tests if N*N would overflow*/ -#define FIT_SQRT_LONG(n) (((n)=-SQRT_LONG_MAX)) +#define FIT_SQRT_INT(n) (((n)=-SQRT_INT_MAX)) + +mrb_value +mrb_fixnum_mul(mrb_state *mrb, mrb_value x, mrb_value y) +{ + mrb_int a; + + a = mrb_fixnum(x); + if (a == 0) return x; + if (FIXNUM_P(y)) { + mrb_int b, c; + + b = mrb_fixnum(y); + if (FIT_SQRT_INT(a) && FIT_SQRT_INT(b)) + return mrb_fixnum_value(a*b); + c = a * b; + if (c/a != b) { + return mrb_float_value((mrb_float)a*(mrb_float)b); + } + return mrb_fixnum_value(c);; + } + return mrb_float_value((mrb_float)a * mrb_to_flo(mrb, y)); +} /* 15.2.8.3.3 */ /* @@ -709,27 +737,8 @@ static mrb_value fix_mul(mrb_state *mrb, mrb_value x) { mrb_value y; - mrb_int a; mrb_get_args(mrb, "o", &y); - - a = mrb_fixnum(x); - if (FIXNUM_P(y)) { - mrb_int b, c; - mrb_value r; - - b = mrb_fixnum(y); - if (FIT_SQRT_LONG(a) && FIT_SQRT_LONG(b)) - return mrb_fixnum_value(a*b); - c = a * b; - r = mrb_fixnum_value(c); - - if (a == 0) return x; - if (mrb_fixnum(r) != c || c/a != b) { - r = mrb_float_value((mrb_float)a*(mrb_float)b); - } - return r; - } - return mrb_float_value((mrb_float)a * mrb_to_flo(mrb, y)); + return mrb_fixnum_mul(mrb, x, y); } static void @@ -942,8 +951,28 @@ fix_xor(mrb_state *mrb, mrb_value x) return mrb_fixnum_value(val); } -static mrb_value fix_lshift(mrb_state *mrb, mrb_int, unsigned long); -static mrb_value fix_rshift(mrb_int, unsigned long); +static mrb_value +lshift(mrb_state *mrb, mrb_int val, unsigned long width) +{ + if (width > (sizeof(mrb_int)*CHAR_BIT-1) + || ((unsigned long)abs(val))>>(sizeof(mrb_int)*CHAR_BIT-1-width) > 0) { + mrb_raise(mrb, E_RANGE_ERROR, "width(%d) > (%d:sizeof(mrb_int)*CHAR_BIT-1)", width, + sizeof(mrb_int)*CHAR_BIT-1); + } + val = val << width; + return mrb_fixnum_value(val); +} + +static mrb_value +rshift(mrb_int val, unsigned long i) +{ + if (i >= sizeof(mrb_int)*CHAR_BIT-1) { + if (val < 0) return mrb_fixnum_value(-1); + return mrb_fixnum_value(0); + } + val = RSHIFT(val, i); + return mrb_fixnum_value(val); +} /* 15.2.8.3.12 */ /* @@ -954,7 +983,7 @@ static mrb_value fix_rshift(mrb_int, unsigned long); */ static mrb_value -mrb_fix_lshift(mrb_state *mrb, mrb_value x) +fix_lshift(mrb_state *mrb, mrb_value x) { mrb_value y; mrb_int val, width; @@ -964,20 +993,8 @@ mrb_fix_lshift(mrb_state *mrb, mrb_value x) y = bit_coerce(mrb, y); width = mrb_fixnum(y); if (width < 0) - return fix_rshift(val, (unsigned long)-width); - return fix_lshift(mrb, val, width); -} - -static mrb_value -fix_lshift(mrb_state *mrb, mrb_int val, unsigned long width) -{ - if (width > (sizeof(mrb_int)*CHAR_BIT-1) - || ((unsigned long)abs(val))>>(sizeof(mrb_int)*CHAR_BIT-1-width) > 0) { - mrb_raise(mrb, E_RANGE_ERROR, "width(%d) > (%d:sizeof(mrb_int)*CHAR_BIT-1)", width, - sizeof(mrb_int)*CHAR_BIT-1); - } - val = val << width; - return mrb_fixnum_value(val); + return rshift(val, (unsigned long)-width); + return lshift(mrb, val, width); } /* 15.2.8.3.13 */ @@ -989,7 +1006,7 @@ fix_lshift(mrb_state *mrb, mrb_int val, unsigned long width) */ static mrb_value -mrb_fix_rshift(mrb_state *mrb, mrb_value x) +fix_rshift(mrb_state *mrb, mrb_value x) { mrb_value y; mrb_int i, val; @@ -1000,19 +1017,8 @@ mrb_fix_rshift(mrb_state *mrb, mrb_value x) i = mrb_fixnum(y); if (i == 0) return x; if (i < 0) - return fix_lshift(mrb, val, (unsigned long)-i); - return fix_rshift(val, i); -} - -static mrb_value -fix_rshift(mrb_int val, unsigned long i) -{ - if (i >= sizeof(mrb_int)*CHAR_BIT-1) { - if (val < 0) return mrb_fixnum_value(-1); - return mrb_fixnum_value(0); - } - val = RSHIFT(val, i); - return mrb_fixnum_value(val); + return lshift(mrb, val, (unsigned long)-i); + return rshift(val, i); } /* 15.2.8.3.23 */ @@ -1066,7 +1072,27 @@ flt2big(mrb_state *mrb, mrb_float d) mrb_value mrb_flt2big(mrb_state *mrb, mrb_float d) { - return mrb_fixnum_value(flt2big(mrb, d)); + return mrb_fixnum_value(flt2big(mrb, d)); +} + +mrb_value +mrb_fixnum_plus(mrb_state *mrb, mrb_value x, mrb_value y) +{ + mrb_int a; + + a = mrb_fixnum(x); + if (a == 0) return y; + if (FIXNUM_P(y)) { + mrb_int b, c; + + b = mrb_fixnum(y); + c = a + b; + if (c - b != a) { + return mrb_float_value((mrb_float)a + (mrb_float)b); + } + return mrb_fixnum_value(c); + } + return mrb_float_value((mrb_float)a + mrb_to_flo(mrb, y)); } /* 15.2.8.3.1 */ @@ -1079,15 +1105,32 @@ mrb_flt2big(mrb_state *mrb, mrb_float d) * result. */ static mrb_value -mrb_fixnum_plus(mrb_state *mrb, mrb_value self) +fix_plus(mrb_state *mrb, mrb_value self) { - mrb_int x, y; + mrb_value other; + + mrb_get_args(mrb, "o", &other); + return mrb_fixnum_plus(mrb, self, other); +} - x = mrb_fixnum(self); - mrb_get_args(mrb, "i", &y); +mrb_value +mrb_fixnum_minus(mrb_state *mrb, mrb_value x, mrb_value y) +{ + mrb_int a; + + a = mrb_fixnum(x); + if (a == 0) return y; + if (FIXNUM_P(y)) { + mrb_int b, c; - DEBUG(printf("%d + %d = %d\n", x, y, x+y)); - return mrb_fixnum_value(x + y); + b = mrb_fixnum(y); + c = a - b; + if (c + b != a) { + return mrb_float_value((mrb_float)a - (mrb_float)b); + } + return mrb_fixnum_value(c); + } + return mrb_float_value((mrb_float)a - mrb_to_flo(mrb, y)); } /* 15.2.8.3.2 */ @@ -1101,15 +1144,12 @@ mrb_fixnum_plus(mrb_state *mrb, mrb_value self) * result. */ static mrb_value -mrb_fixnum_minus(mrb_state *mrb, mrb_value self) +fix_minus(mrb_state *mrb, mrb_value self) { - mrb_int x, y; - - x = mrb_fixnum(self); - mrb_get_args(mrb, "i", &y); + mrb_value other; - DEBUG(printf("%d - %d = %d\n", x, y, x-y)); - return mrb_fixnum_value(x - y); + mrb_get_args(mrb, "o", &other); + return mrb_fixnum_minus(mrb, self, other); } /* 15.2.8.3.29 (x) */ @@ -1179,7 +1219,7 @@ mrb_fix_to_s(mrb_state *mrb, mrb_value self, int argc, mrb_value *argv) * */ static mrb_value -mrb_fixnum_to_s(mrb_state *mrb, mrb_value self) /* fix_to_s */ +fix_to_s(mrb_state *mrb, mrb_value self) /* fix_to_s */ { mrb_value *argv; int argc; @@ -1236,7 +1276,7 @@ num_cmp(mrb_state *mrb, mrb_value self) * and other. */ static mrb_value -mrb_float_plus(mrb_state *mrb, mrb_value self) +flo_plus(mrb_state *mrb, mrb_value self) { mrb_float x, y; @@ -1267,8 +1307,8 @@ mrb_init_numeric(mrb_state *mrb) fixnum = mrb->fixnum_class = mrb_define_class(mrb, "Fixnum", integer); mrb_undef_method(mrb, fixnum, "new"); - mrb_define_method(mrb, fixnum, "+", mrb_fixnum_plus, ARGS_REQ(1)); /* 15.2.8.3.1 */ - mrb_define_method(mrb, fixnum, "-", mrb_fixnum_minus, ARGS_REQ(1)); /* 15.2.8.3.2 */ + mrb_define_method(mrb, fixnum, "+", fix_plus, ARGS_REQ(1)); /* 15.2.8.3.1 */ + mrb_define_method(mrb, fixnum, "-", fix_minus, ARGS_REQ(1)); /* 15.2.8.3.2 */ mrb_define_method(mrb, fixnum, "-@", fix_uminus, ARGS_REQ(1)); /* 15.2.7.4.2 */ mrb_define_method(mrb, fixnum, "*", fix_mul, ARGS_REQ(1)); /* 15.2.8.3.3 */ mrb_define_method(mrb, fixnum, "%", fix_mod, ARGS_REQ(1)); /* 15.2.8.3.5 */ @@ -1277,8 +1317,8 @@ mrb_init_numeric(mrb_state *mrb) mrb_define_method(mrb, fixnum, "&", fix_and, ARGS_REQ(1)); /* 15.2.8.3.9 */ mrb_define_method(mrb, fixnum, "|", fix_or, ARGS_REQ(1)); /* 15.2.8.3.10 */ mrb_define_method(mrb, fixnum, "^", fix_xor, ARGS_REQ(1)); /* 15.2.8.3.11 */ - mrb_define_method(mrb, fixnum, "<<", mrb_fix_lshift, ARGS_REQ(1)); /* 15.2.8.3.12 */ - mrb_define_method(mrb, fixnum, ">>", mrb_fix_rshift, ARGS_REQ(1)); /* 15.2.8.3.13 */ + mrb_define_method(mrb, fixnum, "<<", fix_lshift, ARGS_REQ(1)); /* 15.2.8.3.12 */ + mrb_define_method(mrb, fixnum, ">>", fix_rshift, ARGS_REQ(1)); /* 15.2.8.3.13 */ mrb_define_method(mrb, fixnum, "ceil", int_to_i, ARGS_NONE()); /* 15.2.8.3.14 */ mrb_define_method(mrb, fixnum, "eql?", num_eql, ARGS_REQ(1)); /* 15.2.8.3.16 */ mrb_define_method(mrb, fixnum, "floor", num_floor, ARGS_NONE()); /* 15.2.8.3.17 */ @@ -1288,22 +1328,22 @@ mrb_init_numeric(mrb_state *mrb) mrb_define_method(mrb, fixnum, "succ", fix_succ, ARGS_NONE()); /* 15.2.8.3.21 */ mrb_define_method(mrb, fixnum, "to_f", fix_to_f, ARGS_NONE()); /* 15.2.8.3.23 */ mrb_define_method(mrb, fixnum, "to_i", int_to_i, ARGS_NONE()); /* 15.2.8.3.24 */ - mrb_define_method(mrb, fixnum, "to_s", mrb_fixnum_to_s, ARGS_NONE()); /* 15.2.8.3.25 */ + mrb_define_method(mrb, fixnum, "to_s", fix_to_s, ARGS_NONE()); /* 15.2.8.3.25 */ mrb_define_method(mrb, fixnum, "truncate", int_to_i, ARGS_NONE()); /* 15.2.8.3.26 */ mrb_define_method(mrb, fixnum, "divmod", fix_divmod, ARGS_REQ(1)); /* 15.2.8.3.30 (x) */ /* Float Class */ fl = mrb->float_class = mrb_define_class(mrb, "Float", numeric); mrb_undef_method(mrb, fl, "new"); - mrb_define_method(mrb, fl, "+", mrb_float_plus, ARGS_REQ(1)); /* 15.2.9.3.1 */ + mrb_define_method(mrb, fl, "+", flo_plus, ARGS_REQ(1)); /* 15.2.9.3.1 */ mrb_define_method(mrb, fl, "-", flo_minus, ARGS_REQ(1)); /* 15.2.9.3.2 */ mrb_define_method(mrb, fl, "*", flo_mul, ARGS_REQ(1)); /* 15.2.9.3.3 */ mrb_define_method(mrb, fl, "%", flo_mod, ARGS_REQ(1)); /* 15.2.9.3.5 */ mrb_define_method(mrb, fl, "==", flo_eq, ARGS_REQ(1)); /* 15.2.9.3.7 */ mrb_define_method(mrb, fl, "ceil", flo_ceil, ARGS_NONE()); /* 15.2.9.3.8 */ - mrb_define_method(mrb, fl, "finite?", flo_is_finite_p, ARGS_NONE()); /* 15.2.9.3.9 */ + mrb_define_method(mrb, fl, "finite?", flo_finite_p, ARGS_NONE()); /* 15.2.9.3.9 */ mrb_define_method(mrb, fl, "floor", flo_floor, ARGS_NONE()); /* 15.2.9.3.10 */ - mrb_define_method(mrb, fl, "infinite?", flo_is_infinite_p,ARGS_NONE()); /* 15.2.9.3.11 */ + mrb_define_method(mrb, fl, "infinite?", flo_infinite_p, ARGS_NONE()); /* 15.2.9.3.11 */ mrb_define_method(mrb, fl, "round", flo_round, ARGS_ANY()); /* 15.2.9.3.12 */ mrb_define_method(mrb, fl, "to_f", flo_to_f, ARGS_NONE()); /* 15.2.9.3.13 */ mrb_define_method(mrb, fl, "to_i", flo_truncate, ARGS_NONE()); /* 15.2.9.3.14 */ diff --git a/src/vm.c b/src/vm.c index c449a9b3c..3d4d0370b 100644 --- a/src/vm.c +++ b/src/vm.c @@ -1162,12 +1162,12 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) regs[a].value.v1 = regs[a].value.v1 op regs[a+1].value.v2;\ } while(0) -#define OP_MATH(op) do {\ +#define OP_MATH(op,iop,s) do {\ int a = GETARG_A(i);\ - /* need to check if - is overridden */\ + /* need to check if op is overridden */\ switch (TYPES2(mrb_type(regs[a]),mrb_type(regs[a+1]))) {\ case TYPES2(MRB_TT_FIXNUM,MRB_TT_FIXNUM):\ - OP_MATH_BODY(op,i,i); \ + regs[a] = iop(mrb, regs[a], regs[a+1]);\ break;\ case TYPES2(MRB_TT_FIXNUM,MRB_TT_FLOAT):\ {\ @@ -1182,6 +1182,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) case TYPES2(MRB_TT_FLOAT,MRB_TT_FLOAT):\ OP_MATH_BODY(op,f,f);\ break;\ + s\ default:\ i = MKOP_ABC(OP_SEND, a, GETARG_B(i), GETARG_C(i));\ goto L_SEND;\ @@ -1190,50 +1191,28 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) CASE(OP_ADD) { /* A B C R(A) := R(A)+R(A+1) (Syms[B]=:+,C=1)*/ - int a = GETARG_A(i); - - switch (TYPES2(mrb_type(regs[a]),mrb_type(regs[a+1]))) { - case TYPES2(MRB_TT_FIXNUM,MRB_TT_FIXNUM): - OP_MATH_BODY(+,i,i); - break; - case TYPES2(MRB_TT_FIXNUM,MRB_TT_FLOAT): - { - mrb_int x = regs[a].value.i; - mrb_float y = regs[a+1].value.f; - SET_FLOAT_VALUE(regs[a], (mrb_float)x + y); - } - break; - case TYPES2(MRB_TT_FLOAT,MRB_TT_FIXNUM): - OP_MATH_BODY(+,f,i); - break; - case TYPES2(MRB_TT_FLOAT,MRB_TT_FLOAT): - OP_MATH_BODY(+,f,f); - break; + OP_MATH(+,mrb_fixnum_plus, case TYPES2(MRB_TT_STRING,MRB_TT_STRING): regs[a] = mrb_str_plus(mrb, regs[a], regs[a+1]); - break; - default: - i = MKOP_ABC(OP_SEND, a, GETARG_B(i), GETARG_C(i)); - goto L_SEND; - } + break;); NEXT; } CASE(OP_SUB) { /* A B C R(A) := R(A)-R(A+1) (Syms[B]=:-,C=1)*/ - OP_MATH(-); + OP_MATH(-,mrb_fixnum_minus,;); NEXT; } CASE(OP_MUL) { /* A B C R(A) := R(A)*R(A+1) (Syms[B]=:*,C=1)*/ - OP_MATH(*); + OP_MATH(*,mrb_fixnum_mul,;); NEXT; } CASE(OP_DIV) { /* A B C R(A) := R(A)/R(A+1) (Syms[B]=:/,C=1)*/ - OP_MATH(/); + OP_MATH(/,mrb_num_div,;); NEXT; } -- cgit v1.2.3 From db3d72a471a0ee4d8d6ea248e99b2b062b390511 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 13 Jun 2012 15:40:41 +0900 Subject: move RSHIFT from numeric.h to numeric.c --- include/mruby/numeric.h | 1 - src/numeric.c | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/include/mruby/numeric.h b/include/mruby/numeric.h index 95792e9a6..a3768db2f 100644 --- a/include/mruby/numeric.h +++ b/include/mruby/numeric.h @@ -13,7 +13,6 @@ extern "C" { #include -#define RSHIFT(x,y) ((x)>>(int)(y)) #define POSFIXABLE(f) ((f) <= INT_MAX) #define NEGFIXABLE(f) ((f) >= INT_MIN) #define FIXABLE(f) (POSFIXABLE(f) && NEGFIXABLE(f)) diff --git a/src/numeric.c b/src/numeric.c index 2d668fa79..e894b3dc3 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -28,7 +28,7 @@ #include #endif -#define SIGNED_VALUE intptr_t +#define RSHIFT(x,y) ((x)>>(int)(y)) #ifdef MRB_USE_FLOAT #define floor(f) floorf(f) @@ -697,7 +697,7 @@ int_succ(mrb_state *mrb, mrb_value num) return mrb_funcall(mrb, num, "+", 1, mrb_fixnum_value(1)); } -#define SQRT_INT_MAX ((SIGNED_VALUE)1<<((sizeof(mrb_int)*CHAR_BIT-1)/2)) +#define SQRT_INT_MAX ((mrb_int)1<<((sizeof(mrb_int)*CHAR_BIT-1)/2)) /*tests if N*N would overflow*/ #define FIT_SQRT_INT(n) (((n)=-SQRT_INT_MAX)) -- cgit v1.2.3 From 38d2b7f84c938acab5aefba217474a9d033c0d07 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 13 Jun 2012 15:51:28 +0900 Subject: float representation simplified --- src/numeric.c | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/src/numeric.c b/src/numeric.c index e894b3dc3..4285ca6bc 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -187,27 +187,13 @@ flo_to_s(mrb_state *mrb, mrb_value flt) { char buf[32]; mrb_float value = mrb_float(flt); - char *p, *e; if (isinf(value)) - return mrb_str_new2(mrb, value < 0 ? "-Infinity" : "Infinity"); + return mrb_str_new2(mrb, value < 0 ? "-inf" : "inf"); else if(isnan(value)) return mrb_str_new2(mrb, "NaN"); - sprintf(buf, "%#.15g", value); /* ensure to print decimal point */ - if (!(e = strchr(buf, 'e'))) { - e = buf + strlen(buf); - } - if (!ISDIGIT(e[-1])) { /* reformat if ended with decimal point (ex 111111111111111.) */ - sprintf(buf, "%#.14e", value); - if (!(e = strchr(buf, 'e'))) { - e = buf + strlen(buf); - } - } - p = e; - while (p[-1]=='0' && ISDIGIT(p[-2])) - p--; - memmove(p, e, strlen(e)+1); + sprintf(buf, "%.14g", value); return mrb_str_new2(mrb, buf); } -- cgit v1.2.3 From 261e4d3fa0643d1e9114826486eb91ee27410f32 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 13 Jun 2012 17:48:03 +0900 Subject: handle number literal overflow --- src/codegen.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 54 insertions(+), 14 deletions(-) diff --git a/src/codegen.c b/src/codegen.c index e76443a20..4c0f98295 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -16,6 +16,9 @@ #include "node.h" #include #include +#include +#include +#include typedef mrb_ast_node node; typedef struct mrb_parser_state parser_state; @@ -800,6 +803,27 @@ raise_error(codegen_scope *s, const char *msg) genop(s, MKOP_ABx(OP_ERR, 0, idx)); } +static mrb_float +readint_float(codegen_scope *s, const char *p, int base) +{ + const char *e = p + strlen(p); + mrb_float f = 0; + int n; + + while (p <= e) { + char c = tolower(*p); + for (n=0; n -MAXARG_sBx) { - co = MKOP_AsBx(OP_LOADI, cursp(), i); + if (i == LONG_MAX && errno == ERANGE) { + mrb_float f = readint_float(s, p, base); + int off = new_lit(s, mrb_float_value(f)); + + genop(s, MKOP_ABx(OP_LOADL, cursp(), off)); } else { - int off = new_lit(s, mrb_fixnum_value(i)); - co = MKOP_ABx(OP_LOADL, cursp(), off); + if (i < MAXARG_sBx && i > -MAXARG_sBx) { + co = MKOP_AsBx(OP_LOADI, cursp(), i); + } + else { + int off = new_lit(s, mrb_fixnum_value(i)); + co = MKOP_ABx(OP_LOADL, cursp(), off); + } + genop(s, co); } - genop(s, co); push(); } break; @@ -1599,15 +1631,23 @@ codegen(codegen_scope *s, node *tree, int val) int i = readint(p, base); mrb_code co; - i = -i; - if (i < MAXARG_sBx && i > -MAXARG_sBx) { - co = MKOP_AsBx(OP_LOADI, cursp(), i); - } - else { - int off = new_lit(s, mrb_fixnum_value(i)); - co = MKOP_ABx(OP_LOADL, cursp(), off); - } - genop(s, co); + if (i == LONG_MAX && errno == ERANGE) { + mrb_float f = readint_float(s, p, base); + int off = new_lit(s, mrb_float_value(-f)); + + genop(s, MKOP_ABx(OP_LOADL, cursp(), off)); + } + else { + i = -i; + if (i < MAXARG_sBx && i > -MAXARG_sBx) { + co = MKOP_AsBx(OP_LOADI, cursp(), i); + } + else { + int off = new_lit(s, mrb_fixnum_value(i)); + co = MKOP_ABx(OP_LOADL, cursp(), off); + } + genop(s, co); + } push(); } break; -- cgit v1.2.3 From 2ded555a91a63744fcc20bdd67c50ff113095303 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 13 Jun 2012 17:59:37 +0900 Subject: could not print 0xffffffff as an negative fixnum --- src/numeric.c | 35 ++++++++++++++--------------------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/src/numeric.c b/src/numeric.c index 4285ca6bc..81933237e 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -1165,9 +1165,16 @@ mrb_fix2str(mrb_state *mrb, mrb_value x, int base) neg = 1; } *--b = '\0'; - do { - *--b = mrb_digitmap[(int)(val % base)]; - } while (val /= base); + if (neg && val < 0) { + do { + *--b = mrb_digitmap[abs(val % base)]; + } while (val /= base); + } + else { + do { + *--b = mrb_digitmap[(int)(val % base)]; + } while (val /= base); + } if (neg) { *--b = '-'; } @@ -1175,19 +1182,6 @@ mrb_fix2str(mrb_state *mrb, mrb_value x, int base) return mrb_str_new2(mrb, b); } -mrb_value -mrb_fix_to_s(mrb_state *mrb, mrb_value self, int argc, mrb_value *argv) -{ - int base; - - if (argc == 0) base = 10; - else { - mrb_get_args(mrb, "i", &base); - } - - return mrb_fix2str(mrb, self, base); -} - /* 15.2.8.3.25 */ /* * call-seq: @@ -1205,13 +1199,12 @@ mrb_fix_to_s(mrb_state *mrb, mrb_value self, int argc, mrb_value *argv) * */ static mrb_value -fix_to_s(mrb_state *mrb, mrb_value self) /* fix_to_s */ +fix_to_s(mrb_state *mrb, mrb_value self) { - mrb_value *argv; - int argc; + mrb_int base = 10; - mrb_get_args(mrb, "*", &argv, &argc); - return mrb_fix_to_s(mrb, self, argc, argv); + mrb_get_args(mrb, "|i", &base); + return mrb_fix2str(mrb, self, base); } /* 15.2.9.3.6 */ -- cgit v1.2.3 From 8e574a9e7433cb6f5b17a8cac8e66a54fc71a03f Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 13 Jun 2012 19:05:33 +0900 Subject: integer overflow in fixnum plus and minus --- src/numeric.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/numeric.c b/src/numeric.c index 81933237e..746078fd9 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -1073,7 +1073,8 @@ mrb_fixnum_plus(mrb_state *mrb, mrb_value x, mrb_value y) b = mrb_fixnum(y); c = a + b; - if (c - b != a) { + if (((a < 0) ^ (b < 0)) == 0 && (a < 0) != (c < 0)) { + /* integer overflow */ return mrb_float_value((mrb_float)a + (mrb_float)b); } return mrb_fixnum_value(c); @@ -1111,7 +1112,8 @@ mrb_fixnum_minus(mrb_state *mrb, mrb_value x, mrb_value y) b = mrb_fixnum(y); c = a - b; - if (c + b != a) { + if (((a < 0) ^ (b < 0)) != 0 && (a < 0) != (c < 0)) { + /* integer overflow */ return mrb_float_value((mrb_float)a - (mrb_float)b); } return mrb_fixnum_value(c); -- cgit v1.2.3 From 8004168725dc7e3c6975400c40fc9419a0ffed65 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 13 Jun 2012 19:16:24 +0900 Subject: readint() returns long --- src/codegen.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/codegen.c b/src/codegen.c index 4c0f98295..5f8d17314 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -12,6 +12,7 @@ #include "mruby/irep.h" #include "mruby/proc.h" #include "mruby/compile.h" +#include "mruby/numeric.h" #include "opcode.h" #include "node.h" #include @@ -1574,10 +1575,10 @@ codegen(codegen_scope *s, node *tree, int val) if (val) { char *p = (char*)tree->car; int base = (intptr_t)tree->cdr->car; - int i = readint(p, base); + long i = readint(p, base); mrb_code co; - if (i == LONG_MAX && errno == ERANGE) { + if ((i == LONG_MAX && errno == ERANGE) || !FIXABLE(i)) { mrb_float f = readint_float(s, p, base); int off = new_lit(s, mrb_float_value(f)); @@ -1628,10 +1629,10 @@ codegen(codegen_scope *s, node *tree, int val) { char *p = (char*)tree->car; int base = (intptr_t)tree->cdr->car; - int i = readint(p, base); + long i = readint(p, base); mrb_code co; - if (i == LONG_MAX && errno == ERANGE) { + if ((i == LONG_MAX && errno == ERANGE) || !FIXABLE(i)) { mrb_float f = readint_float(s, p, base); int off = new_lit(s, mrb_float_value(-f)); -- cgit v1.2.3 From 6919ca61edb2da9ea81217fdc355eef1208a6398 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 13 Jun 2012 23:16:53 +0900 Subject: stop using strtol (via readint) except in load.c; use custom readint_float --- include/mrbconf.h | 1 - src/codegen.c | 19 +++++++++++-------- src/load.c | 2 +- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/include/mrbconf.h b/include/mrbconf.h index f2b23258e..5848eee1a 100644 --- a/include/mrbconf.h +++ b/include/mrbconf.h @@ -19,7 +19,6 @@ typedef double mrb_float; typedef int mrb_int; typedef intptr_t mrb_sym; -#define readint(p,base) strtol((p),NULL,(base)) #undef PARSER_DUMP /* do not print out parser state */ //#define PARSER_DUMP /* print out parser state */ diff --git a/src/codegen.c b/src/codegen.c index 5f8d17314..63531eac1 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -1575,16 +1575,18 @@ codegen(codegen_scope *s, node *tree, int val) if (val) { char *p = (char*)tree->car; int base = (intptr_t)tree->cdr->car; - long i = readint(p, base); + mrb_float f; + mrb_int i; mrb_code co; - if ((i == LONG_MAX && errno == ERANGE) || !FIXABLE(i)) { - mrb_float f = readint_float(s, p, base); + f = readint_float(s, p, base); + if (!FIXABLE(f)) { int off = new_lit(s, mrb_float_value(f)); genop(s, MKOP_ABx(OP_LOADL, cursp(), off)); } else { + i = (mrb_int)f; if (i < MAXARG_sBx && i > -MAXARG_sBx) { co = MKOP_AsBx(OP_LOADI, cursp(), i); } @@ -1629,17 +1631,18 @@ codegen(codegen_scope *s, node *tree, int val) { char *p = (char*)tree->car; int base = (intptr_t)tree->cdr->car; - long i = readint(p, base); + mrb_float f; + mrb_int i; mrb_code co; - if ((i == LONG_MAX && errno == ERANGE) || !FIXABLE(i)) { - mrb_float f = readint_float(s, p, base); + f = readint_float(s, p, base); + if (!FIXABLE(f)) { int off = new_lit(s, mrb_float_value(-f)); - + genop(s, MKOP_ABx(OP_LOADL, cursp(), off)); } else { - i = -i; + i = (mrb_int)-f; if (i < MAXARG_sBx && i > -MAXARG_sBx) { co = MKOP_AsBx(OP_LOADI, cursp(), i); } diff --git a/src/load.c b/src/load.c index 1b607909c..053ec2d7e 100644 --- a/src/load.c +++ b/src/load.c @@ -413,7 +413,7 @@ read_rite_irep_record(mrb_state *mrb, unsigned char *src, mrb_irep *irep, uint32 switch (tt) { //pool data case MRB_TT_FIXNUM: - fix_num = readint(buf, 10); + fix_num = strtol(buf, NULL, 10); irep->pool[i] = mrb_fixnum_value(fix_num); break; -- cgit v1.2.3 From b3d83a79ea4b3817401f4f17c82763bf7b26dd74 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 13 Jun 2012 23:53:09 +0900 Subject: remove unused variable from mrb_f_block_given_p_m --- src/kernel.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/kernel.c b/src/kernel.c index 30c1c8a67..759615c15 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -297,9 +297,8 @@ static mrb_value mrb_f_block_given_p_m(mrb_state *mrb, mrb_value self) { mrb_callinfo *ci = mrb->ci; - mrb_value *bp, *p; + mrb_value *bp; - p = mrb->stbase + ci->stackidx; bp = mrb->stbase + ci->stackidx + 1; ci--; if (ci <= mrb->cibase) return mrb_false_value(); -- cgit v1.2.3 From 6bf63707812e17314a89eaff2bcb539fae6a09e4 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 13 Jun 2012 23:53:57 +0900 Subject: new mrb_get_args specifier "n" to retrieve a symbol (stands for "name") --- src/class.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/class.c b/src/class.c index 914785120..fe0a2b530 100644 --- a/src/class.c +++ b/src/class.c @@ -370,6 +370,7 @@ to_hash(mrb_state *mrb, mrb_value val) a: Array [mrb_value*,int] f: Float [mrb_float] i: Integer [mrb_int] + n: Symbol [mrb_sym] &: Block [mrb_value] *: rest argument [mrb_value*,int] |: optional @@ -560,6 +561,25 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) } } break; + case 'n': + { + mrb_sym *symp; + + symp = va_arg(ap, mrb_sym*); + if (i < argc) { + mrb_value ss; + + ss = *sp++; + if (mrb_type(ss) == MRB_TT_SYMBOL) { + *symp = mrb_symbol(ss); + } + else { + *symp = mrb_intern_str(mrb, to_str(mrb, ss)); + } + i++; + } + } + break; case '&': { -- cgit v1.2.3 From a58761787bc419cdcb08f9ad4d7795cfc1588fc3 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 13 Jun 2012 23:54:19 +0900 Subject: mrb_f_send to use mrb_get_args(n) --- src/kernel.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/kernel.c b/src/kernel.c index 759615c15..6f2c46e51 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -262,11 +262,12 @@ mrb_obj_id_m(mrb_state *mrb, mrb_value self) static mrb_value mrb_f_send(mrb_state *mrb, mrb_value self) { - mrb_value name, block, *argv; + mrb_sym name; + mrb_value block, *argv; int argc; - mrb_get_args(mrb, "o*&", &name, &argv, &argc, &block); - return mrb_funcall_with_block(mrb,self, mrb_string_value_ptr(mrb, name), argc, argv, block); + mrb_get_args(mrb, "n*&", &name, &argv, &argc, &block); + return mrb_funcall_with_block(mrb,self, mrb_sym2name(mrb, name), argc, argv, block); } /* 15.3.1.2.2 */ -- cgit v1.2.3 From 6f670785c5deea79e78abd965de466a1d344e77a Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 14 Jun 2012 00:03:36 +0900 Subject: mrb_get_args(i) should check range of float values --- src/class.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/class.c b/src/class.c index fe0a2b530..ee6cf78f4 100644 --- a/src/class.c +++ b/src/class.c @@ -542,7 +542,14 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) *p = mrb_fixnum(*sp); break; case MRB_TT_FLOAT: - *p = (mrb_int)mrb_float(*sp); + { + mrb_float f = mrb_float(*sp); + + if (!FIXABLE(f)) { + mrb_raise(mrb, E_RANGE_ERROR, "float too big for int"); + } + *p = (mrb_int)f; + } break; case MRB_TT_FALSE: *p = 0; -- cgit v1.2.3 From a6ebdc6580125847a79a455573bba32a92308bb9 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 14 Jun 2012 00:04:05 +0900 Subject: error message from mrb_convert_type has been changed --- src/object.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/object.c b/src/object.c index 817137d8e..c9ea3f8eb 100644 --- a/src/object.c +++ b/src/object.c @@ -350,8 +350,8 @@ mrb_convert_type(mrb_state *mrb, mrb_value val, mrb_int type, const char *tname, if (mrb_type(val) == type) return val; v = convert_type(mrb, val, tname, method, 1/*Qtrue*/); if (mrb_type(v) != type) { - mrb_raise(mrb, E_TYPE_ERROR, "%s#%s should return %s", - mrb_obj_classname(mrb, val), method, tname); + mrb_raise(mrb, E_TYPE_ERROR, "%s cannot be converted to %s by #%s", + mrb_obj_classname(mrb, val), tname, method); } return v; } -- cgit v1.2.3 From e2447d3530eb16ac343771b64ec5b1e59670a715 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 14 Jun 2012 00:41:14 +0900 Subject: add aspec for math.c methods --- src/math.c | 50 +++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/math.c b/src/math.c index 63daa58d1..48180a98f 100644 --- a/src/math.c +++ b/src/math.c @@ -644,35 +644,35 @@ mrb_init_math(mrb_state *mrb) mrb_define_const(mrb, mrb_math, "E", mrb_float_value(exp(1.0))); #endif - mrb_define_module_function(mrb, mrb_math, "sin", math_sin, 1); - mrb_define_module_function(mrb, mrb_math, "cos", math_cos, 1); - mrb_define_module_function(mrb, mrb_math, "tan", math_tan, 1); - - mrb_define_module_function(mrb, mrb_math, "asin", math_asin, 1); - mrb_define_module_function(mrb, mrb_math, "acos", math_acos, 1); - mrb_define_module_function(mrb, mrb_math, "atan", math_atan, 1); - mrb_define_module_function(mrb, mrb_math, "atan2", math_atan2, 2); + mrb_define_module_function(mrb, mrb_math, "sin", math_sin, ARGS_REQ(1)); + mrb_define_module_function(mrb, mrb_math, "cos", math_cos, ARGS_REQ(1)); + mrb_define_module_function(mrb, mrb_math, "tan", math_tan, ARGS_REQ(1)); + + mrb_define_module_function(mrb, mrb_math, "asin", math_asin, ARGS_REQ(1)); + mrb_define_module_function(mrb, mrb_math, "acos", math_acos, ARGS_REQ(1)); + mrb_define_module_function(mrb, mrb_math, "atan", math_atan, ARGS_REQ(1)); + mrb_define_module_function(mrb, mrb_math, "atan2", math_atan2, ARGS_REQ(2)); - mrb_define_module_function(mrb, mrb_math, "sinh", math_sinh, 1); - mrb_define_module_function(mrb, mrb_math, "cosh", math_cosh, 1); - mrb_define_module_function(mrb, mrb_math, "tanh", math_tanh, 1); + mrb_define_module_function(mrb, mrb_math, "sinh", math_sinh, ARGS_REQ(1)); + mrb_define_module_function(mrb, mrb_math, "cosh", math_cosh, ARGS_REQ(1)); + mrb_define_module_function(mrb, mrb_math, "tanh", math_tanh, ARGS_REQ(1)); - mrb_define_module_function(mrb, mrb_math, "asinh", math_asinh, 1); - mrb_define_module_function(mrb, mrb_math, "acosh", math_acosh, 1); - mrb_define_module_function(mrb, mrb_math, "atanh", math_atanh, 1); + mrb_define_module_function(mrb, mrb_math, "asinh", math_asinh, ARGS_REQ(1)); + mrb_define_module_function(mrb, mrb_math, "acosh", math_acosh, ARGS_REQ(1)); + mrb_define_module_function(mrb, mrb_math, "atanh", math_atanh, ARGS_REQ(1)); - mrb_define_module_function(mrb, mrb_math, "exp", math_exp, 1); - mrb_define_module_function(mrb, mrb_math, "log", math_log, -1); - mrb_define_module_function(mrb, mrb_math, "log2", math_log2, 1); - mrb_define_module_function(mrb, mrb_math, "log10", math_log10, 1); - mrb_define_module_function(mrb, mrb_math, "sqrt", math_sqrt, 1); - mrb_define_module_function(mrb, mrb_math, "cbrt", math_cbrt, 1); + mrb_define_module_function(mrb, mrb_math, "exp", math_exp, ARGS_REQ(1)); + mrb_define_module_function(mrb, mrb_math, "log", math_log, ARGS_REQ(1)|ARGS_OPT(1)); + mrb_define_module_function(mrb, mrb_math, "log2", math_log2, ARGS_REQ(1)); + mrb_define_module_function(mrb, mrb_math, "log10", math_log10, ARGS_REQ(1)); + mrb_define_module_function(mrb, mrb_math, "sqrt", math_sqrt, ARGS_REQ(1)); + mrb_define_module_function(mrb, mrb_math, "cbrt", math_cbrt, ARGS_REQ(1)); - mrb_define_module_function(mrb, mrb_math, "frexp", math_frexp, 1); - mrb_define_module_function(mrb, mrb_math, "ldexp", math_ldexp, 2); + mrb_define_module_function(mrb, mrb_math, "frexp", math_frexp, ARGS_REQ(1)); + mrb_define_module_function(mrb, mrb_math, "ldexp", math_ldexp, ARGS_REQ(2)); - mrb_define_module_function(mrb, mrb_math, "hypot", math_hypot, 2); + mrb_define_module_function(mrb, mrb_math, "hypot", math_hypot, ARGS_REQ(2)); - mrb_define_module_function(mrb, mrb_math, "erf", math_erf, 1); - mrb_define_module_function(mrb, mrb_math, "erfc", math_erfc, 1); + mrb_define_module_function(mrb, mrb_math, "erf", math_erf, ARGS_REQ(1)); + mrb_define_module_function(mrb, mrb_math, "erfc", math_erfc, ARGS_REQ(1)); } -- cgit v1.2.3 From 91a665905a8781373480f003c2e15cef9fa3604c Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 14 Jun 2012 00:41:33 +0900 Subject: Math.log to take optinal second argument --- src/math.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/math.c b/src/math.c index 48180a98f..1de9c0d8f 100644 --- a/src/math.c +++ b/src/math.c @@ -411,11 +411,14 @@ math_exp(mrb_state *mrb, mrb_value obj) static mrb_value math_log(mrb_state *mrb, mrb_value obj) { - mrb_float x; + mrb_float x, base; + int argc; - mrb_get_args(mrb, "f", &x); + argc = mrb_get_args(mrb, "f|f", &x, &base); x = log(x); - + if (argc == 2) { + d /= log(base); + } return mrb_float_value(x); } -- cgit v1.2.3 From 764a791f439bb843838239909d98b26ac90a9e02 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 14 Jun 2012 00:59:35 +0900 Subject: make Math module optional --- include/mrbconf.h | 13 ++++++++----- src/init.c | 2 ++ src/math.c | 3 +++ 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/include/mrbconf.h b/include/mrbconf.h index 5848eee1a..3744c1827 100644 --- a/include/mrbconf.h +++ b/include/mrbconf.h @@ -20,21 +20,24 @@ typedef double mrb_float; typedef int mrb_int; typedef intptr_t mrb_sym; -#undef PARSER_DUMP /* do not print out parser state */ //#define PARSER_DUMP /* print out parser state */ +#undef PARSER_DUMP /* do not print out parser state */ -#undef INCLUDE_ENCODING /* not use encoding classes (ascii only) */ //#define INCLUDE_ENCODING /* use UTF-8 encoding classes */ +#undef INCLUDE_ENCODING /* not use encoding classes (ascii only) */ -#undef INCLUDE_REGEXP /* not use regular expression classes */ //#define INCLUDE_REGEXP /* use regular expression classes */ +#undef INCLUDE_REGEXP /* not use regular expression classes */ #ifdef INCLUDE_REGEXP # define INCLUDE_ENCODING /* Regexp depends Encoding */ #endif -//#undef INCLUDE_KERNEL_SPRINTF /* not use Kernel.sprintf method. */ -#define INCLUDE_KERNEL_SPRINTF /* not use Kernel.sprintf method. */ +#define INCLUDE_KERNEL_SPRINTF /* not use Kernel.sprintf method */ +//#undef INCLUDE_KERNEL_SPRINTF /* not use Kernel.sprintf method */ + +#define INCLUDE_MATH /* use (non ISO) Math module */ +//#undef INCLUDE_MATH /* not use (non ISO) Math module */ #ifdef MRUBY_DEBUG_BUILD # define PARSER_DUMP diff --git a/src/init.c b/src/init.c index 17ce24313..1f7d4d364 100644 --- a/src/init.c +++ b/src/init.c @@ -57,7 +57,9 @@ mrb_init_core(mrb_state *mrb) mrb_init_exception(mrb); mrb_init_print(mrb); mrb_init_time(mrb); +#ifdef INCLUDE_MATH mrb_init_math(mrb); +#endif mrb_init_mrblib(mrb); diff --git a/src/math.c b/src/math.c index 1de9c0d8f..3898146b6 100644 --- a/src/math.c +++ b/src/math.c @@ -5,6 +5,8 @@ */ #include "mruby.h" + +#ifdef INCLUDE_MATH #include #define domain_error(msg) \ @@ -679,3 +681,4 @@ mrb_init_math(mrb_state *mrb) mrb_define_module_function(mrb, mrb_math, "erf", math_erf, ARGS_REQ(1)); mrb_define_module_function(mrb, mrb_math, "erfc", math_erfc, ARGS_REQ(1)); } +#endif /* INCLUDE_MATH */ -- cgit v1.2.3 From b4be82ccc1941df0a4dcbc0f0b9922798cf0cac4 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 14 Jun 2012 00:59:58 +0900 Subject: variable name typo fixed --- src/math.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/math.c b/src/math.c index 3898146b6..f3a2dc12c 100644 --- a/src/math.c +++ b/src/math.c @@ -419,7 +419,7 @@ math_log(mrb_state *mrb, mrb_value obj) argc = mrb_get_args(mrb, "f|f", &x, &base); x = log(x); if (argc == 2) { - d /= log(base); + x /= log(base); } return mrb_float_value(x); } -- cgit v1.2.3 From 90735a242fc67fdaffd9ccaef3c7e2ccbbbf1b1e Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 14 Jun 2012 01:00:34 +0900 Subject: mrb_define_{singleton,class}_method should prepare singleton class for the obejct --- src/class.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/class.c b/src/class.c index ee6cf78f4..9d89aef61 100644 --- a/src/class.c +++ b/src/class.c @@ -708,15 +708,16 @@ mrb_singleton_class(mrb_state *mrb, mrb_value v) } void -mrb_define_class_method(mrb_state *mrb, struct RClass *c, const char *name, mrb_func_t func, int aspec) +mrb_define_singleton_method(mrb_state *mrb, struct RObject *o, const char *name, mrb_func_t func, int aspec) { - mrb_define_method_id(mrb, c->c, mrb_intern(mrb, name), func, aspec); + o->c = mrb_singleton_class_ptr(mrb, o->c); + mrb_define_method_id(mrb, o->c, mrb_intern(mrb, name), func, aspec); } void -mrb_define_singleton_method(mrb_state *mrb, struct RObject *o, const char *name, mrb_func_t func, int aspec) +mrb_define_class_method(mrb_state *mrb, struct RClass *c, const char *name, mrb_func_t func, int aspec) { - mrb_define_method_id(mrb, mrb_singleton_class_ptr(mrb, o->c), mrb_intern(mrb, name), func, aspec); + mrb_define_singleton_method(mrb, (struct RObject*)c, name, func, aspec); } void -- cgit v1.2.3 From 6bdd257c42958b72aa257bfd686fe351708ea72e Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 14 Jun 2012 01:17:44 +0900 Subject: inspect format for exception has changed --- src/error.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/src/error.c b/src/error.c index ae89541c1..e83c71931 100644 --- a/src/error.c +++ b/src/error.c @@ -136,18 +136,13 @@ exc_inspect(mrb_state *mrb, mrb_value exc) { mrb_value str, klass; - klass = mrb_str_new2(mrb, mrb_obj_classname(mrb, exc)); + str = mrb_str_new2(mrb, mrb_obj_classname(mrb, exc)); exc = mrb_obj_as_string(mrb, exc); - if (RSTRING_LEN(exc) == 0) { - return klass; - } - - str = mrb_str_new2(mrb, "#<"); - mrb_str_append(mrb, str, klass); - mrb_str_cat2(mrb, str, ": "); - mrb_str_append(mrb, str, exc); - mrb_str_cat2(mrb, str, ">"); + if (RSTRING_LEN(exc) > 0) { + mrb_str_cat2(mrb, str, ": "); + mrb_str_append(mrb, str, exc); + } return str; } -- cgit v1.2.3 From df7be84dba8d972b47d1441056f077b7f1ec4c33 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 14 Jun 2012 01:18:07 +0900 Subject: add newline between functions --- src/error.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/error.c b/src/error.c index e83c71931..d0cbc91c3 100644 --- a/src/error.c +++ b/src/error.c @@ -218,6 +218,7 @@ mrb_name_error(mrb_state *mrb, mrb_sym id, const char *fmt, ...) exc = mrb_class_new_instance(mrb, 2, argv, E_NAME_ERROR); mrb_exc_raise(mrb, exc); } + mrb_value mrb_sprintf(mrb_state *mrb, const char *fmt, ...) { -- cgit v1.2.3 From 1156b0cc322cfb87b148b36aed23bac287ca328f Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 14 Jun 2012 01:18:49 +0900 Subject: update RDoc for #raise --- src/kernel.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/kernel.c b/src/kernel.c index 6f2c46e51..c47b5c4a5 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -1117,12 +1117,8 @@ get_errinfo(mrb_state *mrb) * raise * raise(string) * raise(exception [, string [, array]]) - * fail - * fail(string) - * fail(exception [, string [, array]]) * - * With no arguments, raises the exception in $! or raises - * a RuntimeError if $! is +nil+. + * With no arguments, raises a RuntimeError * With a single +String+ argument, raises a * +RuntimeError+ with the string as a message. Otherwise, * the first parameter should be the name of an +Exception+ -- cgit v1.2.3 From 54bc7e0721ffc6d5ad5a57f62306682e5044b265 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 14 Jun 2012 01:19:19 +0900 Subject: avoid accessing non-allocated memory; close #271 --- src/kernel.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/kernel.c b/src/kernel.c index c47b5c4a5..eef8dc7f0 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -1140,11 +1140,7 @@ mrb_f_raise(mrb_state *mrb, mrb_value self) mrb_get_args(mrb, "*", &argv, &argc); if (argc == 0) { - err = get_errinfo(mrb); - if (!mrb_nil_p(err)) { - argc = 1; - argv[0] = err; - } + mrb_raise(mrb, mrb->eRuntimeError_class, ""); } mrb_exc_raise(mrb, mrb_make_exception(mrb, argc, argv)); return mrb_nil_value(); /* not reached */ -- cgit v1.2.3 From b775bc771e8c6effbf583cadf5da270d3c016a15 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 14 Jun 2012 01:19:45 +0900 Subject: remove unused variable --- src/error.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/error.c b/src/error.c index d0cbc91c3..bb334322f 100644 --- a/src/error.c +++ b/src/error.c @@ -134,7 +134,7 @@ exc_message(mrb_state *mrb, mrb_value exc) static mrb_value exc_inspect(mrb_state *mrb, mrb_value exc) { - mrb_value str, klass; + mrb_value str; str = mrb_str_new2(mrb, mrb_obj_classname(mrb, exc)); exc = mrb_obj_as_string(mrb, exc); -- cgit v1.2.3 From 3b2ff6145e86d071ff99e552223e3b0eebee0fb0 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 14 Jun 2012 01:22:18 +0900 Subject: != should call == inside; close #268 --- src/kernel.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kernel.c b/src/kernel.c index eef8dc7f0..d9d98766d 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -191,7 +191,7 @@ mrb_obj_not_equal_m(mrb_state *mrb, mrb_value self) mrb_value arg; mrb_get_args(mrb, "o", &arg); - if (mrb_obj_equal(mrb, self, arg)) { + if (mrb_equal(mrb, self, arg)) { return mrb_false_value(); } else { -- cgit v1.2.3 From 6adaf3b80fd255668f4fe500afc4fd1d0dfad50b Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 14 Jun 2012 01:47:31 +0900 Subject: should invoke ensure clauses just before terminating mrb_sun; close #270 --- src/vm.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/vm.c b/src/vm.c index 3d4d0370b..ef3535d53 100644 --- a/src/vm.c +++ b/src/vm.c @@ -164,6 +164,7 @@ ecall(mrb_state *mrb, int i) struct RProc *p; mrb_callinfo *ci; mrb_value *self = mrb->stack; + struct RObject *exc; p = mrb->ensure[i]; ci = cipush(mrb); @@ -175,7 +176,9 @@ ecall(mrb_state *mrb, int i) ci->nregs = p->body.irep->nregs; ci->target_class = p->target_class; mrb->stack = mrb->stack + ci[-1].nregs; + exc = mrb->exc; mrb->exc = 0; mrb_run(mrb, p, *self); + mrb->exc = exc; } mrb_value @@ -999,13 +1002,18 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) L_RETURN: if (mrb->exc) { mrb_callinfo *ci; + int eidx; L_RAISE: ci = mrb->ci; + eidx = mrb->ci->eidx; if (ci == mrb->cibase) goto L_STOP; while (ci[0].ridx == ci[-1].ridx) { cipop(mrb); ci = mrb->ci; + while (eidx > mrb->ci->eidx) { + ecall(mrb, --eidx); + } if (ci == mrb->cibase) { if (ci->ridx == 0) { mrb->stack = mrb->stbase; @@ -1569,6 +1577,13 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) CASE(OP_STOP) { /* stop VM */ L_STOP: + { + int n = mrb->ci->eidx; + + while (n--) { + ecall(mrb, n); + } + } mrb->jmp = prev_jmp; if (mrb->exc) { return mrb_obj_value(mrb->exc); -- cgit v1.2.3 From f1ec5f5d50129499e659cff5bfb0b5598607729f Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 14 Jun 2012 03:11:21 +0900 Subject: use MKOP_sBx for OP_JMP --- src/codegen.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/codegen.c b/src/codegen.c index 63531eac1..2d747eabd 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -893,7 +893,7 @@ codegen(codegen_scope *s, node *tree, int val) } } while (n4); pos1 = new_label(s); - genop(s, MKOP_Bx(OP_JMP, 0)); + genop(s, MKOP_sBx(OP_JMP, 0)); dispatch_linked(s, pos2); pop(); @@ -904,7 +904,7 @@ codegen(codegen_scope *s, node *tree, int val) codegen(s, n3->cdr->cdr->car, val); } tmp = new_label(s); - genop(s, MKOP_AsBx(OP_JMP, cursp(), exend)); + genop(s, MKOP_sBx(OP_JMP, exend)); exend = tmp; n2 = n2->cdr; push(); -- cgit v1.2.3 From 30b19048595042be68bb01a64854ea284272cd93 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 14 Jun 2012 03:26:36 +0900 Subject: need to adjust register pos after rescue --- src/codegen.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/codegen.c b/src/codegen.c index 2d747eabd..10bf882a3 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -914,6 +914,7 @@ codegen(codegen_scope *s, node *tree, int val) genop(s, MKOP_A(OP_RAISE, exc)); } } + pop(); tree = tree->cdr; dispatch(s, noexc); genop(s, MKOP_A(OP_POPERR, 1)); -- cgit v1.2.3 From 36a1c80d3ce37c7b5202a4415e0a8ab8ebe677d6 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 14 Jun 2012 03:44:45 +0900 Subject: uvenv(): proc->env may be NULL be before uplevel --- src/vm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vm.c b/src/vm.c index ef3535d53..e229a4a54 100644 --- a/src/vm.c +++ b/src/vm.c @@ -94,8 +94,8 @@ uvenv(mrb_state *mrb, int up) { struct REnv *e = mrb->ci->proc->env; - if (!e) return 0; while (up--) { + if (!e) return 0; e = (struct REnv*)e->c; } return e; -- cgit v1.2.3 From 3fb20bc72aba82c7fb65530071ab32c62216dc81 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 14 Jun 2012 03:45:28 +0900 Subject: BLKPUSH (and super) need to detect surrounding method scope (not block) --- src/codegen.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/codegen.c b/src/codegen.c index 10bf882a3..1bdc2d21c 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -51,7 +51,8 @@ typedef struct scope { int sp; int pc; int lastlabel; - int ainfo; + int ainfo:15; + int mscope:1; struct loopinfo *loop; int ensure_level; @@ -448,6 +449,7 @@ lambda_body(codegen_scope *s, node *tree, int blk) s = scope_new(s->mrb, s, tree->car); idx = s->idx; + s->mscope = !blk; if (blk) { struct loopinfo *lp = loop_push(s, LOOP_BLOCK); @@ -1346,7 +1348,7 @@ codegen(codegen_scope *s, node *tree, int val) int lv = 0, ainfo = 0; push(); /* room for receiver */ - while (s2->ainfo < 0) { + while (!s2->mscope) { lv++; s2 = s2->prev; if (!s2) break; @@ -1381,7 +1383,7 @@ codegen(codegen_scope *s, node *tree, int val) int lv = 0, ainfo = 0; int n = 0, sendv = 0; - while (s2->ainfo < 0) { + while (!s2->mscope) { lv++; s2 = s2->prev; if (!s2) break; @@ -1916,6 +1918,7 @@ scope_new(mrb_state *mrb, codegen_scope *prev, node *lv) if (!prev) return p; p->prev = prev; p->ainfo = -1; + p->mscope = 0; p->mrb = prev->mrb; p->icapa = 1024; -- cgit v1.2.3 From 2eeaab4e81ea475d80af9d49cf333bb416fd666f Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 14 Jun 2012 04:44:02 +0900 Subject: do not offset jump from OP_ENTER if no optional argument given --- src/vm.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vm.c b/src/vm.c index e229a4a54..951c63b21 100644 --- a/src/vm.c +++ b/src/vm.c @@ -971,7 +971,9 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) if (r) { /* r */ regs[m1+o+1] = mrb_ary_new_capa(mrb, 0); } - pc += argc - m1 - m2 + 1; + if (o == 0) pc++; + else + pc += argc - m1 - m2 + 1; } else { memmove(®s[1], argv, sizeof(mrb_value)*(m1+o)); /* m1 + o */ -- cgit v1.2.3 From bd309f555a7fd999a4c21ba50a2fe4170b1df83f Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 14 Jun 2012 05:13:38 +0900 Subject: should not ignore variable-less rest parameter --- src/parse.y | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/parse.y b/src/parse.y index d31711b68..7b788e3d0 100644 --- a/src/parse.y +++ b/src/parse.y @@ -2797,7 +2797,8 @@ f_rest_arg : restarg_mark tIDENTIFIER } | restarg_mark { - $$ = 0; + local_add_f(p, 0); + $$ = -1; } ; -- cgit v1.2.3 From 73d7000b8f5c3f7d2cb12e03b0a431ec3636fe21 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 14 Jun 2012 05:15:08 +0900 Subject: remove .inspect from bs_block.rb tests --- test/t/bs_block.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/t/bs_block.rb b/test/t/bs_block.rb index b290cb914..084d3b30f 100644 --- a/test/t/bs_block.rb +++ b/test/t/bs_block.rb @@ -322,28 +322,28 @@ assert('BS Block [ruby-dev:31147]') do def m yield end - m{|&b| b}.inspect == 'nil' + m{|&b| b} == nil end assert('BS Block [ruby-dev:31160]') do def m() yield end - m {|(v,(*))|}.inspect == 'nil' + m {|(v,(*))|} == nil end assert('BS Block 31') do def m() yield end - m {|((*))|}.inspect == 'nil' + m {|((*))|} == nil end assert('BS Block [ruby-dev:31440]') do def m yield [0] end - m{|v, &b| v}.inspect == '[0]' + m{|v, &b| v} == [0] end assert('BS Block 32') do -- cgit v1.2.3 From 03d32796b44420fa07ac375a2e4768a5c5195235 Mon Sep 17 00:00:00 2001 From: "NARUSE, Yui" Date: Thu, 14 Jun 2012 07:52:58 +0900 Subject: Support mruby -e'p 1'. mruby supports already -e 'p 1' (-e, space, command), but hadn't supported no space version. --- tools/mruby/mruby.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/tools/mruby/mruby.c b/tools/mruby/mruby.c index 0e38879db..5cf3d8a37 100644 --- a/tools/mruby/mruby.c +++ b/tools/mruby/mruby.c @@ -51,12 +51,14 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args) memset(args, 0, sizeof(*args)); for (argc--,argv++; argc > 0; argc--,argv++) { + char *item; if (argv[0][0] != '-') break; if (strlen(*argv) <= 1) return -1; - switch ((*argv)[1]) { + item = argv[0] + 1; + switch (*item++) { case 'b': args->mrbfile = 1; break; @@ -64,19 +66,24 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args) args->check_syntax = 1; break; case 'e': - if (argc > 1) { + if (item[0]) { + goto append_cmdline; + } + else if (argc > 1) { argc--; argv++; + item = argv[0]; +append_cmdline: if (!args->cmdline) { char *buf; - buf = mrb_malloc(mrb, strlen(argv[0])+1); - strcpy(buf, argv[0]); + buf = mrb_malloc(mrb, strlen(item)+1); + strcpy(buf, item); args->cmdline = buf; } else { - args->cmdline = mrb_realloc(mrb, args->cmdline, strlen(args->cmdline)+strlen(argv[0])+2); + args->cmdline = mrb_realloc(mrb, args->cmdline, strlen(args->cmdline)+strlen(item)+2); strcat(args->cmdline, "\n"); - strcat(args->cmdline, argv[0]); + strcat(args->cmdline, item); } } else { -- cgit v1.2.3 From 0436596ba3ce12febe11d321bc7a9e515d2b63a0 Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Thu, 14 Jun 2012 11:00:18 +0900 Subject: Remove as err is already unused since applied 54bc7e0721ffc --- src/kernel.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/kernel.c b/src/kernel.c index d9d98766d..f6244cd68 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -1134,7 +1134,6 @@ get_errinfo(mrb_state *mrb) mrb_value mrb_f_raise(mrb_state *mrb, mrb_value self) { - mrb_value err; mrb_value *argv; int argc; -- cgit v1.2.3 From df55efd3739bd0e252f824322d4a022c35adcc1a Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Thu, 14 Jun 2012 17:38:47 +0900 Subject: Fix typo in parser around tLEQ --- src/parse.y | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/parse.y b/src/parse.y index 7b788e3d0..7ca0cda80 100644 --- a/src/parse.y +++ b/src/parse.y @@ -1512,7 +1512,7 @@ op : '|' { $$ = intern("|"); } | '>' { $$ = intern(">"); } | tGEQ { $$ = intern(">="); } | '<' { $$ = intern("<"); } - | tLEQ { $$ = intern(">="); } + | tLEQ { $$ = intern("<="); } | tNEQ { $$ = intern("!="); } | tLSHFT { $$ = intern("<<"); } | tRSHFT { $$ = intern(">>"); } -- cgit v1.2.3 From 587e0b0137234ee4d8b18430d41f7cf07569a732 Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Thu, 14 Jun 2012 17:47:29 +0900 Subject: Tests for Comparable. Still not all path coverage. --- test/t/comparable.rb | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 test/t/comparable.rb diff --git a/test/t/comparable.rb b/test/t/comparable.rb new file mode 100644 index 000000000..f3c03a9b5 --- /dev/null +++ b/test/t/comparable.rb @@ -0,0 +1,56 @@ + +assert('<', '15.3.3.2.1') do + class Foo + include Comparable + def <=>(x) + 0 + end + end + + (Foo.new < Foo.new) == false +end + +assert('<=', '15.3.3.2.2') do + class Foo + include Comparable + def <=>(x) + 0 + end + end + + (Foo.new <= Foo.new) == true +end + +assert('==', '15.3.3.2.3') do + class Foo + include Comparable + def <=>(x) + 0 + end + end + + (Foo.new == Foo.new) == true +end + +assert('>', '15.3.3.2.4') do + class Foo + include Comparable + def <=>(x) + 0 + end + end + + (Foo.new > Foo.new) == false +end + +assert('>=', '15.3.3.2.5') do + class Foo + include Comparable + def <=>(x) + 0 + end + end + + (Foo.new >= Foo.new) == true +end + -- cgit v1.2.3 From b43e790b717ff373ff1c41cc8e16ead7e825f61e Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Thu, 14 Jun 2012 18:02:01 +0900 Subject: Remove unused functions. --- src/compar.c | 35 ----------------------------------- src/range.c | 14 -------------- 2 files changed, 49 deletions(-) diff --git a/src/compar.c b/src/compar.c index 1502d450b..1614d2393 100644 --- a/src/compar.c +++ b/src/compar.c @@ -5,41 +5,6 @@ */ #include "mruby.h" -#include "mruby/string.h" -#include "mruby/numeric.h" - -void -mrb_cmperr(mrb_state *mrb, mrb_value x, mrb_value y) -{ - const char *classname; - - if (SPECIAL_CONST_P(y)) { - y = mrb_inspect(mrb, y); - classname = mrb_string_value_ptr(mrb, y); - } - else { - classname = mrb_obj_classname(mrb, y); - } - mrb_raise(mrb, E_ARGUMENT_ERROR, "comparison of %s with %s failed", - mrb_obj_classname(mrb, x), classname); -} - -int -mrb_cmpint(mrb_state *mrb, mrb_value val, mrb_value a, mrb_value b) -{ - if (mrb_nil_p(val)) { - mrb_cmperr(mrb, a, b); - } - if (FIXNUM_P(val)) { - long l = mrb_fixnum(val); - if (l > 0) return 1; - if (l < 0) return -1; - return 0; - } - if (mrb_test(mrb_funcall(mrb, val, ">", 1, mrb_fixnum_value(0)))) return 1; - if (mrb_test(mrb_funcall(mrb, val, "<", 1, mrb_fixnum_value(0)))) return -1; - return 0; -} void mrb_init_comparable(mrb_state *mrb) diff --git a/src/range.c b/src/range.c index b8b1d3926..acec1514e 100644 --- a/src/range.c +++ b/src/range.c @@ -201,11 +201,6 @@ r_le(mrb_state *mrb, mrb_value a, mrb_value b) if (mrb_nil_p(r)) return FALSE; - /* mrb_value -> int */ - //c = mrb_cmpint(mrb, r, a, b); - //if (c == 0) return TRUE; - //if (c < 0) return TRUE; - //return FALSE; if (mrb_obj_equal(mrb, r, mrb_fixnum_value(0))) return TRUE; if (mrb_obj_equal(mrb, r, mrb_fixnum_value(-1))) return TRUE; return FALSE; @@ -220,10 +215,6 @@ r_gt(mrb_state *mrb, mrb_value a, mrb_value b) if (mrb_nil_p(r)) return FALSE; - /* mrb_value -> int */ - //c = mrb_cmpint(mrb, r); - //if (c > 0) return TRUE; - //return FALSE; if (mrb_obj_equal(mrb, r, mrb_fixnum_value(1))) return TRUE; return FALSE; } @@ -237,11 +228,6 @@ r_ge(mrb_state *mrb, mrb_value a, mrb_value b) if (mrb_nil_p(r)) return FALSE; - /* mrb_value -> int */ - //c = mrb_cmpint(mrb, r); - //if (c == 0) return TRUE; - //if (c > 0) return TRUE; - //return FALSE; if (mrb_obj_equal(mrb, r, mrb_fixnum_value(0))) return TRUE; if (mrb_obj_equal(mrb, r, mrb_fixnum_value(1))) return TRUE; return FALSE; -- cgit v1.2.3 From 3fb9408669ac44f1e366d764262f65c452d4d907 Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Thu, 14 Jun 2012 18:28:05 +0900 Subject: Fix redundant declraration warnings by gcc. --- include/mruby.h | 1 - src/cdump.c | 1 - src/error.h | 2 -- 3 files changed, 4 deletions(-) diff --git a/include/mruby.h b/include/mruby.h index 167808b14..25fc96b53 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -481,7 +481,6 @@ mrb_value mrb_class_new_instance_m(mrb_state *mrb, mrb_value klass); #define xfree free #endif -void mrb_garbage_collect(mrb_state *mrb); void mrb_gc_protect(mrb_state *mrb, mrb_value obj); mrb_value mrb_to_int(mrb_state *mrb, mrb_value val); void mrb_check_type(mrb_state *mrb, mrb_value x, enum mrb_vtype t); diff --git a/src/cdump.c b/src/cdump.c index f9525d042..4f680d4f3 100644 --- a/src/cdump.c +++ b/src/cdump.c @@ -195,7 +195,6 @@ mrb_cdump_irep(mrb_state *mrb, int n, FILE *f,const char *initname) SOURCE_CODE0(" mrb->irep_len = idx;"); SOURCE_CODE0(""); - SOURCE_CODE0(" extern mrb_value mrb_top_self(mrb_state *mrb);"); SOURCE_CODE0(" mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb));"); SOURCE_CODE0("}"); diff --git a/src/error.h b/src/error.h index babf93a7d..8a86e7d3d 100644 --- a/src/error.h +++ b/src/error.h @@ -12,13 +12,11 @@ struct RException { }; void mrb_sys_fail(mrb_state *mrb, const char *mesg); -void mrb_exc_raise(mrb_state *mrb, mrb_value mesg); void mrb_bug_errno(const char*, int); int sysexit_status(mrb_state *mrb, mrb_value err); void error_pos(void); mrb_value mrb_exc_new3(mrb_state *mrb, struct RClass* c, mrb_value str); mrb_value make_exception(mrb_state *mrb, int argc, mrb_value *argv, int isstr); -mrb_value mrb_exc_new(mrb_state *mrb, struct RClass *c, const char *ptr, long len); mrb_value mrb_make_exception(mrb_state *mrb, int argc, mrb_value *argv); mrb_value mrb_sprintf(mrb_state *mrb, const char *fmt, ...); void mrb_name_error(mrb_state *mrb, mrb_sym id, const char *fmt, ...); -- cgit v1.2.3 From c7b1622f40bd7625eaebde228a2c4255488c4ee9 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 14 Jun 2012 23:19:15 +0900 Subject: remove get_errorinfo; close #275 --- src/kernel.c | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/kernel.c b/src/kernel.c index f6244cd68..4856af7ad 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -1092,24 +1092,6 @@ mrb_obj_public_methods(mrb_state *mrb, mrb_value self) return mrb_obj_methods(mrb, argc, argv, self, NOEX_PUBLIC); /* public attribute not define */ } -/* 15.3.1.2.11 */ -/* 15.3.1.3.39 */ -/* - * call-seq: - * puts(obj, ...) -> nil - * - * Equivalent to - * - * $stdout.puts(obj, ...) - */ - -static mrb_value -get_errinfo(mrb_state *mrb) -{ - //return get_thread_errinfo(GET_THREAD()); - return mrb_str_new_cstr(mrb, "error!!"); /* dummy */ -} - /* 15.3.1.2.12 */ /* 15.3.1.3.40 */ /* -- cgit v1.2.3 From f564ec7e822c55e8ef6973170818263675b2499f Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Fri, 15 Jun 2012 00:56:00 +0900 Subject: Remove some redundant code. --- src/codegen.c | 12 ------------ src/error.c | 30 ------------------------------ src/error.h | 1 - src/etc.c | 8 -------- src/hash.c | 8 -------- src/kernel.c | 13 ------------- src/load.c | 8 -------- src/object.c | 8 -------- src/parse.y | 8 -------- src/range.c | 8 -------- src/string.c | 2 +- src/variable.c | 8 -------- 12 files changed, 1 insertion(+), 113 deletions(-) diff --git a/src/codegen.c b/src/codegen.c index 1bdc2d21c..b64a18b96 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -298,20 +298,8 @@ push_(codegen_scope *s) s->sp++; nregs_update; } -#if 0 -static void -push_n_(codegen_scope *s, int n) -{ - if (s->sp + n > 511) { - codegen_error(s, "too complex expression"); - } - s->sp += n; - nregs_update; -} -#endif #define push() push_(s) -#define push_n(n) push_n_(s, n) #define pop() (s->sp--) #define pop_n(n) (s->sp-=(n)) #define cursp() (s->sp) diff --git a/src/error.c b/src/error.c index bb334322f..e6ccdf096 100644 --- a/src/error.c +++ b/src/error.c @@ -20,14 +20,6 @@ #define warn_printf printf -#ifndef FALSE -#define FALSE 0 -#endif - -#ifndef TRUE -#define TRUE 1 -#endif - mrb_value mrb_exc_new(mrb_state *mrb, struct RClass *c, const char *ptr, long len) { @@ -300,28 +292,6 @@ sysexit_status(mrb_state *mrb, mrb_value err) return mrb_fixnum(st); } -void -error_pos(void) -{ -#if 0 - const char *sourcefile = mrb_sourcefile(); - int sourceline = mrb_sourceline(); - - if (sourcefile) { - if (sourceline == 0) { - warn_printf("%s", sourcefile); - } - else if (mrb_frame_callee()) { - warn_printf("%s:%d:in `%s'", sourcefile, sourceline, - mrb_sym2name(mrb, mrb_frame_callee())); - } - else { - warn_printf("%s:%d", sourcefile, sourceline); - } - } -#endif -} - static void set_backtrace(mrb_state *mrb, mrb_value info, mrb_value bt) { diff --git a/src/error.h b/src/error.h index 8a86e7d3d..e4d6acb6c 100644 --- a/src/error.h +++ b/src/error.h @@ -14,7 +14,6 @@ struct RException { void mrb_sys_fail(mrb_state *mrb, const char *mesg); void mrb_bug_errno(const char*, int); int sysexit_status(mrb_state *mrb, mrb_value err); -void error_pos(void); mrb_value mrb_exc_new3(mrb_state *mrb, struct RClass* c, mrb_value str); 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); diff --git a/src/etc.c b/src/etc.c index 5d70c8bc7..40a00c1f5 100644 --- a/src/etc.c +++ b/src/etc.c @@ -10,14 +10,6 @@ #include "mruby/numeric.h" #include "mruby/data.h" -#ifndef FALSE -#define FALSE 0 -#endif - -#ifndef TRUE -#define TRUE 1 -#endif - struct RData* mrb_data_object_alloc(mrb_state *mrb, struct RClass *klass, void *ptr, const struct mrb_data_type *type) { diff --git a/src/hash.c b/src/hash.c index 4a85fcec3..fe5336dc1 100644 --- a/src/hash.c +++ b/src/hash.c @@ -33,14 +33,6 @@ mrb_hash_ht_hash_equal(mrb_state *mrb, mrb_value a, mrb_value b) KHASH_INIT(ht, mrb_value, mrb_value, 1, mrb_hash_ht_hash_func, mrb_hash_ht_hash_equal); -#ifndef FALSE -#define FALSE 0 -#endif - -#ifndef TRUE -#define TRUE 1 -#endif - static void mrb_hash_modify(mrb_state *mrb, mrb_value hash); static inline mrb_value diff --git a/src/kernel.c b/src/kernel.c index 4856af7ad..6dfe6be19 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -34,22 +34,9 @@ typedef enum { NOEX_RESPONDS = 0x80 } mrb_method_flag_t; -#ifdef INCLUDE_REGEXP -#include "re.h" -#include "regint.h" -#endif - KHASH_INIT(mt, mrb_sym, struct RProc*, 1, kh_int_hash_func, kh_int_hash_equal) KHASH_INIT(iv, mrb_sym, mrb_value, 1, kh_int_hash_func, kh_int_hash_equal) -#ifndef FALSE -#define FALSE 0 -#endif - -#ifndef TRUE -#define TRUE 1 -#endif - struct obj_ivar_tag { mrb_value obj; int (*func)(mrb_sym key, mrb_value val, void * arg); diff --git a/src/load.c b/src/load.c index 053ec2d7e..1f853df00 100644 --- a/src/load.c +++ b/src/load.c @@ -13,14 +13,6 @@ #endif #include "mruby/irep.h" -#ifndef FALSE -#define FALSE 0 -#endif - -#ifndef TRUE -#define TRUE 1 -#endif - typedef struct _RiteFILE { FILE* fp; diff --git a/src/object.c b/src/object.c index c9ea3f8eb..a30e7c58a 100644 --- a/src/object.c +++ b/src/object.c @@ -11,14 +11,6 @@ #include "mruby/class.h" #include "mruby/numeric.h" -#ifndef FALSE -#define FALSE 0 -#endif - -#ifndef TRUE -#define TRUE 1 -#endif - int mrb_obj_eq(mrb_state *mrb, mrb_value v1, mrb_value v2) { diff --git a/src/parse.y b/src/parse.y index 7ca0cda80..5e44dd85a 100644 --- a/src/parse.y +++ b/src/parse.y @@ -41,14 +41,6 @@ static void backref_error(parser_state *p, node *n); #define identchar(c) (isalnum(c) || (c) == '_' || !isascii(c)) -#ifndef TRUE -#define TRUE 1 -#endif - -#ifndef FALSE -#define FALSE 0 -#endif - typedef unsigned int stack_type; #define BITSTACK_PUSH(stack, n) ((stack) = ((stack)<<1)|((n)&1)) diff --git a/src/range.c b/src/range.c index acec1514e..a158dd920 100644 --- a/src/range.c +++ b/src/range.c @@ -15,14 +15,6 @@ #include #include -#ifndef FALSE -#define FALSE 0 -#endif - -#ifndef TRUE -#define TRUE 1 -#endif - #ifndef OTHER #define OTHER 2 #endif diff --git a/src/string.c b/src/string.c index 14041127a..a9e155c72 100644 --- a/src/string.c +++ b/src/string.c @@ -763,7 +763,7 @@ num_index: len = RSTRING_LEN(str); switch (mrb_range_beg_len(mrb, indx, &beg, &len, len, 0)) { - case 0/*FLASE*/: + case FALSE: break; case 2/*OTHER*/: return mrb_nil_value(); diff --git a/src/variable.c b/src/variable.c index b8957fb6a..47029da28 100644 --- a/src/variable.c +++ b/src/variable.c @@ -21,14 +21,6 @@ KHASH_INIT(iv, mrb_sym, mrb_value, 1, kh_int_hash_func, kh_int_hash_equal) -#ifndef FALSE -#define FALSE 0 -#endif - -#ifndef TRUE -#define TRUE 1 -#endif - static void mark_tbl(mrb_state *mrb, struct kh_iv *h) { -- cgit v1.2.3 From 56103509c89807c7498a4f91ed715a3e684b0b31 Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Fri, 15 Jun 2012 02:36:51 +0900 Subject: Remove as NotImplemenetedError is defined in mrblib/. --- src/error.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/error.c b/src/error.c index e6ccdf096..3585f1634 100644 --- a/src/error.c +++ b/src/error.c @@ -398,7 +398,6 @@ mrb_init_exception(mrb_state *mrb) // eScriptError = mrb_define_class(mrb, "ScriptError", mrb->eException_class); /* 15.2.37 */ // mrb_define_class(mrb, "SyntaxError", eScriptError); /* 15.2.38 */ // mrb_define_class(mrb, "LoadError", eScriptError); /* 15.2.39 */ - // mrb_define_class(mrb, "NotImplementedError", eScriptError_class); // mrb_define_class(mrb, "SystemCallError", mrb->eStandardError_class); /* 15.2.36 */ mrb_define_class(mrb, "LocalJumpError", mrb->eStandardError_class); /* 15.2.25 */ -- cgit v1.2.3 From 040b57fae5ab001fdb04271131dbe33a713170d8 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Fri, 15 Jun 2012 08:36:07 +0900 Subject: 1 % 0 should return NaN; close #283 --- src/numeric.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/numeric.c b/src/numeric.c index 746078fd9..de43dccba 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -767,12 +767,11 @@ static mrb_value fix_mod(mrb_state *mrb, mrb_value x) { mrb_value y; - mrb_int a; + mrb_int a, b; mrb_get_args(mrb, "o", &y); - a = mrb_fixnum(x); - if (FIXNUM_P(y)) { + if (FIXNUM_P(y) && (b=mrb_fixnum(y)) != 0) { mrb_int mod; fixdivmod(mrb, a, mrb_fixnum(y), 0, &mod); -- cgit v1.2.3 From 9983e1d77378dd55d0b0380df848a307d4669bff Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Fri, 15 Jun 2012 12:26:17 +0900 Subject: Remove unused funcions. --- src/error.c | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/src/error.c b/src/error.c index 3585f1634..d50c596cc 100644 --- a/src/error.c +++ b/src/error.c @@ -172,15 +172,6 @@ mrb_exc_raise(mrb_state *mrb, mrb_value exc) longjmp(*(jmp_buf*)mrb->jmp, 1); } -void -mrb_raise_va(mrb_state *mrb, struct RClass *c, const char *fmt, va_list args) -{ - char buf[256]; - - vsnprintf(buf, 256, fmt, args); - mrb_exc_raise(mrb, mrb_exc_new(mrb, c, buf, strlen(buf))); -} - void mrb_raise(mrb_state *mrb, struct RClass *c, const char *fmt, ...) { @@ -236,18 +227,6 @@ mrb_warn(const char *fmt, ...) } -void -mrb_warning(const char *fmt, ...) -{ - va_list args; - char buf[256]; - - va_start(args, fmt); - snprintf(buf, 256, "warning: %s", fmt); - printf(buf, args); - va_end(args); -} - void mrb_bug(const char *fmt, ...) { -- cgit v1.2.3 From ccec3da35bb2a6fff9fb58c30645b02692996f8b Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Fri, 15 Jun 2012 12:27:44 +0900 Subject: Use return value of vsnprintf() for the string length. It is redundant using strlen(). --- src/error.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/error.c b/src/error.c index d50c596cc..548527f07 100644 --- a/src/error.c +++ b/src/error.c @@ -177,11 +177,15 @@ mrb_raise(mrb_state *mrb, struct RClass *c, const char *fmt, ...) { va_list args; char buf[256]; + int n; va_start(args, fmt); - vsnprintf(buf, 256, fmt, args); + n = vsnprintf(buf, 256, fmt, args); va_end(args); - mrb_exc_raise(mrb, mrb_exc_new(mrb, c, buf, strlen(buf))); + if (n < 0) { + n = 0; + } + mrb_exc_raise(mrb, mrb_exc_new(mrb, c, buf, n)); } void @@ -190,12 +194,15 @@ mrb_name_error(mrb_state *mrb, mrb_sym id, const char *fmt, ...) mrb_value exc, argv[2]; va_list args; char buf[256]; + int n; va_start(args, fmt); - //argv[0] = mrb_vsprintf(fmt, args); - vsnprintf(buf, 256, fmt, args); - argv[0] = mrb_str_new(mrb, buf, strlen(buf)); + n = vsnprintf(buf, 256, fmt, args); va_end(args); + if (n < 0) { + n = 0; + } + argv[0] = mrb_str_new(mrb, buf, n); argv[1] = mrb_str_new_cstr(mrb, mrb_sym2name(mrb, id)); exc = mrb_class_new_instance(mrb, 2, argv, E_NAME_ERROR); @@ -207,11 +214,15 @@ mrb_sprintf(mrb_state *mrb, const char *fmt, ...) { va_list args; char buf[256]; + int n; va_start(args, fmt); - vsnprintf(buf, 256, fmt, args); + n = vsnprintf(buf, 256, fmt, args); va_end(args); - return mrb_str_new(mrb, buf, strlen(buf)); + if (n < 0) { + n = 0; + } + return mrb_str_new(mrb, buf, n); } void -- cgit v1.2.3 From cfd5f5157d06f9c62a04660843c3c02014d8a3a5 Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Fri, 15 Jun 2012 13:06:43 +0900 Subject: Move Subclasses of ScriptError to mrblib. --- mrblib/error.rb | 8 ++++++++ src/error.c | 3 --- test/t/exception.rb | 30 ++++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/mrblib/error.rb b/mrblib/error.rb index 3fa7f21e3..1cb2b1150 100644 --- a/mrblib/error.rb +++ b/mrblib/error.rb @@ -17,5 +17,13 @@ end class ScriptError < Exception end +# ISO 15.2.38 +class SyntaxError < ScriptError +end + +# ISO 15.2.39 +class LoadError < ScriptError +end + class NotImplementedError < ScriptError end diff --git a/src/error.c b/src/error.c index 548527f07..590fad5a5 100644 --- a/src/error.c +++ b/src/error.c @@ -385,9 +385,6 @@ mrb_init_exception(mrb_state *mrb) eNameError = mrb_define_class(mrb, "NameError", mrb->eStandardError_class); /* 15.2.31 */ mrb_define_class(mrb, "NoMethodError", eNameError); /* 15.2.32 */ - // eScriptError = mrb_define_class(mrb, "ScriptError", mrb->eException_class); /* 15.2.37 */ - // mrb_define_class(mrb, "SyntaxError", eScriptError); /* 15.2.38 */ - // mrb_define_class(mrb, "LoadError", eScriptError); /* 15.2.39 */ // mrb_define_class(mrb, "SystemCallError", mrb->eStandardError_class); /* 15.2.36 */ mrb_define_class(mrb, "LocalJumpError", mrb->eStandardError_class); /* 15.2.25 */ diff --git a/test/t/exception.rb b/test/t/exception.rb index 22795161f..d7226a368 100644 --- a/test/t/exception.rb +++ b/test/t/exception.rb @@ -41,6 +41,36 @@ assert('Exception.exception', '15.2.22.4.1') do e.message == 'a' end +assert('ScriptError', '15.2.37') do + begin + raise ScriptError.new + rescue ScriptError + true + else + false + end +end + +assert('SyntaxError', '15.2.38') do + begin + raise SyntaxError.new + rescue SyntaxError + true + else + false + end +end + +assert('LoadError', '15.2.39') do + begin + raise LoadError.new + rescue LoadError + true + else + false + end +end + # Not ISO specified assert('Exception 1') do -- cgit v1.2.3 From 39f47c191557ca401b6aaceb04b395227431b62f Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Fri, 15 Jun 2012 13:55:27 +0900 Subject: remove LoadError --- mrblib/error.rb | 4 ---- test/t/exception.rb | 12 +----------- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/mrblib/error.rb b/mrblib/error.rb index 1cb2b1150..5d49ec1e4 100644 --- a/mrblib/error.rb +++ b/mrblib/error.rb @@ -21,9 +21,5 @@ end class SyntaxError < ScriptError end -# ISO 15.2.39 -class LoadError < ScriptError -end - class NotImplementedError < ScriptError end diff --git a/test/t/exception.rb b/test/t/exception.rb index d7226a368..0aed0e2e6 100644 --- a/test/t/exception.rb +++ b/test/t/exception.rb @@ -24,7 +24,7 @@ end assert('Exception#message', '15.2.22.5.2') do e = Exception.exception('a') - + e.message == 'a' end @@ -61,16 +61,6 @@ assert('SyntaxError', '15.2.38') do end end -assert('LoadError', '15.2.39') do - begin - raise LoadError.new - rescue LoadError - true - else - false - end -end - # Not ISO specified assert('Exception 1') do -- cgit v1.2.3 From 195d1dd685124edf93735a751f8ec34a7bfe76c0 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Fri, 15 Jun 2012 14:03:02 +0900 Subject: do not use fixed sized buffer in mrb_bug/mrb_warn; close #287 --- include/mruby.h | 1 - src/error.c | 12 +++++------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/include/mruby.h b/include/mruby.h index 25fc96b53..94fb44ad2 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -428,7 +428,6 @@ int mrb_block_given_p(void); void mrb_raise(mrb_state *mrb, struct RClass *c, const char *fmt, ...); void rb_raise(struct RClass *c, const char *fmt, ...); void mrb_warn(const char *fmt, ...); -void mrb_warning(const char *fmt, ...); void mrb_bug(const char *fmt, ...); #define E_TYPE_ERROR (mrb_class_obj_get(mrb, "TypeError")) diff --git a/src/error.c b/src/error.c index 590fad5a5..3ef08a631 100644 --- a/src/error.c +++ b/src/error.c @@ -229,25 +229,23 @@ void mrb_warn(const char *fmt, ...) { va_list args; - char buf[256]; va_start(args, fmt); - snprintf(buf, 256, "warning: %s", fmt); - printf(buf, args); + printf("warning: "); + vprintf(fmt, args); va_end(args); } - void mrb_bug(const char *fmt, ...) { va_list args; - char buf[256]; va_start(args, fmt); - snprintf(buf, 256, "bug: %s", fmt); - printf(buf, args); + printf("bug: "); + vprintf(fmt, args); va_end(args); + exit(EXIT_FAILURE); } static const char * -- cgit v1.2.3 From 9e78fea7b3d2d0cb99d57913885fa48dc6843d09 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Fri, 15 Jun 2012 14:04:25 +0900 Subject: remove unreference Error class macros --- include/mruby.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/include/mruby.h b/include/mruby.h index 94fb44ad2..ef742cef4 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -438,13 +438,9 @@ void mrb_bug(const char *fmt, ...); #define E_NOMETHOD_ERROR (mrb_class_obj_get(mrb, "NoMethodError")) #define E_SCRIPT_ERROR (mrb_class_obj_get(mrb, "ScriptError")) #define E_SYNTAX_ERROR (mrb_class_obj_get(mrb, "SyntaxError")) -#define E_LOAD_ERROR (mrb_class_obj_get(mrb, "LoadError")) -#define E_SYSTEMCALL_ERROR (mrb_class_obj_get(mrb, "SystemCallError")) #define E_LOCALJUMP_ERROR (mrb_class_obj_get(mrb, "LocalJumpError")) #define E_REGEXP_ERROR (mrb_class_obj_get(mrb, "RegexpError")) -#define E_ZERODIVISION_ERROR (mrb_class_obj_get(mrb, "ZeroDivisionError")) -#define E_ENCODING_ERROR (mrb_class_obj_get(mrb, "EncodingError")) #define E_NOTIMP_ERROR (mrb_class_obj_get(mrb, "NotImplementedError")) #define E_FLOATDOMAIN_ERROR (mrb_class_obj_get(mrb, "FloatDomainError")) -- cgit v1.2.3 From 8c838de4a83956fec100e2da8dc4f49c4ace6298 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Fri, 15 Jun 2012 14:07:24 +0900 Subject: Time class made optinal --- include/mrbconf.h | 3 +++ src/init.c | 2 ++ src/time.c | 3 +++ 3 files changed, 8 insertions(+) diff --git a/include/mrbconf.h b/include/mrbconf.h index 3744c1827..f4f3ccaef 100644 --- a/include/mrbconf.h +++ b/include/mrbconf.h @@ -39,6 +39,9 @@ typedef intptr_t mrb_sym; #define INCLUDE_MATH /* use (non ISO) Math module */ //#undef INCLUDE_MATH /* not use (non ISO) Math module */ +#define INCLUDE_TIME /* use Time module */ +//#undef INCLUDE_TIME /* not use Time module */ + #ifdef MRUBY_DEBUG_BUILD # define PARSER_DUMP #endif diff --git a/src/init.c b/src/init.c index 1f7d4d364..13b074fd1 100644 --- a/src/init.c +++ b/src/init.c @@ -56,7 +56,9 @@ mrb_init_core(mrb_state *mrb) #endif mrb_init_exception(mrb); mrb_init_print(mrb); +#ifdef INCLUDE_TIME mrb_init_time(mrb); +#endif #ifdef INCLUDE_MATH mrb_init_math(mrb); #endif diff --git a/src/time.c b/src/time.c index 862ff57a9..1acde8ed9 100644 --- a/src/time.c +++ b/src/time.c @@ -6,6 +6,7 @@ #include "mruby.h" +#ifdef INCLUDE_TIME #include #include #include @@ -742,3 +743,5 @@ mrb_init_time(mrb_state *mrb) utc_offset(15.2.19.7.29) */ } +#endif + -- cgit v1.2.3 From 0ef76fdbde01f45d53ac1d5e8b998d3f4a78c037 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Fri, 15 Jun 2012 14:08:11 +0900 Subject: make init function consistent: mrb_init_symbols to mrb_init_symbol --- src/init.c | 4 ++-- src/symbol.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/init.c b/src/init.c index 13b074fd1..351874b32 100644 --- a/src/init.c +++ b/src/init.c @@ -8,7 +8,7 @@ void mrb_init_class(mrb_state*); void mrb_init_symtbl(mrb_state*); -void mrb_init_symbols(mrb_state*); +void mrb_init_symbol(mrb_state*); void mrb_init_object(mrb_state*); void mrb_init_kernel(mrb_state*); void mrb_init_enumerable(mrb_state*); @@ -42,7 +42,7 @@ mrb_init_core(mrb_state *mrb) mrb_init_comparable(mrb); mrb_init_enumerable(mrb); - mrb_init_symbols(mrb); + mrb_init_symbol(mrb); mrb_init_proc(mrb); mrb_init_string(mrb); mrb_init_array(mrb); diff --git a/src/symbol.c b/src/symbol.c index e1b9925eb..92ed58c23 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -363,7 +363,7 @@ mrb_sym2name(mrb_state *mrb, mrb_sym sym) } void -mrb_init_symbols(mrb_state *mrb) +mrb_init_symbol(mrb_state *mrb) { struct RClass *sym; -- cgit v1.2.3 From 4aa9111f9a107b3b0c6f1c13d933cbcd39f2a787 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Fri, 15 Jun 2012 14:45:03 +0900 Subject: escape codedump strings/symbols --- src/codegen.c | 43 ++++++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/src/codegen.c b/src/codegen.c index b64a18b96..e6c339521 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -2050,7 +2050,7 @@ codedump(mrb_state *mrb, int n) printf("OP_LOADI\tR%d\t%d\n", GETARG_A(c), GETARG_sBx(c)); break; case OP_LOADSYM: - printf("OP_LOADSYM\tR%d\t'%s'\n", GETARG_A(c), + printf("OP_LOADSYM\tR%d\t:%s\n", GETARG_A(c), mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)])); break; case OP_LOADNIL: @@ -2066,20 +2066,20 @@ codedump(mrb_state *mrb, int n) printf("OP_LOADF\tR%d\n", GETARG_A(c)); break; case OP_GETGLOBAL: - printf("OP_GETGLOBAL\tR%d\t'%s'\n", GETARG_A(c), + printf("OP_GETGLOBAL\tR%d\t:%s\n", GETARG_A(c), mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)])); break; case OP_SETGLOBAL: - printf("OP_SETGLOBAL\t'%s'\tR%d\n", + printf("OP_SETGLOBAL\t:%s\tR%d\n", mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)]), GETARG_A(c)); break; case OP_GETCONST: - printf("OP_GETCONST\tR%d\t'%s'\n", GETARG_A(c), + printf("OP_GETCONST\tR%d\t:%s\n", GETARG_A(c), mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)])); break; case OP_SETCONST: - printf("OP_SETCONST\t'%s'\tR%d\n", + printf("OP_SETCONST\t:%s\tR%d\n", mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)]), GETARG_A(c)); break; @@ -2128,7 +2128,7 @@ codedump(mrb_state *mrb, int n) printf("OP_JMPNOT\tR%d\t%03d\n", GETARG_A(c), i+GETARG_sBx(c)); break; case OP_SEND: - printf("OP_SEND\tR%d\t'%s'\t%d\n", GETARG_A(c), + printf("OP_SEND\tR%d\t:%s\t%d\n", GETARG_A(c), mrb_sym2name(mrb, irep->syms[GETARG_B(c)]), GETARG_C(c)); break; @@ -2183,52 +2183,52 @@ codedump(mrb_state *mrb, int n) printf("OP_RANGE\tR%d\tR%d\t%d\n", GETARG_A(c), GETARG_B(c), GETARG_C(c)); break; case OP_METHOD: - printf("OP_METHOD\tR%d\t'%s'\n", GETARG_A(c), + printf("OP_METHOD\tR%d\t:%s\n", GETARG_A(c), mrb_sym2name(mrb, irep->syms[GETARG_B(c)])); break; case OP_ADD: - printf("OP_ADD\tR%d\t'%s'\t%d\n", GETARG_A(c), + printf("OP_ADD\tR%d\t:%s\t%d\n", GETARG_A(c), mrb_sym2name(mrb, irep->syms[GETARG_B(c)]), GETARG_C(c)); break; case OP_SUB: - printf("OP_SUB\tR%d\t'%s'\t%d\n", GETARG_A(c), + printf("OP_SUB\tR%d\t:%s\t%d\n", GETARG_A(c), mrb_sym2name(mrb, irep->syms[GETARG_B(c)]), GETARG_C(c)); break; case OP_MUL: - printf("OP_MUL\tR%d\t'%s'\t%d\n", GETARG_A(c), + printf("OP_MUL\tR%d\t:%s\t%d\n", GETARG_A(c), mrb_sym2name(mrb, irep->syms[GETARG_B(c)]), GETARG_C(c)); break; case OP_DIV: - printf("OP_DIV\tR%d\t'%s'\t%d\n", GETARG_A(c), + printf("OP_DIV\tR%d\t:%s\t%d\n", GETARG_A(c), mrb_sym2name(mrb, irep->syms[GETARG_B(c)]), GETARG_C(c)); break; case OP_LT: - printf("OP_LT\tR%d\t'%s'\t%d\n", GETARG_A(c), + printf("OP_LT\tR%d\t:%s\t%d\n", GETARG_A(c), mrb_sym2name(mrb, irep->syms[GETARG_B(c)]), GETARG_C(c)); break; case OP_LE: - printf("OP_LE\tR%d\t'%s'\t%d\n", GETARG_A(c), + printf("OP_LE\tR%d\t:%s\t%d\n", GETARG_A(c), mrb_sym2name(mrb, irep->syms[GETARG_B(c)]), GETARG_C(c)); break; case OP_GT: - printf("OP_GT\tR%d\t'%s'\t%d\n", GETARG_A(c), + printf("OP_GT\tR%d\t:%s\t%d\n", GETARG_A(c), mrb_sym2name(mrb, irep->syms[GETARG_B(c)]), GETARG_C(c)); break; case OP_GE: - printf("OP_GE\tR%d\t'%s'\t%d\n", GETARG_A(c), + printf("OP_GE\tR%d\t:%s\t%d\n", GETARG_A(c), mrb_sym2name(mrb, irep->syms[GETARG_B(c)]), GETARG_C(c)); break; case OP_EQ: - printf("OP_EQ\tR%d\t'%s'\t%d\n", GETARG_A(c), + printf("OP_EQ\tR%d\t:%s\t%d\n", GETARG_A(c), mrb_sym2name(mrb, irep->syms[GETARG_B(c)]), GETARG_C(c)); break; @@ -2253,7 +2253,12 @@ codedump(mrb_state *mrb, int n) printf("OP_APOST\tR%d\t%d\t%d\n", GETARG_A(c), GETARG_B(c), GETARG_C(c)); break; case OP_STRING: - printf("OP_STRING\tR%d\t'%s'\n", GETARG_A(c), RSTRING_PTR(irep->pool[GETARG_Bx(c)])); + { + mrb_value s = irep->pool[GETARG_Bx(c)]; + + s = mrb_str_dump(mrb, s); + printf("OP_STRING\tR%d\t%s\n", GETARG_A(c), RSTRING_PTR(s)); + } break; case OP_STRCAT: printf("OP_STRCAT\tR%d\tR%d\n", GETARG_A(c), GETARG_B(c)); @@ -2266,11 +2271,11 @@ codedump(mrb_state *mrb, int n) printf("OP_OCLASS\tR%d\n", GETARG_A(c)); break; case OP_CLASS: - printf("OP_CLASS\tR%d\t'%s'\n", GETARG_A(c), + printf("OP_CLASS\tR%d\t:%s\n", GETARG_A(c), mrb_sym2name(mrb, irep->syms[GETARG_B(c)])); break; case OP_MODULE: - printf("OP_MODULE\tR%d\t'%s'\n", GETARG_A(c), + printf("OP_MODULE\tR%d\t:%s\n", GETARG_A(c), mrb_sym2name(mrb, irep->syms[GETARG_B(c)])); break; case OP_EXEC: -- cgit v1.2.3 From 76f7aecff326666543d9bac31fe13e0cab8e05f4 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Fri, 15 Jun 2012 15:34:49 +0900 Subject: use ENABLE/DISABLE instead of INCLUDE for configuration macro names --- include/mrbconf.h | 50 ++++++++++++++++---------------- include/mruby/class.h | 9 +----- src/dump.c | 6 ++-- src/gc.c | 8 +++--- src/init.c | 6 ++-- src/load.c | 4 +-- src/math.c | 4 +-- src/parse.y | 6 ---- src/re.c | 8 +++--- src/regcomp.c | 8 +++--- src/regerror.c | 4 +-- src/regexec.c | 4 +-- src/regparse.c | 8 +++--- src/string.c | 80 +++++++++++++++++++++++++-------------------------- src/struct.c | 2 +- src/time.c | 3 +- src/variable.c | 2 +- 17 files changed, 98 insertions(+), 114 deletions(-) diff --git a/include/mrbconf.h b/include/mrbconf.h index f4f3ccaef..4b778e6de 100644 --- a/include/mrbconf.h +++ b/include/mrbconf.h @@ -8,8 +8,21 @@ #define MRUBYCONF_H #include + +/* configuration options: */ +/* add -DMRB_USE_FLOAT to use float instead of double for floating point numbers */ #undef MRB_USE_FLOAT +/* -DDISABLE_XXXX to change to drop the feature */ +#define DISABLE_REGEXP /* regular expression classes */ +#undef DISABLE_KERNEL_SPRINTF /* Kernel.sprintf method */ +#undef DISABLE_MATH /* Math functions */ +#undef DISABLE_TIME /* Time class */ + +#undef HAVE_UNISTD_H /* WINDOWS */ +#define HAVE_UNISTD_H /* LINUX */ +/* end of configuration */ + #ifdef MRB_USE_FLOAT typedef float mrb_float; #else @@ -20,34 +33,19 @@ typedef double mrb_float; typedef int mrb_int; typedef intptr_t mrb_sym; -//#define PARSER_DUMP /* print out parser state */ -#undef PARSER_DUMP /* do not print out parser state */ - -//#define INCLUDE_ENCODING /* use UTF-8 encoding classes */ -#undef INCLUDE_ENCODING /* not use encoding classes (ascii only) */ - -//#define INCLUDE_REGEXP /* use regular expression classes */ -#undef INCLUDE_REGEXP /* not use regular expression classes */ - -#ifdef INCLUDE_REGEXP -# define INCLUDE_ENCODING /* Regexp depends Encoding */ +/* define ENABLE_XXXX from DISABLE_XXX */ +#ifndef DISABLE_REGEXP +#define ENABLE_REGEXP #endif - -#define INCLUDE_KERNEL_SPRINTF /* not use Kernel.sprintf method */ -//#undef INCLUDE_KERNEL_SPRINTF /* not use Kernel.sprintf method */ - -#define INCLUDE_MATH /* use (non ISO) Math module */ -//#undef INCLUDE_MATH /* not use (non ISO) Math module */ - -#define INCLUDE_TIME /* use Time module */ -//#undef INCLUDE_TIME /* not use Time module */ - -#ifdef MRUBY_DEBUG_BUILD -# define PARSER_DUMP +#ifndef DISABLE_KERNEL_SPRINTF +#define ENABLE_KERNEL_SPRINTF +#endif +#ifndef DISABLE_MATH +#define ENABLE_MATH +#endif +#ifndef DISABLE_TIME +#define ENABLE_TIME #endif - -#undef HAVE_UNISTD_H /* WINDOWS */ -#define HAVE_UNISTD_H /* LINUX */ #ifndef FALSE # define FALSE 0 diff --git a/include/mruby/class.h b/include/mruby/class.h index 35dd0ec1d..2cc90310e 100644 --- a/include/mruby/class.h +++ b/include/mruby/class.h @@ -40,14 +40,7 @@ mrb_class(mrb_state *mrb, mrb_value v) case MRB_TT_FLOAT: return mrb->float_class; -#ifdef INCLUDE_REGEXP -// case MRB_TT_REGEX: -// return mrb->regex_class; -// case MRB_TT_MATCH: -// return mrb->match_class; -// case MRB_TT_DATA: -// return mrb->encode_class; -#else +#ifdef ENABLE_REGEXP case MRB_TT_REGEX: case MRB_TT_MATCH: mrb_raise(mrb, E_TYPE_ERROR, "type mismatch: %s given", diff --git a/src/dump.c b/src/dump.c index 7b2199a02..daf2868f1 100644 --- a/src/dump.c +++ b/src/dump.c @@ -8,7 +8,7 @@ #include "mruby/dump.h" #include "mruby/string.h" -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP #include "re.h" #endif #include "mruby/irep.h" @@ -237,7 +237,7 @@ get_pool_block_size(mrb_state *mrb, mrb_irep *irep, int type) nlen = str_dump_len(RSTRING_PTR(str), RSTRING_LEN(str), type); size += nlen; break; -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP case MRB_TT_REGEX: str = mrb_reg_to_s(mrb, irep->pool[pool_no]); nlen = str_dump_len(RSTRING_PTR(str), RSTRING_LEN(str), type); @@ -365,7 +365,7 @@ write_pool_block(mrb_state *mrb, mrb_irep *irep, char *buf, int type) str_dump(RSTRING_PTR(str), char_buf, RSTRING_LEN(str), type); break; -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP case MRB_TT_REGEX: str = mrb_reg_to_s(mrb, irep->pool[pool_no]); nlen = str_dump_len(RSTRING_PTR(str), RSTRING_LEN(str), type); diff --git a/src/gc.c b/src/gc.c index 1b4b3eed4..c07c9b13b 100644 --- a/src/gc.c +++ b/src/gc.c @@ -71,7 +71,7 @@ */ -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP #include "re.h" #endif @@ -92,7 +92,7 @@ typedef struct { struct RRange range; struct RStruct structdata; struct RProc procdata; -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP struct RMatch match; struct RRegexp regexp; #endif @@ -412,7 +412,7 @@ gc_mark_children(mrb_state *mrb, struct RBasic *obj) } break; -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP case MRB_TT_MATCH: { struct RMatch *m = (struct RMatch*)obj; @@ -611,7 +611,7 @@ gc_gray_mark(mrb_state *mrb, struct RBasic *obj) children+=2; break; -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP case MRB_TT_MATCH: children+=2; break; diff --git a/src/init.c b/src/init.c index 351874b32..a515ee880 100644 --- a/src/init.c +++ b/src/init.c @@ -51,15 +51,15 @@ mrb_init_core(mrb_state *mrb) mrb_init_range(mrb); mrb_init_struct(mrb); mrb_init_gc(mrb); -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP mrb_init_regexp(mrb); #endif mrb_init_exception(mrb); mrb_init_print(mrb); -#ifdef INCLUDE_TIME +#ifdef ENABLE_TIME mrb_init_time(mrb); #endif -#ifdef INCLUDE_MATH +#ifdef ENABLE_MATH mrb_init_math(mrb); #endif diff --git a/src/load.c b/src/load.c index 1f853df00..d3766da9d 100644 --- a/src/load.c +++ b/src/load.c @@ -8,7 +8,7 @@ #include "mruby/dump.h" #include "mruby/string.h" -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP #include "re.h" #endif #include "mruby/irep.h" @@ -418,7 +418,7 @@ read_rite_irep_record(mrb_state *mrb, unsigned char *src, mrb_irep *irep, uint32 irep->pool[i] = mrb_str_new(mrb, buf, pdl); break; -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP case MRB_TT_REGEX: str = mrb_str_new(mrb, buf, pdl); irep->pool[i] = mrb_reg_quote(mrb, str); diff --git a/src/math.c b/src/math.c index f3a2dc12c..cf9a20489 100644 --- a/src/math.c +++ b/src/math.c @@ -6,7 +6,7 @@ #include "mruby.h" -#ifdef INCLUDE_MATH +#ifdef ENABLE_MATH #include #define domain_error(msg) \ @@ -681,4 +681,4 @@ mrb_init_math(mrb_state *mrb) mrb_define_module_function(mrb, mrb_math, "erf", math_erf, ARGS_REQ(1)); mrb_define_module_function(mrb, mrb_math, "erfc", math_erfc, ARGS_REQ(1)); } -#endif /* INCLUDE_MATH */ +#endif /* ENABLE_MATH */ diff --git a/src/parse.y b/src/parse.y index 5e44dd85a..b7eaaa4e4 100644 --- a/src/parse.y +++ b/src/parse.y @@ -4776,9 +4776,6 @@ mrb_compile_file(mrb_state * mrb, FILE *f) if (!p) return -1; if (!p->tree) return -1; if (p->nerr) return -1; -#ifdef PARSER_DUMP - parser_dump(mrb, p->tree, 0); -#endif n = mrb_generate_code(mrb, p->tree); mrb_pool_close(p->pool); @@ -4795,9 +4792,6 @@ mrb_compile_nstring(mrb_state *mrb, char *s, size_t len) if (!p) return -1; if (!p->tree) return -1; if (p->nerr) return -1; -#ifdef PARSER_DUMP - parser_dump(mrb, p->tree, 0); -#endif n = mrb_generate_code(mrb, p->tree); mrb_pool_close(p->pool); diff --git a/src/re.c b/src/re.c index b4134c81c..17b4f3da7 100644 --- a/src/re.c +++ b/src/re.c @@ -13,7 +13,7 @@ #include "regint.h" #include "mruby/class.h" #include "error.h" -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP #define REGEX_CLASS (mrb_class_obj_get(mrb, "Regexp")) #define MATCH_CLASS (mrb_class_obj_get(mrb, "MatchData")) @@ -2318,7 +2318,7 @@ mrb_backref_set(mrb_state *mrb, mrb_value val) { vm_svar_set(mrb, 1, val); } -#endif //INCLUDE_REGEXP +#endif //ENABLE_REGEXP #ifdef INCLUDE_ENCODING static inline long @@ -2421,7 +2421,7 @@ mrb_memsearch(mrb_state *mrb, const void *x0, int m, const void *y0, int n, mrb_ } #endif //INCLUDE_ENCODING -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP mrb_value mrb_reg_init_str(mrb_state *mrb, mrb_value re, mrb_value s, int options) { @@ -2469,7 +2469,7 @@ re_adjust_startpos(struct re_pattern_buffer *bufp, const char *string, int size, }*/ return startpos; } -#endif //INCLUDE_REGEXP +#endif //ENABLE_REGEXP #ifdef INCLUDE_ENCODING static const unsigned char mbctab_ascii[] = { diff --git a/src/regcomp.c b/src/regcomp.c index 523124b26..b8c652999 100644 --- a/src/regcomp.c +++ b/src/regcomp.c @@ -30,7 +30,7 @@ #include "mruby.h" #include #include "regparse.h" -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP OnigCaseFoldType OnigDefaultCaseFoldFlag = ONIGENC_CASE_FOLD_MIN; @@ -5628,7 +5628,7 @@ onig_end(void) THREAD_SYSTEM_END; return 0; } -#endif //INCLUDE_REGEXP +#endif //ENABLE_REGEXP #ifdef INCLUDE_ENCODING extern int @@ -5653,7 +5653,7 @@ onig_is_in_code_range(const UChar* p, OnigCodePoint code) } #endif //INCLUDE_ENCODING -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP extern int onig_is_code_in_cc_len(int elen, OnigCodePoint code, CClassNode* cc) { @@ -6285,4 +6285,4 @@ print_tree(FILE* f, Node* node) print_indent_tree(f, node, 0); } #endif -#endif //INCLUDE_REGEXP +#endif //ENABLE_REGEXP diff --git a/src/regerror.c b/src/regerror.c index 2ba879f78..df60b49cc 100644 --- a/src/regerror.c +++ b/src/regerror.c @@ -28,7 +28,7 @@ */ #include "mruby.h" -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP #include #include "regint.h" #include /* for vsnprintf() */ @@ -372,4 +372,4 @@ onig_snprintf_with_pattern(UChar buf[], int bufsize, OnigEncoding enc, pat, pat_end, fmt, args); va_end(args); } -#endif //INCLUDE_REGEXP +#endif //ENABLE_REGEXP diff --git a/src/regexec.c b/src/regexec.c index 4d8950b73..d265cc803 100644 --- a/src/regexec.c +++ b/src/regexec.c @@ -28,7 +28,7 @@ */ #include "mruby.h" -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP #include #include "regint.h" @@ -3754,4 +3754,4 @@ onig_copy_encoding(OnigEncoding to, OnigEncoding from) { *to = *from; } -#endif //INCLUDE_REGEXP +#endif //ENABLE_REGEXP diff --git a/src/regparse.c b/src/regparse.c index 509740ac3..f7bb23306 100644 --- a/src/regparse.c +++ b/src/regparse.c @@ -32,7 +32,7 @@ #include #include "regparse.h" #include -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP #define WARN_BUFSIZE 256 @@ -298,7 +298,7 @@ strcat_capa_from_static(UChar* dest, UChar* dest_end, onig_strcpy(r + (dest_end - dest), src, src_end); return r; } -#endif //INCLUDE_REGEXP +#endif //ENABLE_REGEXP #ifdef INCLUDE_ENCODING #ifdef USE_ST_LIBRARY @@ -393,7 +393,7 @@ onig_st_insert_strend(hash_table_type* table, const UChar* str_key, #endif /* USE_ST_LIBRARY */ #endif //INCLUDE_ENCODING -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP #ifdef USE_NAMED_GROUP #define INIT_NAME_BACKREFS_ALLOC_NUM 8 @@ -5597,4 +5597,4 @@ onig_scan_env_set_error_string(ScanEnv* env, int ecode ARG_UNUSED, env->error = arg; env->error_end = arg_end; } -#endif //INCLUDE_REGEXP +#endif //ENABLE_REGEXP diff --git a/src/string.c b/src/string.c index a9e155c72..566c056cf 100644 --- a/src/string.c +++ b/src/string.c @@ -17,10 +17,10 @@ #include "mruby/variable.h" #include #include "re.h" -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP #include "regex.h" #include "st.h" -#endif //INCLUDE_REGEXP +#endif //ENABLE_REGEXP #ifndef FALSE #define FALSE 0 @@ -32,9 +32,9 @@ const char mrb_digitmap[] = "0123456789abcdefghijklmnopqrstuvwxyz"; -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP static mrb_value get_pat(mrb_state *mrb, mrb_value pat, mrb_int quote); -#endif //INCLUDE_REGEXP +#endif //ENABLE_REGEXP static mrb_value str_replace(mrb_state *mrb, struct RString *s1, struct RString *s2); static mrb_value mrb_str_subseq(mrb_state *mrb, mrb_value str, int beg, int len); @@ -743,12 +743,12 @@ num_index: return str; case MRB_TT_REGEX: -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP return mrb_str_subpat(mrb, str, indx, 0); //mrb_str_subpat(str, indx, INT2FIX(0)); #else mrb_raise(mrb, E_TYPE_ERROR, "Regexp Class not supported"); return mrb_nil_value(); -#endif //INCLUDE_REGEXP +#endif //ENABLE_REGEXP case MRB_TT_STRING: if (mrb_str_index(mrb, str, indx, 0) != -1) @@ -835,12 +835,12 @@ mrb_str_aref_m(mrb_state *mrb, mrb_value str) argc = mrb_get_args(mrb, "o|o", &a1, &a2); if (argc == 2) { if (mrb_type(a1) == MRB_TT_REGEX) { -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP return mrb_str_subpat(mrb, str, argv[0], mrb_fixnum(argv[1])); #else mrb_raise(mrb, E_TYPE_ERROR, "Regexp Class not supported"); return mrb_nil_value(); -#endif //INCLUDE_REGEXP +#endif //ENABLE_REGEXP } return mrb_str_substr(mrb, str, mrb_fixnum(a1), mrb_fixnum(a2)); } @@ -1246,7 +1246,7 @@ mrb_str_buf_append(mrb_state *mrb, mrb_value str, mrb_value str2) return str; } -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP static mrb_value str_gsub(mrb_state *mrb, mrb_value str, mrb_int bang) { @@ -1383,7 +1383,7 @@ mrb_str_gsub_bang(mrb_state *mrb, mrb_value self) str_modify(mrb, s); return str_gsub(mrb, s, 1); } -#endif //INCLUDE_REGEXP +#endif //ENABLE_REGEXP mrb_int mrb_str_hash(mrb_state *mrb, mrb_value str) @@ -1506,7 +1506,7 @@ mrb_str_index_m(mrb_state *mrb, mrb_value str) switch (mrb_type(sub)) { case MRB_TT_REGEX: -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP if (pos > RSTRING_LEN(str)) return mrb_nil_value(); pos = mrb_str_offset(mrb, str, pos); @@ -1514,7 +1514,7 @@ mrb_str_index_m(mrb_state *mrb, mrb_value str) pos = mrb_str_sublen(mrb, str, pos); #else mrb_raise(mrb, E_TYPE_ERROR, "Regexp Class not supported"); -#endif //INCLUDE_REGEXP +#endif //ENABLE_REGEXP break; case MRB_TT_FIXNUM: { @@ -1668,7 +1668,7 @@ mrb_check_string_type(mrb_state *mrb, mrb_value str) return mrb_check_convert_type(mrb, str, MRB_TT_STRING, "String", "to_str"); } -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP static mrb_value get_pat(mrb_state *mrb, mrb_value pat, mrb_int quote) { @@ -1696,7 +1696,7 @@ get_pat(mrb_state *mrb, mrb_value pat, mrb_int quote) return mrb_reg_regcomp(mrb, pat); } -#endif //INCLUDE_REGEXP +#endif //ENABLE_REGEXP /* 15.2.10.5.27 */ /* @@ -1711,7 +1711,7 @@ get_pat(mrb_state *mrb, mrb_value pat, mrb_int quote) * 'hello'.match(/(.)\1/)[0] #=> "ll" * 'hello'.match('xx') #=> nil */ -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP static mrb_value mrb_str_match_m(mrb_state *mrb, mrb_value self) { @@ -1731,7 +1731,7 @@ mrb_str_match_m(mrb_state *mrb, mrb_value self) } return result; } -#endif //INCLUDE_REGEXP +#endif //ENABLE_REGEXP /* ---------------------------------- */ /* 15.2.10.5.29 */ @@ -1883,11 +1883,11 @@ mrb_str_rindex_m(mrb_state *mrb, mrb_value str) pos += len; if (pos < 0) { if (mrb_type(sub) == MRB_TT_REGEX) { -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP mrb_backref_set(mrb, mrb_nil_value()); #else mrb_raise(mrb, E_TYPE_ERROR, "Regexp Class not supported"); -#endif //INCLUDE_REGEXP +#endif //ENABLE_REGEXP } return mrb_nil_value(); } @@ -1904,7 +1904,7 @@ mrb_str_rindex_m(mrb_state *mrb, mrb_value str) switch (mrb_type(sub)) { case MRB_TT_REGEX: -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP pos = mrb_str_offset(mrb, str, pos); if (!RREGEXP(sub)->ptr || RREGEXP_SRC_LEN(sub)) { pos = mrb_reg_search(mrb, sub, str, pos, 1); @@ -1913,7 +1913,7 @@ mrb_str_rindex_m(mrb_state *mrb, mrb_value str) if (pos >= 0) return mrb_fixnum_value(pos); #else mrb_raise(mrb, E_TYPE_ERROR, "Regexp Class not supported"); -#endif //INCLUDE_REGEXP +#endif //ENABLE_REGEXP break; case MRB_TT_FIXNUM: { @@ -1947,7 +1947,7 @@ mrb_str_rindex_m(mrb_state *mrb, mrb_value str) return mrb_nil_value(); } -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP static mrb_value scan_once(mrb_state *mrb, mrb_value str, mrb_value pat, mrb_int *start) { @@ -1986,7 +1986,7 @@ scan_once(mrb_state *mrb, mrb_value str, mrb_value pat, mrb_int *start) } return mrb_nil_value(); } -#endif //INCLUDE_REGEXP +#endif //ENABLE_REGEXP /* 15.2.10.5.32 */ /* @@ -2019,7 +2019,7 @@ scan_once(mrb_state *mrb, mrb_value str, mrb_value pat, mrb_int *start) * <> <> * rceu lowlr */ -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP static mrb_value mrb_str_scan(mrb_state *mrb, mrb_value str) { @@ -2053,7 +2053,7 @@ mrb_str_scan(mrb_state *mrb, mrb_value str) mrb_backref_set(mrb, match); return str; } -#endif //INCLUDE_REGEXP +#endif //ENABLE_REGEXP static const char isspacetable[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, @@ -2146,28 +2146,28 @@ mrb_str_split_m(mrb_state *mrb, mrb_value str) //fs_set: if (mrb_type(spat) == MRB_TT_STRING) { split_type = string; -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP if (RSTRING_LEN(spat) == 0) { /* Special case - split into chars */ spat = mrb_reg_regcomp(mrb, spat); split_type = regexp; } else { -#endif //INCLUDE_REGEXP +#endif //ENABLE_REGEXP if (RSTRING_LEN(spat) == 1 && RSTRING_PTR(spat)[0] == ' '){ split_type = awk; } -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP } -#endif //INCLUDE_REGEXP +#endif //ENABLE_REGEXP } else { -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP spat = get_pat(mrb, spat, 1); split_type = regexp; #else mrb_raise(mrb, E_TYPE_ERROR, "Regexp Class not supported"); -#endif //INCLUDE_REGEXP +#endif //ENABLE_REGEXP } } @@ -2230,7 +2230,7 @@ mrb_str_split_m(mrb_state *mrb, mrb_value str) beg = ptr - temp; } else { -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP char *ptr = RSTRING_PTR(str); long len = RSTRING_LEN(str); long start = beg; @@ -2276,7 +2276,7 @@ mrb_str_split_m(mrb_state *mrb, mrb_value str) } #else mrb_raise(mrb, E_TYPE_ERROR, "Regexp Class not supported"); -#endif //INCLUDE_REGEXP +#endif //ENABLE_REGEXP } if (RSTRING_LEN(str) > 0 && (lim >= 0 || RSTRING_LEN(str) > beg || lim < 0)) { if (RSTRING_LEN(str) == beg) @@ -2314,14 +2314,14 @@ mrb_block_given_p() * returning str, or nil if no substitutions were * performed. */ -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP static mrb_value mrb_str_sub_bang(mrb_state *mrb, mrb_value str) { str_modify(mrb, str); return mrb_nil_value(); } -#endif //INCLUDE_REGEXP +#endif //ENABLE_REGEXP /* 15.2.10.5.36 */ @@ -2362,7 +2362,7 @@ mrb_str_sub_bang(mrb_state *mrb, mrb_value str) * #=> "Is /bin/bash your preferred shell?" */ -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP static mrb_value mrb_str_sub(mrb_state *mrb, mrb_value self) { @@ -2371,7 +2371,7 @@ mrb_str_sub(mrb_state *mrb, mrb_value self) mrb_str_sub_bang(mrb, str); return str; } -#endif //INCLUDE_REGEXP +#endif //ENABLE_REGEXP mrb_value mrb_cstr_to_inum(mrb_state *mrb, const char *str, int base, int badcheck) @@ -3030,7 +3030,7 @@ mrb_init_string(mrb_state *mrb) mrb_define_method(mrb, s, "each_line", mrb_str_each_line, ARGS_REQ(1)); /* 15.2.10.5.15 */ mrb_define_method(mrb, s, "empty?", mrb_str_empty_p, ARGS_NONE()); /* 15.2.10.5.16 */ mrb_define_method(mrb, s, "eql?", mrb_str_eql, ARGS_REQ(1)); /* 15.2.10.5.17 */ -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP mrb_define_method(mrb, s, "gsub", mrb_str_gsub, ARGS_REQ(1)); /* 15.2.10.5.18 */ mrb_define_method(mrb, s, "gsub!", mrb_str_gsub_bang, ARGS_REQ(1)); /* 15.2.10.5.19 */ #endif @@ -3040,19 +3040,19 @@ mrb_init_string(mrb_state *mrb) mrb_define_method(mrb, s, "initialize", mrb_str_init, ARGS_REQ(1)); /* 15.2.10.5.23 */ mrb_define_method(mrb, s, "initialize_copy", mrb_str_replace, ARGS_REQ(1)); /* 15.2.10.5.24 */ mrb_define_method(mrb, s, "intern", mrb_str_intern, ARGS_NONE()); /* 15.2.10.5.25 */ -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP mrb_define_method(mrb, s, "match", mrb_str_match_m, ARGS_REQ(1)); /* 15.2.10.5.27 */ #endif mrb_define_method(mrb, s, "replace", mrb_str_replace, ARGS_REQ(1)); /* 15.2.10.5.28 */ mrb_define_method(mrb, s, "reverse", mrb_str_reverse, ARGS_NONE()); /* 15.2.10.5.29 */ mrb_define_method(mrb, s, "reverse!", mrb_str_reverse_bang, ARGS_NONE()); /* 15.2.10.5.30 */ mrb_define_method(mrb, s, "rindex", mrb_str_rindex_m, ARGS_ANY()); /* 15.2.10.5.31 */ -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP mrb_define_method(mrb, s, "scan", mrb_str_scan, ARGS_REQ(1)); /* 15.2.10.5.32 */ #endif mrb_define_method(mrb, s, "slice", mrb_str_aref_m, ARGS_ANY()); /* 15.2.10.5.34 */ mrb_define_method(mrb, s, "split", mrb_str_split_m, ARGS_ANY()); /* 15.2.10.5.35 */ -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP mrb_define_method(mrb, s, "sub", mrb_str_sub, ARGS_REQ(1)); /* 15.2.10.5.36 */ mrb_define_method(mrb, s, "sub!", mrb_str_sub_bang, ARGS_REQ(1)); /* 15.2.10.5.37 */ #endif diff --git a/src/struct.c b/src/struct.c index 2e2e0c10f..5d759776f 100644 --- a/src/struct.c +++ b/src/struct.c @@ -12,7 +12,7 @@ #include //#include "defines.h" -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP #include "encoding.h" #endif diff --git a/src/time.c b/src/time.c index 1acde8ed9..55060729b 100644 --- a/src/time.c +++ b/src/time.c @@ -6,7 +6,7 @@ #include "mruby.h" -#ifdef INCLUDE_TIME +#ifdef ENABLE_TIME #include #include #include @@ -744,4 +744,3 @@ mrb_init_time(mrb_state *mrb) */ } #endif - diff --git a/src/variable.c b/src/variable.c index 47029da28..b11143b02 100644 --- a/src/variable.c +++ b/src/variable.c @@ -14,7 +14,7 @@ #include "error.h" #include "mruby/array.h" -#ifdef INCLUDE_REGEXP +#ifdef ENABLE_REGEXP #include "re.h" #include "st.h" #endif -- cgit v1.2.3 From 49133111554a3e0d6a4ff415641cc5ec721d8df4 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Fri, 15 Jun 2012 16:20:25 +0900 Subject: should not swallow exceptions from ensure clause --- src/vm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vm.c b/src/vm.c index 951c63b21..32d2a6a24 100644 --- a/src/vm.c +++ b/src/vm.c @@ -178,7 +178,7 @@ ecall(mrb_state *mrb, int i) mrb->stack = mrb->stack + ci[-1].nregs; exc = mrb->exc; mrb->exc = 0; mrb_run(mrb, p, *self); - mrb->exc = exc; + if (!mrb->exc) mrb->exc = exc; } mrb_value -- cgit v1.2.3 From 2c93fab066c55a64e77bb5a7b593553a4ae61075 Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Fri, 15 Jun 2012 16:55:49 +0900 Subject: Remove TRUE/FALSE definition in C sources. (Reported by #282 but not applied.) --- src/re.c | 8 -------- src/regenc.c | 8 -------- src/string.c | 8 -------- 3 files changed, 24 deletions(-) diff --git a/src/re.c b/src/re.c index 17b4f3da7..70e7c59b6 100644 --- a/src/re.c +++ b/src/re.c @@ -26,14 +26,6 @@ #define MKARG_B(c) (((c) & 0xff) << 16) #define MKARG_C(c) (((c) & 0xff) << 8) -#ifndef FALSE -#define FALSE 0 -#endif - -#ifndef TRUE -#define TRUE 1 -#endif - #define ARG_REG_OPTION_MASK \ (ONIG_OPTION_IGNORECASE|ONIG_OPTION_MULTILINE|ONIG_OPTION_EXTEND) #define ARG_ENCODING_FIXED 16 diff --git a/src/regenc.c b/src/regenc.c index 3764a694f..4cc496782 100644 --- a/src/regenc.c +++ b/src/regenc.c @@ -32,14 +32,6 @@ #include #include "regint.h" -#ifndef FALSE -#define FALSE 0 -#endif - -#ifndef TRUE -#define TRUE 1 -#endif - OnigEncoding OnigEncDefaultCharEncoding = ONIG_ENCODING_INIT_DEFAULT; extern int diff --git a/src/string.c b/src/string.c index 566c056cf..6392b504c 100644 --- a/src/string.c +++ b/src/string.c @@ -22,14 +22,6 @@ #include "st.h" #endif //ENABLE_REGEXP -#ifndef FALSE -#define FALSE 0 -#endif - -#ifndef TRUE -#define TRUE 1 -#endif - const char mrb_digitmap[] = "0123456789abcdefghijklmnopqrstuvwxyz"; #ifdef ENABLE_REGEXP -- cgit v1.2.3 From 5353b8555cac47f1615899e5622acb411a501eab Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Fri, 15 Jun 2012 22:57:11 +0900 Subject: exception jump should not cross mrb_funcall border; close #276 --- src/vm.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/vm.c b/src/vm.c index 32d2a6a24..826cdafef 100644 --- a/src/vm.c +++ b/src/vm.c @@ -1013,6 +1013,10 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) while (ci[0].ridx == ci[-1].ridx) { cipop(mrb); ci = mrb->ci; + if (ci->acc < 0) { + mrb->jmp = prev_jmp; + longjmp(*(jmp_buf*)mrb->jmp, 1); + } while (eidx > mrb->ci->eidx) { ecall(mrb, --eidx); } -- cgit v1.2.3 From 2401a175a3a4f4dcb7d0ebedd6234be472984b2f Mon Sep 17 00:00:00 2001 From: Junji Sawada Date: Sat, 16 Jun 2012 01:30:59 +0900 Subject: Fix to show ensure node --- src/parse.y | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/parse.y b/src/parse.y index b7eaaa4e4..91853fe5b 100644 --- a/src/parse.y +++ b/src/parse.y @@ -4886,7 +4886,7 @@ parser_dump(mrb_state *mrb, node *tree, int offset) parser_dump(mrb, tree->car, offset+2); dump_prefix(offset+1); printf("ensure:\n"); - parser_dump(mrb, tree->cdr, offset+2); + parser_dump(mrb, tree->cdr->cdr, offset+2); break; case NODE_LAMBDA: -- cgit v1.2.3 From 26ef69d9abf363934bf44c6546d6036b758a6146 Mon Sep 17 00:00:00 2001 From: Junji Sawada Date: Sat, 16 Jun 2012 08:09:18 +0900 Subject: Remove unused struct --- src/node.h | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/src/node.h b/src/node.h index 8ae0301ba..29edd6cc5 100644 --- a/src/node.h +++ b/src/node.h @@ -103,29 +103,3 @@ enum node_type { NODE_ATTRASGN, NODE_LAST }; - -typedef struct RNode { - unsigned long flags; - char *nd_file; - union { - struct RNode *node; - mrb_sym id; - mrb_value value; - //mrb_value (*cfunc)((ARGS_ANY())); - mrb_sym *tbl; - } u1; - union { - struct RNode *node; - mrb_sym id; - long argc; - mrb_value value; - } u2; - union { - struct RNode *node; - mrb_sym id; - long state; - struct global_entry *entry; - long cnt; - mrb_value value; - } u3; -} NODE; -- cgit v1.2.3 From f89215c7d20bb305cc22a504cbb931f8ec9114cf Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sat, 16 Jun 2012 17:36:47 +0900 Subject: parser_dump: local variable dump condition updated --- src/parse.y | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/parse.y b/src/parse.y index 91853fe5b..4c9f88889 100644 --- a/src/parse.y +++ b/src/parse.y @@ -5050,13 +5050,14 @@ parser_dump(mrb_state *mrb, node *tree, int offset) { node *n2 = tree->car; - if (n2) { + if (n2 && (n2->car || n2->cdr)) { dump_prefix(offset+1); printf("local variables:\n"); - while (n2) { - dump_prefix(offset+2); - printf("%s ", mrb_sym2name(mrb, (mrb_sym)n2->car)); + if (n2->car) { + dump_prefix(offset+2); + printf("%s ", mrb_sym2name(mrb, (mrb_sym)n2->car)); + } n2 = n2->cdr; } printf("\n"); @@ -5391,16 +5392,21 @@ parser_dump(mrb_state *mrb, node *tree, int offset) dump_prefix(offset+1); printf("%s\n", mrb_sym2name(mrb, (mrb_sym)tree->car)); tree = tree->cdr; - dump_prefix(offset+1); - printf("local variables:\n"); { node *n2 = tree->car; - while (n2) { - dump_prefix(offset+2); - if (n2->car) - printf("%s\n", mrb_sym2name(mrb, (mrb_sym)n2->car)); - n2 = n2->cdr; + if (n2 && (n2->car || n2->cdr)) { + dump_prefix(offset+1); + printf("local variables:\n"); + + while (n2) { + if (n2->car) { + dump_prefix(offset+2); + printf("%s ", mrb_sym2name(mrb, (mrb_sym)n2->car)); + } + n2 = n2->cdr; + } + printf("\n"); } } tree = tree->cdr; -- cgit v1.2.3 From 62fdd43d6599fc1c54c869aae075f1bb153314d6 Mon Sep 17 00:00:00 2001 From: Junji Sawada Date: Sun, 17 Jun 2012 21:35:32 +0900 Subject: RStruct.ptr must allocate members size --- src/struct.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/struct.c b/src/struct.c index 5d759776f..8e9804cbc 100644 --- a/src/struct.c +++ b/src/struct.c @@ -412,7 +412,7 @@ mrb_struct_initialize_withArg(mrb_state *mrb, int argc, mrb_value *argv, mrb_val mrb_raise(mrb, E_ARGUMENT_ERROR, "struct size differs"); } st = RSTRUCT(self); - st->ptr = mrb_malloc(mrb, sizeof(mrb_value)*argc); + st->ptr = mrb_calloc(mrb, sizeof(mrb_value), n); st->len = n; memcpy(st->ptr, argv, sizeof(mrb_value)*argc); -- cgit v1.2.3 From e5e2ebf15a48716180a29a2d88a5cb6e905965cc Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Sun, 17 Jun 2012 22:32:07 +0900 Subject: fix binary minus function of Fixnum '0'. --- src/numeric.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/numeric.c b/src/numeric.c index de43dccba..c2393dc09 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -1105,7 +1105,6 @@ mrb_fixnum_minus(mrb_state *mrb, mrb_value x, mrb_value y) mrb_int a; a = mrb_fixnum(x); - if (a == 0) return y; if (FIXNUM_P(y)) { mrb_int b, c; -- cgit v1.2.3 From ede3049f33f8c6cdb703784619fb4143bfe3b441 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 17 Jun 2012 23:36:34 +0900 Subject: allow disabling Struct class --- include/mrbconf.h | 4 ++++ src/init.c | 2 ++ src/struct.c | 2 ++ 3 files changed, 8 insertions(+) diff --git a/include/mrbconf.h b/include/mrbconf.h index 4b778e6de..21b8fea18 100644 --- a/include/mrbconf.h +++ b/include/mrbconf.h @@ -18,6 +18,7 @@ #undef DISABLE_KERNEL_SPRINTF /* Kernel.sprintf method */ #undef DISABLE_MATH /* Math functions */ #undef DISABLE_TIME /* Time class */ +#undef DISABLE_STRUCT /* Struct class */ #undef HAVE_UNISTD_H /* WINDOWS */ #define HAVE_UNISTD_H /* LINUX */ @@ -46,6 +47,9 @@ typedef intptr_t mrb_sym; #ifndef DISABLE_TIME #define ENABLE_TIME #endif +#ifndef DISABLE_STRUCT +#define ENABLE_STRUCT +#endif #ifndef FALSE # define FALSE 0 diff --git a/src/init.c b/src/init.c index a515ee880..e2ab62339 100644 --- a/src/init.c +++ b/src/init.c @@ -49,7 +49,9 @@ mrb_init_core(mrb_state *mrb) mrb_init_hash(mrb); mrb_init_numeric(mrb); mrb_init_range(mrb); +#ifdef ENABLE_STRUCT mrb_init_struct(mrb); +#endif mrb_init_gc(mrb); #ifdef ENABLE_REGEXP mrb_init_regexp(mrb); diff --git a/src/struct.c b/src/struct.c index 8e9804cbc..c0af85d0e 100644 --- a/src/struct.c +++ b/src/struct.c @@ -5,6 +5,7 @@ */ #include "mruby.h" +#ifdef ENABLE_STRUCT #include #include "error.h" #include "mruby/struct.h" @@ -793,3 +794,4 @@ mrb_init_struct(mrb_state *mrb) mrb_define_method(mrb, st, "eql?", mrb_struct_eql, ARGS_REQ(1)); /* 15.2.18.4.12(x) */ } +#endif /* ENABLE_STRUCT */ -- cgit v1.2.3 From 4f4965a4a20b1fba002d7b428508632604fd0b38 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 18 Jun 2012 08:58:56 +0900 Subject: allow struct access; close #295 --- src/struct.c | 58 ++++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 38 insertions(+), 20 deletions(-) diff --git a/src/struct.c b/src/struct.c index c0af85d0e..4d59be22d 100644 --- a/src/struct.c +++ b/src/struct.c @@ -183,33 +183,51 @@ mrb_struct_modify(mrb_value s) } mrb_sym -mrb_id_attrset(mrb_sym id) +mrb_id_attrset(mrb_state *mrb, mrb_sym id) { - //id &= ~ID_SCOPE_MASK; - //id |= ID_ATTRSET; - return id; + const char *name; + char *buf; + int len; + mrb_sym mid; + + name = mrb_sym2name_len(mrb, id, &len); + buf = mrb_malloc(mrb, len+2); + memcpy(buf, name, len); + buf[len] = '='; + buf[len+1] = '\0'; + + mid = mrb_intern2(mrb, buf, len+1); + mrb_free(mrb, buf); + return mid; } static mrb_value mrb_struct_set(mrb_state *mrb, mrb_value obj, mrb_value val) { - mrb_value members, slot, *ptr, *ptr_members; - long i, len; + const char *name; + int i, len; + mrb_sym mid; + mrb_value members, slot, *ptr, *ptr_members; - members = mrb_struct_members(mrb, obj); - ptr_members = RARRAY_PTR(members); - len = RARRAY_LEN(members); - mrb_struct_modify(obj); - ptr = RSTRUCT_PTR(obj); - for (i=0; ici->mid, &len); + mid = mrb_intern2(mrb, name, len-1); /* omit last "=" */ + + members = mrb_struct_members(mrb, obj); + ptr_members = RARRAY_PTR(members); + len = RARRAY_LEN(members); + mrb_struct_modify(obj); + ptr = RSTRUCT_PTR(obj); + for (i=0; itLAST_TOKEN) @@ -275,7 +293,7 @@ make_struct(mrb_state *mrb, mrb_value name, mrb_value members, struct RClass * k else { mrb_define_method_id(mrb, c, id, mrb_struct_ref, 0); } - mrb_define_method_id(mrb, c, mrb_id_attrset(id), (mrb_func_t)mrb_struct_set, 1); + mrb_define_method_id(mrb, c, mrb_id_attrset(mrb, id), (mrb_func_t)mrb_struct_set, 1); } } -- cgit v1.2.3 From 742c4fb86f321f24f3da722bfb49adf56067cc4e Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 18 Jun 2012 09:06:13 +0900 Subject: ignore id to create NameError --- src/error.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/error.c b/src/error.c index 3ef08a631..1d8d2ddeb 100644 --- a/src/error.c +++ b/src/error.c @@ -203,9 +203,8 @@ mrb_name_error(mrb_state *mrb, mrb_sym id, const char *fmt, ...) n = 0; } argv[0] = mrb_str_new(mrb, buf, n); - - argv[1] = mrb_str_new_cstr(mrb, mrb_sym2name(mrb, id)); - exc = mrb_class_new_instance(mrb, 2, argv, E_NAME_ERROR); + argv[1] = mrb_symbol_value(id); /* ignore now */ + exc = mrb_class_new_instance(mrb, 1, argv, E_NAME_ERROR); mrb_exc_raise(mrb, exc); } -- cgit v1.2.3 From f88a8399149f9b949f31f960d56d486a423efefa Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 18 Jun 2012 09:09:00 +0900 Subject: add Struct tests --- test/t/struct.rb | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/test/t/struct.rb b/test/t/struct.rb index 798cf6728..5a74c6205 100644 --- a/test/t/struct.rb +++ b/test/t/struct.rb @@ -9,3 +9,53 @@ assert('Struct superclass', '15.2.18.2') do Struct.superclass == Object end +assert('Struct.new', '15.2.18.3.1') do + c = Struct.new(:m1, :m2) + c.superclass == Struct and + c.members == [:m1,:m2] +end + +assert('Struct#[]', '15.2.18.4.2') do + c = Struct.new(:m1, :m2) + cc = c.new(1,2) + cc[:m1] == 1 and cc["m2"] == 2 +end + +assert('Struct#[]=', '15.2.18.4.3') do + c = Struct.new(:m1, :m2) + cc = c.new(1,2) + cc[:m1] = 3 + cc[:m1] == 3 +end + +assert('Struct#each', '15.2.18.4.4') do + c = Struct.new(:m1, :m2) + cc = c.new(1,2) + a = [] + cc.each{|x| + a << x + } + a[0] == 1 and a[1] == 2 +end + +assert('Struct#each_pair', '15.2.18.4.5') do + c = Struct.new(:m1, :m2) + cc = c.new(1,2) + a = [] + cc.each_pair{|k,v| + a << [k,v] + } + a[0] == [:m1, 1] and a[1] == [:m2, 2] +end + +assert('Struct#members', '15.2.18.4.6') do + c = Struct.new(:m1, :m2) + cc = c.new(1,2) + cc.members == [:m1,:m2] +end + +assert('Struct#select', '15.2.18.4.7') do + c = Struct.new(:m1, :m2) + cc = c.new(1,2) + cc.select{|v| v % 2 == 0} == [2] +end -- cgit v1.2.3 From 955a48d964a2bbe175617880c868ca8b862da74e Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 18 Jun 2012 10:30:17 +0900 Subject: move exception definiton to mrblib --- mrblib/error.rb | 39 +++++++++++++++++++++++++++++++++++++++ src/error.c | 25 ------------------------- 2 files changed, 39 insertions(+), 25 deletions(-) diff --git a/mrblib/error.rb b/mrblib/error.rb index 5d49ec1e4..16e88eefb 100644 --- a/mrblib/error.rb +++ b/mrblib/error.rb @@ -13,6 +13,44 @@ class Exception end end +# ISO 15.2.24 +class ArgumentError < StandardError +end + +# ISO 15.2.25 +class LocalJumpError < StandardError +end + +# ISO 15.2.26 +class RangeError < StandardError +end + +class FloatDomainError < RangeError +end + +# ISO 15.2.26 +class RegexpError < StandardError +end + +# ISO 15.2.29 +class TypeError < StandardError +end + +# ISO 15.2.31 +class NameError < StandardError +end + +# ISO 15.2.32 +class NoMethodError < NameError +end + +# ISO 15.2.33 +class IndexError < StandardError +end + +class KeyError < IndexError +end + # ISO 15.2.37 class ScriptError < Exception end @@ -23,3 +61,4 @@ end class NotImplementedError < ScriptError end + diff --git a/src/error.c b/src/error.c index 1d8d2ddeb..981b2abab 100644 --- a/src/error.c +++ b/src/error.c @@ -359,9 +359,6 @@ void mrb_init_exception(mrb_state *mrb) { struct RClass *e; - struct RClass *eIndexError; - struct RClass *eRangeError; - struct RClass *eNameError; mrb->eException_class = e = mrb_define_class(mrb, "Exception", mrb->object_class); /* 15.2.22 */ mrb_define_class_method(mrb, e, "exception", mrb_instance_new, ARGS_ANY()); @@ -374,26 +371,4 @@ mrb_init_exception(mrb_state *mrb) mrb->eStandardError_class = mrb_define_class(mrb, "StandardError", mrb->eException_class); /* 15.2.23 */ mrb->eRuntimeError_class = mrb_define_class(mrb, "RuntimeError", mrb->eStandardError_class); /* 15.2.28 */ - - mrb_define_class(mrb, "TypeError", mrb->eStandardError_class); /* 15.2.29 */ - mrb_define_class(mrb, "ArgumentError", mrb->eStandardError_class); /* 15.2.24 */ - eIndexError = mrb_define_class(mrb, "IndexError", mrb->eStandardError_class); /* 15.2.33 */ - eRangeError = mrb_define_class(mrb, "RangeError", mrb->eStandardError_class); /* 15.2.26 */ - eNameError = mrb_define_class(mrb, "NameError", mrb->eStandardError_class); /* 15.2.31 */ - - mrb_define_class(mrb, "NoMethodError", eNameError); /* 15.2.32 */ - // mrb_define_class(mrb, "SystemCallError", mrb->eStandardError_class); /* 15.2.36 */ - mrb_define_class(mrb, "LocalJumpError", mrb->eStandardError_class); /* 15.2.25 */ - -#ifdef INCLUDE_REGEX - mrb_define_class(mrb, "RegexpError", mrb->eStandardError_class); /* 15.2.27 */ -#endif - -#ifdef INCLUDE_ENCODING - mrb_define_class(mrb, "EncodingError", mrb->eStandardError_class); -#endif - // mrb_define_class(mrb, "ZeroDivisionError", mrb->eStandardError_class); /* 15.2.30 */ - - mrb_define_class(mrb, "FloatDomainError", eRangeError); - mrb_define_class(mrb, "KeyError", eIndexError); } -- cgit v1.2.3 From 83e5999d7efcad648e9ecbd64c51b305b6261999 Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Mon, 18 Jun 2012 11:22:05 +0800 Subject: Make CFLAG choices in Makefiles more flexible --- Makefile | 17 ++++++++++++----- mrblib/Makefile | 17 ++++++++++++----- src/Makefile | 17 ++++++++++++----- test/Makefile | 17 ++++++++++++----- tools/mirb/Makefile | 13 ++++++++++--- tools/mrbc/Makefile | 17 ++++++++++++----- tools/mruby/Makefile | 17 ++++++++++++----- 7 files changed, 82 insertions(+), 33 deletions(-) diff --git a/Makefile b/Makefile index e7408d793..a960fc14a 100644 --- a/Makefile +++ b/Makefile @@ -7,12 +7,19 @@ export LL = gcc export AR = ar export YACC = bison -DEBUG_MODE = 1 -ifeq ($(DEBUG_MODE),1) -CFLAGS = -g -O3 -else -CFLAGS = -O3 +ifeq ($(strip $(COMPILE_MODE)),) + # default compile option + COMPILE_MODE = debug +endif + +ifeq ($(COMPILE_MODE),debug) + CFLAGS = -g -O3 +else ifeq ($(COMPILE_MODE),release) + CFLAGS = -O3 +else ifeq ($(COMPILE_MODE),small) + CFLAGS = -Os endif + ALL_CFLAGS = -Wall -Werror-implicit-function-declaration $(CFLAGS) ifeq ($(OS),Windows_NT) MAKE_FLAGS = --no-print-directory CC=$(CC) LL=$(LL) ALL_CFLAGS='$(ALL_CFLAGS)' diff --git a/mrblib/Makefile b/mrblib/Makefile index c7226ddcd..01a5a6198 100644 --- a/mrblib/Makefile +++ b/mrblib/Makefile @@ -18,12 +18,19 @@ LIBR := ../lib/libmruby.a # libraries, includes INCLUDES = -I../src -I../include -DEBUG_MODE = 1 -ifeq ($(DEBUG_MODE),1) -CFLAGS = -g -else -CFLAGS = -O3 +ifeq ($(strip $(COMPILE_MODE)),) + # default compile option + COMPILE_MODE = debug +endif + +ifeq ($(COMPILE_MODE),debug) + CFLAGS = -g -O3 +else ifeq ($(COMPILE_MODE),release) + CFLAGS = -O3 +else ifeq ($(COMPILE_MODE),small) + CFLAGS = -Os endif + ALL_CFLAGS = -Wall -Werror-implicit-function-declaration $(CFLAGS) ifeq ($(OS),Windows_NT) MAKE_FLAGS = CC=$(CC) LL=$(LL) ALL_CFLAGS="$(ALL_CFLAGS)" diff --git a/src/Makefile b/src/Makefile index 61012ea68..13f80b694 100644 --- a/src/Makefile +++ b/src/Makefile @@ -19,12 +19,19 @@ OBJS := $(OBJ1) $(OBJ2) $(OBJ3) # libraries, includes INCLUDES = -I$(BASEDIR) -I$(BASEDIR)/../include -DEBUG_MODE = 1 -ifeq ($(DEBUG_MODE),1) -CFLAGS = -g -O3 -else -CFLAGS = -O3 +ifeq ($(strip $(COMPILE_MODE)),) + # default compile option + COMPILE_MODE = debug endif + +ifeq ($(COMPILE_MODE),debug) + CFLAGS = -g -O3 +else ifeq ($(COMPILE_MODE),release) + CFLAGS = -O3 +else ifeq ($(COMPILE_MODE),small) + CFLAGS = -Os +endif + ALL_CFLAGS = -Wall -Werror-implicit-function-declaration $(CFLAGS) diff --git a/test/Makefile b/test/Makefile index 170c1dac8..921442b28 100644 --- a/test/Makefile +++ b/test/Makefile @@ -20,12 +20,19 @@ OBJS := driver.o $(MLIB) LIBS = -lm INCLUDES = -I$(BASEDIR)/../src -I$(BASEDIR)/../include -DEBUG_MODE = 1 -ifeq ($(DEBUG_MODE),1) -CFLAGS = -g -else -CFLAGS = -O3 +ifeq ($(strip $(COMPILE_MODE)),) + # default compile option + COMPILE_MODE = debug +endif + +ifeq ($(COMPILE_MODE),debug) + CFLAGS = -g -O3 +else ifeq ($(COMPILE_MODE),release) + CFLAGS = -O3 +else ifeq ($(COMPILE_MODE),small) + CFLAGS = -Os endif + ALL_CFLAGS = -Wall -Werror-implicit-function-declaration $(CFLAGS) ifeq ($(OS),Windows_NT) MAKE_FLAGS = CC=$(CC) LL=$(LL) ALL_CFLAGS="$(ALL_CFLAGS)" diff --git a/tools/mirb/Makefile b/tools/mirb/Makefile index ba307227c..52941f242 100644 --- a/tools/mirb/Makefile +++ b/tools/mirb/Makefile @@ -21,12 +21,19 @@ EXTS := $(EXT1) LIBS = -lm INCLUDES = -I$(BASEDIR) -I$(BASEDIR)/../include -DEBUG_MODE = 1 -ifeq ($(DEBUG_MODE),1) +ifeq ($(strip $(COMPILE_MODE)),) + # default compile option + COMPILE_MODE = debug +endif + +ifeq ($(COMPILE_MODE),debug) CFLAGS = -g -O3 -else +else ifeq ($(COMPILE_MODE),release) CFLAGS = -O3 +else ifeq ($(COMPILE_MODE),small) + CFLAGS = -Os endif + ALL_CFLAGS = -Wall -Werror-implicit-function-declaration $(CFLAGS) ifeq ($(OS),Windows_NT) MAKE_FLAGS = CC=$(CC) LL=$(LL) ALL_CFLAGS="$(ALL_CFLAGS)" diff --git a/tools/mrbc/Makefile b/tools/mrbc/Makefile index 99f5830e6..eea0c02cb 100644 --- a/tools/mrbc/Makefile +++ b/tools/mrbc/Makefile @@ -23,12 +23,19 @@ LIBS = -lm INCLUDES = -I$(BASEDIR) -I$(BASEDIR)/../include # compiler, linker (gcc) -DEBUG_MODE = 1 -ifeq ($(DEBUG_MODE),1) -CFLAGS = -g -O3 -else -CFLAGS = -O3 +ifeq ($(strip $(COMPILE_MODE)),) + # default compile option + COMPILE_MODE = debug +endif + +ifeq ($(COMPILE_MODE),debug) + CFLAGS = -g -O3 +else ifeq ($(COMPILE_MODE),release) + CFLAGS = -O3 +else ifeq ($(COMPILE_MODE),small) + CFLAGS = -Os endif + ALL_CFLAGS = -Wall -Werror-implicit-function-declaration $(CFLAGS) ifeq ($(OS),Windows_NT) MAKE_FLAGS = CC=$(CC) LL=$(LL) ALL_CFLAGS="$(ALL_CFLAGS)" diff --git a/tools/mruby/Makefile b/tools/mruby/Makefile index 0442bd422..9955b4302 100644 --- a/tools/mruby/Makefile +++ b/tools/mruby/Makefile @@ -26,12 +26,19 @@ LIBS = -lm INCLUDES = -I$(BASEDIR) -I$(BASEDIR)/../include # compiler, linker (gcc) -DEBUG_MODE = 1 -ifeq ($(DEBUG_MODE),1) -CFLAGS = -g -O3 -else -CFLAGS = -O3 +ifeq ($(strip $(COMPILE_MODE)),) + # default compile option + COMPILE_MODE = debug +endif + +ifeq ($(COMPILE_MODE),debug) + CFLAGS = -g -O3 +else ifeq ($(COMPILE_MODE),release) + CFLAGS = -O3 +else ifeq ($(COMPILE_MODE),small) + CFLAGS = -Os endif + ALL_CFLAGS = -Wall -Werror-implicit-function-declaration $(CFLAGS) ifeq ($(OS),Windows_NT) MAKE_FLAGS = CC=$(CC) LL=$(LL) ALL_CFLAGS="$(ALL_CFLAGS)" -- cgit v1.2.3 From f443a719a1cd86790ac823b519f51784e1ddeb22 Mon Sep 17 00:00:00 2001 From: Junji Sawada Date: Mon, 18 Jun 2012 22:20:28 +0900 Subject: Fix member access method definition --- src/struct.c | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/src/struct.c b/src/struct.c index 4d59be22d..de0dbeeaa 100644 --- a/src/struct.c +++ b/src/struct.c @@ -131,7 +131,7 @@ mrb_struct_getmember(mrb_state *mrb, mrb_value obj, mrb_sym id) ptr = RSTRUCT_PTR(obj); members = mrb_struct_members(mrb, obj); ptr_members = RARRAY_PTR(members); - slot = mrb_str_new_cstr(mrb, mrb_sym2name(mrb, id)); + slot = mrb_symbol_value(id); len = RARRAY_LEN(members); for (i=0; ici->mid); } static mrb_value mrb_struct_ref0(mrb_state* mrb, mrb_value obj) {return RSTRUCT_PTR(obj)[0];} @@ -230,6 +229,15 @@ mrb_struct_set(mrb_state *mrb, mrb_value obj, mrb_value val) return mrb_nil_value(); /* not reached */ } +static mrb_value +mrb_struct_set_m(mrb_state *mrb, mrb_value obj) +{ + mrb_value val; + + mrb_get_args(mrb, "o", &val); + return mrb_struct_set(mrb, obj, val); +} + #define is_notop_id(id) (id)//((id)>tLAST_TOKEN) #define is_local_id(id) (is_notop_id(id))//&&((id)&ID_SCOPE_MASK)==ID_LOCAL) int @@ -288,12 +296,12 @@ make_struct(mrb_state *mrb, mrb_value name, mrb_value members, struct RClass * k mrb_sym id = SYM2ID(ptr_members[i]); if (mrb_is_local_id(id) || mrb_is_const_id(id)) { if (i < N_REF_FUNC) { - mrb_define_method_id(mrb, c, id, (mrb_func_t)ref_func[i], 0); + mrb_define_method_id(mrb, c, id, ref_func[i], ARGS_NONE()); } else { - mrb_define_method_id(mrb, c, id, mrb_struct_ref, 0); + mrb_define_method_id(mrb, c, id, mrb_struct_ref, ARGS_NONE()); } - mrb_define_method_id(mrb, c, mrb_id_attrset(mrb, id), (mrb_func_t)mrb_struct_set, 1); + mrb_define_method_id(mrb, c, mrb_id_attrset(mrb, id), mrb_struct_set_m, ARGS_REQ(1)); } } @@ -314,7 +322,7 @@ mrb_struct_define(mrb_state *mrb, const char *name, ...) va_start(ar, name); while ((mem = va_arg(ar, char*)) != 0) { mrb_sym slot = mrb_intern(mrb, mem); - mrb_ary_push(mrb, ary, mrb_str_new_cstr(mrb, mrb_sym2name(mrb, slot))); + mrb_ary_push(mrb, ary, mrb_symbol_value(slot)); } va_end(ar); @@ -379,10 +387,6 @@ mrb_struct_s_def(mrb_state *mrb, mrb_value klass) mrb_ary_unshift(mrb, rest, name); name = mrb_nil_value(); } - for (i=0; i Date: Tue, 19 Jun 2012 09:45:58 +0900 Subject: forgot to replace INLCUDE_KERNEL_SPRINTF by ENABLE_KERNEL_SPRINTF --- src/kernel.c | 2 +- src/sprintf.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/kernel.c b/src/kernel.c index 6dfe6be19..a38e88f47 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -1354,7 +1354,7 @@ mrb_init_kernel(mrb_state *mrb) mrb_define_method(mrb, krn, "singleton_methods", mrb_obj_singleton_methods_m, ARGS_ANY()); /* 15.3.1.3.45 */ mrb_define_method(mrb, krn, "to_s", mrb_any_to_s, ARGS_NONE()); /* 15.3.1.3.46 */ -#ifdef INCLUDE_KERNEL_SPRINTF +#ifdef ENABLE_KERNEL_SPRINTF mrb_define_method(mrb, krn, "sprintf", mrb_f_sprintf, ARGS_ANY()); /* in sprintf.c */ mrb_define_method(mrb, krn, "format", mrb_f_sprintf, ARGS_ANY()); /* in sprintf.c */ #endif diff --git a/src/sprintf.c b/src/sprintf.c index c7e7badc4..b4d460c83 100644 --- a/src/sprintf.c +++ b/src/sprintf.c @@ -6,7 +6,7 @@ #include "mruby.h" -#ifdef INCLUDE_KERNEL_SPRINTF +#ifdef ENABLE_KERNEL_SPRINTF #include #include @@ -1082,4 +1082,4 @@ fmt_setup(char *buf, size_t size, int c, int flags, int width, int prec) *buf = '\0'; } -#endif //INCLUDE_KERNEL_SPRINTF +#endif /* ENABLE_KERNEL_SPRINTF */ -- cgit v1.2.3 From b023acb6296d7ee55ae5e7f7bc3e1bf53f4e48dd Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 19 Jun 2012 09:54:05 +0900 Subject: add ISO reference numbers --- src/class.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/class.c b/src/class.c index 9d89aef61..df02a832a 100644 --- a/src/class.c +++ b/src/class.c @@ -1300,19 +1300,19 @@ mrb_init_class(mrb_state *mrb) MRB_SET_INSTANCE_TT(cls, MRB_TT_CLASS); mrb_define_method(mrb, bob, "initialize", mrb_bob_init, ARGS_NONE()); mrb_define_method(mrb, bob, "!", mrb_bob_not, ARGS_NONE()); - mrb_define_method(mrb, bob, "method_missing", mrb_bob_missing, ARGS_ANY()); /* 15.3.1.3.30 */ + mrb_define_method(mrb, bob, "method_missing", mrb_bob_missing, ARGS_ANY()); /* 15.3.1.3.30 */ mrb_define_class_method(mrb, cls, "new", mrb_class_new_class, ARGS_ANY()); - mrb_define_method(mrb, cls, "superclass", mrb_class_superclass, ARGS_NONE()); - mrb_define_method(mrb, cls, "new", mrb_instance_new, ARGS_ANY()); + mrb_define_method(mrb, cls, "superclass", mrb_class_superclass, ARGS_NONE()); /* 15.2.3.3.4 */ + mrb_define_method(mrb, cls, "new", mrb_instance_new, ARGS_ANY()); /* 15.2.3.3.3 */ mrb_define_method(mrb, cls, "inherited", mrb_bob_init, ARGS_REQ(1)); - mrb_define_method(mrb, mod, "include", mrb_mod_include, ARGS_REQ(1)); + mrb_define_method(mrb, mod, "include", mrb_mod_include, ARGS_REQ(1)); /* 15.2.2.4.27 */ mrb_define_method(mrb, mod, "to_s", mrb_mod_to_s, ARGS_NONE()); - mrb_define_method(mrb, mod, "alias_method", mrb_mod_alias, ARGS_ANY()); - mrb_define_method(mrb, mod, "undef_method", mrb_mod_undef, ARGS_ANY()); - mrb_define_method(mrb, mod, "const_defined?", mrb_mod_const_defined, ARGS_REQ(1)); - mrb_define_method(mrb, mod, "const_get", mrb_mod_const_get, ARGS_REQ(1)); - mrb_define_method(mrb, mod, "const_set", mrb_mod_const_set, ARGS_REQ(2)); + mrb_define_method(mrb, mod, "alias_method", mrb_mod_alias, ARGS_ANY()); /* 15.2.2.4.8 */ + mrb_define_method(mrb, mod, "undef_method", mrb_mod_undef, ARGS_ANY()); /* 15.2.2.4.41 */ + mrb_define_method(mrb, mod, "const_defined?", mrb_mod_const_defined, ARGS_REQ(1)); /* 15.2.2.4.20 */ + mrb_define_method(mrb, mod, "const_get", mrb_mod_const_get, ARGS_REQ(1)); /* 15.2.2.4.21 */ + mrb_define_method(mrb, mod, "const_set", mrb_mod_const_set, ARGS_REQ(2)); /* 15.2.2.4.23 */ mrb_define_method(mrb, mod, "===", mrb_mod_eqq, ARGS_REQ(1)); } -- cgit v1.2.3 From 8f9b958f1e269e6e2c58402ae0409a3a99e8bcf4 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 19 Jun 2012 12:54:49 +0900 Subject: raise should initialize Exception object --- src/error.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/error.c b/src/error.c index 981b2abab..b2d9a8c8d 100644 --- a/src/error.c +++ b/src/error.c @@ -71,14 +71,14 @@ static mrb_value exc_exception(mrb_state *mrb, mrb_value self) { mrb_value exc; - mrb_value *argv; + mrb_value a; int argc; - mrb_get_args(mrb, "*", &argv, &argc); + argc = mrb_get_args(mrb, "|o", &a); if (argc == 0) return self; - if (argc == 1 && mrb_obj_equal(mrb, self, argv[0])) return self; + if (mrb_obj_equal(mrb, self, a)) return self; exc = mrb_obj_clone(mrb, self); - exc_initialize(mrb, exc); + mrb_iv_set(mrb, exc, mrb_intern(mrb, "mesg"), a); return exc; } @@ -321,7 +321,7 @@ exception_call: // mrb_raise(mrb, E_TYPE_ERROR, "exception class/object expected"); //} if (mrb_respond_to(mrb, argv[0], mrb_intern(mrb, "exception"))) { - mesg = mrb_funcall(mrb, argv[0], "exception", n, argv+1); + mesg = mrb_funcall_argv(mrb, argv[0], "exception", n, argv+1); } else { /* undef */ -- cgit v1.2.3 From 97e94247fa6aca9492c7ecde605059f660bdc146 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 19 Jun 2012 12:56:08 +0900 Subject: Kernel#raise: better argument check --- src/kernel.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/kernel.c b/src/kernel.c index a38e88f47..14d602869 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -1085,7 +1085,7 @@ mrb_obj_public_methods(mrb_state *mrb, mrb_value self) * call-seq: * raise * raise(string) - * raise(exception [, string [, array]]) + * raise(exception [, string]) * * With no arguments, raises a RuntimeError * With a single +String+ argument, raises a @@ -1103,14 +1103,24 @@ mrb_obj_public_methods(mrb_state *mrb, mrb_value self) mrb_value mrb_f_raise(mrb_state *mrb, mrb_value self) { - mrb_value *argv; + mrb_value a[2]; int argc; - mrb_get_args(mrb, "*", &argv, &argc); - if (argc == 0) { + argc = mrb_get_args(mrb, "|oo", &a[0], &a[1]); + switch (argc) { + case 0: mrb_raise(mrb, mrb->eRuntimeError_class, ""); + break; + case 1: + a[1] = mrb_check_string_type(mrb, a[0]); + if (!mrb_nil_p(a[1])) { + argc = 2; + a[0] = mrb_obj_value(mrb->eRuntimeError_class); + } + /* fall through */ + default: + mrb_exc_raise(mrb, mrb_make_exception(mrb, argc, a)); } - mrb_exc_raise(mrb, mrb_make_exception(mrb, argc, argv)); return mrb_nil_value(); /* not reached */ } -- cgit v1.2.3 From debea27224b391a1c0e6895e1e03a2aa6b042c94 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 19 Jun 2012 15:31:56 +0900 Subject: remove obsolete comment --- src/kernel.c | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/src/kernel.c b/src/kernel.c index 14d602869..3a11fbb42 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -997,31 +997,6 @@ mrb_false(mrb_state *mrb, mrb_value self) return mrb_false_value(); } -/* 15.3.1.2.10 */ -/* 15.3.1.3.35 */ -/* - * call-seq: - * print(obj, ...) -> nil - * - * Prints each object in turn to $stdout. If the output - * field separator ($,) is not +nil+, its - * contents will appear between each field. If the output record - * separator ($\\) is not +nil+, it will be - * appended to the output. If no arguments are given, prints - * $_. Objects that aren't strings will be converted by - * calling their to_s method. - * - * print "cat", [1,2,3], 99, "\n" - * $, = ", " - * $\ = "\n" - * print "cat", [1,2,3], 99 - * - * produces: - * - * cat12399 - * cat, 1, 2, 3, 99 - */ - /* 15.3.1.3.36 */ /* * call-seq: -- cgit v1.2.3 From 4d7bf31b972c57d483d7d6d981b3e2a689057f8a Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 19 Jun 2012 15:36:09 +0900 Subject: remove dummy require/loop --- src/kernel.c | 64 ------------------------------------------------------------ 1 file changed, 64 deletions(-) diff --git a/src/kernel.c b/src/kernel.c index 3a11fbb42..060e8c6de 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -833,32 +833,6 @@ mrb_f_local_variables(mrb_state *mrb, mrb_value self) return ary; /* dummy */ } -/* 15.3.1.2.8 */ -/* 15.3.1.3.29 */ -/* - * call-seq: - * loop { block } - * loop -> an_enumerator - * - * Repeatedly executes the block. - * - * If no block is given, an enumerator is returned instead. - * - * loop do - * print "Input: " - * line = gets - * break if !line or line =~ /^qQ/ - * # ... - * end - * - * StopIteration raised in the block breaks the loop. - */ -mrb_value -mrb_f_loop(mrb_state *mrb, mrb_value self) -{ - return mrb_nil_value(); /* dummy */ -} - static void method_entry_loop(mrb_state *mrb, struct RClass* klass, mrb_value ary) { @@ -1160,44 +1134,10 @@ mrb_obj_remove_instance_variable(mrb_state *mrb, mrb_value self) return mrb_nil_value(); /* not reached */ } -/* 15.3.1.2.13 */ -/* 15.3.1.3.42 */ -/* - * call-seq: - * require(string) -> true or false - * - * Ruby tries to load the library named _string_, returning - * +true+ if successful. If the filename does not resolve to - * an absolute path, it will be searched for in the directories listed - * in $:. If the file has the extension ``.rb'', it is - * loaded as a source file; if the extension is ``.so'', ``.o'', or - * ``.dll'', or whatever the default shared library extension is on - * the current platform, Ruby loads the shared library as a Ruby - * extension. Otherwise, Ruby tries adding ``.rb'', ``.so'', and so on - * to the name. The name of the loaded feature is added to the array in - * $". A feature will not be loaded if its name already - * appears in $". The file name is converted to an absolute - * path, so ``require 'a'; require './a''' will not load - * a.rb twice. - * - * require "my-library.rb" - * require "db-driver" - */ -mrb_value -mrb_f_require(mrb_state *mrb, mrb_value self) -{ - mrb_value fname; - - mrb_get_args(mrb, "o", &fname); - return mrb_nil_value(); /* dummy */ -} - - static inline int basic_obj_respond_to(mrb_state *mrb, mrb_value obj, mrb_sym id, int pub) { return mrb_respond_to(mrb, obj, id); - //return TRUE; } /* 15.3.1.3.43 */ /* @@ -1290,10 +1230,8 @@ mrb_init_kernel(mrb_state *mrb) mrb_define_class_method(mrb, krn, "iterator?", mrb_f_block_given_p_m, ARGS_NONE()); /* 15.3.1.2.5 */ mrb_define_class_method(mrb, krn, "lambda", proc_lambda, ARGS_NONE()); /* 15.3.1.2.6 */ mrb_define_class_method(mrb, krn, "local_variables", mrb_f_local_variables, ARGS_NONE()); /* 15.3.1.2.7 */ - mrb_define_class_method(mrb, krn, "loop", mrb_f_loop, ARGS_NONE()); /* 15.3.1.2.8 */ ; /* 15.3.1.2.11 */ mrb_define_class_method(mrb, krn, "raise", mrb_f_raise, ARGS_ANY()); /* 15.3.1.2.12 */ - mrb_define_class_method(mrb, krn, "require", mrb_f_require, ARGS_REQ(1)); /* 15.3.1.2.13 */ mrb_define_method(mrb, krn, "singleton_class", mrb_singleton_class, ARGS_NONE()); @@ -1324,7 +1262,6 @@ mrb_init_kernel(mrb_state *mrb) mrb_define_method(mrb, krn, "kind_of?", mrb_obj_is_kind_of_m, ARGS_REQ(1)); /* 15.3.1.3.26 */ mrb_define_method(mrb, krn, "lambda", proc_lambda, ARGS_NONE()); /* 15.3.1.3.27 */ mrb_define_method(mrb, krn, "local_variables", mrb_f_local_variables, ARGS_NONE()); /* 15.3.1.3.28 */ - mrb_define_method(mrb, krn, "loop", mrb_f_loop, ARGS_NONE()); /* 15.3.1.3.29 */ mrb_define_method(mrb, krn, "methods", mrb_obj_methods_m, ARGS_ANY()); /* 15.3.1.3.31 */ mrb_define_method(mrb, krn, "nil?", mrb_false, ARGS_NONE()); /* 15.3.1.3.32 */ mrb_define_method(mrb, krn, "object_id", mrb_obj_id_m, ARGS_NONE()); /* 15.3.1.3.33 */ @@ -1333,7 +1270,6 @@ mrb_init_kernel(mrb_state *mrb) mrb_define_method(mrb, krn, "public_methods", mrb_obj_public_methods, ARGS_ANY()); /* 15.3.1.3.38 */ mrb_define_method(mrb, krn, "raise", mrb_f_raise, ARGS_ANY()); /* 15.3.1.3.40 */ mrb_define_method(mrb, krn, "remove_instance_variable", mrb_obj_remove_instance_variable,ARGS_REQ(1)); /* 15.3.1.3.41 */ - mrb_define_method(mrb, krn, "require", mrb_f_require, ARGS_REQ(1)); /* 15.3.1.3.42 */ mrb_define_method(mrb, krn, "respond_to?", obj_respond_to, ARGS_ANY()); /* 15.3.1.3.43 */ mrb_define_method(mrb, krn, "send", mrb_f_send, ARGS_ANY()); /* 15.3.1.3.44 */ mrb_define_method(mrb, krn, "singleton_methods", mrb_obj_singleton_methods_m, ARGS_ANY()); /* 15.3.1.3.45 */ -- cgit v1.2.3 From 41f7fdaf8e7e5d3ef030288bf415372f5768bc6e Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 19 Jun 2012 15:37:31 +0900 Subject: remove dummy local_variables --- src/kernel.c | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/src/kernel.c b/src/kernel.c index 060e8c6de..b5bde628a 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -810,29 +810,6 @@ proc_lambda(mrb_state *mrb, mrb_value self) return mrb_nil_value(); /* dummy */ } -/* 15.3.1.2.7 */ -/* 15.3.1.3.28 */ -/* - * call-seq: - * local_variables -> array - * - * Returns the names of the current local variables. - * - * fred = 1 - * for i in 1..10 - * # ... - * end - * local_variables #=> [:fred, :i] - */ -mrb_value -mrb_f_local_variables(mrb_state *mrb, mrb_value self) -{ - mrb_value ary; - - ary = mrb_ary_new(mrb); - return ary; /* dummy */ -} - static void method_entry_loop(mrb_state *mrb, struct RClass* klass, mrb_value ary) { @@ -1229,7 +1206,6 @@ mrb_init_kernel(mrb_state *mrb) mrb_define_class_method(mrb, krn, "global_variables", mrb_f_global_variables, ARGS_NONE()); /* 15.3.1.2.4 */ mrb_define_class_method(mrb, krn, "iterator?", mrb_f_block_given_p_m, ARGS_NONE()); /* 15.3.1.2.5 */ mrb_define_class_method(mrb, krn, "lambda", proc_lambda, ARGS_NONE()); /* 15.3.1.2.6 */ - mrb_define_class_method(mrb, krn, "local_variables", mrb_f_local_variables, ARGS_NONE()); /* 15.3.1.2.7 */ ; /* 15.3.1.2.11 */ mrb_define_class_method(mrb, krn, "raise", mrb_f_raise, ARGS_ANY()); /* 15.3.1.2.12 */ @@ -1261,7 +1237,6 @@ mrb_init_kernel(mrb_state *mrb) mrb_define_method(mrb, krn, "iterator?", mrb_f_block_given_p_m, ARGS_NONE()); /* 15.3.1.3.25 */ mrb_define_method(mrb, krn, "kind_of?", mrb_obj_is_kind_of_m, ARGS_REQ(1)); /* 15.3.1.3.26 */ mrb_define_method(mrb, krn, "lambda", proc_lambda, ARGS_NONE()); /* 15.3.1.3.27 */ - mrb_define_method(mrb, krn, "local_variables", mrb_f_local_variables, ARGS_NONE()); /* 15.3.1.3.28 */ mrb_define_method(mrb, krn, "methods", mrb_obj_methods_m, ARGS_ANY()); /* 15.3.1.3.31 */ mrb_define_method(mrb, krn, "nil?", mrb_false, ARGS_NONE()); /* 15.3.1.3.32 */ mrb_define_method(mrb, krn, "object_id", mrb_obj_id_m, ARGS_NONE()); /* 15.3.1.3.33 */ -- cgit v1.2.3 From 4aad9e88d6a459c96ff0daf70849d9cd0b9df4e1 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 19 Jun 2012 15:40:54 +0900 Subject: remove unused mrb_rescue() --- src/etc.c | 15 --------------- src/range.c | 1 - 2 files changed, 16 deletions(-) diff --git a/src/etc.c b/src/etc.c index 40a00c1f5..ac1f79f2f 100644 --- a/src/etc.c +++ b/src/etc.c @@ -70,21 +70,6 @@ mrb_lastline_get(mrb_state *mrb) } } -mrb_value -mrb_rescue2(mrb_state *mrb, mrb_value (* b_proc) (ANYARGS), mrb_value *data1, - mrb_value (* r_proc) (ANYARGS), mrb_value *data2, ...) -{ - mrb_value result = (*b_proc) (mrb, data1); - return result; -} - -mrb_value -mrb_rescue(mrb_state *mrb, mrb_value (* b_proc)(ANYARGS), mrb_value *data1, - mrb_value (* r_proc)(ANYARGS), mrb_value *data2) -{ - return mrb_rescue2(mrb, b_proc, data1, r_proc, data2, mrb->eStandardError_class, - mrb_fixnum_value(0)); -} /* ------------------------------------------------ */ /* * Calls func(obj, arg, recursive), where recursive is non-zero if the diff --git a/src/range.c b/src/range.c index a158dd920..bb6ad6463 100644 --- a/src/range.c +++ b/src/range.c @@ -111,7 +111,6 @@ range_init(mrb_state *mrb, mrb_value range, mrb_value beg, mrb_value end, mrb_in if ((mrb_type(beg) != MRB_TT_FIXNUM) || (mrb_type(end) != MRB_TT_FIXNUM)) { args[0] = beg; args[1] = end; - /* eroor.c v = mrb_rescue(range_check, (mrb_value)args, range_failed, 0); if (mrb_nil_p(v)) range_failed(); */ if (!range_check(mrb, args)) { printf("range_failed()\n"); -- cgit v1.2.3 From e7034b57ff9795456b5b8c8252e8f073be6b97fd Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 19 Jun 2012 16:47:17 +0900 Subject: range.c: typo fixed --- src/range.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/range.c b/src/range.c index bb6ad6463..826481e93 100644 --- a/src/range.c +++ b/src/range.c @@ -111,7 +111,6 @@ range_init(mrb_state *mrb, mrb_value range, mrb_value beg, mrb_value end, mrb_in if ((mrb_type(beg) != MRB_TT_FIXNUM) || (mrb_type(end) != MRB_TT_FIXNUM)) { args[0] = beg; args[1] = end; - if (mrb_nil_p(v)) range_failed(); */ if (!range_check(mrb, args)) { printf("range_failed()\n"); } -- cgit v1.2.3 From 1a7bdcf156d5a150bb0a24905970b0c6065c36ae Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 19 Jun 2012 16:48:31 +0900 Subject: remove local_variables test --- test/t/kernel.rb | 8 -------- 1 file changed, 8 deletions(-) diff --git a/test/t/kernel.rb b/test/t/kernel.rb index 5e25d6516..ba708dbb7 100644 --- a/test/t/kernel.rb +++ b/test/t/kernel.rb @@ -32,10 +32,6 @@ assert('Kernel.lambda', '15.3.1.2.6') do l.call and l.class == Proc end -assert('Kernel.local_variables', '15.3.1.2.7') do - Kernel.local_variables.class == Array -end - assert('Kernel.loop', '15.3.1.2.8') do i = 0 @@ -79,10 +75,6 @@ assert('Kernel#hash', '15.3.1.2.15') do hash == hash end -assert('Kernel#local_variables', '15.3.1.2.28') do - local_variables.class == Array -end - assert('Kernel#loop', '15.3.1.2.29') do i = 0 -- cgit v1.2.3 From 7744315d88ceea6cb4e233506ba9b97693b68569 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 19 Jun 2012 16:50:02 +0900 Subject: add Symbol#<=> --- src/symbol.c | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/symbol.c b/src/symbol.c index 92ed58c23..b80174e7b 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -362,6 +362,37 @@ mrb_sym2name(mrb_state *mrb, mrb_sym sym) } } +#define lesser(a,b) (((a)>(b))?(b):(a)) + +static mrb_value +sym_cmp(mrb_state *mrb, mrb_value s1) +{ + mrb_value s2; + mrb_sym sym1, sym2; + + mrb_get_args(mrb, "o", &s2); + if (mrb_type(s2) != MRB_TT_SYMBOL) return mrb_nil_value(); + sym1 = mrb_symbol(s1); + sym2 = mrb_symbol(s2); + if (sym1 == sym2) return mrb_fixnum_value(0); + else { + const char *p1, *p2; + int len, len1, len2, retval; + + p1 = mrb_sym2name_len(mrb, sym1, &len1); + p2 = mrb_sym2name_len(mrb, sym2, &len2); + len = lesser(len1, len2); + retval = memcmp(p1, p2, len); + if (retval == 0) { + if (len1 == len2) return mrb_fixnum_value(0); + if (len1 > len2) return mrb_fixnum_value(1); + return mrb_fixnum_value(-1); + } + if (retval > 0) return mrb_fixnum_value(1); + return mrb_fixnum_value(-1); + } +} + void mrb_init_symbol(mrb_state *mrb) { @@ -373,6 +404,6 @@ mrb_init_symbol(mrb_state *mrb) mrb_define_method(mrb, sym, "id2name", mrb_sym_to_s, ARGS_NONE()); /* 15.2.11.3.2 */ mrb_define_method(mrb, sym, "to_s", mrb_sym_to_s, ARGS_NONE()); /* 15.2.11.3.3 */ mrb_define_method(mrb, sym, "to_sym", sym_to_sym, ARGS_NONE()); /* 15.2.11.3.4 */ - mrb_define_method(mrb, sym, "inspect", sym_inspect, ARGS_NONE()); /* 15.2.11.3.5(x) */ + mrb_define_method(mrb, sym, "<=>", sym_cmp, ARGS_REQ(1)); } -- cgit v1.2.3 From cd68190480785430b8e350d9a5d2127ab04e1074 Mon Sep 17 00:00:00 2001 From: crimsonwoods Date: Tue, 19 Jun 2012 23:00:29 +0900 Subject: split declaration and definition for 'khash_xxx'. --- include/mruby/khash.h | 63 +++++++++++++++++++++++++++++++++------------------ src/class.c | 3 --- src/hash.c | 3 ++- src/kernel.c | 3 --- src/khash.c | 5 ++++ src/symbol.c | 3 ++- src/variable.c | 2 -- 7 files changed, 50 insertions(+), 32 deletions(-) create mode 100644 src/khash.c diff --git a/include/mruby/khash.h b/include/mruby/khash.h index 22df48ebb..6cb2b383d 100644 --- a/include/mruby/khash.h +++ b/include/mruby/khash.h @@ -32,16 +32,14 @@ static const uint8_t __m[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; #define __ac_iseither(e_flag, d_flag, i) (__ac_isempty(e_flag,d_flag,i)||__ac_isdel(e_flag,d_flag,i)) -/* struct kh_xxx +/* declare struct kh_xxx and kh_xxx_funcs name: ash name khkey_t: key data type khval_t: value data type kh_is_map: (not implemented / not used in RiteVM ) - __hash_func: hash function - __hash_equal: hash comparation function */ -#define KHASH_INIT(name, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) \ +#define KHASH_DECLARE(name, khkey_t, khval_t, kh_is_map) \ typedef struct kh_##name { \ khint_t n_buckets; \ khint_t size; \ @@ -55,7 +53,26 @@ static const uint8_t __m[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; khint_t inc; \ mrb_state *mrb; \ } kh_##name##_t; \ - static void kh_alloc_##name(kh_##name##_t *h) \ + void kh_alloc_##name(kh_##name##_t *h); \ + kh_##name##_t *kh_init_##name(mrb_state *mrb); \ + void kh_destroy_##name(kh_##name##_t *h); \ + void kh_clear_##name(kh_##name##_t *h); \ + khint_t kh_get_##name(kh_##name##_t *h, khkey_t key); \ + khint_t kh_put_##name(kh_##name##_t *h, khkey_t key); \ + void kh_resize_##name(kh_##name##_t *h, khint_t new_n_buckets); \ + void kh_del_##name(kh_##name##_t *h, khint_t x); \ + +/* define kh_xxx_funcs + + name: ash name + khkey_t: key data type + khval_t: value data type + kh_is_map: (not implemented / not used in RiteVM ) + __hash_func: hash function + __hash_equal: hash comparation function +*/ +#define KHASH_DEFINE(name, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) \ + void kh_alloc_##name(kh_##name##_t *h) \ { \ khint_t sz = h->n_buckets; \ h->size = h->n_occupied = 0; \ @@ -69,14 +86,14 @@ static const uint8_t __m[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; h->mask = sz-1; \ h->inc = sz/2-1; \ } \ - static inline kh_##name##_t *kh_init_##name(mrb_state *mrb){ \ + kh_##name##_t *kh_init_##name(mrb_state *mrb){ \ kh_##name##_t *h = (kh_##name##_t*)mrb_calloc(mrb, 1, sizeof(kh_##name##_t)); \ h->n_buckets = INITIAL_HASH_SIZE; \ h->mrb = mrb; \ kh_alloc_##name(h); \ return h; \ } \ - static inline void kh_destroy_##name(kh_##name##_t *h) \ + void kh_destroy_##name(kh_##name##_t *h) \ { \ if( h ){ \ mrb_free(h->mrb, h->keys); \ @@ -85,7 +102,7 @@ static const uint8_t __m[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; mrb_free(h->mrb, h); \ } \ } \ - static inline void kh_clear_##name(kh_##name##_t *h) \ + void kh_clear_##name(kh_##name##_t *h) \ { \ if( h && h->e_flags ){ \ memset(h->e_flags, 0xff, h->n_buckets/8*sizeof(uint8_t)); \ @@ -93,7 +110,7 @@ static const uint8_t __m[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; h->size = h->n_occupied = 0; \ } \ } \ - static inline khint_t kh_get_##name(kh_##name##_t *h, khkey_t key) \ + 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) ){ \ @@ -104,8 +121,7 @@ static const uint8_t __m[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; } \ return h->n_buckets; \ } \ - static inline khint_t kh_put_##name(kh_##name##_t *h, khkey_t key); \ - static void kh_resize_##name(kh_##name##_t *h, khint_t new_n_buckets) \ + void kh_resize_##name(kh_##name##_t *h, khint_t new_n_buckets) \ { \ if( new_n_bucketse_flags; \ khkey_t *old_keys = h->keys; \ khval_t *old_vals = h->vals; \ @@ -124,17 +140,17 @@ static const uint8_t __m[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; kh_alloc_##name(h); \ /* relocate */ \ for( i=0 ; imrb, old_e_flags); \ mrb_free(h->mrb, old_keys); \ mrb_free(h->mrb, old_vals); \ } \ } \ - static inline khint_t kh_put_##name(kh_##name##_t *h, khkey_t key) \ + khint_t kh_put_##name(kh_##name##_t *h, khkey_t key) \ { \ khint_t k; \ if( h->n_occupied >= h->upper_bound ){ \ @@ -159,12 +175,13 @@ static const uint8_t __m[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; } \ return k; \ } \ - static inline void kh_del_##name(kh_##name##_t *h, khint_t x) \ + void kh_del_##name(kh_##name##_t *h, khint_t x) \ { \ h->d_flags[x/8] |= __m[x%8]; \ h->size--; \ } + #define khash_t(name) kh_##name##_t #define kh_init(name,mrb) kh_init_##name(mrb) @@ -197,11 +214,13 @@ static inline khint_t __ac_X31_hash_string(const char *s) #define kh_str_hash_func(mrb,key) __ac_X31_hash_string(key) #define kh_str_hash_equal(mrb,a, b) (strcmp(a, b) == 0) -#define KHASH_MAP_INIT_INT(name, khval_t) \ - KHASH_INIT(name, uint32_t, khval_t, 1, kh_int_hash_func, kh_int_hash_equal) typedef const char *kh_cstr_t; -#define KHASH_MAP_INIT_STR(name, khval_t) \ - KHASH_INIT(name, kh_cstr_t, khval_t, 1, kh_str_hash_func, kh_str_hash_equal) + +/* declare common hash types. */ +#include "mruby.h" + +KHASH_DECLARE(mt, mrb_sym, struct RProc*, 1) +KHASH_DECLARE(iv, mrb_sym, mrb_value, 1) #if defined(__cplusplus) } /* extern "C" { */ diff --git a/src/class.c b/src/class.c index df02a832a..434ecb037 100644 --- a/src/class.c +++ b/src/class.c @@ -17,9 +17,6 @@ #include "mruby/khash.h" -KHASH_INIT(mt, mrb_sym, struct RProc*, 1, kh_int_hash_func, kh_int_hash_equal) -KHASH_INIT(iv, mrb_sym, mrb_value, 1, kh_int_hash_func, kh_int_hash_equal) - typedef struct fc_result { mrb_sym name; struct RClass * klass; diff --git a/src/hash.c b/src/hash.c index fe5336dc1..08f906800 100644 --- a/src/hash.c +++ b/src/hash.c @@ -31,7 +31,8 @@ mrb_hash_ht_hash_equal(mrb_state *mrb, mrb_value a, mrb_value b) return mrb_eql(mrb, a, b); } -KHASH_INIT(ht, mrb_value, mrb_value, 1, mrb_hash_ht_hash_func, mrb_hash_ht_hash_equal); +KHASH_DECLARE(ht, mrb_value, mrb_value, 1); +KHASH_DEFINE (ht, mrb_value, mrb_value, 1, mrb_hash_ht_hash_func, mrb_hash_ht_hash_equal); static void mrb_hash_modify(mrb_state *mrb, mrb_value hash); diff --git a/src/kernel.c b/src/kernel.c index b5bde628a..75c588a81 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -34,9 +34,6 @@ typedef enum { NOEX_RESPONDS = 0x80 } mrb_method_flag_t; -KHASH_INIT(mt, mrb_sym, struct RProc*, 1, kh_int_hash_func, kh_int_hash_equal) -KHASH_INIT(iv, mrb_sym, mrb_value, 1, kh_int_hash_func, kh_int_hash_equal) - struct obj_ivar_tag { mrb_value obj; int (*func)(mrb_sym key, mrb_value val, void * arg); diff --git a/src/khash.c b/src/khash.c new file mode 100644 index 000000000..7ea09cfe7 --- /dev/null +++ b/src/khash.c @@ -0,0 +1,5 @@ +#include "mruby/khash.h" + +KHASH_DEFINE(mt, mrb_sym, struct RProc*, 1, kh_int_hash_func, kh_int_hash_equal) +KHASH_DEFINE(iv, mrb_sym, mrb_value, 1, kh_int_hash_func, kh_int_hash_equal) + diff --git a/src/symbol.c b/src/symbol.c index b80174e7b..d2ae09655 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -36,7 +36,8 @@ sym_hash_func(mrb_state *mrb, const symbol_name s) } #define sym_hash_equal(mrb,a, b) (a.len == b.len && memcmp(a.name, b.name, a.len) == 0) -KHASH_INIT(n2s, symbol_name, mrb_sym, 1, sym_hash_func, sym_hash_equal) +KHASH_DECLARE(n2s, symbol_name, mrb_sym, 1) +KHASH_DEFINE (n2s, symbol_name, mrb_sym, 1, sym_hash_func, sym_hash_equal) /* ------------------------------------------------------ */ mrb_sym mrb_intern2(mrb_state *mrb, const char *name, int len) diff --git a/src/variable.c b/src/variable.c index b11143b02..d89e9d6bb 100644 --- a/src/variable.c +++ b/src/variable.c @@ -19,8 +19,6 @@ #include "st.h" #endif -KHASH_INIT(iv, mrb_sym, mrb_value, 1, kh_int_hash_func, kh_int_hash_equal) - static void mark_tbl(mrb_state *mrb, struct kh_iv *h) { -- cgit v1.2.3 From ea81146a41d730f951de452ffb9217e2aceba19d Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 20 Jun 2012 13:43:26 +0900 Subject: add Module#define_method --- src/class.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/class.c b/src/class.c index df02a832a..3445b1692 100644 --- a/src/class.c +++ b/src/class.c @@ -1209,6 +1209,21 @@ mrb_mod_undef(mrb_state *mrb, mrb_value mod) return mrb_nil_value(); } +static mrb_value +mod_define_method(mrb_state *mrb, mrb_value self) +{ + struct RClass *c = mrb_class_ptr(self); + mrb_sym mid; + mrb_value blk; + + mrb_get_args(mrb, "n&", &mid, &blk); + if (mrb_nil_p(blk)) { + /* raise */ + } + mrb_define_method_raw(mrb, c, mid, mrb_proc_ptr(blk)); + return blk; +} + static mrb_sym mrb_sym_value(mrb_state *mrb, mrb_value val) { @@ -1313,6 +1328,7 @@ mrb_init_class(mrb_state *mrb) mrb_define_method(mrb, mod, "const_defined?", mrb_mod_const_defined, ARGS_REQ(1)); /* 15.2.2.4.20 */ mrb_define_method(mrb, mod, "const_get", mrb_mod_const_get, ARGS_REQ(1)); /* 15.2.2.4.21 */ mrb_define_method(mrb, mod, "const_set", mrb_mod_const_set, ARGS_REQ(2)); /* 15.2.2.4.23 */ + mrb_define_method(mrb, mod, "define_method", mod_define_method, ARGS_REQ(1)); mrb_define_method(mrb, mod, "===", mrb_mod_eqq, ARGS_REQ(1)); } -- cgit v1.2.3 From 97e5ab22f66d0b70643ac2b6d76aef55a5122746 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 20 Jun 2012 13:44:32 +0900 Subject: add Module#{attr,attr_reader,attr_writer,attr_accessor}; close #257 --- mrblib/class.rb | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 mrblib/class.rb diff --git a/mrblib/class.rb b/mrblib/class.rb new file mode 100644 index 000000000..9c3ef91fd --- /dev/null +++ b/mrblib/class.rb @@ -0,0 +1,24 @@ +class Module + # 15.2.2.4.13 + def attr_reader(*names) + names.each{|name| + define_method(name){self.instance_variable_get(name)} + } + end + # 15.2.2.4.14 + def attr_writer(*names) + names.each{|name| + aset = (name.to_s+"=").intern + define_method(aset){|v|self.instance_variable_set(name,v)} + } + end + # 15.2.2.4.12 + def attr_accessor(*names) + attr_reader(*names) + attr_writer(*names) + end + # 15.2.2.4.11 + def attr(name) + attr_reader(name) + end +end -- cgit v1.2.3 From 88db589e7f965e5b16b82eca76f2e1febd82d124 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 20 Jun 2012 15:12:35 +0900 Subject: protect crash from empty irep --- src/vm.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/vm.c b/src/vm.c index 826cdafef..c78799c6d 100644 --- a/src/vm.c +++ b/src/vm.c @@ -788,6 +788,10 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) /* setup environment for calling method */ proc = m; irep = m->body.irep; + if (!irep) { + mrb->stack[0] = mrb_nil_value(); + goto L_RETURN; + } pool = irep->pool; syms = irep->syms; ci->nregs = irep->nregs; -- cgit v1.2.3 From e9231bca7a5fafa67e0a15aa657e727e46a1363a Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 20 Jun 2012 15:26:10 +0900 Subject: allow lambda duplication --- src/proc.c | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/src/proc.c b/src/proc.c index 21c462493..c64bb88ac 100644 --- a/src/proc.c +++ b/src/proc.c @@ -56,20 +56,40 @@ mrb_proc_new_cfunc(mrb_state *mrb, mrb_func_t func) return p; } +static inline void +proc_copy(struct RProc *a, struct RProc *b) +{ + a->body = b->body; + a->target_class = b->target_class; + a->env = b->env; +} + static mrb_value mrb_proc_initialize(mrb_state *mrb, mrb_value self) { mrb_value blk; mrb_get_args(mrb, "&", &blk); - if (!mrb_nil_p(blk)) { - *mrb_proc_ptr(self) = *mrb_proc_ptr(blk); - } - else { + if (mrb_nil_p(blk)) { /* Calling Proc.new without a block is not implemented yet */ mrb_raise(mrb, E_ARGUMENT_ERROR, "tried to create Proc object without a block"); } + else { + proc_copy(mrb_proc_ptr(self), mrb_proc_ptr(blk)); + } + return self; +} + +static mrb_value +mrb_proc_init_copy(mrb_state *mrb, mrb_value self) +{ + mrb_value proc; + mrb_get_args(mrb, "o", &proc); + if (mrb_type(proc) != MRB_TT_PROC) { + mrb_raise(mrb, E_ARGUMENT_ERROR, "not a proc"); + } + proc_copy(mrb_proc_ptr(self), mrb_proc_ptr(proc)); return self; } @@ -108,8 +128,10 @@ mrb_init_proc(mrb_state *mrb) call_irep->ilen = 1; mrb->proc_class = mrb_define_class(mrb, "Proc", mrb->object_class); + MRB_SET_INSTANCE_TT(mrb->proc_class, MRB_TT_PROC); mrb_define_method(mrb, mrb->proc_class, "initialize", mrb_proc_initialize, ARGS_NONE()); + mrb_define_method(mrb, mrb->proc_class, "initialize_copy", mrb_proc_init_copy, ARGS_REQ(1)); m = mrb_proc_new(mrb, call_irep); mrb_define_method_raw(mrb, mrb->proc_class, mrb_intern(mrb, "call"), m); -- cgit v1.2.3 From b11d4647e91bdcd6dfaecfaccdc4c350b1bc413f Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 20 Jun 2012 15:41:22 +0900 Subject: ISO conforming lambda --- mrblib/kernel.rb | 20 -------------------- src/kernel.c | 18 ------------------ src/proc.c | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 33 insertions(+), 38 deletions(-) diff --git a/mrblib/kernel.rb b/mrblib/kernel.rb index c263ec403..f29a80973 100644 --- a/mrblib/kernel.rb +++ b/mrblib/kernel.rb @@ -3,17 +3,6 @@ # # ISO 15.3.1 module Kernel - - ## - # Takes the given block, create a lambda - # out of it and +call+ it. - # - # ISO 15.3.1.2.6 - def self.lambda(&block) - ### *** TODO *** ### - block # dummy - end - ## # Calls the given block repetitively. # @@ -42,15 +31,6 @@ module Kernel Kernel.eval(s) end - ## - # Alias for +Kernel.lambda+. - # - # ISO 15.3.1.3.27 - def lambda(&block) - ### *** TODO *** ### - block # dummy - end - ## # Alias for +Kernel.loop+. # diff --git a/src/kernel.c b/src/kernel.c index b5bde628a..45eda6d2f 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -794,22 +794,6 @@ mrb_obj_is_kind_of_m(mrb_state *mrb, mrb_value self) } } -/* 15.3.1.2.6 */ -/* 15.3.1.3.27 */ -/* - * call-seq: - * lambda { |...| block } -> a_proc - * - * Equivalent to Proc.new, except the resulting Proc objects - * check the number of parameters passed when called. - */ -mrb_value -proc_lambda(mrb_state *mrb, mrb_value self) -{ - //return mrb_block_lambda(); - return mrb_nil_value(); /* dummy */ -} - static void method_entry_loop(mrb_state *mrb, struct RClass* klass, mrb_value ary) { @@ -1205,7 +1189,6 @@ mrb_init_kernel(mrb_state *mrb) mrb_define_class_method(mrb, krn, "block_given?", mrb_f_block_given_p_m, ARGS_NONE()); /* 15.3.1.2.2 */ mrb_define_class_method(mrb, krn, "global_variables", mrb_f_global_variables, ARGS_NONE()); /* 15.3.1.2.4 */ mrb_define_class_method(mrb, krn, "iterator?", mrb_f_block_given_p_m, ARGS_NONE()); /* 15.3.1.2.5 */ - mrb_define_class_method(mrb, krn, "lambda", proc_lambda, ARGS_NONE()); /* 15.3.1.2.6 */ ; /* 15.3.1.2.11 */ mrb_define_class_method(mrb, krn, "raise", mrb_f_raise, ARGS_ANY()); /* 15.3.1.2.12 */ @@ -1236,7 +1219,6 @@ mrb_init_kernel(mrb_state *mrb) mrb_define_method(mrb, krn, "is_a?", mrb_obj_is_kind_of_m, ARGS_REQ(1)); /* 15.3.1.3.24 */ mrb_define_method(mrb, krn, "iterator?", mrb_f_block_given_p_m, ARGS_NONE()); /* 15.3.1.3.25 */ mrb_define_method(mrb, krn, "kind_of?", mrb_obj_is_kind_of_m, ARGS_REQ(1)); /* 15.3.1.3.26 */ - mrb_define_method(mrb, krn, "lambda", proc_lambda, ARGS_NONE()); /* 15.3.1.3.27 */ mrb_define_method(mrb, krn, "methods", mrb_obj_methods_m, ARGS_ANY()); /* 15.3.1.3.31 */ mrb_define_method(mrb, krn, "nil?", mrb_false, ARGS_NONE()); /* 15.3.1.3.32 */ mrb_define_method(mrb, krn, "object_id", mrb_obj_id_m, ARGS_NONE()); /* 15.3.1.3.33 */ diff --git a/src/proc.c b/src/proc.c index c64bb88ac..98f753ac6 100644 --- a/src/proc.c +++ b/src/proc.c @@ -59,6 +59,7 @@ mrb_proc_new_cfunc(mrb_state *mrb, mrb_func_t func) static inline void proc_copy(struct RProc *a, struct RProc *b) { + a->flags = b->flags; a->body = b->body; a->target_class = b->target_class; a->env = b->env; @@ -111,6 +112,35 @@ mrb_proc_iseq(mrb_state *mrb, struct RProc *p) return p->body.irep->iseq; } +/* 15.3.1.2.6 */ +/* 15.3.1.3.27 */ +/* + * call-seq: + * lambda { |...| block } -> a_proc + * + * Equivalent to Proc.new, except the resulting Proc objects + * check the number of parameters passed when called. + */ +static mrb_value +proc_lambda(mrb_state *mrb, mrb_value self) +{ + mrb_value blk; + struct RProc *p; + + mrb_get_args(mrb, "&", &blk); + if (mrb_nil_p(blk)) { + mrb_raise(mrb, E_ARGUMENT_ERROR, "tried to create Proc object without a block"); + } + p = mrb_proc_ptr(blk); + if (!MRB_PROC_STRICT_P(p)) { + struct RProc *p2 = (struct RProc*)mrb_obj_alloc(mrb, MRB_TT_PROC, p->c); + proc_copy(p2, p); + p2->flags |= MRB_PROC_STRICT; + return mrb_obj_value(p2); + } + return self; +} + void mrb_init_proc(mrb_state *mrb) { @@ -136,4 +166,7 @@ mrb_init_proc(mrb_state *mrb) 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_class_method(mrb, mrb->kernel_module, "lambda", proc_lambda, ARGS_NONE()); /* 15.3.1.2.6 */ + mrb_define_method(mrb, mrb->kernel_module, "lambda", proc_lambda, ARGS_NONE()); /* 15.3.1.3.27 */ } -- cgit v1.2.3 From 6f22a61135fd077c1dcff2dec92ab215e3a83d79 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 20 Jun 2012 15:42:51 +0900 Subject: __send__ added --- mrblib/kernel.rb | 8 -------- src/kernel.c | 1 + 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/mrblib/kernel.rb b/mrblib/kernel.rb index f29a80973..ad3bc72f7 100644 --- a/mrblib/kernel.rb +++ b/mrblib/kernel.rb @@ -18,14 +18,6 @@ module Kernel raise NotImplementedError.new("eval not implemented") end - ## - # Alias for +send+. - # - # ISO 15.3.1.3.4 - #def __send__(symbol, *args, &block) - ### *** TODO *** ### - #end - # 15.3.1.3.12 def eval(s) Kernel.eval(s) diff --git a/src/kernel.c b/src/kernel.c index 45eda6d2f..5b65714b6 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -1229,6 +1229,7 @@ mrb_init_kernel(mrb_state *mrb) mrb_define_method(mrb, krn, "remove_instance_variable", mrb_obj_remove_instance_variable,ARGS_REQ(1)); /* 15.3.1.3.41 */ mrb_define_method(mrb, krn, "respond_to?", obj_respond_to, ARGS_ANY()); /* 15.3.1.3.43 */ mrb_define_method(mrb, krn, "send", mrb_f_send, ARGS_ANY()); /* 15.3.1.3.44 */ + mrb_define_method(mrb, krn, "__send__", mrb_f_send, ARGS_ANY()); /* 15.3.1.3.4 */ mrb_define_method(mrb, krn, "singleton_methods", mrb_obj_singleton_methods_m, ARGS_ANY()); /* 15.3.1.3.45 */ mrb_define_method(mrb, krn, "to_s", mrb_any_to_s, ARGS_NONE()); /* 15.3.1.3.46 */ -- cgit v1.2.3 From ef50e63a63c9b3759a2030816c9e2c5ec4e14cd0 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 20 Jun 2012 20:43:27 +0900 Subject: remove RuntimeError from mrb_state --- include/mruby.h | 2 +- src/error.c | 8 ++++---- src/gc.c | 2 +- src/kernel.c | 6 +++--- src/re.c | 2 +- src/string.c | 2 +- src/vm.c | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/include/mruby.h b/include/mruby.h index ef742cef4..aadd56e94 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -279,7 +279,6 @@ typedef struct mrb_state { struct RClass *eException_class; struct RClass *eStandardError_class; - struct RClass *eRuntimeError_class; void *ud; /* auxiliary data */ } mrb_state; @@ -430,6 +429,7 @@ void rb_raise(struct RClass *c, const char *fmt, ...); void mrb_warn(const char *fmt, ...); void mrb_bug(const char *fmt, ...); +#define E_RUNTIME_ERROR (mrb_class_obj_get(mrb, "RuntimeError")) #define E_TYPE_ERROR (mrb_class_obj_get(mrb, "TypeError")) #define E_ARGUMENT_ERROR (mrb_class_obj_get(mrb, "ArgumentError")) #define E_INDEX_ERROR (mrb_class_obj_get(mrb, "IndexError")) diff --git a/src/error.c b/src/error.c index b2d9a8c8d..1183d8643 100644 --- a/src/error.c +++ b/src/error.c @@ -301,7 +301,7 @@ make_exception(mrb_state *mrb, int argc, mrb_value *argv, int isstr) if (isstr) { mesg = mrb_check_string_type(mrb, argv[0]); if (!mrb_nil_p(mesg)) { - mesg = mrb_exc_new3(mrb, mrb->eRuntimeError_class, mesg); + mesg = mrb_exc_new3(mrb, E_RUNTIME_ERROR, mesg); break; } } @@ -352,7 +352,7 @@ mrb_make_exception(mrb_state *mrb, int argc, mrb_value *argv) void mrb_sys_fail(mrb_state *mrb, const char *mesg) { - mrb_raise(mrb, mrb->eRuntimeError_class, "%s", mesg); + mrb_raise(mrb, E_RUNTIME_ERROR, "%s", mesg); } void @@ -369,6 +369,6 @@ mrb_init_exception(mrb_state *mrb) mrb_define_method(mrb, e, "message", exc_message, ARGS_NONE()); mrb_define_method(mrb, e, "inspect", exc_inspect, ARGS_NONE()); - mrb->eStandardError_class = mrb_define_class(mrb, "StandardError", mrb->eException_class); /* 15.2.23 */ - mrb->eRuntimeError_class = mrb_define_class(mrb, "RuntimeError", mrb->eStandardError_class); /* 15.2.28 */ + mrb->eStandardError_class = mrb_define_class(mrb, "StandardError", mrb->eException_class); /* 15.2.23 */ + mrb_define_class(mrb, "RuntimeError", mrb->eStandardError_class); /* 15.2.28 */ } diff --git a/src/gc.c b/src/gc.c index c07c9b13b..a7537a015 100644 --- a/src/gc.c +++ b/src/gc.c @@ -277,7 +277,7 @@ gc_protect(mrb_state *mrb, struct RBasic *p) if (mrb->arena_idx > MRB_ARENA_SIZE) { /* arena overflow error */ mrb->arena_idx = MRB_ARENA_SIZE - 4; /* force room in arena */ - mrb_raise(mrb, mrb->eRuntimeError_class, "arena overflow error"); + mrb_raise(mrb, E_RUNTIME_ERROR, "arena overflow error"); } mrb->arena[mrb->arena_idx++] = p; } diff --git a/src/kernel.c b/src/kernel.c index 5b65714b6..209eaa91d 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -573,7 +573,7 @@ mrb_obj_instance_eval(mrb_state *mrb, mrb_value self) mrb_value a, b; if (mrb_get_args(mrb, "|S&", &a, &b) == 1) { - mrb_raise(mrb, mrb->eRuntimeError_class, "instance_eval with string not implemented"); + mrb_raise(mrb, E_RUNTIME_ERROR, "instance_eval with string not implemented"); } return mrb_yield_with_self(mrb, b, 0, 0, self); } @@ -1019,13 +1019,13 @@ mrb_f_raise(mrb_state *mrb, mrb_value self) argc = mrb_get_args(mrb, "|oo", &a[0], &a[1]); switch (argc) { case 0: - mrb_raise(mrb, mrb->eRuntimeError_class, ""); + mrb_raise(mrb, E_RUNTIME_ERROR, ""); break; case 1: a[1] = mrb_check_string_type(mrb, a[0]); if (!mrb_nil_p(a[1])) { argc = 2; - a[0] = mrb_obj_value(mrb->eRuntimeError_class); + a[0] = mrb_obj_value(E_RUNTIME_ERROR); } /* fall through */ default: diff --git a/src/re.c b/src/re.c index 70e7c59b6..b821d2e71 100644 --- a/src/re.c +++ b/src/re.c @@ -2143,7 +2143,7 @@ mrb_reg_regsub(mrb_state *mrb, mrb_value str, mrb_value src, struct re_registers break; } else { - mrb_raise(mrb, mrb->eRuntimeError_class, "invalid group name reference format"); + mrb_raise(mrb, E_RUNTIME_ERROR, "invalid group name reference format"); } } diff --git a/src/string.c b/src/string.c index 6392b504c..585edf8a3 100644 --- a/src/string.c +++ b/src/string.c @@ -100,7 +100,7 @@ str_mod_check(mrb_state *mrb, mrb_value str, char *p, mrb_int len) struct RString *s = mrb_str_ptr(str); if (s->ptr != p || s->len != len) { - mrb_raise(mrb, mrb->eRuntimeError_class, "string modified"); + mrb_raise(mrb, E_RUNTIME_ERROR, "string modified"); } } diff --git a/src/vm.c b/src/vm.c index c78799c6d..f3e5a497a 100644 --- a/src/vm.c +++ b/src/vm.c @@ -1604,7 +1604,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) CASE(OP_ERR) { /* Bx raise RuntimeError with message Lit(Bx) */ mrb_value msg = pool[GETARG_Bx(i)]; - mrb_value exc = mrb_exc_new3(mrb, mrb->eRuntimeError_class, msg); + mrb_value exc = mrb_exc_new3(mrb, E_RUNTIME_ERROR, msg); mrb->exc = (struct RObject*)mrb_object(exc); goto L_RAISE; -- cgit v1.2.3 From e61bdbe3960aa471a8b4e5d8a89614d1433959aa Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 20 Jun 2012 20:45:04 +0900 Subject: add printf method --- mrblib/print.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mrblib/print.rb b/mrblib/print.rb index 0d33c66d2..452ba53a9 100644 --- a/mrblib/print.rb +++ b/mrblib/print.rb @@ -47,4 +47,8 @@ module Kernel end args[0] end + + def printf(*args) + __printstr__(sprintf(*args)) + end end -- cgit v1.2.3 From 8b8151a60e53e3182382acca8b128c6d1d7f0b4f Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 21 Jun 2012 10:46:21 +0900 Subject: remove khash.c; khash.h dependency to mruby.h; refactoring --- src/khash.c | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 src/khash.c diff --git a/src/khash.c b/src/khash.c deleted file mode 100644 index 7ea09cfe7..000000000 --- a/src/khash.c +++ /dev/null @@ -1,5 +0,0 @@ -#include "mruby/khash.h" - -KHASH_DEFINE(mt, mrb_sym, struct RProc*, 1, kh_int_hash_func, kh_int_hash_equal) -KHASH_DEFINE(iv, mrb_sym, mrb_value, 1, kh_int_hash_func, kh_int_hash_equal) - -- cgit v1.2.3 From 396397bce17a0f03eab8ed6512651e665aa89c8a Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 21 Jun 2012 11:04:36 +0900 Subject: move KHASH_DECLARE to header files --- include/mruby/khash.h | 6 ------ include/mruby/proc.h | 3 +++ include/mruby/variable.h | 7 ++++++- src/class.c | 6 ++---- src/kernel.c | 37 +++++-------------------------------- src/variable.c | 47 ++++++++++++++++++++++++++++++++++++++++++++--- 6 files changed, 60 insertions(+), 46 deletions(-) diff --git a/include/mruby/khash.h b/include/mruby/khash.h index 6cb2b383d..e236f0bea 100644 --- a/include/mruby/khash.h +++ b/include/mruby/khash.h @@ -216,12 +216,6 @@ static inline khint_t __ac_X31_hash_string(const char *s) typedef const char *kh_cstr_t; -/* declare common hash types. */ -#include "mruby.h" - -KHASH_DECLARE(mt, mrb_sym, struct RProc*, 1) -KHASH_DECLARE(iv, mrb_sym, mrb_value, 1) - #if defined(__cplusplus) } /* extern "C" { */ #endif diff --git a/include/mruby/proc.h b/include/mruby/proc.h index 52dc5a98e..8f178790e 100644 --- a/include/mruby/proc.h +++ b/include/mruby/proc.h @@ -50,6 +50,9 @@ struct RProc *mrb_proc_new(mrb_state*, mrb_irep*); struct RProc *mrb_proc_new_cfunc(mrb_state*, mrb_func_t); struct RProc *mrb_closure_new(mrb_state*, mrb_irep*); +#include "mruby/khash.h" +KHASH_DECLARE(mt, mrb_sym, struct RProc*, 1); + #if defined(__cplusplus) } /* extern "C" { */ #endif diff --git a/include/mruby/variable.h b/include/mruby/variable.h index fb686fd47..440c4cc8b 100644 --- a/include/mruby/variable.h +++ b/include/mruby/variable.h @@ -20,6 +20,7 @@ typedef struct global_variable { //int block_trace; //struct trace_var *trace; } global_variable; + struct global_entry { global_variable *var; mrb_sym id; @@ -41,7 +42,8 @@ mrb_value mrb_obj_iv_get(mrb_state*, struct RObject*, mrb_sym); void mrb_obj_iv_set(mrb_state*, struct RObject*, mrb_sym, mrb_value); const char * mrb_class2name(mrb_state *mrb, struct RClass* klass); mrb_value mrb_iv_get(mrb_state *mrb, mrb_value obj, mrb_sym sym); -void mrb_iv_set(mrb_state *mrb, mrb_value obj, mrb_sym sym, mrb_value v); /* mrb_iv_set */ +void mrb_iv_set(mrb_state *mrb, mrb_value obj, mrb_sym sym, mrb_value v); +mrb_value mrb_iv_remove(mrb_state *mrb, mrb_value obj, mrb_sym sym); void mrb_copy_generic_ivar(mrb_value clone, mrb_value obj); int mrb_const_defined_at(mrb_state *mrb, struct RClass *klass, mrb_sym id); mrb_value mrb_f_global_variables(mrb_state *mrb, mrb_value self); @@ -55,6 +57,9 @@ void mrb_gc_mark_iv(mrb_state*, struct RObject*); size_t mrb_gc_mark_iv_size(mrb_state*, struct RObject*); void mrb_gc_free_iv(mrb_state*, struct RObject*); +#include "mruby/khash.h" +KHASH_DECLARE(iv, mrb_sym, mrb_value, 1) + #if defined(__cplusplus) } /* extern "C" { */ #endif diff --git a/src/class.c b/src/class.c index 72fef70aa..56ab8c06f 100644 --- a/src/class.c +++ b/src/class.c @@ -15,7 +15,8 @@ #include "mruby/array.h" #include "error.h" -#include "mruby/khash.h" +KHASH_DEFINE(iv, mrb_sym, mrb_value, 1, kh_int_hash_func, kh_int_hash_equal); +KHASH_DEFINE(mt, mrb_sym, struct RProc*, 1, kh_int_hash_func, kh_int_hash_equal); typedef struct fc_result { mrb_sym name; @@ -25,9 +26,6 @@ typedef struct fc_result { struct fc_result *prev; } fcresult_t; -int kiv_lookup(khash_t(iv) *table, mrb_sym key, mrb_value *value); -extern struct kh_iv *mrb_class_tbl; - void mrb_gc_mark_mt(mrb_state *mrb, struct RClass *c) { diff --git a/src/kernel.c b/src/kernel.c index a9f4792d7..fd0440e05 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -10,14 +10,12 @@ #include #include #include "mruby/proc.h" - #include "mruby/range.h" #include "mruby/array.h" #include "mruby/hash.h" #include "mruby/class.h" #include "mruby/struct.h" #include "mruby/variable.h" -#include "mruby/khash.h" #include "error.h" typedef enum { @@ -1057,39 +1055,14 @@ mrb_value mrb_obj_remove_instance_variable(mrb_state *mrb, mrb_value self) { mrb_sym sym; - mrb_value name; - khash_t(iv) *h; - khiter_t k; mrb_value val; - mrb_value Qundef = mrb_undef_value(); - mrb_get_args(mrb, "o", &name); - sym = mrb_to_id(mrb, name); - //if (OBJ_FROZEN(obj)) mrb_error_frozen("object"); - //if (!mrb_is_instance_id(id)) { - // mrb_name_error(mrb, id, "`%s' is not allowed as an instance variable name", mrb_sym2name(mrb, id)); - //} - switch (mrb_type(self)) { - case MRB_TT_OBJECT: - case MRB_TT_CLASS: - case MRB_TT_MODULE: - if (!mrb_obj_ptr(self)->iv) break; - h = mrb_obj_ptr(self)->iv; - if (!h) break; - k = kh_get(iv, h, sym); - if (k != kh_end(h)) { - val = kh_value(h, k); - if (!mrb_obj_equal(mrb, val, Qundef)) { - kh_value(h, k) = Qundef; - return val; - } - } - break; - default: - break; + mrb_get_args(mrb, "n", &sym); + val = mrb_iv_remove(mrb, self, sym); + if (UNDEF_P(val)) { + mrb_name_error(mrb, sym, "instance variable %s not defined", mrb_sym2name(mrb, sym)); } - mrb_name_error(mrb, sym, "instance variable %s not defined", mrb_sym2name(mrb, sym)); - return mrb_nil_value(); /* not reached */ + return val; } static inline int diff --git a/src/variable.c b/src/variable.c index d89e9d6bb..051c971d6 100644 --- a/src/variable.c +++ b/src/variable.c @@ -94,10 +94,28 @@ mrb_obj_iv_get(mrb_state *mrb, struct RObject *obj, mrb_sym sym) return ivget(mrb, obj->iv, sym); } +static int +obj_iv_p(mrb_value obj) +{ + switch (mrb_type(obj)) { + case MRB_TT_OBJECT: + case MRB_TT_CLASS: + case MRB_TT_MODULE: + case MRB_TT_HASH: + case MRB_TT_DATA: + return TRUE; + default: + return FALSE; + } +} + mrb_value mrb_iv_get(mrb_state *mrb, mrb_value obj, mrb_sym sym) { - return mrb_obj_iv_get(mrb, mrb_obj_ptr(obj), sym); + if (obj_iv_p(obj)) { + return mrb_obj_iv_get(mrb, mrb_obj_ptr(obj), sym); + } + return mrb_nil_value(); } static void @@ -127,7 +145,30 @@ mrb_obj_iv_set(mrb_state *mrb, struct RObject *obj, mrb_sym sym, mrb_value v) void mrb_iv_set(mrb_state *mrb, mrb_value obj, mrb_sym sym, mrb_value v) /* mrb_ivar_set */ { - mrb_obj_iv_set(mrb, mrb_obj_ptr(obj), sym, v); + if (obj_iv_p(obj)) { + mrb_obj_iv_set(mrb, mrb_obj_ptr(obj), sym, v); + } +} + +mrb_value +mrb_iv_remove(mrb_state *mrb, mrb_value obj, mrb_sym sym) +{ + mrb_value val; + + if (obj_iv_p(obj)) { + khash_t(iv) *h = mrb_obj_ptr(obj)->iv; + khiter_t k; + + if (h) { + k = kh_get(iv, h, sym); + if (k != kh_end(h)) { + val = kh_value(h, k); + kh_del(iv, h, k); + return val; + } + } + } + return mrb_undef_value(); } mrb_value @@ -366,7 +407,7 @@ mrb_st_lookup(struct kh_iv *table, mrb_sym id, khiter_t *value) } } -int +static int kiv_lookup(khash_t(iv)* table, mrb_sym key, mrb_value *value) { khash_t(iv) *h=table; -- cgit v1.2.3 From aa1bbe67b67b36bdc449255c6ebb1c48c4c0a7db Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Thu, 21 Jun 2012 11:17:16 +0900 Subject: Simplify. Should not use strlen() as possible. It needs complexity. --- src/codegen.c | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/codegen.c b/src/codegen.c index e6c339521..3374b2e7f 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -633,31 +633,31 @@ gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val) { const char *name = mrb_sym2name(s->mrb, sym); - if (!noop && name[0] == '+' && strlen(name) == 1) { + if (!noop && name[0] == '+' && name[1] == '\0') { genop(s, MKOP_ABC(OP_ADD, cursp(), idx, n)); } - else if (!noop && name[0] == '-' && strlen(name) == 1) { + else if (!noop && name[0] == '-' && name[1] == '\0') { genop(s, MKOP_ABC(OP_SUB, cursp(), idx, n)); } - else if (!noop && name[0] == '*' && strlen(name) == 1) { + else if (!noop && name[0] == '*' && name[1] == '\0') { genop(s, MKOP_ABC(OP_MUL, cursp(), idx, n)); } - else if (!noop && name[0] == '/' && strlen(name) == 1) { + else if (!noop && name[0] == '/' && name[1] == '\0') { genop(s, MKOP_ABC(OP_DIV, cursp(), idx, n)); } - else if (!noop && name[0] == '<' && strlen(name) == 1) { + else if (!noop && name[0] == '<' && name[1] == '\0') { genop(s, MKOP_ABC(OP_LT, cursp(), idx, n)); } - else if (!noop && name[0] == '<' && strlen(name) == 2 && name[1] == '=') { + else if (!noop && name[0] == '<' && name[1] == '=' && name[2] == '\0') { genop(s, MKOP_ABC(OP_LE, cursp(), idx, n)); } - else if (!noop && name[0] == '>' && strlen(name) == 1) { + else if (!noop && name[0] == '>' && name[1] == '\0') { genop(s, MKOP_ABC(OP_GT, cursp(), idx, n)); } - else if (!noop && name[0] == '>' && strlen(name) == 2 && name[1] == '=') { + else if (!noop && name[0] == '>' && name[1] == '=' && name[2] == '\0') { genop(s, MKOP_ABC(OP_GE, cursp(), idx, n)); } - else if (!noop && name[0] == '=' && strlen(name) == 2 && name[1] == '=') { + else if (!noop && name[0] == '=' && name[1] == '=' && name[2] == '\0') { genop(s, MKOP_ABC(OP_EQ, cursp(), idx, n)); } else { @@ -1258,8 +1258,8 @@ codegen(codegen_scope *s, node *tree, int val) int idx; codegen(s, tree->car, VAL); - if ((name[0] == '|' && strlen(name) == 2 && name[1] == '|') || - (name[0] == '&' && strlen(name) == 2 && name[1] == '&')) { + if ((name[0] == '|' && name[1] == '|' && name[2] == '\0') || + (name[0] == '&' && name[1] == '&' && name[2] == '\0')) { int pos; pop(); @@ -1276,22 +1276,22 @@ codegen(codegen_scope *s, node *tree, int val) pop(); pop(); idx = new_msym(s, sym); - if (name[0] == '+' && strlen(name) == 1) { + if (name[0] == '+' && name[1] == '\0') { genop(s, MKOP_ABC(OP_ADD, cursp(), idx, 1)); } - else if (name[0] == '-' && strlen(name) == 1) { + else if (name[0] == '-' && name[1] == '\0') { genop(s, MKOP_ABC(OP_SUB, cursp(), idx, 1)); } - else if (name[0] == '<' && strlen(name) == 1) { + else if (name[0] == '<' && name[1] == '\0') { genop(s, MKOP_ABC(OP_LT, cursp(), idx, 1)); } - else if (name[0] == '<' && strlen(name) == 2 && name[1] == '=') { + else if (name[0] == '<' && name[1] == '=' && name[2] == '\0') { genop(s, MKOP_ABC(OP_LE, cursp(), idx, 1)); } - else if (name[0] == '>' && strlen(name) == 1) { + else if (name[0] == '>' && name[1] == '\0') { genop(s, MKOP_ABC(OP_GT, cursp(), idx, 1)); } - else if (name[0] == '>' && strlen(name) == 2 && name[1] == '=') { + else if (name[0] == '>' && name[1] == '=' && name[2] == '\0') { genop(s, MKOP_ABC(OP_GE, cursp(), idx, 1)); } else { -- cgit v1.2.3 From 750a639eab6e0c5615cd7651c1ab4215a8247ef7 Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Thu, 21 Jun 2012 11:43:03 +0900 Subject: Add test for Array#to_s and Array#inspect. --- test/t/array.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/t/array.rb b/test/t/array.rb index 1cfe02af7..3f441c1cc 100644 --- a/test/t/array.rb +++ b/test/t/array.rb @@ -234,4 +234,12 @@ assert('Array#unshift', '15.2.12.5.30') do a == [1,2,3] and b == [1,2,3] end +assert('Array#to_s', '15.2.12.5.31') do + a = [2, 3, 4, 5] + r1 = a.to_s + r2 = a.inspect + + r1 == r2 and r1 == "[2, 3, 4, 5]" +end + # Not ISO specified -- cgit v1.2.3 From 0c5b704de355d021f73af72ff4050485fe4203ec Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Thu, 21 Jun 2012 11:45:55 +0900 Subject: Remove strlen(). We can use sizeof() of char array because sizeof(char) is always 1 (ISO C99). --- src/array.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/array.c b/src/array.c index 3b42abc74..ca111bc0e 100644 --- a/src/array.c +++ b/src/array.c @@ -880,9 +880,9 @@ inspect_ary(mrb_state *mrb, mrb_value ary, mrb_value list) { int i; mrb_value s, arystr; - char *head = "["; - char *sep = ", "; - char *tail = "]"; + char head[] = { '[' }; + char sep[] = { ',', ' ' }; + char tail[] = { ']' }; /* check recursive */ for(i=0; i 0) { - mrb_str_buf_cat(mrb, arystr, sep, strlen(sep)); + mrb_str_buf_cat(mrb, arystr, sep, sizeof(sep)); } if (mrb_type(RARRAY_PTR(ary)[i]) == MRB_TT_ARRAY) { s = inspect_ary(mrb, RARRAY_PTR(ary)[i], list); @@ -911,7 +911,7 @@ inspect_ary(mrb_state *mrb, mrb_value ary, mrb_value list) mrb_gc_arena_restore(mrb, ai); } - mrb_str_buf_cat(mrb, arystr, tail, strlen(tail)); + mrb_str_buf_cat(mrb, arystr, tail, sizeof(tail)); mrb_ary_pop(mrb, list); return arystr; -- cgit v1.2.3 From 64693ef7fc349d37ea170de021b1f3c7763e817b Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Thu, 21 Jun 2012 14:22:24 +0800 Subject: Create new constants to indicate optional features --- src/kernel.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/kernel.c b/src/kernel.c index fd0440e05..d2fceae55 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -1206,6 +1206,39 @@ mrb_init_kernel(mrb_state *mrb) #ifdef ENABLE_KERNEL_SPRINTF mrb_define_method(mrb, krn, "sprintf", mrb_f_sprintf, ARGS_ANY()); /* in sprintf.c */ mrb_define_method(mrb, krn, "format", mrb_f_sprintf, ARGS_ANY()); /* in sprintf.c */ + mrb_define_const(mrb, krn, "SprintfEnabled", mrb_true_value()); +#else + mrb_define_const(mrb, krn, "SprintfEnabled", mrb_false_value()); +#endif + +#ifdef ENABLE_MATH + mrb_define_const(mrb, krn, "MathEnabled", mrb_true_value()); +#else + mrb_define_const(mrb, krn, "MathEnabled", mrb_false_value()); +#endif + +#ifdef ENABLE_TIME + mrb_define_const(mrb, krn, "TimeEnabled", mrb_true_value()); +#else + mrb_define_const(mrb, krn, "TimeEnabled", mrb_false_value()); +#endif + +#ifdef ENABLE_REGEXP + mrb_define_const(mrb, krn, "RegExpEnabled", mrb_true_value()); +#else + mrb_define_const(mrb, krn, "RegExpEnabled", mrb_false_value()); +#endif + +#ifdef ENABLE_STRUCT + mrb_define_const(mrb, krn, "StructEnabled", mrb_true_value()); +#else + mrb_define_const(mrb, krn, "StructEnabled", mrb_false_value()); +#endif + +#ifdef MRB_USE_FLOAT + mrb_define_const(mrb, krn, "UsingFloat", mrb_true_value()); +#else + mrb_define_const(mrb, krn, "UsingFloat", mrb_false_value()); #endif mrb_include_module(mrb, mrb->object_class, mrb->kernel_module); -- cgit v1.2.3 From c09f804e2bd62fa861cf802181b26f2e01add7aa Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Thu, 21 Jun 2012 14:22:50 +0800 Subject: Skip math test in case that Math isn't implemented --- test/t/math.rb | 178 +++++++++++++++++++++++++++++---------------------------- 1 file changed, 90 insertions(+), 88 deletions(-) diff --git a/test/t/math.rb b/test/t/math.rb index 47a3bf527..d60d80ae7 100644 --- a/test/t/math.rb +++ b/test/t/math.rb @@ -1,115 +1,117 @@ ## # Math Test -assert('Math.sin 0') do - check_float(Math.sin(0), 0) -end +if MathEnabled + assert('Math.sin 0') do + check_float(Math.sin(0), 0) + end -assert('Math.sin PI/2') do - check_float(Math.sin(Math::PI / 2), 1) -end + assert('Math.sin PI/2') do + check_float(Math.sin(Math::PI / 2), 1) + end + assert('Fundamental trig identities') do + result = true + N = 15 + N.times do |i| + a = Math::PI / N * i + ca = Math::PI / 2 - a + s = Math.sin(a) + c = Math.cos(a) + t = Math.tan(a) + result &= check_float(s, Math.cos(ca)) + result &= check_float(t, 1 / Math.tan(ca)) + result &= check_float(s ** 2 + c ** 2, 1) + result &= check_float(t ** 2 + 1, (1/c) ** 2) + result &= check_float((1/t) ** 2 + 1, (1/s) ** 2) + end + result + end -assert('Fundamental trig identities') do - result = true - N = 15 - N.times do |i| - a = Math::PI / N * i - ca = Math::PI / 2 - a - s = Math.sin(a) - c = Math.cos(a) - t = Math.tan(a) - result &= check_float(s, Math.cos(ca)) - result &= check_float(t, 1 / Math.tan(ca)) - result &= check_float(s ** 2 + c ** 2, 1) - result &= check_float(t ** 2 + 1, (1/c) ** 2) - result &= check_float((1/t) ** 2 + 1, (1/s) ** 2) - end - result -end + assert('Math.erf 0') do + check_float(Math.erf(0), 0) + end -assert('Math.erf 0') do - check_float(Math.erf(0), 0) -end + assert('Math.exp 0') do + check_float(Math.exp(0), 1.0) + end -assert('Math.exp 0') do - check_float(Math.exp(0), 1.0) -end + assert('Math.exp 1') do + check_float(Math.exp(1), 2.718281828459045) + end -assert('Math.exp 1') do - check_float(Math.exp(1), 2.718281828459045) -end + assert('Math.exp 1.5') do + check_float(Math.exp(1.5), 4.4816890703380645) + end -assert('Math.exp 1.5') do - check_float(Math.exp(1.5), 4.4816890703380645) -end + assert('Math.log 1') do + check_float(Math.log(1), 0) + end -assert('Math.log 1') do - check_float(Math.log(1), 0) -end + assert('Math.log E') do + check_float(Math.log(Math::E), 1.0) + end -assert('Math.log E') do - check_float(Math.log(Math::E), 1.0) -end + assert('Math.log E**3') do + check_float(Math.log(Math::E**3), 3.0) + end -assert('Math.log E**3') do - check_float(Math.log(Math::E**3), 3.0) -end + assert('Math.log2 1') do + check_float(Math.log2(1), 0.0) + end -assert('Math.log2 1') do - check_float(Math.log2(1), 0.0) -end + assert('Math.log2 2') do + check_float(Math.log2(2), 1.0) + end -assert('Math.log2 2') do - check_float(Math.log2(2), 1.0) -end + assert('Math.log10 1') do + check_float(Math.log10(1), 0.0) + end -assert('Math.log10 1') do - check_float(Math.log10(1), 0.0) -end + assert('Math.log10 10') do + check_float(Math.log10(10), 1.0) + end -assert('Math.log10 10') do - check_float(Math.log10(10), 1.0) -end + assert('Math.log10 10**100') do + check_float(Math.log10(10**100), 100.0) + end -assert('Math.log10 10**100') do - check_float(Math.log10(10**100), 100.0) -end + assert('Math.sqrt') do + num = [0.0, 1.0, 2.0, 3.0, 4.0] + sqr = [0, 1, 4, 9, 16] + result = true + sqr.each_with_index do |v,i| + result &= check_float(Math.sqrt(v), num[i]) + end + result + end -assert('Math.sqrt') do - num = [0.0, 1.0, 2.0, 3.0, 4.0] - sqr = [0, 1, 4, 9, 16] - result = true - sqr.each_with_index do |v,i| - result &= check_float(Math.sqrt(v), num[i]) + assert('Math.cbrt') do + num = [-2.0, -1.0, 0.0, 1.0, 2.0] + cub = [-8, -1, 0, 1, 8] + result = true + cub.each_with_index do |v,i| + result &= check_float(Math.cbrt(v), num[i]) + end + result end - result -end -assert('Math.cbrt') do - num = [-2.0, -1.0, 0.0, 1.0, 2.0] - cub = [-8, -1, 0, 1, 8] - result = true - cub.each_with_index do |v,i| - result &= check_float(Math.cbrt(v), num[i]) + assert('Math.hypot') do + check_float(Math.hypot(3, 4), 5.0) end - result -end -assert('Math.hypot') do - check_float(Math.hypot(3, 4), 5.0) -end + assert('Math.frexp 1234') do + n = 1234 + fraction, exponent = Math.frexp(n) + check_float(Math.ldexp(fraction, exponent), n) + end -assert('Math.frexp 1234') do - n = 1234 - fraction, exponent = Math.frexp(n) - check_float(Math.ldexp(fraction, exponent), n) -end + assert('Math.erf 1') do + check_float(Math.erf(1), 0.842700792949715) + end -assert('Math.erf 1') do - check_float(Math.erf(1), 0.842700792949715) + assert('Math.erfc 1') do + check_float(Math.erfc(1), 0.157299207050285) + end end -assert('Math.erfc 1') do - check_float(Math.erfc(1), 0.157299207050285) -end -- cgit v1.2.3 From d88a37c1c9175a1583b02596ece978a51a64f9e0 Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Thu, 21 Jun 2012 14:23:21 +0800 Subject: Skip struct test in case that Struct isn't implemented --- test/t/struct.rb | 101 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 52 insertions(+), 49 deletions(-) diff --git a/test/t/struct.rb b/test/t/struct.rb index 5a74c6205..5e86c70bf 100644 --- a/test/t/struct.rb +++ b/test/t/struct.rb @@ -1,61 +1,64 @@ ## # Struct ISO Test -assert('Struct', '15.2.18') do - Struct.class == Class -end +if StructEnabled + assert('Struct', '15.2.18') do + Struct.class == Class + end -assert('Struct superclass', '15.2.18.2') do - Struct.superclass == Object -end + assert('Struct superclass', '15.2.18.2') do + Struct.superclass == Object + end -assert('Struct.new', '15.2.18.3.1') do - c = Struct.new(:m1, :m2) - c.superclass == Struct and - c.members == [:m1,:m2] -end + assert('Struct.new', '15.2.18.3.1') do + c = Struct.new(:m1, :m2) + c.superclass == Struct and + c.members == [:m1,:m2] + end -assert('Struct#[]', '15.2.18.4.2') do - c = Struct.new(:m1, :m2) - cc = c.new(1,2) - cc[:m1] == 1 and cc["m2"] == 2 -end + assert('Struct#[]', '15.2.18.4.2') do + c = Struct.new(:m1, :m2) + cc = c.new(1,2) + cc[:m1] == 1 and cc["m2"] == 2 + end -assert('Struct#[]=', '15.2.18.4.3') do - c = Struct.new(:m1, :m2) - cc = c.new(1,2) - cc[:m1] = 3 - cc[:m1] == 3 -end + assert('Struct#[]=', '15.2.18.4.3') do + c = Struct.new(:m1, :m2) + cc = c.new(1,2) + cc[:m1] = 3 + cc[:m1] == 3 + end -assert('Struct#each', '15.2.18.4.4') do - c = Struct.new(:m1, :m2) - cc = c.new(1,2) - a = [] - cc.each{|x| - a << x - } - a[0] == 1 and a[1] == 2 -end + assert('Struct#each', '15.2.18.4.4') do + c = Struct.new(:m1, :m2) + cc = c.new(1,2) + a = [] + cc.each{|x| + a << x + } + a[0] == 1 and a[1] == 2 + end -assert('Struct#each_pair', '15.2.18.4.5') do - c = Struct.new(:m1, :m2) - cc = c.new(1,2) - a = [] - cc.each_pair{|k,v| - a << [k,v] - } - a[0] == [:m1, 1] and a[1] == [:m2, 2] -end + assert('Struct#each_pair', '15.2.18.4.5') do + c = Struct.new(:m1, :m2) + cc = c.new(1,2) + a = [] + cc.each_pair{|k,v| + a << [k,v] + } + a[0] == [:m1, 1] and a[1] == [:m2, 2] + end -assert('Struct#members', '15.2.18.4.6') do - c = Struct.new(:m1, :m2) - cc = c.new(1,2) - cc.members == [:m1,:m2] -end + assert('Struct#members', '15.2.18.4.6') do + c = Struct.new(:m1, :m2) + cc = c.new(1,2) + cc.members == [:m1,:m2] + end -assert('Struct#select', '15.2.18.4.7') do - c = Struct.new(:m1, :m2) - cc = c.new(1,2) - cc.select{|v| v % 2 == 0} == [2] + assert('Struct#select', '15.2.18.4.7') do + c = Struct.new(:m1, :m2) + cc = c.new(1,2) + cc.select{|v| v % 2 == 0} == [2] + end end + -- cgit v1.2.3 From 304b7eec0aaadf3cc45f8400e52b72ece523d30e Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Thu, 21 Jun 2012 14:23:36 +0800 Subject: Skip time test in case that Time isn't implemented --- test/t/time.rb | 278 +++++++++++++++++++++++++++++---------------------------- 1 file changed, 140 insertions(+), 138 deletions(-) diff --git a/test/t/time.rb b/test/t/time.rb index 045c5b185..2b3101e69 100644 --- a/test/t/time.rb +++ b/test/t/time.rb @@ -1,189 +1,191 @@ ## # Time ISO Test -assert('Time.new', '15.2.3.3.3') do - Time.new.class == Time -end +if TimeEnabled + assert('Time.new', '15.2.3.3.3') do + Time.new.class == Time + end -assert('Time', '15.2.19') do - Time.class == Class -end + assert('Time', '15.2.19') do + Time.class == Class + end -assert('Time superclass', '15.2.19.2') do - Time.superclass == Object -end + assert('Time superclass', '15.2.19.2') do + Time.superclass == Object + end -assert('Time.at', '15.2.19.6.1') do - Time.at(1300000000.0) -end + assert('Time.at', '15.2.19.6.1') do + Time.at(1300000000.0) + end -assert('Time.gm', '15.2.19.6.2') do - Time.gm(2012, 12, 23) -end + assert('Time.gm', '15.2.19.6.2') do + Time.gm(2012, 12, 23) + end -assert('Time.local', '15.2.19.6.3') do - Time.local(2012, 12, 23) -end + assert('Time.local', '15.2.19.6.3') do + Time.local(2012, 12, 23) + end -assert('Time.mktime', '15.2.19.6.4') do - Time.mktime(2012, 12, 23) -end + assert('Time.mktime', '15.2.19.6.4') do + Time.mktime(2012, 12, 23) + end -assert('Time.now', '15.2.19.6.5') do - Time.now.class == Time -end + assert('Time.now', '15.2.19.6.5') do + Time.now.class == Time + end -assert('Time.utc', '15.2.19.6.6') do - Time.utc(2012, 12, 23) -end + assert('Time.utc', '15.2.19.6.6') do + Time.utc(2012, 12, 23) + end -assert('Time#+', '15.2.19.7.1') do - t1 = Time.at(1300000000.0) - t2 = t1.+(60) + assert('Time#+', '15.2.19.7.1') do + t1 = Time.at(1300000000.0) + t2 = t1.+(60) - t2.utc.asctime == "Sun Mar 13 07:07:40 UTC 2011" -end + t2.utc.asctime == "Sun Mar 13 07:07:40 UTC 2011" + end -assert('Time#-', '15.2.19.7.2') do - t1 = Time.at(1300000000.0) - t2 = t1.-(60) + assert('Time#-', '15.2.19.7.2') do + t1 = Time.at(1300000000.0) + t2 = t1.-(60) - t2.utc.asctime == "Sun Mar 13 07:05:40 UTC 2011" -end + t2.utc.asctime == "Sun Mar 13 07:05:40 UTC 2011" + end -assert('Time#<=>', '15.2.19.7.3') do - t1 = Time.at(1300000000.0) - t2 = Time.at(1400000000.0) - t3 = Time.at(1500000000.0) + assert('Time#<=>', '15.2.19.7.3') do + t1 = Time.at(1300000000.0) + t2 = Time.at(1400000000.0) + t3 = Time.at(1500000000.0) - t2.<=>(t1) == 1 and - t2.<=>(t2) == 0 and - t2.<=>(t3) == -1 and - t2.<=>(nil) == nil -end + t2.<=>(t1) == 1 and + t2.<=>(t2) == 0 and + t2.<=>(t3) == -1 and + t2.<=>(nil) == nil + end -assert('Time#asctime', '15.2.19.7.4') do - Time.at(1300000000.0).utc.asctime == "Sun Mar 13 07:06:40 UTC 2011" -end + assert('Time#asctime', '15.2.19.7.4') do + Time.at(1300000000.0).utc.asctime == "Sun Mar 13 07:06:40 UTC 2011" + end -assert('Time#ctime', '15.2.19.7.5') do - Time.at(1300000000.0).utc.ctime == "Sun Mar 13 07:06:40 UTC 2011" -end + assert('Time#ctime', '15.2.19.7.5') do + Time.at(1300000000.0).utc.ctime == "Sun Mar 13 07:06:40 UTC 2011" + end -assert('Time#day', '15.2.19.7.6') do - Time.gm(2012, 12, 23).day == 23 -end + assert('Time#day', '15.2.19.7.6') do + Time.gm(2012, 12, 23).day == 23 + end -assert('Time#dst?', '15.2.19.7.7') do - not Time.gm(2012, 12, 23).utc.dst? -end + assert('Time#dst?', '15.2.19.7.7') do + not Time.gm(2012, 12, 23).utc.dst? + end -assert('Time#getgm', '15.2.19.7.8') do - Time.at(1300000000.0).getgm.asctime == "Sun Mar 13 07:06:40 UTC 2011" -end + assert('Time#getgm', '15.2.19.7.8') do + Time.at(1300000000.0).getgm.asctime == "Sun Mar 13 07:06:40 UTC 2011" + end -assert('Time#getlocal', '15.2.19.7.9') do - t1 = Time.at(1300000000.0) - t2 = Time.at(1300000000.0) - t3 = t1.getlocal + assert('Time#getlocal', '15.2.19.7.9') do + t1 = Time.at(1300000000.0) + t2 = Time.at(1300000000.0) + t3 = t1.getlocal - t1 == t3 and t3 == t2.getlocal -end + t1 == t3 and t3 == t2.getlocal + end -assert('Time#getutc', '15.2.19.7.10') do - Time.at(1300000000.0).getutc.asctime == "Sun Mar 13 07:06:40 UTC 2011" -end + assert('Time#getutc', '15.2.19.7.10') do + Time.at(1300000000.0).getutc.asctime == "Sun Mar 13 07:06:40 UTC 2011" + end -assert('Time#gmt?', '15.2.19.7.11') do - Time.at(1300000000.0).utc.gmt? -end + assert('Time#gmt?', '15.2.19.7.11') do + Time.at(1300000000.0).utc.gmt? + end -# ATM not implemented -# assert('Time#gmt_offset', '15.2.19.7.12') do + # ATM not implemented + # assert('Time#gmt_offset', '15.2.19.7.12') do -assert('Time#gmtime', '15.2.19.7.13') do - Time.at(1300000000.0).gmtime -end + assert('Time#gmtime', '15.2.19.7.13') do + Time.at(1300000000.0).gmtime + end -# ATM not implemented -# assert('Time#gmtoff', '15.2.19.7.14') do + # ATM not implemented + # assert('Time#gmtoff', '15.2.19.7.14') do -assert('Time#hour', '15.2.19.7.15') do - Time.gm(2012, 12, 23, 7, 6).hour == 7 -end + assert('Time#hour', '15.2.19.7.15') do + Time.gm(2012, 12, 23, 7, 6).hour == 7 + end -# ATM doesn't really work -# assert('Time#initialize', '15.2.19.7.16') do + # ATM doesn't really work + # assert('Time#initialize', '15.2.19.7.16') do -assert('Time#initialize_copy', '15.2.19.7.17') do - time_tmp_2 = Time.at(7.0e6) - time_tmp_2.clone == time_tmp_2 -end + assert('Time#initialize_copy', '15.2.19.7.17') do + time_tmp_2 = Time.at(7.0e6) + time_tmp_2.clone == time_tmp_2 + end -assert('Time#localtime', '15.2.19.7.18') do - t1 = Time.at(1300000000.0) - t2 = Time.at(1300000000.0) + assert('Time#localtime', '15.2.19.7.18') do + t1 = Time.at(1300000000.0) + t2 = Time.at(1300000000.0) - t1.localtime - t1 == t2.getlocal -end + t1.localtime + t1 == t2.getlocal + end -assert('Time#mday', '15.2.19.7.19') do - Time.gm(2012, 12, 23).mday == 23 -end + assert('Time#mday', '15.2.19.7.19') do + Time.gm(2012, 12, 23).mday == 23 + end -assert('Time#min', '15.2.19.7.20') do - Time.gm(2012, 12, 23, 7, 6).min == 6 -end + assert('Time#min', '15.2.19.7.20') do + Time.gm(2012, 12, 23, 7, 6).min == 6 + end -assert('Time#mon', '15.2.19.7.21') do - Time.gm(2012, 12, 23).mon == 12 -end + assert('Time#mon', '15.2.19.7.21') do + Time.gm(2012, 12, 23).mon == 12 + end -assert('Time#month', '15.2.19.7.22') do - Time.gm(2012, 12, 23).month == 12 -end + assert('Time#month', '15.2.19.7.22') do + Time.gm(2012, 12, 23).month == 12 + end -assert('Times#sec', '15.2.19.7.23') do - Time.gm(2012, 12, 23, 7, 6, 40).sec == 40 -end + assert('Times#sec', '15.2.19.7.23') do + Time.gm(2012, 12, 23, 7, 6, 40).sec == 40 + end -assert('Time#to_f', '15.2.19.7.24') do - Time.at(1300000000.0).to_f == 1300000000.0 -end + assert('Time#to_f', '15.2.19.7.24') do + Time.at(1300000000.0).to_f == 1300000000.0 + end -assert('Time#to_i', '15.2.19.7.25') do - Time.at(1300000000.0).to_i == 1300000000 -end + assert('Time#to_i', '15.2.19.7.25') do + Time.at(1300000000.0).to_i == 1300000000 + end -assert('Time#usec', '15.2.19.7.26') do - Time.at(1300000000.0).usec == 0 -end + assert('Time#usec', '15.2.19.7.26') do + Time.at(1300000000.0).usec == 0 + end -assert('Time#utc', '15.2.19.7.27') do - Time.at(1300000000.0).utc -end + assert('Time#utc', '15.2.19.7.27') do + Time.at(1300000000.0).utc + end -assert('Time#utc?', '15.2.19.7.28') do - Time.at(1300000000.0).utc.utc? -end + assert('Time#utc?', '15.2.19.7.28') do + Time.at(1300000000.0).utc.utc? + end -# ATM not implemented -# assert('Time#utc_offset', '15.2.19.7.29') do + # ATM not implemented + # assert('Time#utc_offset', '15.2.19.7.29') do -assert('Time#wday', '15.2.19.7.30') do - Time.gm(2012, 12, 23).wday == 0 -end + assert('Time#wday', '15.2.19.7.30') do + Time.gm(2012, 12, 23).wday == 0 + end -assert('Time#yday', '15.2.19.7.31') do - Time.gm(2012, 12, 23).yday == 357 -end + assert('Time#yday', '15.2.19.7.31') do + Time.gm(2012, 12, 23).yday == 357 + end -assert('Time#year', '15.2.19.7.32') do - Time.gm(2012, 12, 23).year == 2012 -end + assert('Time#year', '15.2.19.7.32') do + Time.gm(2012, 12, 23).year == 2012 + end -assert('Time#zone', '15.2.19.7.33') do - Time.at(1300000000.0).utc.zone == 'UTC' + assert('Time#zone', '15.2.19.7.33') do + Time.at(1300000000.0).utc.zone == 'UTC' + end end -- cgit v1.2.3 From a686ad66ddda77c399fc611f578bcfb586c8fe36 Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Thu, 21 Jun 2012 15:00:49 +0800 Subject: Remove constants --- src/kernel.c | 34 ---------------------------------- 1 file changed, 34 deletions(-) diff --git a/src/kernel.c b/src/kernel.c index d2fceae55..677b75c2d 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -1206,40 +1206,6 @@ mrb_init_kernel(mrb_state *mrb) #ifdef ENABLE_KERNEL_SPRINTF mrb_define_method(mrb, krn, "sprintf", mrb_f_sprintf, ARGS_ANY()); /* in sprintf.c */ mrb_define_method(mrb, krn, "format", mrb_f_sprintf, ARGS_ANY()); /* in sprintf.c */ - mrb_define_const(mrb, krn, "SprintfEnabled", mrb_true_value()); -#else - mrb_define_const(mrb, krn, "SprintfEnabled", mrb_false_value()); #endif - -#ifdef ENABLE_MATH - mrb_define_const(mrb, krn, "MathEnabled", mrb_true_value()); -#else - mrb_define_const(mrb, krn, "MathEnabled", mrb_false_value()); -#endif - -#ifdef ENABLE_TIME - mrb_define_const(mrb, krn, "TimeEnabled", mrb_true_value()); -#else - mrb_define_const(mrb, krn, "TimeEnabled", mrb_false_value()); -#endif - -#ifdef ENABLE_REGEXP - mrb_define_const(mrb, krn, "RegExpEnabled", mrb_true_value()); -#else - mrb_define_const(mrb, krn, "RegExpEnabled", mrb_false_value()); -#endif - -#ifdef ENABLE_STRUCT - mrb_define_const(mrb, krn, "StructEnabled", mrb_true_value()); -#else - mrb_define_const(mrb, krn, "StructEnabled", mrb_false_value()); -#endif - -#ifdef MRB_USE_FLOAT - mrb_define_const(mrb, krn, "UsingFloat", mrb_true_value()); -#else - mrb_define_const(mrb, krn, "UsingFloat", mrb_false_value()); -#endif - mrb_include_module(mrb, mrb->object_class, mrb->kernel_module); } -- cgit v1.2.3 From 162b3625d0f7ab3cba2163544bf0a2d1256d3000 Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Thu, 21 Jun 2012 15:01:13 +0800 Subject: Only open struct class if there is actually already a class --- mrblib/struct.rb | 78 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 41 insertions(+), 37 deletions(-) diff --git a/mrblib/struct.rb b/mrblib/struct.rb index 4b6d767a9..5d0ede90f 100644 --- a/mrblib/struct.rb +++ b/mrblib/struct.rb @@ -2,45 +2,49 @@ # Struct # # ISO 15.2.18 -class Struct - ## - # Calls the given block for each element of +self+ - # and pass the respective element. - # - # ISO 15.2.18.4.4 - def each(&block) - self.class.members.each{|field| - block.call(self[field]) - } - self - end +if Object.const_defined?(:Struct) + class Struct - ## - # Calls the given block for each element of +self+ - # and pass the name and value of the respectiev - # element. - # - # ISO 15.2.18.4.5 - def each_pair(&block) - self.class.members.each{|field| - block.call(field.to_sym, self[field]) - } - self - end + ## + # Calls the given block for each element of +self+ + # and pass the respective element. + # + # ISO 15.2.18.4.4 + def each(&block) + self.class.members.each{|field| + block.call(self[field]) + } + self + end - ## - # Calls the given block for each element of +self+ - # and returns an array with all elements of which - # block is not false. - # - # ISO 15.2.18.4.7 - def select(&block) - ary = [] - self.class.members.each{|field| - val = self[field] - ary.push(val) if block.call(val) - } - ary + ## + # Calls the given block for each element of +self+ + # and pass the name and value of the respectiev + # element. + # + # ISO 15.2.18.4.5 + def each_pair(&block) + self.class.members.each{|field| + block.call(field.to_sym, self[field]) + } + self + end + + ## + # Calls the given block for each element of +self+ + # and returns an array with all elements of which + # block is not false. + # + # ISO 15.2.18.4.7 + def select(&block) + ary = [] + self.class.members.each{|field| + val = self[field] + ary.push(val) if block.call(val) + } + ary + end end end + -- cgit v1.2.3 From 8e89cd456cca0402c639d31031df29fceaa49ef6 Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Thu, 21 Jun 2012 15:01:39 +0800 Subject: only execute math tests if math feature is activated --- test/t/math.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/t/math.rb b/test/t/math.rb index d60d80ae7..025551b82 100644 --- a/test/t/math.rb +++ b/test/t/math.rb @@ -1,7 +1,7 @@ ## # Math Test -if MathEnabled +if Object.const_defined?(:Math) assert('Math.sin 0') do check_float(Math.sin(0), 0) end -- cgit v1.2.3 From 1baa3faf3f0c8ea4fea6415e6e215e794f4993d6 Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Thu, 21 Jun 2012 15:01:52 +0800 Subject: only execute time tests if time feature is activated --- test/t/time.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/t/time.rb b/test/t/time.rb index 2b3101e69..6140be1a8 100644 --- a/test/t/time.rb +++ b/test/t/time.rb @@ -1,7 +1,7 @@ ## # Time ISO Test -if TimeEnabled +if Object.const_defined?(:Time) assert('Time.new', '15.2.3.3.3') do Time.new.class == Time end -- cgit v1.2.3 From 7a410123dd1ad93359d07134bbac39a34b184cb4 Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Thu, 21 Jun 2012 15:02:08 +0800 Subject: only execute struct tests if struct feature is activated --- test/t/struct.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/t/struct.rb b/test/t/struct.rb index 5e86c70bf..fff02ee56 100644 --- a/test/t/struct.rb +++ b/test/t/struct.rb @@ -1,7 +1,7 @@ ## # Struct ISO Test -if StructEnabled +if Object.const_defined?(:Struct) assert('Struct', '15.2.18') do Struct.class == Class end -- cgit v1.2.3 From 4780b653a47c1bacd2412130d77cbe5b3f0b30d3 Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Thu, 21 Jun 2012 15:06:17 +0800 Subject: clean up small line lost --- src/kernel.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/kernel.c b/src/kernel.c index 677b75c2d..fd0440e05 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -1207,5 +1207,6 @@ mrb_init_kernel(mrb_state *mrb) mrb_define_method(mrb, krn, "sprintf", mrb_f_sprintf, ARGS_ANY()); /* in sprintf.c */ mrb_define_method(mrb, krn, "format", mrb_f_sprintf, ARGS_ANY()); /* in sprintf.c */ #endif + mrb_include_module(mrb, mrb->object_class, mrb->kernel_module); } -- cgit v1.2.3 From a70c4e0c790b9ddb4dbca143cffa585b3841b9f6 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 21 Jun 2012 16:22:29 +0900 Subject: reduce calling of strlen(); #301 --- src/codegen.c | 7 ++++--- src/dump.c | 8 +++++--- src/hash.c | 4 ++-- src/re.c | 19 +++++++++---------- src/sprintf.c | 8 ++++---- src/string.c | 2 +- 6 files changed, 25 insertions(+), 23 deletions(-) diff --git a/src/codegen.c b/src/codegen.c index 3374b2e7f..27fd20ee4 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -542,16 +542,17 @@ nosplat(node *t) static mrb_sym attrsym(codegen_scope *s, mrb_sym a) { - const char *name = mrb_sym2name(s->mrb, a); + const char *name; + int len; char *name2; - size_t len = strlen(name); + name = mrb_sym2name(s->mrb, a, &len); name2 = codegen_palloc(s, len+1); strcpy(name2, name); name2[len] = '='; name2[len+1] = '\0'; - return mrb_intern(s->mrb, name2); + return mrb_intern2(s->mrb, name2, len+1); } static int diff --git a/src/dump.c b/src/dump.c index daf2868f1..e1ebe2027 100644 --- a/src/dump.c +++ b/src/dump.c @@ -415,15 +415,17 @@ write_syms_block(mrb_state *mrb, mrb_irep *irep, char *buf, int type) uint16_t nlen =0; if (irep->syms[sym_no] != 0) { - name = mrb_sym2name(mrb, irep->syms[sym_no]); - nlen = str_dump_len((char*)name, strlen(name), type); + int len; + + name = mrb_sym2name(mrb, irep->syms[sym_no], &len); + nlen = str_dump_len((char*)name, len, type); if ( nlen > buf_size - 1) { buf_size = nlen + 1; if ((char_buf = mrb_realloc(mrb, char_buf, buf_size)) == 0) goto error_exit; } memset(char_buf, 0, buf_size); - str_dump((char*)name, char_buf, strlen(name), type); + str_dump((char*)name, char_buf, len, type); buf += uint16_dump(nlen, buf, type); /* length of symbol name */ memcpy(buf, char_buf, nlen); /* symbol name */ diff --git a/src/hash.c b/src/hash.c index 08f906800..7b9ae6a8a 100644 --- a/src/hash.c +++ b/src/hash.c @@ -904,14 +904,14 @@ inspect_hash(mrb_state *mrb, mrb_value hash, int recur) str2 = mrb_inspect(mrb, kh_key(h,k)); mrb_str_append(mrb, str, str2); - mrb_str_buf_cat(mrb, str, "=>", strlen("=>")); + mrb_str_buf_cat(mrb, str, "=>", sizeof("=>")); str2 = mrb_inspect(mrb, kh_value(h,k)); mrb_str_append(mrb, str, str2); mrb_gc_arena_restore(mrb, ai); } } - mrb_str_buf_cat(mrb, str, "}", strlen("}"));//mrb_str_buf_cat2(str, "}"); + mrb_str_buf_cat(mrb, str, "}", sizeof("}")); return str; } diff --git a/src/re.c b/src/re.c index b821d2e71..12061eacf 100644 --- a/src/re.c +++ b/src/re.c @@ -357,14 +357,14 @@ mrb_reg_desc(mrb_state *mrb, const char *s, long len, mrb_value re) mrb_value str = mrb_str_new_cstr(mrb, "/");//mrb_str_buf_new2("/"); mrb_reg_expr_str(mrb, str, s, len); - mrb_str_buf_cat(mrb, str, "/", strlen("/")); + mrb_str_buf_cat(mrb, str, "/", sizeof("/")); if (re.tt) { char opts[4]; mrb_reg_check(mrb, re); if (*option_to_str(opts, RREGEXP(re)->ptr->options)) mrb_str_buf_cat(mrb, str, opts, strlen(opts));//mrb_str_buf_cat2(str, opts); if (RBASIC(re)->flags & REG_ENCODING_NONE) - mrb_str_buf_cat(mrb, str, "n", strlen("n"));//mrb_str_buf_cat2(str, "n"); + mrb_str_buf_cat(mrb, str, "n", sizeof("n")); } return str; @@ -1796,9 +1796,9 @@ again: mrb_str_buf_cat(mrb, str, optbuf, strlen(optbuf)); } - mrb_str_buf_cat(mrb, str, ":", strlen(":")); + mrb_str_buf_cat(mrb, str, ":", sizeof(":")); mrb_reg_expr_str(mrb, str, (char*)ptr, len); - mrb_str_buf_cat(mrb, str, ")", strlen(")")); + mrb_str_buf_cat(mrb, str, ")", sizeof(")")); return str; } @@ -1919,29 +1919,28 @@ mrb_match_inspect(mrb_state *mrb, mrb_value match) match_inspect_name_iter, names); str = mrb_str_new_cstr(mrb, "#<");//mrb_str_buf_new2("#<"); - mrb_str_buf_cat(mrb, str, cname, strlen(cname));//mrb_str_buf_cat2(str, cname); + mrb_str_buf_cat(mrb, str, cname, strlen(cname)); for (i = 0; i < num_regs; i++) { char buf[sizeof(num_regs)*3+1]; mrb_value v; - mrb_str_buf_cat(mrb, str, " ", strlen(" "));//mrb_str_buf_cat2(str, " "); + mrb_str_buf_cat(mrb, str, " ", sizeof(" ")); if (0 < i) { if (names[i].name) mrb_str_buf_cat(mrb, str, (const char*)names[i].name, names[i].len); else { - //mrb_str_catf(mrb, str, "%d", i); sprintf(buf, "%d", i); mrb_str_buf_cat(mrb, str, (const char*)buf, strlen(buf)); } - mrb_str_buf_cat(mrb, str, ":", strlen(":"));//mrb_str_buf_cat2(str, ":"); + mrb_str_buf_cat(mrb, str, ":", sizeof(":")); } v = mrb_reg_nth_match(mrb, i, match); if (mrb_nil_p(v)) - mrb_str_buf_cat(mrb, str, "nil", strlen("nil"));//mrb_str_buf_cat2(str, "nil"); + mrb_str_buf_cat(mrb, str, "nil", sizeof("nil")); else mrb_str_buf_append(mrb, str, mrb_str_inspect(mrb, v)); } - mrb_str_buf_cat(mrb, str, ">", strlen(">"));//mrb_str_buf_cat2(str, ">"); + mrb_str_buf_cat(mrb, str, ">", sizeof(">")); return str; } diff --git a/src/sprintf.c b/src/sprintf.c index b4d460c83..c23969792 100644 --- a/src/sprintf.c +++ b/src/sprintf.c @@ -1069,13 +1069,13 @@ fmt_setup(char *buf, size_t size, int c, int flags, int width, int prec) if (flags & FSPACE) *buf++ = ' '; if (flags & FWIDTH) { - snprintf(buf, end - buf, "%d", width); - buf += strlen(buf); + snprintf(buf, end - buf, "%d", width); + buf += strlen(buf); } if (flags & FPREC) { - snprintf(buf, end - buf, ".%d", prec); - buf += strlen(buf); + snprintf(buf, end - buf, ".%d", prec); + buf += strlen(buf); } *buf++ = c; diff --git a/src/string.c b/src/string.c index 585edf8a3..894342463 100644 --- a/src/string.c +++ b/src/string.c @@ -2987,7 +2987,7 @@ mrb_str_inspect(mrb_state *mrb, mrb_value str) continue; } } - mrb_str_buf_cat(mrb, result, "\"", strlen("\"")); + mrb_str_buf_cat(mrb, result, "\"", sizeof("\"")); return result; } -- cgit v1.2.3 From 9936ce997cbfa9560f792994e2a8f5e45eb6fdef Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 21 Jun 2012 16:27:05 +0900 Subject: forgot to rename function mrb_sym2name -> mrb_sym2name_len --- src/codegen.c | 2 +- src/dump.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/codegen.c b/src/codegen.c index 27fd20ee4..72fc1097d 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -546,7 +546,7 @@ attrsym(codegen_scope *s, mrb_sym a) int len; char *name2; - name = mrb_sym2name(s->mrb, a, &len); + name = mrb_sym2name_len(s->mrb, a, &len); name2 = codegen_palloc(s, len+1); strcpy(name2, name); name2[len] = '='; diff --git a/src/dump.c b/src/dump.c index e1ebe2027..bbdd58eee 100644 --- a/src/dump.c +++ b/src/dump.c @@ -417,7 +417,7 @@ write_syms_block(mrb_state *mrb, mrb_irep *irep, char *buf, int type) if (irep->syms[sym_no] != 0) { int len; - name = mrb_sym2name(mrb, irep->syms[sym_no], &len); + name = mrb_sym2name_len(mrb, irep->syms[sym_no], &len); nlen = str_dump_len((char*)name, len, type); if ( nlen > buf_size - 1) { buf_size = nlen + 1; -- cgit v1.2.3 From 766ae4ee5f99ea96dac166a3dfa0791baa77f353 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 21 Jun 2012 16:27:16 +0900 Subject: dislose mrb_hash_keys; close #304 --- include/mruby/hash.h | 1 + src/hash.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/include/mruby/hash.h b/include/mruby/hash.h index e7162c3ab..7a16d7b5a 100644 --- a/include/mruby/hash.h +++ b/include/mruby/hash.h @@ -27,6 +27,7 @@ void mrb_hash_set(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value val); mrb_value mrb_hash_get(mrb_state *mrb, mrb_value hash, mrb_value key); mrb_value mrb_hash_fetch(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value def); mrb_value mrb_hash_delete_key(mrb_state *mrb, mrb_value hash, mrb_value key); +mrb_value mrb_hash_keys(mrb_state *mrb, mrb_value hash); mrb_value mrb_hash(mrb_state *mrb, mrb_value obj); mrb_value mrb_check_hash_type(mrb_state *mrb, mrb_value self); diff --git a/src/hash.c b/src/hash.c index 7b9ae6a8a..0e06cd246 100644 --- a/src/hash.c +++ b/src/hash.c @@ -965,7 +965,7 @@ mrb_hash_to_hash(mrb_state *mrb, mrb_value hash) * */ -static mrb_value +mrb_value mrb_hash_keys(mrb_state *mrb, mrb_value hash) { khash_t(ht) *h = RHASH_TBL(hash); -- cgit v1.2.3 From 2436ee817adfca3de7b758fa83f959d4079f134f Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Thu, 21 Jun 2012 15:44:27 +0800 Subject: Make printf optional based on sprintf --- mrblib/print.rb | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/mrblib/print.rb b/mrblib/print.rb index 452ba53a9..7ec6d70ef 100644 --- a/mrblib/print.rb +++ b/mrblib/print.rb @@ -48,7 +48,12 @@ module Kernel args[0] end - def printf(*args) - __printstr__(sprintf(*args)) + if Kernel.respond_to?(:sprintf) + ## + # Invoke method +sprintf+ and pass +*args+ to it. + # Pass return value to *print* of STDOUT. + def printf(*args) + __printstr__(sprintf(*args)) + end end end -- cgit v1.2.3 From 2ae84f7d8358628bd904993aef18edf27828d696 Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Thu, 21 Jun 2012 16:00:04 +0800 Subject: Add execution time to tests --- test/assert.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/assert.rb b/test/assert.rb index 2fc11f149..9329638c9 100644 --- a/test/assert.rb +++ b/test/assert.rb @@ -2,6 +2,7 @@ $ok_test = 0 $ko_test = 0 $kill_test = 0 $asserts = [] +$test_start = Time.now if Object.const_defined?(:Time) ## # Print the assertion in a readable way @@ -68,6 +69,12 @@ def report() print('Crash: ') print($kill_test) print("\n") + + if Object.const_defined?(:Time) + print(' Time: ') + print(Time.now - $test_start) + print(" seconds\n") + end end ## @@ -83,3 +90,4 @@ def check_float(a, b) true end end + -- cgit v1.2.3 From 8946ad2c029671c70c980df984d9d48ac47b1dde Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Thu, 21 Jun 2012 16:00:04 +0800 Subject: Add execution time to tests --- test/assert.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/assert.rb b/test/assert.rb index 2fc11f149..9329638c9 100644 --- a/test/assert.rb +++ b/test/assert.rb @@ -2,6 +2,7 @@ $ok_test = 0 $ko_test = 0 $kill_test = 0 $asserts = [] +$test_start = Time.now if Object.const_defined?(:Time) ## # Print the assertion in a readable way @@ -68,6 +69,12 @@ def report() print('Crash: ') print($kill_test) print("\n") + + if Object.const_defined?(:Time) + print(' Time: ') + print(Time.now - $test_start) + print(" seconds\n") + end end ## @@ -83,3 +90,4 @@ def check_float(a, b) true end end + -- cgit v1.2.3 From 21f2e5364b5c6cda244001d779aa67d86a22e6e7 Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Fri, 22 Jun 2012 16:46:37 +0900 Subject: Use mrb_str_new() instead of mrb_str_new2() as possible. --- src/array.c | 4 ++-- src/numeric.c | 23 +++++++++++++++-------- src/range.c | 7 ++++++- src/sprintf.c | 2 +- src/string.c | 7 +++++-- src/struct.c | 4 ++-- 6 files changed, 31 insertions(+), 16 deletions(-) diff --git a/src/array.c b/src/array.c index ca111bc0e..981da7afb 100644 --- a/src/array.c +++ b/src/array.c @@ -887,7 +887,7 @@ inspect_ary(mrb_state *mrb, mrb_value ary, mrb_value list) /* check recursive */ for(i=0; i #include #include +#include #if defined(__FreeBSD__) && __FreeBSD__ < 4 #include @@ -186,15 +187,21 @@ static mrb_value flo_to_s(mrb_state *mrb, mrb_value flt) { char buf[32]; + int n; mrb_float value = mrb_float(flt); - if (isinf(value)) - return mrb_str_new2(mrb, value < 0 ? "-inf" : "inf"); - else if(isnan(value)) - return mrb_str_new2(mrb, "NaN"); - - sprintf(buf, "%.14g", value); - return mrb_str_new2(mrb, buf); + if (isinf(value)) { + static const char s[2][5] = { "-inf", "inf" }; + static const int n[] = { 4, 3 }; + int idx; + idx = (value < 0) ? 0 : 1; + return mrb_str_new(mrb, s[idx], n[idx]); + } else if(isnan(value)) + return mrb_str_new(mrb, "NaN", 3); + + n = sprintf(buf, "%.14g", value); + assert(n >= 0); + return mrb_str_new(mrb, buf, n); } /* 15.2.9.3.2 */ @@ -1158,7 +1165,7 @@ mrb_fix2str(mrb_state *mrb, mrb_value x, int base) mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid radix %d", base); } if (val == 0) { - return mrb_str_new2(mrb, "0"); + return mrb_str_new(mrb, "0", 1); } if (val < 0) { val = -val; diff --git a/src/range.c b/src/range.c index 826481e93..859bb277e 100644 --- a/src/range.c +++ b/src/range.c @@ -343,7 +343,12 @@ inspect_range(mrb_state *mrb, mrb_value range, mrb_value dummy, int recur) struct RRange *r = mrb_range_ptr(range); if (recur) { - return mrb_str_new2(mrb, r->excl ? "(... ... ...)" : "(... .. ...)"); + static const char s[2][14] = { "(... ... ...)", "(... .. ...)" }; + static const int n[] = { 13, 12 }; + int idx; + + idx = (r->excl) ? 0 : 1; + return mrb_str_new(mrb, s[idx], n[idx]); } str = mrb_inspect(mrb, r->edges->beg); str2 = mrb_inspect(mrb, r->edges->end); diff --git a/src/sprintf.c b/src/sprintf.c index c23969792..e01bf572e 100644 --- a/src/sprintf.c +++ b/src/sprintf.c @@ -89,7 +89,7 @@ mrb_fix2binstr(mrb_state *mrb, mrb_value x, int base) val &= 0x3ff; if (val == 0) { - return mrb_str_new2(mrb, "0"); + return mrb_str_new(mrb, "0", 1); } *--b = '\0'; do { diff --git a/src/string.c b/src/string.c index 894342463..6b2df1590 100644 --- a/src/string.c +++ b/src/string.c @@ -21,6 +21,7 @@ #include "regex.h" #include "st.h" #endif //ENABLE_REGEXP +#include const char mrb_digitmap[] = "0123456789abcdefghijklmnopqrstuvwxyz"; @@ -220,7 +221,9 @@ mrb_str_buf_cat(mrb_state *mrb, mrb_value str, const char *ptr, int len) mrb_value mrb_str_new(mrb_state *mrb, const char *p, int len) { - struct RString *s = str_new(mrb, p, len); + struct RString *s; + assert(!(!p && len)); + s = str_new(mrb, p, len); return mrb_obj_value(s); } @@ -1969,7 +1972,7 @@ scan_once(mrb_state *mrb, mrb_value str, mrb_value pat, mrb_int *start) if (regs->num_regs == 1) { return mrb_reg_nth_match(mrb, 0, match); } - result = mrb_ary_new_capa(mrb, regs->num_regs);//mrb_ary_new2(regs->num_regs); + result = mrb_ary_new_capa(mrb, regs->num_regs); for (i=1; i < regs->num_regs; i++) { mrb_ary_push(mrb, result, mrb_reg_nth_match(mrb, i, match)); } diff --git a/src/struct.c b/src/struct.c index de0dbeeaa..7e422f140 100644 --- a/src/struct.c +++ b/src/struct.c @@ -93,7 +93,7 @@ mrb_struct_s_members_m(mrb_state *mrb, mrb_value klass) mrb_value *p, *pend; members = mrb_struct_s_members(mrb, klass); - ary = mrb_ary_new_capa(mrb, RARRAY_LEN(members));//mrb_ary_new2(RARRAY_LEN(members)); + ary = mrb_ary_new_capa(mrb, RARRAY_LEN(members)); p = RARRAY_PTR(members); pend = p + RARRAY_LEN(members); while (p < pend) { mrb_ary_push(mrb, ary, *p); @@ -493,7 +493,7 @@ static mrb_value inspect_struct(mrb_state *mrb, mrb_value s, mrb_value dummy, int recur) { const char *cn = mrb_class_name(mrb, mrb_obj_class(mrb, s)); - mrb_value members, str = mrb_str_new2(mrb, "# Date: Fri, 22 Jun 2012 17:47:23 +0900 Subject: fixed attr_*: forgot '@' --- mrblib/class.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mrblib/class.rb b/mrblib/class.rb index 9c3ef91fd..e984376a4 100644 --- a/mrblib/class.rb +++ b/mrblib/class.rb @@ -2,14 +2,14 @@ class Module # 15.2.2.4.13 def attr_reader(*names) names.each{|name| - define_method(name){self.instance_variable_get(name)} + define_method(name){self.instance_variable_get('@'+name.to_s)} } end # 15.2.2.4.14 def attr_writer(*names) names.each{|name| aset = (name.to_s+"=").intern - define_method(aset){|v|self.instance_variable_set(name,v)} + define_method(aset){|v|self.instance_variable_set('@'+name.to_s,v)} } end # 15.2.2.4.12 -- cgit v1.2.3 From 2d781f5c1da6f627d9b4d3c2c7e9444108e09221 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sat, 23 Jun 2012 09:49:14 +0900 Subject: remove assertion for false assumption; mrb_str_new(0, len) where len > 0 can be used to allocate an unintialized string --- src/string.c | 3 +-- src/vm.c | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/string.c b/src/string.c index 6b2df1590..a943512c7 100644 --- a/src/string.c +++ b/src/string.c @@ -21,7 +21,6 @@ #include "regex.h" #include "st.h" #endif //ENABLE_REGEXP -#include const char mrb_digitmap[] = "0123456789abcdefghijklmnopqrstuvwxyz"; @@ -222,7 +221,7 @@ mrb_value mrb_str_new(mrb_state *mrb, const char *p, int len) { struct RString *s; - assert(!(!p && len)); + s = str_new(mrb, p, len); return mrb_obj_value(s); } diff --git a/src/vm.c b/src/vm.c index f3e5a497a..04392891f 100644 --- a/src/vm.c +++ b/src/vm.c @@ -393,7 +393,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) mrb_code i; int ai = mrb->arena_idx; jmp_buf c_jmp; - jmp_buf *prev_jmp = NULL; + volatile jmp_buf *prev_jmp = NULL; #ifdef DIRECT_THREADED static void *optable[] = { -- cgit v1.2.3 From 1fa63930fd072847d24ffe9c20a57109c41387ec Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sat, 23 Jun 2012 10:40:17 +0900 Subject: check object type before retrieving instance variabls; close #311 --- include/mruby/variable.h | 1 + src/kernel.c | 40 ---------------------------------------- src/variable.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 40 deletions(-) diff --git a/include/mruby/variable.h b/include/mruby/variable.h index 440c4cc8b..a4ed9a0ee 100644 --- a/include/mruby/variable.h +++ b/include/mruby/variable.h @@ -49,6 +49,7 @@ int mrb_const_defined_at(mrb_state *mrb, struct RClass *klass, mrb_sym id); mrb_value mrb_f_global_variables(mrb_state *mrb, mrb_value self); mrb_value mrb_gv_get(mrb_state *mrb, mrb_sym sym); void mrb_gv_set(mrb_state *mrb, mrb_sym sym, mrb_value val); +mrb_value mrb_obj_instance_variables(mrb_state*, mrb_value); /* GC functions */ void mrb_gc_mark_gv(mrb_state*); diff --git a/src/kernel.c b/src/kernel.c index fd0440e05..8f2b15378 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -708,46 +708,6 @@ mrb_obj_ivar_set(mrb_state *mrb, mrb_value self) return val; } -/* 15.3.1.3.23 */ -/* - * call-seq: - * obj.instance_variables -> array - * - * Returns an array of instance variable names for the receiver. Note - * that simply defining an accessor does not create the corresponding - * instance variable. - * - * class Fred - * attr_accessor :a1 - * def initialize - * @iv = 3 - * end - * end - * Fred.new.instance_variables #=> [:@iv] - */ -mrb_value -mrb_obj_instance_variables(mrb_state *mrb, mrb_value self) -{ - mrb_value ary; - kh_iv_t *h = RCLASS_IV_TBL(self); - khint_t i; - const char* p; - - ary = mrb_ary_new(mrb); - if (h) { - for (i=0;istack[0], sym, v); } +/* 15.3.1.3.23 */ +/* + * call-seq: + * obj.instance_variables -> array + * + * Returns an array of instance variable names for the receiver. Note + * that simply defining an accessor does not create the corresponding + * instance variable. + * + * class Fred + * attr_accessor :a1 + * def initialize + * @iv = 3 + * end + * end + * Fred.new.instance_variables #=> [:@iv] + */ +mrb_value +mrb_obj_instance_variables(mrb_state *mrb, mrb_value self) +{ + mrb_value ary; + kh_iv_t *h; + khint_t i; + int len; + const char* p; + + ary = mrb_ary_new(mrb); + if (obj_iv_p(self)) { + h = ROBJECT_IVPTR(self); + if (h) { + for (i=0;i 1 && *p == '@') { + if (mrb_type(kh_value(h, i)) != MRB_TT_UNDEF) + mrb_ary_push(mrb, ary, mrb_str_new(mrb, p, len)); + } + } + } + } + } + return ary; +} + mrb_value mrb_vm_cv_get(mrb_state *mrb, mrb_sym sym) { -- cgit v1.2.3 From f045e646751bfe0f399aae59746befa6384b96aa Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sat, 23 Jun 2012 13:51:50 +0900 Subject: reduce calling mrb_str_new_cstr() to avoid strlen(); #301 --- src/class.c | 17 ++++++++++++----- src/codegen.c | 10 ++++++---- src/hash.c | 6 +++--- src/kernel.c | 2 +- src/object.c | 8 +++----- src/re.c | 13 +++++++------ src/sprintf.c | 10 ++++++---- src/string.c | 5 ++--- src/struct.c | 9 +++++---- src/time.c | 13 +++++++------ src/vm.c | 18 ++++++++++-------- 11 files changed, 62 insertions(+), 49 deletions(-) diff --git a/src/class.c b/src/class.c index 56ab8c06f..a9bf54a3b 100644 --- a/src/class.c +++ b/src/class.c @@ -972,15 +972,23 @@ mrb_class_path(mrb_state *mrb, struct RClass *c) struct RClass *outer = mrb_class_outer_module(mrb, c); mrb_sym sym = class_sym(mrb, c, outer); if (outer && outer != mrb->object_class) { + char *name; + int len; + mrb_value base = mrb_class_path(mrb, outer); - path = mrb_str_plus(mrb, base, mrb_str_new_cstr(mrb, "::")); - mrb_str_concat(mrb, path, mrb_str_new_cstr(mrb, mrb_sym2name(mrb, sym))); + path = mrb_str_plus(mrb, base, mrb_str_new(mrb, "::", 2)); + name = mrb_sym2name_len(mrb, sym, &len); + mrb_str_concat(mrb, path, mrb_str_new(mrb, name, len)); } else if (sym == 0) { return mrb_nil_value(); } else { - path = mrb_str_new_cstr(mrb, mrb_sym2name(mrb, sym)); + char *name; + int len; + + name = mrb_sym2name_len(mrb, sym, &len); + path = mrb_str_new(mrb, name, len); } mrb_obj_iv_set(mrb, (struct RObject*)c, mrb_intern(mrb, "__classpath__"), path); } @@ -1114,9 +1122,8 @@ mrb_define_alias(mrb_state *mrb, struct RClass *klass, const char *name1, const static mrb_value mrb_mod_to_s(mrb_state *mrb, mrb_value klass) { - //if (FL_TEST(klass, FL_SINGLETON)) { if (mrb_type(klass) == MRB_TT_SCLASS) { - mrb_value s = mrb_str_new_cstr(mrb, "#<"); + mrb_value s = mrb_str_new(mrb, "#<", 2); mrb_value v = mrb_iv_get(mrb, klass, mrb_intern(mrb, "__attached__")); mrb_str_cat2(mrb, s, "Class:"); diff --git a/src/codegen.c b/src/codegen.c index 72fc1097d..cbf401a1f 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -1534,10 +1534,11 @@ codegen(codegen_scope *s, node *tree, int val) case NODE_BACK_REF: { char buf[4]; + int len; int sym; - snprintf(buf, 3, "$%c", (int)(intptr_t)tree); - sym = new_sym(s, mrb_intern(s->mrb, buf)); + len = snprintf(buf, 3, "$%c", (int)(intptr_t)tree); + sym = new_sym(s, mrb_intern2(s->mrb, buf, len)); genop(s, MKOP_ABx(OP_GETGLOBAL, cursp(), sym)); push(); } @@ -1546,10 +1547,11 @@ codegen(codegen_scope *s, node *tree, int val) case NODE_NTH_REF: { char buf[4]; + int len; int sym; - snprintf(buf, 3, "$%d", (int)(intptr_t)tree); - sym = new_sym(s, mrb_intern(s->mrb, buf)); + len = snprintf(buf, 3, "$%d", (int)(intptr_t)tree); + sym = new_sym(s, mrb_intern2(s->mrb, buf, len)); genop(s, MKOP_ABx(OP_GETGLOBAL, cursp(), sym)); push(); } diff --git a/src/hash.c b/src/hash.c index 0e06cd246..a87ca97d4 100644 --- a/src/hash.c +++ b/src/hash.c @@ -889,9 +889,9 @@ inspect_hash(mrb_state *mrb, mrb_value hash, int recur) khash_t(ht) *h = RHASH_TBL(hash); khiter_t k; - if (recur) return mrb_str_new_cstr(mrb, "{...}"); + if (recur) return mrb_str_new(mrb, "{...}", 5); - str = mrb_str_new_cstr(mrb, "{"); + str = mrb_str_new(mrb, "{", 1); if (h && kh_size(h) > 0) { for (k = kh_begin(h); k != kh_end(h); k++) { int ai; @@ -934,7 +934,7 @@ mrb_hash_inspect(mrb_state *mrb, mrb_value hash) khash_t(ht) *h = RHASH_TBL(hash); if (!h || kh_size(h) == 0) - return mrb_str_new_cstr(mrb, "{}"); + return mrb_str_new(mrb, "{}", 2); return inspect_hash(mrb, hash, 0); } diff --git a/src/kernel.c b/src/kernel.c index 8f2b15378..8da112ee5 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -117,7 +117,7 @@ mrb_obj_inspect(mrb_state *mrb, mrb_value obj) return mrb_any_to_s(mrb, obj); } else if (mrb_nil_p(obj)) { - return mrb_str_new_cstr(mrb, "nil"); + return mrb_str_new(mrb, "nil", 3); } return mrb_funcall(mrb, obj, "to_s", 0, 0); } diff --git a/src/object.c b/src/object.c index a30e7c58a..eb63c1293 100644 --- a/src/object.c +++ b/src/object.c @@ -151,7 +151,7 @@ true_xor(mrb_state *mrb, mrb_value obj) static mrb_value true_to_s(mrb_state *mrb, mrb_value obj) { - return mrb_str_new_cstr(mrb, "true"); + return mrb_str_new(mrb, "true", 4); } /* 15.2.5.3.4 */ @@ -264,7 +264,7 @@ false_or(mrb_state *mrb, mrb_value obj) static mrb_value false_to_s(mrb_state *mrb, mrb_value obj) { - return mrb_str_new_cstr(mrb, "false"); + return mrb_str_new(mrb, "false", 5); } void @@ -462,9 +462,7 @@ mrb_any_to_s(mrb_state *mrb, mrb_value obj) len = strlen(cname)+6+16; str = mrb_str_new(mrb, 0, len); /* 6:tags 16:addr */ s = mrb_str_ptr(str); - // snprintf(RSTRING(str)->ptr, len+1, "#<%s:0x%lx>", cname, obj); - sprintf(s->ptr, "#<%s:0x%lx>", cname, (unsigned long)(obj.value.p)); - s->len = strlen(s->ptr); + s->len = sprintf(s->ptr, "#<%s:0x%lx>", cname, (unsigned long)(obj.value.p)); return str; } diff --git a/src/re.c b/src/re.c index 12061eacf..a7552de11 100644 --- a/src/re.c +++ b/src/re.c @@ -354,10 +354,10 @@ mrb_reg_options(mrb_state *mrb, mrb_value re) static mrb_value mrb_reg_desc(mrb_state *mrb, const char *s, long len, mrb_value re) { - mrb_value str = mrb_str_new_cstr(mrb, "/");//mrb_str_buf_new2("/"); + mrb_value str = mrb_str_new(mrb, "/", 1); mrb_reg_expr_str(mrb, str, s, len); - mrb_str_buf_cat(mrb, str, "/", sizeof("/")); + mrb_str_buf_cat(mrb, str, "/", 1); if (re.tt) { char opts[4]; mrb_reg_check(mrb, re); @@ -1688,9 +1688,10 @@ mrb_reg_expr_str(mrb_state *mrb, mrb_value str, const char *s, long len) } else if (!ISSPACE(c)) { char b[8]; + int n; - snprintf(b, sizeof(b), "\\x%02X", c); - mrb_str_buf_cat(mrb, str, b, 4); + n = snprintf(b, sizeof(b), "\\x%02X", c); + mrb_str_buf_cat(mrb, str, b, n); } else { mrb_str_buf_cat(mrb, str, p, 1); @@ -1728,7 +1729,7 @@ mrb_reg_to_s(mrb_state *mrb, mrb_value re) const int embeddable = ONIG_OPTION_MULTILINE|ONIG_OPTION_IGNORECASE|ONIG_OPTION_EXTEND; long len; const UChar* ptr; - mrb_value str = mrb_str_new_cstr(mrb, "(?"); + mrb_value str = mrb_str_new(mrb, "(?", 2); char optbuf[5]; mrb_encoding *enc = mrb_enc_get(mrb, re); @@ -1918,7 +1919,7 @@ mrb_match_inspect(mrb_state *mrb, mrb_value match) onig_foreach_name(regexp->ptr, match_inspect_name_iter, names); - str = mrb_str_new_cstr(mrb, "#<");//mrb_str_buf_new2("#<"); + str = mrb_str_new(mrb, "#<", 2); mrb_str_buf_cat(mrb, str, cname, strlen(cname)); for (i = 0; i < num_regs; i++) { diff --git a/src/sprintf.c b/src/sprintf.c index e01bf572e..56141e482 100644 --- a/src/sprintf.c +++ b/src/sprintf.c @@ -1061,6 +1061,8 @@ static void fmt_setup(char *buf, size_t size, int c, int flags, int width, int prec) { char *end = buf + size; + int n; + *buf++ = '%'; if (flags & FSHARP) *buf++ = '#'; if (flags & FPLUS) *buf++ = '+'; @@ -1069,13 +1071,13 @@ fmt_setup(char *buf, size_t size, int c, int flags, int width, int prec) if (flags & FSPACE) *buf++ = ' '; if (flags & FWIDTH) { - snprintf(buf, end - buf, "%d", width); - buf += strlen(buf); + n = snprintf(buf, end - buf, "%d", width); + buf += n; } if (flags & FPREC) { - snprintf(buf, end - buf, ".%d", prec); - buf += strlen(buf); + n = snprintf(buf, end - buf, ".%d", prec); + buf += n; } *buf++ = c; diff --git a/src/string.c b/src/string.c index a943512c7..1ef0cdc33 100644 --- a/src/string.c +++ b/src/string.c @@ -2517,6 +2517,7 @@ bad: printf("Integer"); return mrb_fixnum_value(0); } + char * mrb_string_value_cstr(mrb_state *mrb, mrb_value *ptr) { @@ -2535,10 +2536,8 @@ mrb_str_to_inum(mrb_state *mrb, mrb_value str, int base, int badcheck) char *s; int len; - //StringValue(str); mrb_string_value(mrb, &str); if (badcheck) { - //s = StringValueCStr(str); s = mrb_string_value_cstr(mrb, &str); } else { @@ -2949,7 +2948,7 @@ mrb_str_inspect(mrb_state *mrb, mrb_value str) { const char *p, *pend; char buf[CHAR_ESC_LEN + 1]; - mrb_value result = mrb_str_new_cstr(mrb, "\""); + mrb_value result = mrb_str_new(mrb, "\"", 1); p = RSTRING_PTR(str); pend = RSTRING_END(str); for (;p < pend; p++) { diff --git a/src/struct.c b/src/struct.c index 7e422f140..60a0edb5b 100644 --- a/src/struct.c +++ b/src/struct.c @@ -521,8 +521,11 @@ inspect_struct(mrb_state *mrb, mrb_value s, mrb_value dummy, int recur) slot = ptr_members[i]; id = SYM2ID(slot); if (mrb_is_local_id(id) || mrb_is_const_id(id)) { - //mrb_str_append(str, mrb_id2str(id)); - mrb_str_append(mrb, str, mrb_str_new_cstr(mrb, mrb_sym2name(mrb, id))); + char *name; + int len; + + name = mrb_sym2name_len(mrb, id, &len); + mrb_str_append(mrb, str, mrb_str_new(mrb, name, len)); } else { mrb_str_append(mrb, str, mrb_inspect(mrb, slot)); @@ -804,9 +807,7 @@ mrb_init_struct(mrb_state *mrb) { struct RClass *st; st = mrb_define_class(mrb, "Struct", mrb->object_class); - //mrb_include_module(mrb_cStruct, rb_mEnumerable); - //mrb_undef_alloc_func(mrb_cStruct); mrb_define_class_method(mrb, st, "new", mrb_struct_s_def, ARGS_ANY()); /* 15.2.18.3.1 */ mrb_define_method(mrb, st, "==", mrb_struct_equal, ARGS_REQ(1)); /* 15.2.18.4.1 */ diff --git a/src/time.c b/src/time.c index 55060729b..28cc3c1a3 100644 --- a/src/time.c +++ b/src/time.c @@ -430,16 +430,17 @@ mrb_time_asctime(mrb_state *mrb, mrb_value self) struct mrb_time *tm; struct tm *d; char buf[256]; + int len; tm = mrb_get_datatype(mrb, self, &mrb_time_type); if (!tm) return mrb_nil_value(); d = &tm->datetime; - snprintf(buf, 256, "%s %s %02d %02d:%02d:%02d %s%d", - wday_names[d->tm_wday], mon_names[d->tm_mon], d->tm_mday, - d->tm_hour, d->tm_min, d->tm_sec, - tm->timezone == MRB_TIMEZONE_UTC ? "UTC " : "", - d->tm_year + 1900); - return mrb_str_new_cstr(mrb, buf); + len = snprintf(buf, 256, "%s %s %02d %02d:%02d:%02d %s%d", + wday_names[d->tm_wday], mon_names[d->tm_mon], d->tm_mday, + d->tm_hour, d->tm_min, d->tm_sec, + tm->timezone == MRB_TIMEZONE_UTC ? "UTC " : "", + d->tm_year + 1900); + return mrb_str_new(mrb, buf, len); } /* 15.2.19.7.6 */ diff --git a/src/vm.c b/src/vm.c index 04392891f..daba0acc6 100644 --- a/src/vm.c +++ b/src/vm.c @@ -292,10 +292,11 @@ static void localjump_error(mrb_state *mrb, const char *kind) { char buf[256]; + int len; mrb_value exc; - snprintf(buf, 256, "unexpected %s", kind); - exc = mrb_exc_new(mrb, E_LOCALJUMP_ERROR, buf, strlen(buf)); + len = snprintf(buf, 256, "unexpected %s", kind); + exc = mrb_exc_new(mrb, E_LOCALJUMP_ERROR, buf, len); mrb->exc = (struct RObject*)mrb_object(exc); } @@ -303,18 +304,19 @@ static void argnum_error(mrb_state *mrb, int num) { char buf[256]; + int len; mrb_value exc; if (mrb->ci->mid) { - snprintf(buf, 256, "'%s': wrong number of arguments (%d for %d)", - mrb_sym2name(mrb, mrb->ci->mid), - mrb->ci->argc, num); + len = snprintf(buf, 256, "'%s': wrong number of arguments (%d for %d)", + mrb_sym2name(mrb, mrb->ci->mid), + mrb->ci->argc, num); } else { - snprintf(buf, 256, "wrong number of arguments (%d for %d)", - mrb->ci->argc, num); + len = snprintf(buf, 256, "wrong number of arguments (%d for %d)", + mrb->ci->argc, num); } - exc = mrb_exc_new(mrb, E_ARGUMENT_ERROR, buf, strlen(buf)); + exc = mrb_exc_new(mrb, E_ARGUMENT_ERROR, buf, len); mrb->exc = (struct RObject*)mrb_object(exc); } -- cgit v1.2.3 From c261e4f360106eeb5d9193c30410818884e19ccc Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 24 Jun 2012 00:15:22 +0900 Subject: resolve crash issue on LLVM; longjmp cleared some local variable --- src/vm.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/vm.c b/src/vm.c index daba0acc6..d7048f8f0 100644 --- a/src/vm.c +++ b/src/vm.c @@ -394,8 +394,8 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) mrb_value *regs = NULL; mrb_code i; int ai = mrb->arena_idx; + jmp_buf *prev_jmp = mrb->jmp; jmp_buf c_jmp; - volatile jmp_buf *prev_jmp = NULL; #ifdef DIRECT_THREADED static void *optable[] = { @@ -424,7 +424,6 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) if (setjmp(c_jmp) == 0) { - prev_jmp = mrb->jmp; mrb->jmp = &c_jmp; } else { -- cgit v1.2.3 From d657e26d35ef31314a97d42bacc3e5dc85689404 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 24 Jun 2012 01:12:05 +0900 Subject: pacify const assignment warning --- src/class.c | 8 ++------ src/struct.c | 2 +- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/class.c b/src/class.c index a9bf54a3b..881a0072e 100644 --- a/src/class.c +++ b/src/class.c @@ -966,15 +966,14 @@ mrb_value mrb_class_path(mrb_state *mrb, struct RClass *c) { mrb_value path; + const char *name; + int len; path = mrb_obj_iv_get(mrb, (struct RObject*)c, mrb_intern(mrb, "__classpath__")); if (mrb_nil_p(path)) { struct RClass *outer = mrb_class_outer_module(mrb, c); mrb_sym sym = class_sym(mrb, c, outer); if (outer && outer != mrb->object_class) { - char *name; - int len; - mrb_value base = mrb_class_path(mrb, outer); path = mrb_str_plus(mrb, base, mrb_str_new(mrb, "::", 2)); name = mrb_sym2name_len(mrb, sym, &len); @@ -984,9 +983,6 @@ mrb_class_path(mrb_state *mrb, struct RClass *c) return mrb_nil_value(); } else { - char *name; - int len; - name = mrb_sym2name_len(mrb, sym, &len); path = mrb_str_new(mrb, name, len); } diff --git a/src/struct.c b/src/struct.c index 60a0edb5b..855974182 100644 --- a/src/struct.c +++ b/src/struct.c @@ -521,7 +521,7 @@ inspect_struct(mrb_state *mrb, mrb_value s, mrb_value dummy, int recur) slot = ptr_members[i]; id = SYM2ID(slot); if (mrb_is_local_id(id) || mrb_is_const_id(id)) { - char *name; + const char *name; int len; name = mrb_sym2name_len(mrb, id, &len); -- cgit v1.2.3 From 6d3b35e064ce46cc97530a4fc41e64e28c555c1a Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 24 Jun 2012 01:22:53 +0900 Subject: avoid generating iv name each time in accessors --- mrblib/class.rb | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/mrblib/class.rb b/mrblib/class.rb index e984376a4..4f268b6c8 100644 --- a/mrblib/class.rb +++ b/mrblib/class.rb @@ -2,14 +2,16 @@ class Module # 15.2.2.4.13 def attr_reader(*names) names.each{|name| - define_method(name){self.instance_variable_get('@'+name.to_s)} + name2 = ('@'+name.to_s).intern + define_method(name){self.instance_variable_get(name2)} } end # 15.2.2.4.14 def attr_writer(*names) names.each{|name| - aset = (name.to_s+"=").intern - define_method(aset){|v|self.instance_variable_set('@'+name.to_s,v)} + name2 = ('@'+name.to_s).intern + name = (name.to_s+"=").intern + define_method(name){|v|self.instance_variable_set(name2,v)} } end # 15.2.2.4.12 -- cgit v1.2.3 From a194f30f62d5d746e133c1c7a784b6eb3b5b7cb0 Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Sun, 24 Jun 2012 04:03:46 +0900 Subject: Add test for Struct#==. --- test/t/struct.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/t/struct.rb b/test/t/struct.rb index fff02ee56..5cf6929b8 100644 --- a/test/t/struct.rb +++ b/test/t/struct.rb @@ -16,6 +16,13 @@ if Object.const_defined?(:Struct) c.members == [:m1,:m2] end + assert('Struct#==', '15.2.18.4.1') do + c = Struct.new(:m1, :m2) + cc1 = c.new(1,2) + cc2 = c.new(1,2) + cc1 == cc2 + end + assert('Struct#[]', '15.2.18.4.2') do c = Struct.new(:m1, :m2) cc = c.new(1,2) -- cgit v1.2.3 From 7a17377c644d421fae71bd8d61e6f7dc744faf62 Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Sun, 24 Jun 2012 04:06:53 +0900 Subject: Fix Struct.new and Struct.[]. Instances of Struct's subclass should have MRB_TT_STRUCT. --- src/struct.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/struct.c b/src/struct.c index 855974182..25cd02d3d 100644 --- a/src/struct.c +++ b/src/struct.c @@ -286,8 +286,8 @@ make_struct(mrb_state *mrb, mrb_value name, mrb_value members, struct RClass * k nstr = mrb_obj_value(c); mrb_iv_set(mrb, nstr, mrb_intern(mrb, "__members__"), members); - mrb_define_class_method(mrb, c, "new", mrb_class_new_instance_m, ARGS_ANY()); - mrb_define_class_method(mrb, c, "[]", mrb_class_new_instance_m, ARGS_ANY()); + mrb_define_class_method(mrb, c, "new", mrb_instance_new, ARGS_ANY()); + mrb_define_class_method(mrb, c, "[]", mrb_instance_new, ARGS_ANY()); mrb_define_class_method(mrb, c, "members", mrb_struct_s_members_m, ARGS_NONE()); //RSTRUCT(nstr)->basic.c->super = c->c; ptr_members = RARRAY_PTR(members); -- cgit v1.2.3 From 7778b5ca1c82062e29eb41b22839a1d174dd82e1 Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Sun, 24 Jun 2012 06:28:17 +0900 Subject: Implement garbage collection for struct. --- src/gc.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/gc.c b/src/gc.c index a7537a015..a17cd64c8 100644 --- a/src/gc.c +++ b/src/gc.c @@ -430,6 +430,18 @@ gc_mark_children(mrb_state *mrb, struct RBasic *obj) break; #endif +#ifdef ENABLE_STRUCT + case MRB_TT_STRUCT: + { + struct RStruct *s = (struct RStruct*)obj; + long i; + for (i=0; ilen; i++){ + mrb_gc_mark_value(mrb, s->ptr[i]); + } + } + break; +#endif + default: break; } -- cgit v1.2.3 From 1deb31320a480b1863885743ab344a602062c43a Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Sun, 24 Jun 2012 15:15:55 +0900 Subject: Modify instance tt. --- src/class.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/class.c b/src/class.c index 881a0072e..53e603aeb 100644 --- a/src/class.c +++ b/src/class.c @@ -1050,6 +1050,9 @@ mrb_class_new(mrb_state *mrb, struct RClass *super) mrb_check_inheritable(mrb, super); } c = boot_defclass(mrb, super); + if (super){ + MRB_SET_INSTANCE_TT(c, MRB_INSTANCE_TT(super)); + } make_metaclass(mrb, c); return c; -- cgit v1.2.3 From 2a2ffe7f7dc5202b29a1f59ab5e128b7040e0d86 Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Thu, 21 Jun 2012 02:00:05 +0900 Subject: Modify Kernel#clone and Kernel#dup. Kernel#clone, Kernel#dup: - 'iv' should not be shared with the original object, but it should be copied. Kernel#clone: - 'mt' of singleton_class should be copied. --- include/mruby/khash.h | 16 ++++++++++++++++ src/kernel.c | 13 +++++++++---- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/include/mruby/khash.h b/include/mruby/khash.h index e236f0bea..0803521b7 100644 --- a/include/mruby/khash.h +++ b/include/mruby/khash.h @@ -61,6 +61,7 @@ static const uint8_t __m[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; khint_t kh_put_##name(kh_##name##_t *h, khkey_t key); \ void kh_resize_##name(kh_##name##_t *h, khint_t new_n_buckets); \ void kh_del_##name(kh_##name##_t *h, khint_t x); \ + kh_##name##_t *kh_copy_##name(mrb_state *mrb, kh_##name##_t *h); /* define kh_xxx_funcs @@ -179,6 +180,20 @@ static const uint8_t __m[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; { \ h->d_flags[x/8] |= __m[x%8]; \ h->size--; \ + } \ + kh_##name##_t *kh_copy_##name(mrb_state *mrb, kh_##name##_t *h) \ + { \ + kh_##name##_t *h2; \ + khiter_t k, k2; \ + \ + h2 = kh_init_##name(mrb); \ + for (k = kh_begin(h); k != kh_end(h); k++) { \ + if (kh_exist(h, k)) { \ + k2 = kh_put_##name(h2, kh_key(h, k)); \ + kh_value(h2, k2) = kh_value(h, k); \ + } \ + } \ + return h2; \ } @@ -191,6 +206,7 @@ static const uint8_t __m[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; #define kh_put(name, h, k) kh_put_##name(h, k) #define kh_get(name, h, k) kh_get_##name(h, k) #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_key(h, x) ((h)->keys[x]) diff --git a/src/kernel.c b/src/kernel.c index 8da112ee5..5e17d4b5a 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -338,7 +338,12 @@ mrb_singleton_class_clone(mrb_state *mrb, mrb_value obj) if (klass->iv) { clone->iv = klass->iv; } - clone->mt = kh_init(mt, mrb); + if (klass->mt) { + clone->mt = kh_copy(mt, mrb, klass->mt); + } + else { + clone->mt = kh_init(mt, mrb); + } clone->tt = MRB_TT_SCLASS; return clone; } @@ -361,10 +366,11 @@ init_copy(mrb_state *mrb, mrb_value dest, mrb_value obj) case MRB_TT_CLASS: case MRB_TT_MODULE: if (ROBJECT(dest)->iv) { + kh_destroy(iv, ROBJECT(dest)->iv); ROBJECT(dest)->iv = 0; } if (ROBJECT(obj)->iv) { - ROBJECT(dest)->iv = ROBJECT(obj)->iv; + ROBJECT(dest)->iv = kh_copy(iv, mrb, ROBJECT(obj)->iv); } break; @@ -446,9 +452,8 @@ mrb_obj_dup(mrb_state *mrb, mrb_value obj) mrb_raise(mrb, E_TYPE_ERROR, "can't dup %s", mrb_obj_classname(mrb, obj)); } p = mrb_obj_alloc(mrb, mrb_type(obj), mrb_obj_class(mrb, obj)); - //init_copy(dup, obj); dup = mrb_obj_value(p); - mrb_funcall(mrb, dup, "initialize_copy", 1, obj); + init_copy(mrb, dup, obj); return dup; } -- cgit v1.2.3 From 062e96960d078cb5bca48ba3b878f681871be72a Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Fri, 22 Jun 2012 01:31:33 +0900 Subject: Add sample test for Kernel#clone and Kernel#dup. --- test/t/kernel.rb | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/test/t/kernel.rb b/test/t/kernel.rb index ba708dbb7..6531383e5 100644 --- a/test/t/kernel.rb +++ b/test/t/kernel.rb @@ -71,6 +71,62 @@ assert('Kernel.raise', '15.3.1.2.12') do e_list[0].class == RuntimeError end +assert('Kernel#clone', '15.3.1.3.8') do + class KernelCloneTest + def initialize + @v = 0 + end + + def get + @v + end + + def set(v) + @v = v + end + end + + a = KernelCloneTest.new + a.set(1) + b = a.clone + + def a.test + end + a.set(2) + c = a.clone + + a.get == 2 && b.get == 1 && c.get == 2 && + a.respond_to?(:test) == true && b.respond_to?(:test) == false && c.respond_to?(:test) == true +end + +assert('Kernel#dup', '15.3.1.3.9') do + class KernelDupTest + def initialize + @v = 0 + end + + def get + @v + end + + def set(v) + @v = v + end + end + + a = KernelDupTest.new + a.set(1) + b = a.dup + + def a.test + end + a.set(2) + c = a.dup + + a.get == 2 && b.get == 1 && c.get == 2 && + a.respond_to?(:test) == true && b.respond_to?(:test) == false && c.respond_to?(:test) == false +end + assert('Kernel#hash', '15.3.1.2.15') do hash == hash end -- cgit v1.2.3 From 9a1f58874953e37af538a8fde3792817a88e4e1c Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Sun, 24 Jun 2012 17:29:41 +0900 Subject: Modify obj_free to free instances of Struct. --- src/gc.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/gc.c b/src/gc.c index a7537a015..23d22765c 100644 --- a/src/gc.c +++ b/src/gc.c @@ -502,6 +502,12 @@ obj_free(mrb_state *mrb, struct RBasic *obj) mrb_free(mrb, ((struct RRange*)obj)->edges); break; +#ifdef ENABLE_STRUCT + case MRB_TT_STRUCT: + mrb_free(mrb, ((struct RStruct*)obj)->ptr); + break; +#endif + case MRB_TT_DATA: { struct RData *d = (struct RData*)obj; -- cgit v1.2.3 From e53eea76eb1da7cb9b5b2da52e3244a0f521972a Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Sun, 24 Jun 2012 17:38:20 +0900 Subject: Modify gc_gray_mark for Struct. --- src/gc.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/gc.c b/src/gc.c index 23d22765c..1010a6749 100644 --- a/src/gc.c +++ b/src/gc.c @@ -626,6 +626,15 @@ gc_gray_mark(mrb_state *mrb, struct RBasic *obj) break; #endif +#ifdef ENABLE_STRUCT + case MRB_TT_STRUCT: + { + struct RStruct *s = (struct RStruct*)obj; + children += s->len; + } + break; +#endif + default: break; } -- cgit v1.2.3 From 8121e0d354b83b3fa9d1363470e280dc98112289 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 24 Jun 2012 21:46:24 +0900 Subject: should mark child env from method (proc) objects --- src/class.c | 2 +- src/gc.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class.c b/src/class.c index 881a0072e..16fb36617 100644 --- a/src/class.c +++ b/src/class.c @@ -37,7 +37,7 @@ mrb_gc_mark_mt(mrb_state *mrb, struct RClass *c) if (kh_exist(h, k)){ struct RProc *m = kh_value(h, k); if (m) { - paint_black(m); + mrb_gc_mark(mrb, (struct RBasic*)m); } } } diff --git a/src/gc.c b/src/gc.c index a7537a015..42c4e3fdb 100644 --- a/src/gc.c +++ b/src/gc.c @@ -345,8 +345,8 @@ gc_mark_children(mrb_state *mrb, struct RBasic *obj) break; case MRB_TT_CLASS: - case MRB_TT_SCLASS: case MRB_TT_MODULE: + case MRB_TT_SCLASS: { struct RClass *c = (struct RClass*)obj; -- cgit v1.2.3 From ccde2d3be08d215f235e7a1820ab98ddb769abe6 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 24 Jun 2012 22:30:56 +0900 Subject: update ISO chapter number in test/t/kernel.rb --- test/t/kernel.rb | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/test/t/kernel.rb b/test/t/kernel.rb index 6531383e5..c1f42e420 100644 --- a/test/t/kernel.rb +++ b/test/t/kernel.rb @@ -127,11 +127,11 @@ assert('Kernel#dup', '15.3.1.3.9') do a.respond_to?(:test) == true && b.respond_to?(:test) == false && c.respond_to?(:test) == false end -assert('Kernel#hash', '15.3.1.2.15') do +assert('Kernel#hash', '15.3.1.3.15') do hash == hash end -assert('Kernel#loop', '15.3.1.2.29') do +assert('Kernel#loop', '15.3.1.3.29') do i = 0 loop do @@ -142,32 +142,31 @@ assert('Kernel#loop', '15.3.1.2.29') do i == 100 end -assert('Kernel#methods', '15.3.1.2.31') do +assert('Kernel#methods', '15.3.1.3.31') do methods.class == Array end -assert('Kernel#nil?', '15.3.1.2.32') do - # TODO why is Kernel nil ???? - nil? == true +assert('Kernel#nil?', '15.3.1.3.32') do + nil.nil? == true end -assert('Kernel#private_methods', '15.3.1.2.36') do - private_methods.class == Array +assert('Kernel#private_methods', '15.3.1.3.36') do + private_methods.class == Array end -assert('Kernel#protected_methods', '15.3.1.2.37') do +assert('Kernel#protected_methods', '15.3.1.3.37') do protected_methods.class == Array end -assert('Kernel#public_methods', '15.3.1.2.38') do +assert('Kernel#public_methods', '15.3.1.3.38') do public_methods.class == Array end -assert('Kernel#respond_to?', '15.3.1.2.43') do +assert('Kernel#respond_to?', '15.3.1.3.43') do respond_to? :nil? end -assert('Kernel#send', '15.3.1.2.44') do +assert('Kernel#send', '15.3.1.3.44') do # test with block l = send(:lambda) do true @@ -179,11 +178,11 @@ assert('Kernel#send', '15.3.1.2.44') do send(:public_methods).class == Array end -assert('Kernel#singleton_methods', '15.3.1.2.45') do +assert('Kernel#singleton_methods', '15.3.1.3.45') do singleton_methods.class == Array end -assert('Kernel#to_s', '15.3.1.2.46') do +assert('Kernel#to_s', '15.3.1.3.46') do # TODO looks strange.. to_s == '' end -- cgit v1.2.3 From 19638ded7367520333caf1b070b221ea18e4c352 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 25 Jun 2012 17:30:12 +0900 Subject: use mrb_intern_str instead of mrb_intern if possible --- src/class.c | 2 +- src/sprintf.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class.c b/src/class.c index 16fb36617..cda7ce643 100644 --- a/src/class.c +++ b/src/class.c @@ -1226,7 +1226,7 @@ static mrb_sym mrb_sym_value(mrb_state *mrb, mrb_value val) { if(val.tt == MRB_TT_STRING) { - return mrb_intern(mrb, RSTRING_PTR(val)); + return mrb_intern_str(mrb, val); } else if(val.tt != MRB_TT_SYMBOL) { mrb_value obj = mrb_funcall(mrb, val, "inspect", 0); diff --git a/src/sprintf.c b/src/sprintf.c index 56141e482..86c3b66bc 100644 --- a/src/sprintf.c +++ b/src/sprintf.c @@ -613,7 +613,7 @@ retry: (int)(p - start + 1), start, mrb_sym2name(mrb, id)); } symname = mrb_str_new(mrb, start + 1, p - start - 1); - id = mrb_intern(mrb, RSTRING_PTR(symname)); + id = mrb_intern_str(mrb, symname); nextvalue = GETNAMEARG(mrb_symbol_value(id), start, (int)(p - start + 1)); if (UNDEF_P(nextvalue)) { mrb_raise(mrb, E_KEY_ERROR, "key%.*s not found", (int)(p - start + 1), start); -- cgit v1.2.3 From c99b806f8bd29ff49b0f7384a105fe4cebc8511f Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 25 Jun 2012 19:24:57 +0900 Subject: ci->acc should not be left uninitialized; close #303 --- src/vm.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/vm.c b/src/vm.c index d7048f8f0..136ece3bd 100644 --- a/src/vm.c +++ b/src/vm.c @@ -711,6 +711,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) if (ci->argc == CALL_MAXARGS) ci->argc = -1; ci->target_class = m->target_class; ci->pc = pc + 1; + ci->acc = a; /* prepare stack */ mrb->stack += a; @@ -725,9 +726,6 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) NEXT; } else { - /* fill callinfo */ - ci->acc = a; - /* setup environment for calling method */ proc = mrb->ci->proc = m; irep = m->body.irep; -- cgit v1.2.3 From c152c194a181d38cf5b6ccae45a703bbc47db440 Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Tue, 26 Jun 2012 01:34:41 +0900 Subject: Prevent memory leak when string literal is created. --- src/string.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/string.c b/src/string.c index 1ef0cdc33..c74dcedde 100644 --- a/src/string.c +++ b/src/string.c @@ -292,7 +292,7 @@ mrb_str_literal(mrb_state *mrb, mrb_value str) struct RString *s, *orig; struct mrb_shared_string *shared; - s = str_new(mrb, 0, 0); + s = str_alloc(mrb, mrb->string_class); orig = mrb_str_ptr(str); if (!(orig->flags & MRB_STR_SHARED)) { str_make_shared(mrb, mrb_str_ptr(str)); -- cgit v1.2.3 From b18ab1dc3f9b07ecd6cf2b80005ae08838c9926b Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Tue, 26 Jun 2012 12:03:12 +0900 Subject: Fix str_to_format. See also #314. --- src/cdump.c | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/cdump.c b/src/cdump.c index 4f680d4f3..fedfd9c2b 100644 --- a/src/cdump.c +++ b/src/cdump.c @@ -73,22 +73,23 @@ str_format_len(mrb_value str) static char* str_to_format(mrb_value str, char *buf) { - char *src, *dst; + char *src; + char *dst; - for (src = RSTRING_PTR(str), dst = buf; src < RSTRING_END(str);) { + for (src = RSTRING_PTR(str), dst = buf; src < RSTRING_END(str); src++) { switch (*src) { - case 0x07:/* BEL */ memcpy(dst, "\\a", 2); dst+=2; src+=2; break; - case 0x08:/* BS */ memcpy(dst, "\\b", 2); dst+=2; src+=2; break; - case 0x09:/* HT */ memcpy(dst, "\\t", 2); dst+=2; src+=2; break; - case 0x0A:/* LF */ memcpy(dst, "\\n", 2); dst+=2; src+=2; break; - case 0x0B:/* VT */ memcpy(dst, "\\v", 2); dst+=2; src+=2; break; - case 0x0C:/* FF */ memcpy(dst, "\\f", 2); dst+=2; src+=2; break; - case 0x0D:/* CR */ memcpy(dst, "\\r", 2); dst+=2; src+=2; break; - case 0x22:/* " */ memcpy(dst, "\\\"", 2); dst+=2; src+=2; break; - case 0x27:/* ' */ memcpy(dst, "\\\'", 2); dst+=2; src+=2; break; - case 0x3F:/* ? */ memcpy(dst, "\\\?", 2); dst+=2; src+=2; break; - case 0x5C:/* \ */ memcpy(dst, "\\\\", 2); dst+=2; src+=2; break; - default: *dst++ = *src++; break; + case 0x07:/* BEL */ *dst++ = '\\'; *dst++ = 'a'; break; + case 0x08:/* BS */ *dst++ = '\\'; *dst++ = 'b'; break; + case 0x09:/* HT */ *dst++ = '\\'; *dst++ = 't'; break; + case 0x0A:/* LF */ *dst++ = '\\'; *dst++ = 'n'; break; + case 0x0B:/* VT */ *dst++ = '\\'; *dst++ = 'v'; break; + case 0x0C:/* FF */ *dst++ = '\\'; *dst++ = 'f'; break; + case 0x0D:/* CR */ *dst++ = '\\'; *dst++ = 'r'; break; + case 0x22:/* " */ *dst++ = '\\'; *dst++ = '\"'; break; + case 0x27:/* ' */ *dst++ = '\\'; *dst++ = '\''; break; + case 0x3F:/* ? */ *dst++ = '\\'; *dst++ = '\?'; break; + case 0x5C:/* \ */ *dst++ = '\\'; *dst++ = '\\'; break; + default: *dst++ = *src; break; } } -- cgit v1.2.3 From 8f5017e768b6cdc9b7ef824018561b9d300dfa5e Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 26 Jun 2012 14:01:26 +0900 Subject: raise NotImplementedError from regexp related string methods; close #319 --- mrblib/string.rb | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/mrblib/string.rb b/mrblib/string.rb index ad7e1fca1..d09b787da 100644 --- a/mrblib/string.rb +++ b/mrblib/string.rb @@ -33,12 +33,15 @@ class String end ### *** TODO *** ### + unless Object.const_defined?(:Regexp) + raise NotImplementedError, "gsub not available (yet)" + end end ## # Replace all matches of +pattern+ with +replacement+. # Call block (if given) for each match and replace - # +pattern+ with the value of the block. Modify + # +pattern+ with the value of the block. Modify # +self+ with the final value. # # ISO 15.2.10.5.19 @@ -56,15 +59,18 @@ class String # Calls the given block for each match of +pattern+ # If no block is given return an array with all # matches of +pattern+. - # + # # ISO 15.2.10.5.32 def scan(reg, &block) ### *** TODO *** ### + unless Object.const_defined?(:Regexp) + raise NotImplementedError, "scan not available (yet)" + end end ## - # Replace only the first match of +pattern+ with - # +replacement+. Call block (if given) for each + # Replace only the first match of +pattern+ with + # +replacement+. Call block (if given) for each # match and replace +pattern+ with the value of the # block. Return the final value. # @@ -75,12 +81,15 @@ class String end ### *** TODO *** ### + unless Object.const_defined?(:Regexp) + raise NotImplementedError, "sub not available (yet)" + end end ## - # Replace only the first match of +pattern+ with - # +replacement+. Call block (if given) for each - # match and replace +pattern+ with the value of the + # Replace only the first match of +pattern+ with + # +replacement+. Call block (if given) for each + # match and replace +pattern+ with the value of the # block. Modify +self+ with the final value. # # ISO 15.2.10.5.37 -- cgit v1.2.3 From 568af5518710916ba5e71deefbae0abdd518a766 Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Tue, 26 Jun 2012 20:31:19 +0900 Subject: Refactor hex_to_str(). --- src/load.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/load.c b/src/load.c index d3766da9d..eb9cd119c 100644 --- a/src/load.c +++ b/src/load.c @@ -608,13 +608,11 @@ static char* hex_to_str(char *hex, char *str, uint16_t *str_len) { char *src, *dst; - uint16_t hex_len = strlen(hex); + int escape = 0; *str_len = 0; - - for (src = hex, dst = str; hex_len > 0; (*str_len)++, hex_len--) { - if (*src == '\\' && hex_len > 1) { - src++; hex_len--; + for (src = hex, dst = str; *src != '\0'; src++) { + if (escape) { switch(*src) { case 'a': *dst++ = '\a'/* BEL */; break; case 'b': *dst++ = '\b'/* BS */; break; @@ -629,12 +627,18 @@ hex_to_str(char *hex, char *str, uint16_t *str_len) case '\\': *dst++ = *src; break; default:break; } - src++; + escape = 0; } else { - *dst++ = *src++; + if (*src == '\\') { + escape = 1; + } else { + escape = 0; + *dst++ = *src; + } + } + if (!escape) { + (*str_len)++; } } - return str; } - -- cgit v1.2.3 From 0b4d96741baaf610edd23207838726517ddecbb5 Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Wed, 27 Jun 2012 00:38:59 +0900 Subject: Fix str_format_len. --- src/cdump.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cdump.c b/src/cdump.c index fedfd9c2b..0df2bb491 100644 --- a/src/cdump.c +++ b/src/cdump.c @@ -45,7 +45,7 @@ str_format_len(mrb_value str) char *src; - for (src = RSTRING_PTR(str); src < RSTRING_END(str);) { + for (src = RSTRING_PTR(str); src < RSTRING_END(str); src++) { switch (*src) { case 0x07:/* BEL */ /* fall through */ case 0x08:/* BS */ /* fall through */ @@ -58,11 +58,11 @@ str_format_len(mrb_value str) case 0x27:/* ' */ /* fall through */ case 0x3F:/* ? */ /* fall through */ case 0x5C:/* \ */ /* fall through */ - dump_len += 2; src += 2; + dump_len += 2; break; default: - dump_len++; src++; + dump_len++; break; } } -- cgit v1.2.3 From 6410cdf3bffcbbb3d97f0153720922242c4f800f Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 27 Jun 2012 01:13:21 +0900 Subject: do not undef config macros --- include/mrbconf.h | 12 ++++++------ src/kernel.c | 2 +- src/sprintf.c | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/include/mrbconf.h b/include/mrbconf.h index 21b8fea18..f496c53d9 100644 --- a/include/mrbconf.h +++ b/include/mrbconf.h @@ -15,10 +15,10 @@ /* -DDISABLE_XXXX to change to drop the feature */ #define DISABLE_REGEXP /* regular expression classes */ -#undef DISABLE_KERNEL_SPRINTF /* Kernel.sprintf method */ -#undef DISABLE_MATH /* Math functions */ -#undef DISABLE_TIME /* Time class */ -#undef DISABLE_STRUCT /* Struct class */ +//#define DISABLE_SPRINTF /* Kernel.sprintf method */ +//#define DISABLE_MATH /* Math functions */ +//#define DISABLE_TIME /* Time class */ +//#define DISABLE_STRUCT /* Struct class */ #undef HAVE_UNISTD_H /* WINDOWS */ #define HAVE_UNISTD_H /* LINUX */ @@ -38,8 +38,8 @@ typedef intptr_t mrb_sym; #ifndef DISABLE_REGEXP #define ENABLE_REGEXP #endif -#ifndef DISABLE_KERNEL_SPRINTF -#define ENABLE_KERNEL_SPRINTF +#ifndef DISABLE_SPRINTF +#define ENABLE_SPRINTF #endif #ifndef DISABLE_MATH #define ENABLE_MATH diff --git a/src/kernel.c b/src/kernel.c index 5e17d4b5a..605b84124 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -1168,7 +1168,7 @@ mrb_init_kernel(mrb_state *mrb) mrb_define_method(mrb, krn, "singleton_methods", mrb_obj_singleton_methods_m, ARGS_ANY()); /* 15.3.1.3.45 */ mrb_define_method(mrb, krn, "to_s", mrb_any_to_s, ARGS_NONE()); /* 15.3.1.3.46 */ -#ifdef ENABLE_KERNEL_SPRINTF +#ifdef ENABLE_SPRINTF mrb_define_method(mrb, krn, "sprintf", mrb_f_sprintf, ARGS_ANY()); /* in sprintf.c */ mrb_define_method(mrb, krn, "format", mrb_f_sprintf, ARGS_ANY()); /* in sprintf.c */ #endif diff --git a/src/sprintf.c b/src/sprintf.c index 86c3b66bc..68addef89 100644 --- a/src/sprintf.c +++ b/src/sprintf.c @@ -6,7 +6,7 @@ #include "mruby.h" -#ifdef ENABLE_KERNEL_SPRINTF +#ifdef ENABLE_SPRINTF #include #include @@ -1084,4 +1084,4 @@ fmt_setup(char *buf, size_t size, int c, int flags, int width, int prec) *buf = '\0'; } -#endif /* ENABLE_KERNEL_SPRINTF */ +#endif /* ENABLE_SPRINTF */ -- cgit v1.2.3 From d3bf659bfd633aa6a6fbb5045df4289c809f03dc Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Wed, 27 Jun 2012 03:06:07 +0800 Subject: Add more kernel tests --- test/t/kernel.rb | 141 +++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 132 insertions(+), 9 deletions(-) diff --git a/test/t/kernel.rb b/test/t/kernel.rb index c1f42e420..d11e256a6 100644 --- a/test/t/kernel.rb +++ b/test/t/kernel.rb @@ -7,13 +7,20 @@ end assert('Kernel.block_given?', '15.3.1.2.2') do def bg_try(&b) - if block_given? + if Kernel.block_given? yield else "no block" end end - (Kernel.block_given? == false) && (bg_try == "no block") && ((bg_try { "block" }) == "block") && ((bg_try do "block" end) == "block") + + (Kernel.block_given? == false) and + # test without block + (bg_try == "no block") and + # test with block + ((bg_try { "block" }) == "block") and + # test with block + ((bg_try do "block" end) == "block") end assert('Kernel.global_variables', '15.3.1.2.4') do @@ -32,6 +39,11 @@ assert('Kernel.lambda', '15.3.1.2.6') do l.call and l.class == Proc end +# Not implemented at the moment +#assert('Kernel.local_variables', '15.3.1.2.7') do +# Kernel.local_variables.class == Array +#end + assert('Kernel.loop', '15.3.1.2.8') do i = 0 @@ -58,17 +70,61 @@ assert('Kernel.puts', '15.3.1.2.11') do true end -# TODO fails at the moment without arguments assert('Kernel.raise', '15.3.1.2.12') do e_list = [] begin - raise RuntimeError.new + Kernel.raise + rescue => e + e_list << e + end + + begin + Kernel.raise RuntimeError.new rescue => e e_list << e end - e_list[0].class == RuntimeError + # result without argument + e_list[0].class == RuntimeError and + # result with RuntimeError argument + e_list[1].class == RuntimeError +end + +assert('Kernel#__id__', '15.3.1.3.3') do + __id__.class == Fixnum +end + +assert('Kernel#__send__', '15.3.1.3.4') do + # test with block + l = __send__(:lambda) do + true + end + + l.call and l.class == Proc and + # test with argument + __send__(:respond_to?, :nil?) and + # test without argument and without block + __send__(:public_methods).class == Array +end + +assert('Kernel#block_given?', '15.3.1.3.6') do + def bg_try(&b) + if block_given? + yield + else + "no block" + end + end + + (block_given? == false) and + (bg_try == "no block") and + ((bg_try { "block" }) == "block") and + ((bg_try do "block" end) == "block") +end + +assert('Kernel#class', '15.3.1.3.7') do + Kernel.class == Module end assert('Kernel#clone', '15.3.1.3.8') do @@ -95,8 +151,10 @@ assert('Kernel#clone', '15.3.1.3.8') do a.set(2) c = a.clone - a.get == 2 && b.get == 1 && c.get == 2 && - a.respond_to?(:test) == true && b.respond_to?(:test) == false && c.respond_to?(:test) == true + a.get == 2 and b.get == 1 and c.get == 2 && + a.respond_to?(:test) == true and + b.respond_to?(:test) == false and + c.respond_to?(:test) == true end assert('Kernel#dup', '15.3.1.3.9') do @@ -123,14 +181,53 @@ assert('Kernel#dup', '15.3.1.3.9') do a.set(2) c = a.dup - a.get == 2 && b.get == 1 && c.get == 2 && - a.respond_to?(:test) == true && b.respond_to?(:test) == false && c.respond_to?(:test) == false + a.get == 2 and b.get == 1 and c.get == 2 and + a.respond_to?(:test) == true and + b.respond_to?(:test) == false and + c.respond_to?(:test) == false +end + +assert('global_variables', '15.3.1.3.14') do + global_variables.class == Array end assert('Kernel#hash', '15.3.1.3.15') do hash == hash end +assert('inspect', '15.3.1.3.17') do + inspect.class == String +end + +assert('Kernel#instance_variables', '15.3.1.3.23') do + instance_variables.class == Array +end + +assert('Kernel#is_a?', '15.3.1.3.24') do + is_a?(Kernel) and not is_a?(Array) +end + +assert('Kernel#iterator?', '15.3.1.3.25') do + iterator? == false +end + +assert('Kernel#kind_of?', '15.3.1.3.26') do + kind_of?(Kernel) and not kind_of?(Array) +end + +assert('Kernel#lambda', '15.3.1.3.27') do + l = lambda do + true + end + + l.call and l.class == Proc +end + +# Not implemented yet +#assert('Kernel#local_variables', '15.3.1.3.28') do +# local_variables.class == Array +#end + assert('Kernel#loop', '15.3.1.3.29') do i = 0 @@ -150,6 +247,10 @@ assert('Kernel#nil?', '15.3.1.3.32') do nil.nil? == true end +assert('Kernel#object_id', '15.3.1.3.33') do + object_id.class == Fixnum +end + assert('Kernel#private_methods', '15.3.1.3.36') do private_methods.class == Array end @@ -162,6 +263,27 @@ assert('Kernel#public_methods', '15.3.1.3.38') do public_methods.class == Array end +assert('Kernel.raise', '15.3.1.3.40') do + e_list = [] + + begin + raise + rescue => e + e_list << e + end + + begin + raise RuntimeError.new + rescue => e + e_list << e + end + + # result without argument + e_list[0].class == RuntimeError and + # result with RuntimeError argument + e_list[1].class == RuntimeError +end + assert('Kernel#respond_to?', '15.3.1.3.43') do respond_to? :nil? end @@ -171,6 +293,7 @@ assert('Kernel#send', '15.3.1.3.44') do l = send(:lambda) do true end + l.call and l.class == Proc and # test with argument send(:respond_to?, :nil?) and -- cgit v1.2.3 From e8ad94da9338e1d0ed6acf709f611e6830b16621 Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Wed, 27 Jun 2012 03:12:37 +0800 Subject: Fix kernel test descriptions --- test/t/kernel.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/t/kernel.rb b/test/t/kernel.rb index d11e256a6..5aa7672d7 100644 --- a/test/t/kernel.rb +++ b/test/t/kernel.rb @@ -187,7 +187,7 @@ assert('Kernel#dup', '15.3.1.3.9') do c.respond_to?(:test) == false end -assert('global_variables', '15.3.1.3.14') do +assert('Kernel#global_variables', '15.3.1.3.14') do global_variables.class == Array end @@ -195,7 +195,7 @@ assert('Kernel#hash', '15.3.1.3.15') do hash == hash end -assert('inspect', '15.3.1.3.17') do +assert('Kernel#inspect', '15.3.1.3.17') do inspect.class == String end @@ -263,7 +263,7 @@ assert('Kernel#public_methods', '15.3.1.3.38') do public_methods.class == Array end -assert('Kernel.raise', '15.3.1.3.40') do +assert('Kernel#raise', '15.3.1.3.40') do e_list = [] begin -- cgit v1.2.3 From d534f26f16ba94c2182a44e4201352d1fb277af0 Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Wed, 27 Jun 2012 10:36:39 +0900 Subject: Use sizeof to get char array sizes. --- src/class.c | 4 ++-- src/codegen.c | 4 ++-- src/error.c | 6 +++--- src/time.c | 2 +- src/vm.c | 6 +++--- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/class.c b/src/class.c index 071d7aebe..599db9da5 100644 --- a/src/class.c +++ b/src/class.c @@ -1149,11 +1149,11 @@ mrb_mod_to_s(mrb_state *mrb, mrb_value klass) switch (mrb_type(klass)) { case MRB_TT_CLASS: - snprintf(buf, 256, "#", c); + snprintf(buf, sizeof(buf), "#", c); break; case MRB_TT_MODULE: - snprintf(buf, 256, "#", c); + snprintf(buf, sizeof(buf), "#", c); break; default: diff --git a/src/codegen.c b/src/codegen.c index cbf401a1f..fb0006625 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -1537,7 +1537,7 @@ codegen(codegen_scope *s, node *tree, int val) int len; int sym; - len = snprintf(buf, 3, "$%c", (int)(intptr_t)tree); + len = snprintf(buf, sizeof(buf), "$%c", (int)(intptr_t)tree); sym = new_sym(s, mrb_intern2(s->mrb, buf, len)); genop(s, MKOP_ABx(OP_GETGLOBAL, cursp(), sym)); push(); @@ -1550,7 +1550,7 @@ codegen(codegen_scope *s, node *tree, int val) int len; int sym; - len = snprintf(buf, 3, "$%d", (int)(intptr_t)tree); + len = snprintf(buf, sizeof(buf), "$%d", (int)(intptr_t)tree); sym = new_sym(s, mrb_intern2(s->mrb, buf, len)); genop(s, MKOP_ABx(OP_GETGLOBAL, cursp(), sym)); push(); diff --git a/src/error.c b/src/error.c index 1183d8643..e46e37cbb 100644 --- a/src/error.c +++ b/src/error.c @@ -180,7 +180,7 @@ mrb_raise(mrb_state *mrb, struct RClass *c, const char *fmt, ...) int n; va_start(args, fmt); - n = vsnprintf(buf, 256, fmt, args); + n = vsnprintf(buf, sizeof(buf), fmt, args); va_end(args); if (n < 0) { n = 0; @@ -197,7 +197,7 @@ mrb_name_error(mrb_state *mrb, mrb_sym id, const char *fmt, ...) int n; va_start(args, fmt); - n = vsnprintf(buf, 256, fmt, args); + n = vsnprintf(buf, sizeof(buf), fmt, args); va_end(args); if (n < 0) { n = 0; @@ -216,7 +216,7 @@ mrb_sprintf(mrb_state *mrb, const char *fmt, ...) int n; va_start(args, fmt); - n = vsnprintf(buf, 256, fmt, args); + n = vsnprintf(buf, sizeof(buf), fmt, args); va_end(args); if (n < 0) { n = 0; diff --git a/src/time.c b/src/time.c index 28cc3c1a3..3da824e82 100644 --- a/src/time.c +++ b/src/time.c @@ -435,7 +435,7 @@ mrb_time_asctime(mrb_state *mrb, mrb_value self) tm = mrb_get_datatype(mrb, self, &mrb_time_type); if (!tm) return mrb_nil_value(); d = &tm->datetime; - len = snprintf(buf, 256, "%s %s %02d %02d:%02d:%02d %s%d", + len = snprintf(buf, sizeof(buf), "%s %s %02d %02d:%02d:%02d %s%d", wday_names[d->tm_wday], mon_names[d->tm_mon], d->tm_mday, d->tm_hour, d->tm_min, d->tm_sec, tm->timezone == MRB_TIMEZONE_UTC ? "UTC " : "", diff --git a/src/vm.c b/src/vm.c index 136ece3bd..d69081c9c 100644 --- a/src/vm.c +++ b/src/vm.c @@ -295,7 +295,7 @@ localjump_error(mrb_state *mrb, const char *kind) int len; mrb_value exc; - len = snprintf(buf, 256, "unexpected %s", kind); + len = snprintf(buf, sizeof(buf), "unexpected %s", kind); exc = mrb_exc_new(mrb, E_LOCALJUMP_ERROR, buf, len); mrb->exc = (struct RObject*)mrb_object(exc); } @@ -308,12 +308,12 @@ argnum_error(mrb_state *mrb, int num) mrb_value exc; if (mrb->ci->mid) { - len = snprintf(buf, 256, "'%s': wrong number of arguments (%d for %d)", + len = snprintf(buf, sizeof(buf), "'%s': wrong number of arguments (%d for %d)", mrb_sym2name(mrb, mrb->ci->mid), mrb->ci->argc, num); } else { - len = snprintf(buf, 256, "wrong number of arguments (%d for %d)", + len = snprintf(buf, sizeof(buf), "wrong number of arguments (%d for %d)", mrb->ci->argc, num); } exc = mrb_exc_new(mrb, E_ARGUMENT_ERROR, buf, len); -- cgit v1.2.3 From 2042684b6ed163ca1ebfdaaffe5bd7e98b19abc6 Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Wed, 27 Jun 2012 13:01:22 +0900 Subject: Use sizeof to get char array sizes. --- src/parse.y | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/parse.y b/src/parse.y index 4c9f88889..1c2e13de9 100644 --- a/src/parse.y +++ b/src/parse.y @@ -2587,7 +2587,7 @@ var_ref : variable { char buf[16]; - snprintf(buf, 16, "%d", p->lineno); + snprintf(buf, sizeof(buf), "%d", p->lineno); $$ = new_int(p, buf, 10); } ; @@ -2955,7 +2955,7 @@ yyerror_i(parser_state *p, const char *fmt, int i) { char buf[256]; - snprintf(buf, 256, fmt, i); + snprintf(buf, sizeof(buf), fmt, i); yyerror(p, buf); } @@ -2995,7 +2995,7 @@ yywarning_s(parser_state *p, const char *fmt, const char *s) { char buf[256]; - snprintf(buf, 256, fmt, s); + snprintf(buf, sizeof(buf), fmt, s); yywarning(p, buf); } @@ -3702,7 +3702,7 @@ parser_yylex(parser_state *p) } if (c2) { char buf[256]; - snprintf(buf, 256, "invalid character syntax; use ?\\%c", c2); + snprintf(buf, sizeof(buf), "invalid character syntax; use ?\\%c", c2); yyerror(p, buf); } } -- cgit v1.2.3 From cd5476c6ae5843ff58a52ab4cdc6e38f7f33f64f Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Wed, 27 Jun 2012 13:19:32 +0900 Subject: Supress "warning: array subscript has type ‘char’" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/parse.y | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/parse.y b/src/parse.y index 4c9f88889..e48602ec0 100644 --- a/src/parse.y +++ b/src/parse.y @@ -3201,9 +3201,9 @@ toklen(parser_state *p) #define IS_LABEL_SUFFIX(n) (peek_n(p, ':',(n)) && !peek_n(p, ':', (n)+1)) static unsigned long -scan_oct(const char *start, int len, int *retlen) +scan_oct(const int *start, int len, int *retlen) { - const char *s = start; + const int *s = start; unsigned long retval = 0; while (len-- && *s >= '0' && *s <= '7') { @@ -3215,10 +3215,10 @@ scan_oct(const char *start, int len, int *retlen) } static unsigned long -scan_hex(const char *start, int len, int *retlen) +scan_hex(const int *start, int len, int *retlen) { static const char hexdigit[] = "0123456789abcdef0123456789ABCDEF"; - register const char *s = start; + register const int *s = start; register unsigned long retval = 0; char *tmp; @@ -3264,7 +3264,7 @@ read_escape(parser_state *p) case '0': case '1': case '2': case '3': /* octal constant */ case '4': case '5': case '6': case '7': { - char buf[3]; + int buf[3]; int i; for (i=0; i<3; i++) { @@ -3281,7 +3281,7 @@ read_escape(parser_state *p) case 'x': /* hex constant */ { - char buf[2]; + int buf[2]; int i; for (i=0; i<2; i++) { @@ -4542,7 +4542,7 @@ parser_yylex(parser_state *p) pushback(p, c); } } - if (result == 0 && isupper(tok(p)[0])) { + if (result == 0 && isupper((int)tok(p)[0])) { result = tCONSTANT; } else { -- cgit v1.2.3 From e841135cc11b8f935e8ab19cb6f1793883cda65c Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Wed, 27 Jun 2012 14:13:11 +0800 Subject: raise NotImplementedError in case of sprintf is missing --- mrblib/print.rb | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/mrblib/print.rb b/mrblib/print.rb index 7ec6d70ef..bf8e6d726 100644 --- a/mrblib/print.rb +++ b/mrblib/print.rb @@ -48,12 +48,14 @@ module Kernel args[0] end - if Kernel.respond_to?(:sprintf) - ## - # Invoke method +sprintf+ and pass +*args+ to it. - # Pass return value to *print* of STDOUT. - def printf(*args) + ## + # Invoke method +sprintf+ and pass +*args+ to it. + # Pass return value to *print* of STDOUT. + def printf(*args) + if Kernel.respond_to?(:sprintf) __printstr__(sprintf(*args)) + else + raise NotImplementedError.new('sprintf not available') end end end -- cgit v1.2.3 From 6f9ed1c5b21ba6ef2230e15bd3b39535f2f7bde9 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 27 Jun 2012 15:14:56 +0900 Subject: use return value from sprintf/snprintf --- src/class.c | 10 +++++----- src/re.c | 4 ++-- src/sprintf.c | 22 ++++++++++------------ src/string.c | 4 ++-- 4 files changed, 19 insertions(+), 21 deletions(-) diff --git a/src/class.c b/src/class.c index 071d7aebe..02fe9512a 100644 --- a/src/class.c +++ b/src/class.c @@ -1141,25 +1141,25 @@ mrb_mod_to_s(mrb_state *mrb, mrb_value klass) } else { struct RClass *c = mrb_class_ptr(klass); - const char *cn = mrb_class_name(mrb, c); + const char *cn = mrb_class_name(mrb, c); if (!cn) { char buf[256]; - + int n = 0; switch (mrb_type(klass)) { case MRB_TT_CLASS: - snprintf(buf, 256, "#", c); + n = snprintf(buf, 256, "#", c); break; case MRB_TT_MODULE: - snprintf(buf, 256, "#", c); + n = snprintf(buf, 256, "#", c); break; default: break; } - return mrb_str_dup(mrb, mrb_str_new_cstr(mrb, buf)); + return mrb_str_dup(mrb, mrb_str_new(mrb, buf, n)); } else { return mrb_str_dup(mrb, mrb_str_new_cstr(mrb, cn)); diff --git a/src/re.c b/src/re.c index a7552de11..c7b27eac2 100644 --- a/src/re.c +++ b/src/re.c @@ -1930,8 +1930,8 @@ mrb_match_inspect(mrb_state *mrb, mrb_value match) if (names[i].name) mrb_str_buf_cat(mrb, str, (const char*)names[i].name, names[i].len); else { - sprintf(buf, "%d", i); - mrb_str_buf_cat(mrb, str, (const char*)buf, strlen(buf)); + int n = sprintf(buf, "%d", i); + mrb_str_buf_cat(mrb, str, (const char*)buf, n); } mrb_str_buf_cat(mrb, str, ":", sizeof(":")); } diff --git a/src/sprintf.c b/src/sprintf.c index 68addef89..d6104ad48 100644 --- a/src/sprintf.c +++ b/src/sprintf.c @@ -496,7 +496,7 @@ mrb_str_format(mrb_state *mrb, int argc, const mrb_value *argv, mrb_value fmt) char *buf; long blen, bsiz; mrb_value result; - + int n; int width, prec, flags = FNONE; int nextarg = 1; int posarg = 0; @@ -533,7 +533,6 @@ mrb_str_format(mrb_state *mrb, int argc, const mrb_value *argv, mrb_value fmt) for (; p < end; p++) { const char *t; - int n; mrb_sym id = 0; for (t = p; t < end && *t != '%'; t++) ; @@ -669,7 +668,6 @@ retry: mrb_value val = GETARG(); mrb_value tmp; unsigned int c; - int n; tmp = mrb_check_string_type(mrb, val); if (!mrb_nil_p(tmp)) { @@ -984,6 +982,7 @@ bin_retry: fval = mrb_float(mrb_Float(mrb, val)); if (isnan(fval) || isinf(fval)) { const char *expr; + const int elen = 3; if (isnan(fval)) { expr = "NaN"; @@ -991,14 +990,14 @@ bin_retry: else { expr = "Inf"; } - need = (int)strlen(expr); + need = elen; if ((!isnan(fval) && fval < 0.0) || (flags & FPLUS)) need++; if ((flags & FWIDTH) && need < width) need = width; CHECK(need + 1); - snprintf(&buf[blen], need + 1, "%*s", need, ""); + n = snprintf(&buf[blen], need + 1, "%*s", need, ""); if (flags & FMINUS) { if (!isnan(fval) && fval < 0.0) buf[blen++] = '-'; @@ -1006,17 +1005,16 @@ bin_retry: buf[blen++] = '+'; else if (flags & FSPACE) blen++; - memcpy(&buf[blen], expr, strlen(expr)); + memcpy(&buf[blen], expr, elen); } else { if (!isnan(fval) && fval < 0.0) - buf[blen + need - strlen(expr) - 1] = '-'; + buf[blen + need - elen - 1] = '-'; else if (flags & FPLUS) - buf[blen + need - strlen(expr) - 1] = '+'; + buf[blen + need - elen - 1] = '+'; else if ((flags & FSPACE) && need > width) blen++; - memcpy(&buf[blen + need - strlen(expr)], expr, - strlen(expr)); + memcpy(&buf[blen + need - elen], expr, elen); } blen += strlen(&buf[blen]); break; @@ -1036,8 +1034,8 @@ bin_retry: need += 20; CHECK(need); - snprintf(&buf[blen], need, fbuf, fval); - blen += strlen(&buf[blen]); + n = snprintf(&buf[blen], need, fbuf, fval); + blen += n; } break; } diff --git a/src/string.c b/src/string.c index c74dcedde..f01c08bce 100644 --- a/src/string.c +++ b/src/string.c @@ -2983,8 +2983,8 @@ mrb_str_inspect(mrb_state *mrb, mrb_value str) continue; } else { - sprintf(buf, "\\%03o", c & 0377); - mrb_str_buf_cat(mrb, result, buf, strlen(buf)); + int n = sprintf(buf, "\\%03o", c & 0377); + mrb_str_buf_cat(mrb, result, buf, n); continue; } } -- cgit v1.2.3 From 0a88499f32f38b5608d50da59fc7d22132767c0d Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 27 Jun 2012 15:19:40 +0900 Subject: sizeof("a") is bigger by one than strlen("a") --- src/hash.c | 4 ++-- src/re.c | 14 +++++++------- src/string.c | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/hash.c b/src/hash.c index a87ca97d4..888a1917e 100644 --- a/src/hash.c +++ b/src/hash.c @@ -904,14 +904,14 @@ inspect_hash(mrb_state *mrb, mrb_value hash, int recur) str2 = mrb_inspect(mrb, kh_key(h,k)); mrb_str_append(mrb, str, str2); - mrb_str_buf_cat(mrb, str, "=>", sizeof("=>")); + mrb_str_buf_cat(mrb, str, "=>", 2); str2 = mrb_inspect(mrb, kh_value(h,k)); mrb_str_append(mrb, str, str2); mrb_gc_arena_restore(mrb, ai); } } - mrb_str_buf_cat(mrb, str, "}", sizeof("}")); + mrb_str_buf_cat(mrb, str, "}", 1); return str; } diff --git a/src/re.c b/src/re.c index c7b27eac2..3639a41c6 100644 --- a/src/re.c +++ b/src/re.c @@ -364,7 +364,7 @@ mrb_reg_desc(mrb_state *mrb, const char *s, long len, mrb_value re) if (*option_to_str(opts, RREGEXP(re)->ptr->options)) mrb_str_buf_cat(mrb, str, opts, strlen(opts));//mrb_str_buf_cat2(str, opts); if (RBASIC(re)->flags & REG_ENCODING_NONE) - mrb_str_buf_cat(mrb, str, "n", sizeof("n")); + mrb_str_buf_cat(mrb, str, "n", 1); } return str; @@ -1797,9 +1797,9 @@ again: mrb_str_buf_cat(mrb, str, optbuf, strlen(optbuf)); } - mrb_str_buf_cat(mrb, str, ":", sizeof(":")); + mrb_str_buf_cat(mrb, str, ":", 1); mrb_reg_expr_str(mrb, str, (char*)ptr, len); - mrb_str_buf_cat(mrb, str, ")", sizeof(")")); + mrb_str_buf_cat(mrb, str, ")", 1); return str; } @@ -1925,7 +1925,7 @@ mrb_match_inspect(mrb_state *mrb, mrb_value match) for (i = 0; i < num_regs; i++) { char buf[sizeof(num_regs)*3+1]; mrb_value v; - mrb_str_buf_cat(mrb, str, " ", sizeof(" ")); + mrb_str_buf_cat(mrb, str, " ", 1); if (0 < i) { if (names[i].name) mrb_str_buf_cat(mrb, str, (const char*)names[i].name, names[i].len); @@ -1933,15 +1933,15 @@ mrb_match_inspect(mrb_state *mrb, mrb_value match) int n = sprintf(buf, "%d", i); mrb_str_buf_cat(mrb, str, (const char*)buf, n); } - mrb_str_buf_cat(mrb, str, ":", sizeof(":")); + mrb_str_buf_cat(mrb, str, ":", 1); } v = mrb_reg_nth_match(mrb, i, match); if (mrb_nil_p(v)) - mrb_str_buf_cat(mrb, str, "nil", sizeof("nil")); + mrb_str_buf_cat(mrb, str, "nil", 3); else mrb_str_buf_append(mrb, str, mrb_str_inspect(mrb, v)); } - mrb_str_buf_cat(mrb, str, ">", sizeof(">")); + mrb_str_buf_cat(mrb, str, ">", 1); return str; } diff --git a/src/string.c b/src/string.c index f01c08bce..8e61e6bb9 100644 --- a/src/string.c +++ b/src/string.c @@ -2988,7 +2988,7 @@ mrb_str_inspect(mrb_state *mrb, mrb_value str) continue; } } - mrb_str_buf_cat(mrb, result, "\"", sizeof("\"")); + mrb_str_buf_cat(mrb, result, "\"", 1); return result; } -- cgit v1.2.3 From 7f9b91517bdad2848659fd4bcaee71545e0562ea Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Wed, 27 Jun 2012 14:20:19 +0800 Subject: raise NoImplementedError also for sprintf in case it isn't available --- mrblib/print.rb | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/mrblib/print.rb b/mrblib/print.rb index bf8e6d726..3ebd77ee6 100644 --- a/mrblib/print.rb +++ b/mrblib/print.rb @@ -50,7 +50,7 @@ module Kernel ## # Invoke method +sprintf+ and pass +*args+ to it. - # Pass return value to *print* of STDOUT. + # Pass return value to +print+ of STDOUT. def printf(*args) if Kernel.respond_to?(:sprintf) __printstr__(sprintf(*args)) @@ -58,4 +58,14 @@ module Kernel raise NotImplementedError.new('sprintf not available') end end + + ## + # +sprintf+ is defined in +src/sprintf.c+ + # This stub method is only to inform the user + # that +sprintf+ isn't implemented. + unless Kernel.respond_to?(:sprintf) + def sprintf(*args) + raise NotImplementedError.new('sprintf not available') + end + end end -- cgit v1.2.3 From e9d56f4ccfcd71fa34be36f9457fd60e897036bd Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 28 Jun 2012 14:37:32 +0900 Subject: do not undef config macro MRB_USE_FLOAT --- include/mrbconf.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/mrbconf.h b/include/mrbconf.h index f496c53d9..4ed481e0b 100644 --- a/include/mrbconf.h +++ b/include/mrbconf.h @@ -11,7 +11,7 @@ /* configuration options: */ /* add -DMRB_USE_FLOAT to use float instead of double for floating point numbers */ -#undef MRB_USE_FLOAT +//#define MRB_USE_FLOAT /* -DDISABLE_XXXX to change to drop the feature */ #define DISABLE_REGEXP /* regular expression classes */ -- cgit v1.2.3 From 04d24b3168f1b30ce52f3e6e0cdd3e5ff9ff24c4 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 28 Jun 2012 15:07:11 +0900 Subject: always define POOL_ALIGNMENT (default 4); reduce strength as well; close #333 --- src/pool.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/pool.c b/src/pool.c index 3cbb2b163..612bbe647 100644 --- a/src/pool.c +++ b/src/pool.c @@ -8,6 +8,18 @@ #include #include +/* configuration section */ +/* allcated memory address should be multiple of POOL_ALLOC_ALIGN */ +/* or undef it if alignment does not matter */ +#ifndef POOL_ALIGNMENT +#define POOL_ALIGNMENT 4 +#endif +/* page size of memory pool */ +#ifndef POOL_PAGE_SIZE +#define POOL_PAGE_SIZE 16000 +#endif +/* end of configuration section */ + struct mrb_pool_page { struct mrb_pool_page *next; size_t offset; @@ -29,10 +41,8 @@ struct mrb_pool { #define mrb_free(m,p) free(p) #endif -#define POOL_PAGE_SIZE 16000 - -#ifdef ALLOC_ALIGN -# define ALIGN_PADDING(x) ((x % ALLOC_ALIGN) ? ALLOC_ALIGN - (x % ALLOC_ALIGN) : 0) +#ifdef POOL_ALIGNMENT +# define ALIGN_PADDING(x) ((-x) & (POOL_ALIGNMENT - 1)) #else # define ALIGN_PADDING(x) (0) #endif -- cgit v1.2.3 From 4fd932548ef4aa92a089a6a7dc412cd09eb2284e Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 28 Jun 2012 23:28:54 +0900 Subject: allow :"text" form; close #321 --- src/parse.y | 83 +++++++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 56 insertions(+), 27 deletions(-) diff --git a/src/parse.y b/src/parse.y index d243941e8..069a97412 100644 --- a/src/parse.y +++ b/src/parse.y @@ -518,6 +518,22 @@ new_sym(parser_state *p, mrb_sym sym) return cons((node*)NODE_SYM, (node*)sym); } +static mrb_sym +new_strsym(parser_state *p, node* str) +{ + const char *s = (const char*)str->cdr->car; + size_t len = (size_t)str->cdr->cdr; + + return mrb_intern2(p->mrb, s, len); +} + +// (:sym . a) +static node* +new_dsym(parser_state *p, node *a) +{ + return cons((node*)NODE_DSYM, a); +} + // (:lvar . a) static node* new_lvar(parser_state *p, mrb_sym sym) @@ -890,7 +906,7 @@ var_reference(parser_state *p, node *lhs) %token tREGEXP_END %type singleton string string_interp regexp -%type literal numeric cpath +%type literal numeric cpath symbol %type top_compstmt top_stmts top_stmt %type bodystmt compstmt stmts stmt expr arg primary command command_call method_call %type expr_value arg_value primary_value @@ -906,8 +922,8 @@ var_reference(parser_state *p, node *lhs) %type bv_decls opt_bv_decl bvar f_larglist lambda_body %type brace_block cmd_brace_block do_block lhs none fitem f_bad_arg %type mlhs mlhs_list mlhs_post mlhs_basic mlhs_item mlhs_node mlhs_inner -%type fsym sym symbol operation operation2 operation3 -%type cname fname op f_rest_arg f_block_arg opt_f_block_arg f_norm_arg +%type fsym sym basic_symbol operation operation2 operation3 +%type cname fname op f_rest_arg f_block_arg opt_f_block_arg f_norm_arg %token tUPLUS /* unary+ */ %token tUMINUS /* unary- */ @@ -1474,7 +1490,7 @@ fname : tIDENTIFIER ; fsym : fname - | symbol + | basic_symbol ; fitem : fsym @@ -2458,9 +2474,6 @@ opt_ensure : keyword_ensure compstmt literal : numeric | symbol - { - $$ = new_sym(p, $1); - } ; string : tCHAR @@ -2503,7 +2516,18 @@ string_interp : tSTRING_PART regexp : tREGEXP ; -symbol : tSYMBEG sym +symbol : basic_symbol + { + $$ = new_sym(p, $1); + } + | tSYMBEG tSTRING_BEG string_interp tSTRING + { + p->lstate = EXPR_END; + $$ = new_dsym(p, push($3, $4)); + } + ; + +basic_symbol : tSYMBEG sym { p->lstate = EXPR_END; $$ = $2; @@ -2514,6 +2538,14 @@ sym : fname | tIVAR | tGVAR | tCVAR + | tSTRING + { + $$ = new_strsym(p, $1); + } + | tSTRING_BEG tSTRING + { + $$ = new_strsym(p, $2); + } ; numeric : tINTEGER @@ -3392,8 +3424,8 @@ parse_string(parser_state *p, int term) return tSTRING; } -static int -parse_qstring(parser_state *p, int term) +static node* +qstring_node(parser_state *p, int term) { int c; @@ -3429,9 +3461,20 @@ parse_qstring(parser_state *p, int term) } tokfix(p); - yylval.nd = new_str(p, tok(p), toklen(p)); p->lstate = EXPR_END; - return tSTRING; + return new_str(p, tok(p), toklen(p)); +} + +static int +parse_qstring(parser_state *p, int term) +{ + node *nd = qstring_node(p, term); + + if (nd) { + yylval.nd = new_str(p, tok(p), toklen(p)); + return tSTRING; + } + return 0; } static int @@ -4123,21 +4166,7 @@ parser_yylex(parser_state *p) p->lstate = EXPR_BEG; return ':'; } - switch (c) { - case '\'': -#if 0 - p->lex_strterm = new_strterm(p, str_ssym, c, 0); -#endif - break; - case '"': -#if 0 - p->lex_strterm = new_strterm(p, str_dsym, c, 0); -#endif - break; - default: - pushback(p, c); - break; - } + pushback(p, c); p->lstate = EXPR_FNAME; return tSYMBEG; -- cgit v1.2.3 From 4a98d5c8fd56119a5e30f8e371fd4aac1866895d Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 28 Jun 2012 23:35:17 +0900 Subject: allow string interpolation in symbols like :"a=#{15}" --- src/codegen.c | 9 +++++++++ src/parse.y | 14 +++++++------- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/codegen.c b/src/codegen.c index fb0006625..2654fcbe3 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -1711,6 +1711,15 @@ codegen(codegen_scope *s, node *tree, int val) } break; + case NODE_DSYM: + codegen(s, tree, val); + if (val) { + pop(); + genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern(s->mrb, "intern")), 0)); + push(); + } + break; + case NODE_SELF: if (val) { genop(s, MKOP_A(OP_LOADSELF, cursp())); diff --git a/src/parse.y b/src/parse.y index 069a97412..af8b93cfa 100644 --- a/src/parse.y +++ b/src/parse.y @@ -527,13 +527,6 @@ new_strsym(parser_state *p, node* str) return mrb_intern2(p->mrb, s, len); } -// (:sym . a) -static node* -new_dsym(parser_state *p, node *a) -{ - return cons((node*)NODE_DSYM, a); -} - // (:lvar . a) static node* new_lvar(parser_state *p, mrb_sym sym) @@ -705,6 +698,13 @@ new_dstr(parser_state *p, node *a) return cons((node*)NODE_DSTR, a); } +// (:dsym . a) +static node* +new_dsym(parser_state *p, node *a) +{ + return cons((node*)NODE_DSYM, new_dstr(p, a)); +} + // (:backref . n) static node* new_back_ref(parser_state *p, int n) -- cgit v1.2.3 From 2c8886c80df5505bc0f80bf809b1847d4f82b2d7 Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Fri, 29 Jun 2012 22:59:53 +0800 Subject: Make strucdata optional if ENABLE_STRUCT is activitated --- src/gc.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/gc.c b/src/gc.c index 93085db61..22175a958 100644 --- a/src/gc.c +++ b/src/gc.c @@ -90,7 +90,9 @@ typedef struct { struct RArray array; struct RHash hash; struct RRange range; +#ifdef ENABLE_STRUCT struct RStruct structdata; +#endif struct RProc procdata; #ifdef ENABLE_REGEXP struct RMatch match; -- cgit v1.2.3 From 866f797125093cca9563c753716e3cede1cc5a3f Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Thu, 28 Jun 2012 01:01:56 +0900 Subject: Fix str_replace in string.c - Increment refcnt of shared string. - Free buffer before replacing. - Clear MRB_STR_SHARED after decref is called. - Fix target of aux.capa. --- src/string.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/string.c b/src/string.c index 8e61e6bb9..02f71ef96 100644 --- a/src/string.c +++ b/src/string.c @@ -1549,10 +1549,17 @@ str_replace(mrb_state *mrb, struct RString *s1, struct RString *s2) { if (s2->flags & MRB_STR_SHARED) { L_SHARE: + if (s1->flags & MRB_STR_SHARED){ + mrb_str_decref(mrb, s1->aux.shared); + } + else { + mrb_free(mrb, s1->ptr); + } s1->ptr = s2->ptr; s1->len = s2->len; s1->aux.shared = s2->aux.shared; s1->flags |= MRB_STR_SHARED; + s1->aux.shared->refcnt++; } else if (s2->len > STR_REPLACE_SHARED_MIN) { str_make_shared(mrb, s2); @@ -1561,6 +1568,7 @@ str_replace(mrb_state *mrb, struct RString *s1, struct RString *s2) else { if (s1->flags & MRB_STR_SHARED) { mrb_str_decref(mrb, s1->aux.shared); + s1->flags &= ~MRB_STR_SHARED; s1->ptr = mrb_malloc(mrb, s2->len+1); } else { @@ -1569,7 +1577,7 @@ str_replace(mrb_state *mrb, struct RString *s1, struct RString *s2) memcpy(s1->ptr, s2->ptr, s2->len); s1->ptr[s2->len] = 0; s1->len = s2->len; - s2->aux.capa = s2->len; + s1->aux.capa = s2->len; } return mrb_obj_value(s1); } -- cgit v1.2.3 From 780f54e1eb0ef48ccda95f5275e73aae035cc337 Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Tue, 26 Jun 2012 01:20:05 +0900 Subject: Free iv of MRB_TT_DATA instance. --- src/gc.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/gc.c b/src/gc.c index 22175a958..2663e9780 100644 --- a/src/gc.c +++ b/src/gc.c @@ -528,6 +528,7 @@ obj_free(mrb_state *mrb, struct RBasic *obj) if (d->type->dfree) { d->type->dfree(mrb, d->data); } + mrb_gc_free_iv(mrb, (struct RObject*)obj); } break; @@ -607,6 +608,7 @@ gc_gray_mark(mrb_state *mrb, struct RBasic *obj) break; case MRB_TT_OBJECT: + case MRB_TT_DATA: children += mrb_gc_mark_iv_size(mrb, (struct RObject*)obj); break; -- cgit v1.2.3 From 8746cb2ac12ae13a489830be541f6554bdba7516 Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Sun, 1 Jul 2012 18:34:22 +0900 Subject: Initialize mt of module with khash. --- src/class.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/class.c b/src/class.c index b53c18590..0e7696972 100644 --- a/src/class.c +++ b/src/class.c @@ -1065,6 +1065,7 @@ struct RClass * mrb_module_new(mrb_state *mrb) { struct RClass *m = (struct RClass*)mrb_obj_alloc(mrb, MRB_TT_MODULE, mrb->module_class); + m->mt = kh_init(mt, mrb); return m; } -- cgit v1.2.3 From 3be4e91376804c1815e38d4a591ab152fba9d3b3 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 3 Jul 2012 14:27:34 +0900 Subject: remove size_t from parser --- include/mruby/compile.h | 4 ++-- src/parse.y | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/include/mruby/compile.h b/include/mruby/compile.h index b41eed57e..e549a2f5c 100644 --- a/include/mruby/compile.h +++ b/include/mruby/compile.h @@ -91,12 +91,12 @@ void mrb_parser_parse(struct mrb_parser_state*); /* utility functions */ struct mrb_parser_state* mrb_parse_file(mrb_state*,FILE*); struct mrb_parser_state* mrb_parse_string(mrb_state*,const char*); -struct mrb_parser_state* mrb_parse_nstring(mrb_state*,const char*,size_t); +struct mrb_parser_state* mrb_parse_nstring(mrb_state*,const char*,int); int mrb_generate_code(mrb_state*, mrb_ast_node*); int mrb_compile_file(mrb_state*,FILE*); int mrb_compile_string(mrb_state*,char*); -int mrb_compile_nstring(mrb_state*,char*,size_t); +int mrb_compile_nstring(mrb_state*,char*,int); #if defined(__cplusplus) } /* extern "C" { */ diff --git a/src/parse.y b/src/parse.y index af8b93cfa..8a85b6fc6 100644 --- a/src/parse.y +++ b/src/parse.y @@ -686,7 +686,7 @@ new_float(parser_state *p, const char *s) // (:str . (s . len)) static node* -new_str(parser_state *p, const char *s, size_t len) +new_str(parser_state *p, const char *s, int len) { return cons((node*)NODE_STR, cons((node*)strndup(s, len), (node*)len)); } @@ -2961,7 +2961,7 @@ static void yyerror(parser_state *p, const char *s) { char* c; - size_t n; + int n; if (! p->capture_errors) { if (p->filename) { @@ -2995,7 +2995,7 @@ static void yywarn(parser_state *p, const char *s) { char* c; - size_t n; + int n; if (! p->capture_errors) { if (p->filename) { @@ -4774,7 +4774,7 @@ mrb_parse_file(mrb_state *mrb, FILE *f) } parser_state* -mrb_parse_nstring(mrb_state *mrb, const char *s, size_t len) +mrb_parse_nstring(mrb_state *mrb, const char *s, int len) { parser_state *p; @@ -4812,7 +4812,7 @@ mrb_compile_file(mrb_state * mrb, FILE *f) } int -mrb_compile_nstring(mrb_state *mrb, char *s, size_t len) +mrb_compile_nstring(mrb_state *mrb, char *s, int len) { parser_state *p; int n; -- cgit v1.2.3 From 97b1c57600b243e086114179cd61e3503beaa1e6 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 3 Jul 2012 14:28:19 +0900 Subject: constify parser input strings --- include/mruby/compile.h | 4 ++-- src/parse.y | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/mruby/compile.h b/include/mruby/compile.h index e549a2f5c..fa21d81a6 100644 --- a/include/mruby/compile.h +++ b/include/mruby/compile.h @@ -95,8 +95,8 @@ struct mrb_parser_state* mrb_parse_nstring(mrb_state*,const char*,int); int mrb_generate_code(mrb_state*, mrb_ast_node*); int mrb_compile_file(mrb_state*,FILE*); -int mrb_compile_string(mrb_state*,char*); -int mrb_compile_nstring(mrb_state*,char*,int); +int mrb_compile_string(mrb_state*,const char*); +int mrb_compile_nstring(mrb_state*,const char*,int); #if defined(__cplusplus) } /* extern "C" { */ diff --git a/src/parse.y b/src/parse.y index 8a85b6fc6..ae53d2cf7 100644 --- a/src/parse.y +++ b/src/parse.y @@ -4812,7 +4812,7 @@ mrb_compile_file(mrb_state * mrb, FILE *f) } int -mrb_compile_nstring(mrb_state *mrb, char *s, int len) +mrb_compile_nstring(mrb_state *mrb, const char *s, int len) { parser_state *p; int n; @@ -4828,7 +4828,7 @@ mrb_compile_nstring(mrb_state *mrb, char *s, int len) } int -mrb_compile_string(mrb_state *mrb, char *s) +mrb_compile_string(mrb_state *mrb, const char *s) { return mrb_compile_nstring(mrb, s, strlen(s)); } -- cgit v1.2.3 From ce49d90dc82bc165880a800ae95dc327b729143f Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 3 Jul 2012 15:26:11 +0900 Subject: modify compiler API; replace mrb_compie_xxx with mrb_load_xxx() that combines compilatoin and execution --- include/mruby/compile.h | 7 ++++--- src/parse.y | 56 ++++++++++++++++++++++++++----------------------- 2 files changed, 34 insertions(+), 29 deletions(-) diff --git a/include/mruby/compile.h b/include/mruby/compile.h index fa21d81a6..2ea141da8 100644 --- a/include/mruby/compile.h +++ b/include/mruby/compile.h @@ -94,9 +94,10 @@ struct mrb_parser_state* mrb_parse_string(mrb_state*,const char*); struct mrb_parser_state* mrb_parse_nstring(mrb_state*,const char*,int); int mrb_generate_code(mrb_state*, mrb_ast_node*); -int mrb_compile_file(mrb_state*,FILE*); -int mrb_compile_string(mrb_state*,const char*); -int mrb_compile_nstring(mrb_state*,const char*,int); +/* program load functions */ +mrb_value mrb_load_file(mrb_state*,FILE*); +mrb_value mrb_load_string(mrb_state *mrb, const char *path); +mrb_value mrb_load_nstring(mrb_state *mrb, const char *path, int len); #if defined(__cplusplus) } /* extern "C" { */ diff --git a/src/parse.y b/src/parse.y index ae53d2cf7..7f40534b9 100644 --- a/src/parse.y +++ b/src/parse.y @@ -20,6 +20,7 @@ #include "mruby.h" #include "mruby/compile.h" +#include "mruby/proc.h" #include "node.h" #include "st.h" @@ -4793,46 +4794,49 @@ mrb_parse_string(mrb_state *mrb, const char *s) return mrb_parse_nstring(mrb, s, strlen(s)); } -void parser_dump(mrb_state *mrb, node *tree, int offset); - -int -mrb_compile_file(mrb_state * mrb, FILE *f) +static mrb_value +load_exec(mrb_state *mrb, parser_state *p) { - parser_state *p; int n; - p = mrb_parse_file(mrb, f); - if (!p) return -1; - if (!p->tree) return -1; - if (p->nerr) return -1; + if (!p || !p->tree || p->nerr) { + char buf[256]; + + n = snprintf(buf, sizeof(buf), "line %d: %s\n", + p->error_buffer[0].lineno, p->error_buffer[0].message); + mrb_pool_close(p->pool); + mrb->exc = (struct RObject*)mrb_object(mrb_exc_new(mrb, E_SYNTAX_ERROR, buf, n)); + return mrb_nil_value(); + } n = mrb_generate_code(mrb, p->tree); mrb_pool_close(p->pool); - - return n; + if (n < 0) { + mrb->exc = (struct RObject*)mrb_object(mrb_exc_new(mrb, E_SCRIPT_ERROR, "codegen error", 13)); + return mrb_nil_value(); + } + return mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); } -int -mrb_compile_nstring(mrb_state *mrb, const char *s, int len) +mrb_value +mrb_load_file(mrb_state *mrb, FILE *f) { - parser_state *p; - int n; - - p = mrb_parse_nstring(mrb, s, len); - if (!p) return -1; - if (!p->tree) return -1; - if (p->nerr) return -1; - n = mrb_generate_code(mrb, p->tree); - mrb_pool_close(p->pool); + return load_exec(mrb, mrb_parse_file(mrb, f)); +} - return n; +mrb_value +mrb_load_nstring(mrb_state *mrb, const char *s, int len) +{ + return load_exec(mrb, mrb_parse_nstring(mrb, s, len)); } -int -mrb_compile_string(mrb_state *mrb, const char *s) +mrb_value +mrb_load_string(mrb_state *mrb, const char *s) { - return mrb_compile_nstring(mrb, s, strlen(s)); + return load_exec(mrb, mrb_parse_nstring(mrb, s, strlen(s))); } +void parser_dump(mrb_state *mrb, node *tree, int offset); + static void dump_prefix(int offset) { -- cgit v1.2.3 From 65096c4c1bd1bfb6f547808fc01ab6ea223d9dc6 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 3 Jul 2012 20:59:07 +0900 Subject: add context to parser, that would hold local variable info, filename, and line number. mrbc_context argument has been added to mrb_parse_xxx() functions. Normally, you just to need to add NULL (or 0) to the last argument of the above functions. --- include/mruby/compile.h | 37 +++++++++++++++++------- src/parse.y | 77 +++++++++++++++++++++++++++++++++++++------------ test/driver.c | 12 ++------ tools/mrbc/mrbc.c | 2 +- tools/mruby/mruby.c | 15 +++++----- 5 files changed, 95 insertions(+), 48 deletions(-) diff --git a/include/mruby/compile.h b/include/mruby/compile.h index 2ea141da8..401f52854 100644 --- a/include/mruby/compile.h +++ b/include/mruby/compile.h @@ -14,13 +14,26 @@ extern "C" { #include "mruby.h" #include #include +#include + +/* load context */ +typedef struct mrbc_context { + mrb_sym *syms; + int slen; + char *filename; + int lineno; +} mrbc_context; + +mrbc_context* mrbc_context_new(mrb_state *mrb); +void mrbc_context_free(mrb_state *mrb, mrbc_context *cxt); +const char *mrbc_filename(mrb_state *mrb, mrbc_context *c, const char *s); +/* AST node structure */ typedef struct mrb_ast_node { struct mrb_ast_node *car, *cdr; } mrb_ast_node; -#include - +/* lexer states */ enum mrb_lex_state_enum { EXPR_BEG, /* ignore newline, +/- is a sign. */ EXPR_END, /* newline significant, +/- is an operator. */ @@ -36,21 +49,23 @@ enum mrb_lex_state_enum { EXPR_MAX_STATE }; +/* saved error message */ struct mrb_parser_message { int lineno; int column; char* message; }; +/* parser structure */ struct mrb_parser_state { mrb_state *mrb; struct mrb_pool *pool; mrb_ast_node *cells; const char *s, *send; FILE *f; + char *filename; int lineno; int column; - const char *filename; enum mrb_lex_state_enum lstate; int sterm; @@ -59,6 +74,8 @@ struct mrb_parser_state { unsigned int cmdarg_stack; int paren_nest; int lpar_beg; + int in_def, in_single, cmd_start; + mrb_ast_node *locals; mrb_ast_node *pb; char buf[1024]; @@ -66,9 +83,6 @@ struct mrb_parser_state { mrb_ast_node *heredoc; - int in_def, in_single, cmd_start; - mrb_ast_node *locals; - void *ylval; int nerr; @@ -82,22 +96,23 @@ struct mrb_parser_state { jmp_buf jmp; }; -/* parser structure */ struct mrb_parser_state* mrb_parser_new(mrb_state*); const char *mrb_parser_filename(struct mrb_parser_state*, const char*); -int mrb_parser_lineno(struct mrb_parser_state*, int); void mrb_parser_parse(struct mrb_parser_state*); /* utility functions */ -struct mrb_parser_state* mrb_parse_file(mrb_state*,FILE*); -struct mrb_parser_state* mrb_parse_string(mrb_state*,const char*); -struct mrb_parser_state* mrb_parse_nstring(mrb_state*,const char*,int); +struct mrb_parser_state* mrb_parse_file(mrb_state*,FILE*,mrbc_context*); +struct mrb_parser_state* mrb_parse_string(mrb_state*,const char*,mrbc_context*); +struct mrb_parser_state* mrb_parse_nstring(mrb_state*,const char*,int,mrbc_context*); int mrb_generate_code(mrb_state*, mrb_ast_node*); /* program load functions */ mrb_value mrb_load_file(mrb_state*,FILE*); mrb_value mrb_load_string(mrb_state *mrb, const char *path); mrb_value mrb_load_nstring(mrb_state *mrb, const char *path, int len); +mrb_value mrb_load_file_cxt(mrb_state*,FILE*, mrbc_context *cxt); +mrb_value mrb_load_string_cxt(mrb_state *mrb, const char *path, mrbc_context *cxt); +mrb_value mrb_load_nstring_cxt(mrb_state *mrb, const char *path, int len, mrbc_context *cxt); #if defined(__cplusplus) } /* extern "C" { */ diff --git a/src/parse.y b/src/parse.y index 7f40534b9..78d7d7a7e 100644 --- a/src/parse.y +++ b/src/parse.y @@ -4730,7 +4730,6 @@ mrb_parser_new(mrb_state *mrb) p->in_def = p->in_single = FALSE; p->capture_errors = 0; - p->lineno = 1; p->column = 0; #if defined(PARSER_TEST) || defined(PARSER_DEBUG) @@ -4740,33 +4739,56 @@ mrb_parser_new(mrb_state *mrb) return p; } +mrbc_context* +mrbc_context_new(mrb_state *mrb) +{ + mrbc_context *c; + + c = mrb_malloc(mrb, sizeof(mrbc_context)); + memset(c, 0, sizeof(mrbc_context)); + return c; +} + +void +mrbc_context_free(mrb_state *mrb, mrbc_context *cxt) +{ + mrb_free(mrb, cxt->syms); + mrb_free(mrb, cxt->filename); + mrb_free(mrb, cxt); +} + const char* -mrb_parser_filename(parser_state *p, const char *s) +mrbc_filename(mrb_state *mrb, mrbc_context *c, const char *s) { if (s) { - p->filename = strdup(s); + int len = strlen(s); + char *p = mrb_malloc(mrb, len); + + memcpy(p, s, len); + if (c->filename) mrb_free(mrb, c->filename); + c->filename = p; + c->lineno = 1; } - return p->filename; + return c->filename; } -int -mrb_parser_lineno(struct mrb_parser_state *p, int n) +static void +parser_init_cxt(parser_state *p, mrbc_context *cxt) { - if (n <= 0) { - return p->lineno; + if (cxt) { + if (cxt->lineno) p->lineno = cxt->lineno; + if (cxt->filename) p->filename = cxt->filename; } - p->column = 0; - p->lineno = n; - return n; } parser_state* -mrb_parse_file(mrb_state *mrb, FILE *f) +mrb_parse_file(mrb_state *mrb, FILE *f, mrbc_context *c) { parser_state *p; p = mrb_parser_new(mrb); if (!p) return 0; + parser_init_cxt(p, c); p->s = p->send = NULL; p->f = f; @@ -4775,12 +4797,13 @@ mrb_parse_file(mrb_state *mrb, FILE *f) } parser_state* -mrb_parse_nstring(mrb_state *mrb, const char *s, int len) +mrb_parse_nstring(mrb_state *mrb, const char *s, int len, mrbc_context *c) { parser_state *p; p = mrb_parser_new(mrb); if (!p) return 0; + parser_init_cxt(p, c); p->s = s; p->send = s + len; @@ -4789,9 +4812,9 @@ mrb_parse_nstring(mrb_state *mrb, const char *s, int len) } parser_state* -mrb_parse_string(mrb_state *mrb, const char *s) +mrb_parse_string(mrb_state *mrb, const char *s, mrbc_context *c) { - return mrb_parse_nstring(mrb, s, strlen(s)); + return mrb_parse_nstring(mrb, s, strlen(s), c); } static mrb_value @@ -4817,22 +4840,40 @@ load_exec(mrb_state *mrb, parser_state *p) return mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); } +mrb_value +mrb_load_file_cxt(mrb_state *mrb, FILE *f, mrbc_context *c) +{ + return load_exec(mrb, mrb_parse_file(mrb, f, c)); +} + mrb_value mrb_load_file(mrb_state *mrb, FILE *f) { - return load_exec(mrb, mrb_parse_file(mrb, f)); + return mrb_load_file_cxt(mrb, f, NULL); +} + +mrb_value +mrb_load_nstring_cxt(mrb_state *mrb, const char *s, int len, mrbc_context *c) +{ + return load_exec(mrb, mrb_parse_nstring(mrb, s, len, c)); } mrb_value mrb_load_nstring(mrb_state *mrb, const char *s, int len) { - return load_exec(mrb, mrb_parse_nstring(mrb, s, len)); + return mrb_load_nstring_cxt(mrb, s, len, NULL); +} + +mrb_value +mrb_load_string_cxt(mrb_state *mrb, const char *s, mrbc_context *c) +{ + return load_exec(mrb, mrb_parse_nstring(mrb, s, strlen(s), c)); } mrb_value mrb_load_string(mrb_state *mrb, const char *s) { - return load_exec(mrb, mrb_parse_nstring(mrb, s, strlen(s))); + return mrb_load_string_cxt(mrb, s, NULL); } void parser_dump(mrb_state *mrb, node *tree, int offset); diff --git a/test/driver.c b/test/driver.c index 6b42d025b..6b1697f14 100644 --- a/test/driver.c +++ b/test/driver.c @@ -42,16 +42,8 @@ main(void) } mrb_init_mrbtest(mrb); - parser = mrb_parse_nstring(mrb, prog, strlen(prog)); - - /* generate bytecode */ - byte_code = mrb_generate_code(mrb, parser->tree); - - /* evaluate the bytecode */ - return_value = mrb_run(mrb, - /* pass a proc for evaulation */ - mrb_proc_new(mrb, mrb->irep[byte_code]), - mrb_top_self(mrb)); + /* evaluate the test */ + return_value = mrb_load_string(mrb, prog); /* did an exception occur? */ if (mrb->exc) { mrb_p(mrb, return_value); diff --git a/tools/mrbc/mrbc.c b/tools/mrbc/mrbc.c index 99fea76d8..9b69244e5 100644 --- a/tools/mrbc/mrbc.c +++ b/tools/mrbc/mrbc.c @@ -172,7 +172,7 @@ main(int argc, char **argv) return n; } - p = mrb_parse_file(mrb, args.rfp); + p = mrb_parse_file(mrb, args.rfp, NULL); if (!p || !p->tree || p->nerr) { cleanup(&args); mrb_close(mrb); diff --git a/tools/mruby/mruby.c b/tools/mruby/mruby.c index 5cf3d8a37..b4b37516b 100644 --- a/tools/mruby/mruby.c +++ b/tools/mruby/mruby.c @@ -165,17 +165,16 @@ main(int argc, char **argv) n = mrb_load_irep(mrb, args.rfp); } else { + mrbc_context *c = mrbc_context_new(mrb); if (args.cmdline) { - p = mrb_parse_string(mrb, (char*)args.cmdline); - } + mrbc_filename(mrb, c, "-e"); + p = mrb_parse_string(mrb, (char*)args.cmdline, c); + } else { - p = mrb_parser_new(mrb); - if (p) { - mrb_parser_filename(p, argv[1]); - p->f = args.rfp; - mrb_parser_parse(p); - } + mrbc_filename(mrb, c, argv[1]); + p = mrb_parse_file(mrb, args.rfp, c); } + mrbc_context_free(mrb, c); if (!p || !p->tree || p->nerr) { cleanup(mrb, &args); return -1; -- cgit v1.2.3 From e81449557646b184e6367706273e8c0b4c53668d Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 3 Jul 2012 21:04:25 +0900 Subject: test/driver to use EXIT_SUCCESS --- test/driver.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/driver.c b/test/driver.c index 6b1697f14..03479bcf4 100644 --- a/test/driver.c +++ b/test/driver.c @@ -54,5 +54,5 @@ main(void) } mrb_close(mrb); - return 0; + return EXIT_SUCCESS; } -- cgit v1.2.3 From 39689441e78c59fb92d7563ed40f14287df9b575 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 3 Jul 2012 21:13:10 +0900 Subject: add context arg to mrb_parser_parse() --- include/mruby/compile.h | 2 +- src/parse.y | 27 +++++++++++++-------------- tools/mirb/mirb.c | 2 +- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/include/mruby/compile.h b/include/mruby/compile.h index 401f52854..c4e480577 100644 --- a/include/mruby/compile.h +++ b/include/mruby/compile.h @@ -98,7 +98,7 @@ struct mrb_parser_state { struct mrb_parser_state* mrb_parser_new(mrb_state*); const char *mrb_parser_filename(struct mrb_parser_state*, const char*); -void mrb_parser_parse(struct mrb_parser_state*); +void mrb_parser_parse(struct mrb_parser_state*,mrbc_context*); /* utility functions */ struct mrb_parser_state* mrb_parse_file(mrb_state*,FILE*,mrbc_context*); diff --git a/src/parse.y b/src/parse.y index 78d7d7a7e..90534cb32 100644 --- a/src/parse.y +++ b/src/parse.y @@ -4669,8 +4669,17 @@ yylex(void *lval, parser_state *p) return t; } +static void +parser_init_cxt(parser_state *p, mrbc_context *cxt) +{ + if (cxt) { + if (cxt->lineno) p->lineno = cxt->lineno; + if (cxt->filename) p->filename = cxt->filename; + } +} + void -mrb_parser_parse(parser_state *p) +mrb_parser_parse(parser_state *p, mrbc_context *c) { node *tree; @@ -4685,6 +4694,7 @@ mrb_parser_parse(parser_state *p) p->in_def = p->in_single = FALSE; p->nerr = p->nwarn = 0; p->sterm = 0; + parser_init_cxt(p, c); yyparse(p); tree = p->tree; @@ -4772,15 +4782,6 @@ mrbc_filename(mrb_state *mrb, mrbc_context *c, const char *s) return c->filename; } -static void -parser_init_cxt(parser_state *p, mrbc_context *cxt) -{ - if (cxt) { - if (cxt->lineno) p->lineno = cxt->lineno; - if (cxt->filename) p->filename = cxt->filename; - } -} - parser_state* mrb_parse_file(mrb_state *mrb, FILE *f, mrbc_context *c) { @@ -4788,11 +4789,10 @@ mrb_parse_file(mrb_state *mrb, FILE *f, mrbc_context *c) p = mrb_parser_new(mrb); if (!p) return 0; - parser_init_cxt(p, c); p->s = p->send = NULL; p->f = f; - mrb_parser_parse(p); + mrb_parser_parse(p, c); return p; } @@ -4803,11 +4803,10 @@ mrb_parse_nstring(mrb_state *mrb, const char *s, int len, mrbc_context *c) p = mrb_parser_new(mrb); if (!p) return 0; - parser_init_cxt(p, c); p->s = s; p->send = s + len; - mrb_parser_parse(p); + mrb_parser_parse(p, c); return p; } diff --git a/tools/mirb/mirb.c b/tools/mirb/mirb.c index 35558acfb..fb61dd272 100644 --- a/tools/mirb/mirb.c +++ b/tools/mirb/mirb.c @@ -196,7 +196,7 @@ main(void) parser->send = ruby_code + strlen(ruby_code); parser->capture_errors = 1; parser->lineno = 1; - mrb_parser_parse(parser); + mrb_parser_parse(parser, NULL); code_block_open = is_code_block_open(parser); if (code_block_open) { -- cgit v1.2.3 From daee2e5ad37a2b9e35fdabab817c8db3cedd35a0 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 3 Jul 2012 21:26:05 +0900 Subject: preserve toplevel local variable info in mrbc_context --- src/parse.y | 39 ++++++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/src/parse.y b/src/parse.y index 90534cb32..5376182a0 100644 --- a/src/parse.y +++ b/src/parse.y @@ -4672,9 +4672,36 @@ yylex(void *lval, parser_state *p) static void parser_init_cxt(parser_state *p, mrbc_context *cxt) { - if (cxt) { - if (cxt->lineno) p->lineno = cxt->lineno; - if (cxt->filename) p->filename = cxt->filename; + if (!cxt) return; + if (cxt->lineno) p->lineno = cxt->lineno; + if (cxt->filename) p->filename = cxt->filename; + if (cxt->syms) { + int len = cxt->slen; + + p->locals = cons(0,0); + while (len--) { + local_add_f(p, cxt->syms[len]); + } + } +} + +static void +parser_update_cxt(parser_state *p, mrbc_context *cxt) +{ + node *n, *n0; + int i = 0; + + if (!cxt) return; + if ((int)p->tree->car != NODE_SCOPE) return; + n0 = n = p->tree->cdr->car; + while (n) { + i++; + n = n->cdr; + } + cxt->syms = mrb_realloc(p->mrb, cxt->syms, i*sizeof(mrb_sym)); + cxt->slen = i; + for (i=0, n=n0; n; i++,n=n->cdr) { + cxt->syms[i] = (mrb_sym)n->car; } } @@ -4694,8 +4721,8 @@ mrb_parser_parse(parser_state *p, mrbc_context *c) p->in_def = p->in_single = FALSE; p->nerr = p->nwarn = 0; p->sterm = 0; - parser_init_cxt(p, c); + parser_init_cxt(p, c); yyparse(p); tree = p->tree; if (!tree) { @@ -4707,9 +4734,7 @@ mrb_parser_parse(parser_state *p, mrbc_context *c) } } else { - if ((intptr_t)tree->car == NODE_SCOPE) { - p->locals = cons(tree->cdr->car, 0); - } + parser_update_cxt(p, c); if (p->begin_tree) { tree = new_begin(p, p->begin_tree); append(tree, p->tree); -- cgit v1.2.3 From a7b8a94e48b805cd1651807aae09faf2d265b61b Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 3 Jul 2012 21:29:46 +0900 Subject: refactor mirb code --- tools/mirb/mirb.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/tools/mirb/mirb.c b/tools/mirb/mirb.c index fb61dd272..a9c0f26d2 100644 --- a/tools/mirb/mirb.c +++ b/tools/mirb/mirb.c @@ -133,22 +133,22 @@ main(void) char last_char, ruby_code[1024], last_code_line[1024]; int char_index; struct mrb_parser_state *parser; - mrb_state *mrb_interpreter; - mrb_value mrb_return_value; - int byte_code; + mrb_state *mrb; + mrb_value result; + int n; int code_block_open = FALSE; print_hint(); /* new interpreter instance */ - mrb_interpreter = mrb_open(); - if (mrb_interpreter == NULL) { - fprintf(stderr, "Invalid mrb_interpreter, exiting mirb"); + mrb = mrb_open(); + if (mrb == NULL) { + fprintf(stderr, "Invalid mrb interpreter, exiting mirb"); return EXIT_FAILURE; } /* new parser instance */ - parser = mrb_parser_new(mrb_interpreter); + parser = mrb_parser_new(mrb); memset(ruby_code, 0, sizeof(*ruby_code)); memset(last_code_line, 0, sizeof(*last_code_line)); @@ -209,22 +209,22 @@ main(void) } else { /* generate bytecode */ - byte_code = mrb_generate_code(mrb_interpreter, parser->tree); + n = mrb_generate_code(mrb, parser->tree); /* evaluate the bytecode */ - mrb_return_value = mrb_run(mrb_interpreter, + result = mrb_run(mrb, /* pass a proc for evaulation */ - mrb_proc_new(mrb_interpreter, mrb_interpreter->irep[byte_code]), - mrb_top_self(mrb_interpreter)); + mrb_proc_new(mrb, mrb->irep[n]), + mrb_top_self(mrb)); /* did an exception occur? */ - if (mrb_interpreter->exc) { - mrb_p(mrb_interpreter, mrb_obj_value(mrb_interpreter->exc)); - mrb_interpreter->exc = 0; + if (mrb->exc) { + mrb_p(mrb, mrb_obj_value(mrb->exc)); + mrb->exc = 0; } else { /* no */ printf(" => "); - mrb_p(mrb_interpreter, mrb_return_value); + mrb_p(mrb, result); } } @@ -233,7 +233,7 @@ main(void) } } } - mrb_close(mrb_interpreter); + mrb_close(mrb); return 0; } -- cgit v1.2.3 From 137570acf0f8f9dbfbdc8678d13650bfcfe9c140 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 3 Jul 2012 21:32:37 +0900 Subject: capture_errors can be specified by mrbc_context --- include/mruby/compile.h | 1 + src/parse.y | 1 + 2 files changed, 2 insertions(+) diff --git a/include/mruby/compile.h b/include/mruby/compile.h index c4e480577..8f65932ba 100644 --- a/include/mruby/compile.h +++ b/include/mruby/compile.h @@ -22,6 +22,7 @@ typedef struct mrbc_context { int slen; char *filename; int lineno; + int capture_errors:1; } mrbc_context; mrbc_context* mrbc_context_new(mrb_state *mrb); diff --git a/src/parse.y b/src/parse.y index 5376182a0..217e82a37 100644 --- a/src/parse.y +++ b/src/parse.y @@ -4683,6 +4683,7 @@ parser_init_cxt(parser_state *p, mrbc_context *cxt) local_add_f(p, cxt->syms[len]); } } + p->capture_errors = cxt->capture_errors; } static void -- cgit v1.2.3 From cd1e1a008987d61d06bbef99e9341738b36f3313 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 3 Jul 2012 21:33:20 +0900 Subject: remove unused variables --- test/driver.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/driver.c b/test/driver.c index 03479bcf4..4fe58432d 100644 --- a/test/driver.c +++ b/test/driver.c @@ -26,10 +26,8 @@ void print_hint(void) int main(void) { - struct mrb_parser_state *parser; mrb_state *mrb; mrb_value return_value; - int byte_code; const char *prog = "report()"; print_hint(); -- cgit v1.2.3 From be8181a99a664d226b08d9d1f8348260c6e2bb95 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 3 Jul 2012 21:39:21 +0900 Subject: raise SyntaxError only when capture_errors is set --- src/parse.y | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/parse.y b/src/parse.y index 217e82a37..63d39ec5f 100644 --- a/src/parse.y +++ b/src/parse.y @@ -4847,13 +4847,17 @@ load_exec(mrb_state *mrb, parser_state *p) { int n; - if (!p || !p->tree || p->nerr) { + if (!p) { + mrb_pool_close(p->pool); + return mrb_nil_value(); + } + if (p->capture_errors && (!p->tree || p->nerr)) { char buf[256]; n = snprintf(buf, sizeof(buf), "line %d: %s\n", p->error_buffer[0].lineno, p->error_buffer[0].message); - mrb_pool_close(p->pool); mrb->exc = (struct RObject*)mrb_object(mrb_exc_new(mrb, E_SYNTAX_ERROR, buf, n)); + mrb_pool_close(p->pool); return mrb_nil_value(); } n = mrb_generate_code(mrb, p->tree); -- cgit v1.2.3 From a1af20baa9f9a96c2a8cd6a9a1505fe53799e9c9 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 3 Jul 2012 21:49:06 +0900 Subject: use mrbc_context; free parser for each iteration; close #312 --- tools/mirb/mirb.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tools/mirb/mirb.c b/tools/mirb/mirb.c index a9c0f26d2..d46bcff3c 100644 --- a/tools/mirb/mirb.c +++ b/tools/mirb/mirb.c @@ -132,6 +132,7 @@ main(void) { char last_char, ruby_code[1024], last_code_line[1024]; int char_index; + mrbc_context *cxt; struct mrb_parser_state *parser; mrb_state *mrb; mrb_value result; @@ -147,8 +148,8 @@ main(void) return EXIT_FAILURE; } - /* new parser instance */ - parser = mrb_parser_new(mrb); + cxt = mrbc_context_new(mrb); + cxt->capture_errors = 1; memset(ruby_code, 0, sizeof(*ruby_code)); memset(last_code_line, 0, sizeof(*last_code_line)); @@ -192,11 +193,11 @@ main(void) } /* parse code */ + parser = mrb_parser_new(mrb); parser->s = ruby_code; parser->send = ruby_code + strlen(ruby_code); - parser->capture_errors = 1; parser->lineno = 1; - mrb_parser_parse(parser, NULL); + mrb_parser_parse(parser, cxt); code_block_open = is_code_block_open(parser); if (code_block_open) { @@ -227,12 +228,13 @@ main(void) mrb_p(mrb, result); } } - memset(ruby_code, 0, sizeof(*ruby_code)); memset(ruby_code, 0, sizeof(*last_code_line)); } + mrb_pool_close(parser->pool); } } + mrbc_context_free(mrb, cxt); mrb_close(mrb); return 0; -- cgit v1.2.3 From fc27f71289b84f700efc780ae79eea66f212c0c4 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 3 Jul 2012 21:52:11 +0900 Subject: add new function mrb_parser_free() --- include/mruby/compile.h | 1 + src/parse.y | 5 +++++ tools/mirb/mirb.c | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/include/mruby/compile.h b/include/mruby/compile.h index 8f65932ba..42820896e 100644 --- a/include/mruby/compile.h +++ b/include/mruby/compile.h @@ -98,6 +98,7 @@ struct mrb_parser_state { }; struct mrb_parser_state* mrb_parser_new(mrb_state*); +void mrb_parser_free(struct mrb_parser_state*); const char *mrb_parser_filename(struct mrb_parser_state*, const char*); void mrb_parser_parse(struct mrb_parser_state*,mrbc_context*); diff --git a/src/parse.y b/src/parse.y index 63d39ec5f..b0d399a98 100644 --- a/src/parse.y +++ b/src/parse.y @@ -4775,6 +4775,11 @@ mrb_parser_new(mrb_state *mrb) return p; } +void +mrb_parser_free(parser_state *p) { + mrb_pool_close(p->pool); +} + mrbc_context* mrbc_context_new(mrb_state *mrb) { diff --git a/tools/mirb/mirb.c b/tools/mirb/mirb.c index d46bcff3c..8b36cb5a6 100644 --- a/tools/mirb/mirb.c +++ b/tools/mirb/mirb.c @@ -231,7 +231,7 @@ main(void) memset(ruby_code, 0, sizeof(*ruby_code)); memset(ruby_code, 0, sizeof(*last_code_line)); } - mrb_pool_close(parser->pool); + mrb_parser_free(parser); } } mrbc_context_free(mrb, cxt); -- cgit v1.2.3 From 85a0cad905faf6377f308f0e596a031cd143f91d Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 3 Jul 2012 21:54:08 +0900 Subject: use new function mrb_parser_free() --- src/parse.y | 6 +++--- tools/mrbc/mrbc.c | 2 +- tools/mruby/mruby.c | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/parse.y b/src/parse.y index b0d399a98..2b69ac726 100644 --- a/src/parse.y +++ b/src/parse.y @@ -4853,7 +4853,7 @@ load_exec(mrb_state *mrb, parser_state *p) int n; if (!p) { - mrb_pool_close(p->pool); + mrb_parser_free(p); return mrb_nil_value(); } if (p->capture_errors && (!p->tree || p->nerr)) { @@ -4862,11 +4862,11 @@ load_exec(mrb_state *mrb, parser_state *p) n = snprintf(buf, sizeof(buf), "line %d: %s\n", p->error_buffer[0].lineno, p->error_buffer[0].message); mrb->exc = (struct RObject*)mrb_object(mrb_exc_new(mrb, E_SYNTAX_ERROR, buf, n)); - mrb_pool_close(p->pool); + mrb_parser_free(p); return mrb_nil_value(); } n = mrb_generate_code(mrb, p->tree); - mrb_pool_close(p->pool); + mrb_parser_free(p); if (n < 0) { mrb->exc = (struct RObject*)mrb_object(mrb_exc_new(mrb, E_SCRIPT_ERROR, "codegen error", 13)); return mrb_nil_value(); diff --git a/tools/mrbc/mrbc.c b/tools/mrbc/mrbc.c index 9b69244e5..55e2fcf32 100644 --- a/tools/mrbc/mrbc.c +++ b/tools/mrbc/mrbc.c @@ -183,7 +183,7 @@ main(int argc, char **argv) parser_dump(mrb, p->tree, 0); n = mrb_generate_code(mrb, p->tree); - mrb_pool_close(p->pool); + mrb_parser_free(p); if (args.verbose) codedump_all(mrb, n); diff --git a/tools/mruby/mruby.c b/tools/mruby/mruby.c index b4b37516b..3628e79c9 100644 --- a/tools/mruby/mruby.c +++ b/tools/mruby/mruby.c @@ -184,7 +184,7 @@ main(int argc, char **argv) parser_dump(mrb, p->tree, 0); n = mrb_generate_code(mrb, p->tree); - mrb_pool_close(p->pool); + mrb_parser_free(p); } if (n >= 0) { -- cgit v1.2.3 From f141ae42c0ad52ef37694ae195f5841ea2678b4f Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 4 Jul 2012 10:19:10 +0900 Subject: stop strtod() warning; add more checks; close #247 --- src/parse.y | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/parse.y b/src/parse.y index 2b69ac726..025707670 100644 --- a/src/parse.y +++ b/src/parse.y @@ -4128,8 +4128,15 @@ parser_yylex(parser_state *p) } tokfix(p); if (is_float) { - (void)strtod(tok(p), 0); /* just check if float is within range */ - if (errno == ERANGE) { + double d; + char *endp; + + errno = 0; + d = strtod(tok(p), &endp); + if (d == 0 && endp == tok(p)) { + yywarning_s(p, "corrupted float value %s", tok(p)); + } + else if (errno == ERANGE) { yywarning_s(p, "float %s out of range", tok(p)); errno = 0; } -- cgit v1.2.3 From 472847adc24f10e30ef5ff09814cf12d6a3d372a Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 4 Jul 2012 17:12:47 +0900 Subject: input cast to unsigned char for unqualified tolower(); close #342 --- src/codegen.c | 5 +++-- src/parse.y | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/codegen.c b/src/codegen.c index 2654fcbe3..8aef2a328 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -802,8 +802,9 @@ readint_float(codegen_scope *s, const char *p, int base) mrb_float f = 0; int n; - while (p <= e) { - char c = tolower(*p); + while (p < e) { + char c = *p; + c = tolower((unsigned char)c); for (n=0; n Date: Wed, 4 Jul 2012 17:14:59 +0900 Subject: add input check to readint_float() --- src/codegen.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/codegen.c b/src/codegen.c index 8aef2a328..963e94b21 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -802,6 +802,7 @@ readint_float(codegen_scope *s, const char *p, int base) mrb_float f = 0; int n; + if (*p == '+') p++; while (p < e) { char c = *p; c = tolower((unsigned char)c); @@ -812,6 +813,9 @@ readint_float(codegen_scope *s, const char *p, int base) break; } } + if (n == base) { + codegen_error(s, "malformed readint input"); + } p++; } return f; -- cgit v1.2.3 From 0e9e0693b46438e37e915d9973210d39048db2c1 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 5 Jul 2012 01:13:09 +0900 Subject: big init function in cdump may overflow arena --- src/cdump.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/cdump.c b/src/cdump.c index 0df2bb491..1b67f6205 100644 --- a/src/cdump.c +++ b/src/cdump.c @@ -112,6 +112,7 @@ make_cdump_irep(mrb_state *mrb, int irep_no, FILE *f) return MRB_CDUMP_GENERAL_FAILURE; } + SOURCE_CODE0 (" ai = mrb->arena_idx;"); SOURCE_CODE0 (" irep = mrb->irep[idx] = mrb_malloc(mrb, sizeof(mrb_irep));"); SOURCE_CODE0 (" irep->idx = idx++;"); SOURCE_CODE (" irep->flags = %d | MRB_ISEQ_NOFREE;", irep->flags); @@ -155,6 +156,8 @@ make_cdump_irep(mrb_state *mrb, int irep_no, FILE *f) } else SOURCE_CODE0 (" irep->pool = NULL;"); + SOURCE_CODE0 (" mrb->irep_len = idx;"); + SOURCE_CODE0 (" ai = mrb->arena_idx;"); SOURCE_CODE0(""); return MRB_CDUMP_OK; } @@ -185,6 +188,7 @@ mrb_cdump_irep(mrb_state *mrb, int n, FILE *f,const char *initname) SOURCE_CODE0("{"); SOURCE_CODE0(" int n = mrb->irep_len;"); SOURCE_CODE0(" int idx = n;"); + SOURCE_CODE0(" int ai;"); SOURCE_CODE0(" mrb_irep *irep;"); SOURCE_CODE0(""); SOURCE_CODE (" mrb_add_irep(mrb, idx+%d);", irep_num); @@ -194,8 +198,6 @@ mrb_cdump_irep(mrb_state *mrb, int n, FILE *f,const char *initname) return -1; } - SOURCE_CODE0(" mrb->irep_len = idx;"); - SOURCE_CODE0(""); SOURCE_CODE0(" mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb));"); SOURCE_CODE0("}"); -- cgit v1.2.3 From 07bcd6bed8b608d3e01f62f849dbd6d33accea85 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 5 Jul 2012 01:34:35 +0900 Subject: cdump.c: pool may contain fixnum value --- src/cdump.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/cdump.c b/src/cdump.c index 1b67f6205..f2ba8e8ea 100644 --- a/src/cdump.c +++ b/src/cdump.c @@ -139,7 +139,9 @@ make_cdump_irep(mrb_state *mrb, int irep_no, FILE *f) switch (irep->pool[n].tt) { case MRB_TT_FLOAT: SOURCE_CODE(" irep->pool[%d] = mrb_float_value(%.16e);", n, irep->pool[n].value.f); break; - case MRB_TT_STRING: + case MRB_TT_FIXNUM: + SOURCE_CODE(" irep->pool[%d] = mrb_fixnum_value(%d);", n, irep->pool[n].value.i); break; + case MRB_TT_STRING: str_len = str_format_len(irep->pool[n]) + 1; if ( str_len > buf_len ) { buf_len = str_len; -- cgit v1.2.3 From c4208a413d2706d2914c5ebe112fe14308090f92 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 5 Jul 2012 01:36:54 +0900 Subject: restore arena_idx after initializing irep --- src/cdump.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cdump.c b/src/cdump.c index f2ba8e8ea..16c1dc8ae 100644 --- a/src/cdump.c +++ b/src/cdump.c @@ -159,7 +159,7 @@ make_cdump_irep(mrb_state *mrb, int irep_no, FILE *f) else SOURCE_CODE0 (" irep->pool = NULL;"); SOURCE_CODE0 (" mrb->irep_len = idx;"); - SOURCE_CODE0 (" ai = mrb->arena_idx;"); + SOURCE_CODE0 (" mrb->arena_idx = ai;"); SOURCE_CODE0(""); return MRB_CDUMP_OK; } -- cgit v1.2.3 From ca930538eaac4aa64ce65ef6dbf6c60fe3caccab Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 5 Jul 2012 01:40:23 +0900 Subject: prepare for OP_TAILCALL --- src/codegen.c | 5 +++++ src/vm.c | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/codegen.c b/src/codegen.c index 963e94b21..3236713e2 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -2149,6 +2149,11 @@ codedump(mrb_state *mrb, int n) mrb_sym2name(mrb, irep->syms[GETARG_B(c)]), GETARG_C(c)); break; + case OP_TAILCALL: + printf("OP_TAILCALL\tR%d\t:%s\t%d\n", GETARG_A(c), + mrb_sym2name(mrb, irep->syms[GETARG_B(c)]), + GETARG_C(c)); + break; case OP_SUPER: printf("OP_SUPER\tR%d\t%d\n", GETARG_A(c), GETARG_C(c)); diff --git a/src/vm.c b/src/vm.c index d69081c9c..62fba24d0 100644 --- a/src/vm.c +++ b/src/vm.c @@ -1120,7 +1120,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) /* replace callinfo */ - mrb->ci = ci = &mrb->ci[-1]; + ci = mrb->ci; ci->mid = mid; ci->target_class = m->target_class; ci->argc = n; -- cgit v1.2.3 From fbfef55152364b71df9eef8187fce94a5054ee5b Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 5 Jul 2012 17:57:23 +0900 Subject: Module#include should also include included modules; close #340 --- src/class.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/class.c b/src/class.c index 0e7696972..7e0512322 100644 --- a/src/class.c +++ b/src/class.c @@ -646,6 +646,7 @@ mrb_include_module(mrb_state *mrb, struct RClass *c, struct RClass *m) { struct RClass *ic; + if (m->super) mrb_include_module(mrb, c, m->super); ic = (struct RClass*)mrb_obj_alloc(mrb, MRB_TT_ICLASS, mrb->class_class); ic->c = m; ic->mt = m->mt; -- cgit v1.2.3 From ff42f8f4854525bfecb1a76252730aaad137080f Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 5 Jul 2012 22:56:51 +0900 Subject: move RDoc comments --- include/mruby.h | 2 +- src/etc.c | 29 +---------------------------- src/kernel.c | 27 +++++++++++++++++++++------ 3 files changed, 23 insertions(+), 35 deletions(-) diff --git a/include/mruby.h b/include/mruby.h index aadd56e94..7e2d2575f 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -358,7 +358,7 @@ mrb_value mrb_top_self(mrb_state *); mrb_value mrb_run(mrb_state*, struct RProc*, mrb_value); mrb_value mrb_p(mrb_state*, mrb_value); -int mrb_obj_id(mrb_value obj); +mrb_int mrb_obj_id(mrb_value obj); mrb_sym mrb_to_id(mrb_state *mrb, mrb_value name); int mrb_obj_equal(mrb_state*, mrb_value, mrb_value); diff --git a/src/etc.c b/src/etc.c index ac1f79f2f..36da0c943 100644 --- a/src/etc.c +++ b/src/etc.c @@ -126,34 +126,7 @@ mrb_block_proc(void) return mrb_nil_value();//proc_new(mrb_cProc, FALSE); } -/* - * Document-method: __id__ - * Document-method: object_id - * - * call-seq: - * obj.__id__ -> fixnum - * obj.object_id -> fixnum - * - * Returns an integer identifier for obj. The same number will - * be returned on all calls to id for a given object, and - * no two active objects will share an id. - * Object#object_id is a different concept from the - * :name notation, which returns the symbol id of - * name. Replaces the deprecated Object#id. - */ - -/* - * call-seq: - * obj.hash -> fixnum - * - * Generates a Fixnum hash value for this object. This - * function must have the property that a.eql?(b) implies - * a.hash == b.hash. The hash value is used by class - * Hash. Any hash value that exceeds the capacity of a - * Fixnum will be truncated before being used. - */ - -int +mrb_int mrb_obj_id(mrb_value obj) { /* diff --git a/src/kernel.c b/src/kernel.c index 605b84124..d230305da 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -207,14 +207,19 @@ mrb_equal_m(mrb_state *mrb, mrb_value self) /* 15.3.1.3.3 */ /* 15.3.1.3.33 */ /* + * Document-method: __id__ + * Document-method: object_id + * * call-seq: - * obj.hash -> fixnum + * obj.__id__ -> fixnum + * obj.object_id -> fixnum * - * Generates a Fixnum hash value for this object. This - * function must have the property that a.eql?(b) implies - * a.hash == b.hash. The hash value is used by class - * Hash. Any hash value that exceeds the capacity of a - * Fixnum will be truncated before being used. + * Returns an integer identifier for obj. The same number will + * be returned on all calls to id for a given object, and + * no two active objects will share an id. + * Object#object_id is a different concept from the + * :name notation, which returns the symbol id of + * name. Replaces the deprecated Object#id. */ static mrb_value mrb_obj_id_m(mrb_state *mrb, mrb_value self) @@ -526,6 +531,16 @@ mrb_obj_extend_m(mrb_state *mrb, mrb_value self) //mrb_f_global_variables(mrb_state *mrb, mrb_value self) /* 15.3.1.3.15 */ +/* + * call-seq: + * obj.hash -> fixnum + * + * Generates a Fixnum hash value for this object. This + * function must have the property that a.eql?(b) implies + * a.hash == b.hash. The hash value is used by class + * Hash. Any hash value that exceeds the capacity of a + * Fixnum will be truncated before being used. + */ mrb_value mrb_obj_hash(mrb_state *mrb, mrb_value self) { -- cgit v1.2.3 From 5b3cc4a068ffab7973c819aafd054907f7e52349 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 5 Jul 2012 23:19:09 +0900 Subject: better object_id calculation --- src/etc.c | 158 +++++++++++++++++++++++--------------------------------------- 1 file changed, 58 insertions(+), 100 deletions(-) diff --git a/src/etc.c b/src/etc.c index 36da0c943..10aba12a0 100644 --- a/src/etc.c +++ b/src/etc.c @@ -126,109 +126,67 @@ mrb_block_proc(void) return mrb_nil_value();//proc_new(mrb_cProc, FALSE); } +#include +static mrb_int +float_id(mrb_float f) +{ + const char *p = (const char*)&f; + int len = sizeof(f); + mrb_int id = 0; + + while (len--) { + id = id*65599 + *p; + p++; + } + id = id + (id>>5); + + return id; +} + mrb_int mrb_obj_id(mrb_value obj) { - /* - * 32-bit mrb_value space - * MSB ------------------------ LSB - * false 00000000000000000000000000000000 - * true 00000000000000000000000000000010 - * nil 00000000000000000000000000000100 - * undef 00000000000000000000000000000110 - * symbol ssssssssssssssssssssssss00001110 - * object oooooooooooooooooooooooooooooo00 = 0 (mod sizeof(RVALUE)) - * fixnum fffffffffffffffffffffffffffffff1 - * - * object_id space - * LSB - * false 00000000000000000000000000000000 - * true 00000000000000000000000000000010 - * nil 00000000000000000000000000000100 - * undef 00000000000000000000000000000110 - * symbol 000SSSSSSSSSSSSSSSSSSSSSSSSSSS0 S...S % A = 4 (S...S = s...s * A + 4) - * object oooooooooooooooooooooooooooooo0 o...o % A = 0 - * fixnum fffffffffffffffffffffffffffffff1 bignum if required - * - * where A = sizeof(RVALUE)/4 - * - * sizeof(RVALUE) is - * 20 if 32-bit, double is 4-byte aligned - * 24 if 32-bit, double is 8-byte aligned - * 40 if 64-bit - */ - /* - * 128-bit mrb_value space - * MSB -------- LSB - * x86 [0,1] [2,3] [4,5] [6,7] [8,9] [A,B] [C,D] [E,F] - * 7 6 5 4 3 2 1 0 - * 0123456789ABCDEF 0123456789ABCDEF 0123456789ABCDEF 0123456789ABCDEF 0123456789ABCDEF 0123456789ABCDEF 0123456789ABCDEF 0123456789ABCDEF - * FEDCBA9876543210 FEDCBA9876543210 FEDCBA9876543210 FEDCBA9876543210 FEDCBA9876543210 FEDCBA9876543210 FEDCBA9876543210 FEDCBA9876543210 - * false 0000000000000000 0000000000000000 xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx xxxxxxxx00000001 xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx - * true 0000000000000001 0000000000000000 xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx xxxxxxxx00000010 xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx - * nil 0000000000000001 0000000000000000 xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx xxxxxxxx00000001 xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx - * undef 0000000000000000 0000000000000000 xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx xxxxxxxx00000101 xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx - * symbol ssssssssssssssss ssssssssssssssss xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx xxxxxxxx00000100 xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx - * object oooooooooooooooo oooooooooooooo00 = 0 (mod sizeof(RVALUE)) - (1)fixnum 0000000000000001 0000000000000000 xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx xxxxxxxx00000011 xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx - * float 0000000000000001 0000000000000000 0000000000000000 0000000000000000 xxxxxxxx00000011 xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx - * <-- mrb_float --> xxxxxxxx00001101 xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx - * - * object_id space - * LSB - * false 0000000000000000 0000000000000000 - * true 0000000000000000 0000000000000010 - * nil 0000000000000000 0000000000000100 - * undef 0000000000000000 0000000000000110 - * symbol 000SSSSSSSSSSSS SSSSSSSSSSSSSSS0 S...S % A = 4 (S...S = s...s * A + 4) - * object ooooooooooooooo ooooooooooooooo0 o...o % A = 0 - * fixnum ffffffffffffffff fffffffffffffff1 bignum if required - * - * where A = sizeof(RVALUE)/4 - * - * sizeof(RVALUE) is - * 20 if 32-bit, double is 4-byte aligned - * 24 if 32-bit, double is 8-byte aligned - * 40 if 64-bit - */ - /* tt:0_27 */ - switch (mrb_type(obj)) { - case MRB_TT_FREE: - return 0; /* not define */ - case MRB_TT_FALSE: - if (mrb_nil_p(obj)) - return 4; - return 0; - case MRB_TT_TRUE: - return 2; - case MRB_TT_FIXNUM: - return mrb_fixnum(obj)*2+1; /* odd number */ - case MRB_TT_SYMBOL: - return SYM2ID(obj) * 2; - case MRB_TT_UNDEF: - return 0; /* not define */ - case MRB_TT_FLOAT: - return (int)mrb_float(obj)*2; /* even number */ - case MRB_TT_OBJECT: - case MRB_TT_CLASS: - case MRB_TT_MODULE: - case MRB_TT_ICLASS: - case MRB_TT_SCLASS: - case MRB_TT_PROC: - case MRB_TT_ARRAY: - case MRB_TT_HASH: - case MRB_TT_STRING: - case MRB_TT_RANGE: - case MRB_TT_REGEX: - case MRB_TT_STRUCT: - case MRB_TT_EXCEPTION: - case MRB_TT_MATCH: - case MRB_TT_FILE: - case MRB_TT_DATA: - case MRB_TT_THREAD: - case MRB_TT_THREADGRP: - default: - return mrb_fixnum(obj); /* even number */ + mrb_int tt = obj.tt; + +#define MakeID2(p,t) (((intptr_t)(p))^(t)) +#define MakeID(p) MakeID2(p,tt) + + switch (tt) { + case MRB_TT_FREE: + case MRB_TT_UNDEF: + return MakeID(0); /* not define */ + case MRB_TT_FALSE: + if (mrb_nil_p(obj)) + return MakeID(1); + return MakeID(0); + case MRB_TT_TRUE: + return MakeID(1); + case MRB_TT_SYMBOL: + return MakeID(SYM2ID(obj)); + case MRB_TT_FIXNUM: + return MakeID2(float_id((mrb_float)mrb_fixnum(obj)), MRB_TT_FLOAT); + case MRB_TT_FLOAT: + return MakeID(float_id(mrb_float(obj))); + case MRB_TT_STRING: + case MRB_TT_OBJECT: + case MRB_TT_CLASS: + case MRB_TT_MODULE: + case MRB_TT_ICLASS: + case MRB_TT_SCLASS: + case MRB_TT_PROC: + case MRB_TT_ARRAY: + case MRB_TT_HASH: + case MRB_TT_RANGE: + case MRB_TT_REGEX: + case MRB_TT_STRUCT: + case MRB_TT_EXCEPTION: + case MRB_TT_MATCH: + case MRB_TT_FILE: + case MRB_TT_DATA: + case MRB_TT_THREAD: + case MRB_TT_THREADGRP: + default: + return MakeID(obj.value.p); } } -- cgit v1.2.3 From cc431827e935920397f54cad2c9f27440b82e993 Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Fri, 6 Jul 2012 14:02:55 +0900 Subject: write_pool_block(): reduce calling strlen(). refs #301. dump_irep_record(): Set error code in case dump failed. --- src/dump.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/dump.c b/src/dump.c index bbdd58eee..0e40cf3ed 100644 --- a/src/dump.c +++ b/src/dump.c @@ -331,6 +331,7 @@ write_pool_block(mrb_state *mrb, mrb_irep *irep, char *buf, int type) char *buf_top = buf; char *char_buf; uint16_t buf_size =0; + int len; buf_size = MRB_DUMP_DEFAULT_STR_LEN; if ((char_buf = mrb_malloc(mrb, buf_size)) == 0) @@ -384,10 +385,12 @@ write_pool_block(mrb_state *mrb, mrb_irep *irep, char *buf, int type) continue; } - buf += uint16_dump((uint16_t)strlen(char_buf), buf, type); /* data length */ + len = strlen(char_buf); - memcpy(buf, char_buf, strlen(char_buf)); - buf += strlen(char_buf); + buf += uint16_dump((uint16_t)len, buf, type); /* data length */ + + memcpy(buf, char_buf, len); + buf += len; } error_exit: @@ -600,8 +603,10 @@ dump_irep_record(mrb_state *mrb, int irep_no, FILE* fp, uint32_t *rlen) memset( buf, 0, irep_record_size); - if ((rc = write_irep_record(mrb, irep_no, buf, rlen, DUMP_TYPE_HEX)) != MRB_DUMP_OK) + if ((rc = write_irep_record(mrb, irep_no, buf, rlen, DUMP_TYPE_HEX)) != MRB_DUMP_OK) { + rc = MRB_DUMP_GENERAL_FAILURE; goto error_exit; + } if (fwrite(buf, irep_record_size, 1, fp) != 1) -- cgit v1.2.3 From 4406a08d58f55f1d3d32c98a78bd7dc61a242c8d Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Fri, 6 Jul 2012 19:46:27 +0900 Subject: remove debug printf; close #345 --- src/string.c | 36 +++++++++++++++--------------------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/src/string.c b/src/string.c index 02f71ef96..b2cdc1212 100644 --- a/src/string.c +++ b/src/string.c @@ -2381,17 +2381,10 @@ mrb_cstr_to_inum(mrb_state *mrb, const char *str, int base, int badcheck) #define BDIGIT unsigned int #define BDIGIT_DBL unsigned long -// const char *s = str; char *end; char sign = 1; -// char nondigit = 0; int c; -// BDIGIT_DBL num; long len; -// long blen = 1; -// long i; -// mrb_value z; -// BDIGIT *zds; unsigned long val; #undef ISDIGIT @@ -2508,21 +2501,22 @@ mrb_cstr_to_inum(mrb_state *mrb, const char *str, int base, int badcheck) } len *= strlen(str)*sizeof(char); - val = strtoul((char*)str, &end, base); + val = strtoul((char*)str, &end, base); - if (badcheck) { - if (end == str) goto bad; /* no number */ - while (*end && ISSPACE(*end)) end++; - if (*end) goto bad; /* trailing garbage */ - } + if (badcheck) { + if (end == str) goto bad; /* no number */ + while (*end && ISSPACE(*end)) end++; + if (*end) goto bad; /* trailing garbage */ + } - if (sign) return mrb_fixnum_value(val); - else { - long result = -(long)val; - return mrb_fixnum_value(result); - } + if (sign) return mrb_fixnum_value(val); + else { + long result = -(long)val; + return mrb_fixnum_value(result); + } bad: - printf("Integer"); + mrb_raise(mrb, E_ARGUMENT_ERROR, "invalide string for number(%s)", str); + /* not reached */ return mrb_fixnum_value(0); } @@ -2631,8 +2625,8 @@ mrb_cstr_to_dbl(mrb_state *mrb, const char * p, int badcheck) if (p == end) { if (badcheck) { bad: - //mrb_invalid_str(q, "Float()"); - printf("Float()\n"); + mrb_raise(mrb, E_ARGUMENT_ERROR, "invalide string for float(%s)", p); + /* not reached */ } return d; } -- cgit v1.2.3 From 84ec555ecd4b51767b695d0367d4dbe321359f30 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Fri, 6 Jul 2012 19:50:44 +0900 Subject: range optimization from @monaka; close #348 --- src/range.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/range.c b/src/range.c index 859bb277e..34ca79a0d 100644 --- a/src/range.c +++ b/src/range.c @@ -185,14 +185,14 @@ mrb_range_eq(mrb_state *mrb, mrb_value range) static int r_le(mrb_state *mrb, mrb_value a, mrb_value b) { - //int c; mrb_value r = mrb_funcall(mrb, a, "<=>", 1, b); /* compare result */ /* output :a < b => -1, a = b => 0, a > b => +1 */ - if (mrb_nil_p(r)) return FALSE; + if (mrb_type(r) == MRB_TT_FIXNUM) { + int c = mrb_fixnum(r); + if (c == 0 || c == -1) return TRUE; + } - if (mrb_obj_equal(mrb, r, mrb_fixnum_value(0))) return TRUE; - if (mrb_obj_equal(mrb, r, mrb_fixnum_value(-1))) return TRUE; return FALSE; } -- cgit v1.2.3 From 8268ba2755ec467d100c799dbf53c13f38fda436 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Fri, 6 Jul 2012 19:52:50 +0900 Subject: remove MRB_TT_THREAD,MRB_TT_THREADGRP --- include/mruby.h | 4 +--- src/etc.c | 2 -- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/include/mruby.h b/include/mruby.h index 7e2d2575f..0acd20842 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -60,9 +60,7 @@ enum mrb_vtype { MRB_TT_FILE, /* 21 */ MRB_TT_ENV, /* 22 */ MRB_TT_DATA, /* 23 */ - MRB_TT_THREAD, /* 24 */ - MRB_TT_THREADGRP, /* 25 */ - MRB_TT_MAXDEFINE /* 26 */ + MRB_TT_MAXDEFINE /* 24 */ }; typedef struct mrb_value { diff --git a/src/etc.c b/src/etc.c index 10aba12a0..73cf31087 100644 --- a/src/etc.c +++ b/src/etc.c @@ -183,8 +183,6 @@ mrb_obj_id(mrb_value obj) case MRB_TT_MATCH: case MRB_TT_FILE: case MRB_TT_DATA: - case MRB_TT_THREAD: - case MRB_TT_THREADGRP: default: return MakeID(obj.value.p); } -- cgit v1.2.3 From e896c1cee36d8a8e36dfc06a10d8370156d34ada Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Sat, 7 Jul 2012 09:23:00 +0900 Subject: Range optimization. similar to #348 --- src/range.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/range.c b/src/range.c index 34ca79a0d..8308309ef 100644 --- a/src/range.c +++ b/src/range.c @@ -199,27 +199,28 @@ r_le(mrb_state *mrb, mrb_value a, mrb_value b) static int r_gt(mrb_state *mrb, mrb_value a, mrb_value b) { - //int c; mrb_value r = mrb_funcall(mrb, a, "<=>", 1, b); /* output :a < b => -1, a = b => 0, a > b => +1 */ - if (mrb_nil_p(r)) return FALSE; + if (mrb_type(r) == MRB_TT_FIXNUM) { + int c = mrb_fixnum(r); + if (c == 1) return TRUE; + } - if (mrb_obj_equal(mrb, r, mrb_fixnum_value(1))) return TRUE; return FALSE; } static int r_ge(mrb_state *mrb, mrb_value a, mrb_value b) { - //int c; mrb_value r = mrb_funcall(mrb, a, "<=>", 1, b); /* compare result */ /* output :a < b => -1, a = b => 0, a > b => +1 */ - if (mrb_nil_p(r)) return FALSE; + if (mrb_type(r) == MRB_TT_FIXNUM) { + int c = mrb_fixnum(r); + if (c == 0 || c == 1) return TRUE; + } - if (mrb_obj_equal(mrb, r, mrb_fixnum_value(0))) return TRUE; - if (mrb_obj_equal(mrb, r, mrb_fixnum_value(1))) return TRUE; return FALSE; } -- cgit v1.2.3 From 47407768fdf118fa6fe3ead5b088b79397603ef6 Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Sat, 7 Jul 2012 12:09:59 +0900 Subject: Fix underlying bugs. mrb_calloc will be crashed in case "nelem == 0" or "p == NULL" --- src/gc.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/gc.c b/src/gc.c index 2663e9780..5f30570de 100644 --- a/src/gc.c +++ b/src/gc.c @@ -167,10 +167,15 @@ mrb_malloc(mrb_state *mrb, size_t len) void* mrb_calloc(mrb_state *mrb, size_t nelem, size_t len) { - void *p = mrb_realloc(mrb, 0, nelem*len); + void *p; + size_t size; + + size = nelem * len; + p = mrb_realloc(mrb, 0, size); + + if (p && size > 0) + memset(p, 0, size); - if (len > 0) - memset(p, 0, nelem*len); return p; } -- cgit v1.2.3 From a064038d85758c2e8add556f9aafa7823df53ef4 Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Sat, 7 Jul 2012 12:38:07 +0900 Subject: Add a check for unsigned integer wrapping. --- src/gc.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/gc.c b/src/gc.c index 5f30570de..2149a2d43 100644 --- a/src/gc.c +++ b/src/gc.c @@ -167,14 +167,16 @@ mrb_malloc(mrb_state *mrb, size_t len) void* mrb_calloc(mrb_state *mrb, size_t nelem, size_t len) { - void *p; + void *p = NULL; size_t size; - size = nelem * len; - p = mrb_realloc(mrb, 0, size); + if (nelem <= SIZE_MAX / len) { + size = nelem * len; + p = mrb_realloc(mrb, 0, size); - if (p && size > 0) - memset(p, 0, size); + if (p && size > 0) + memset(p, 0, size); + } return p; } -- cgit v1.2.3 From 312b2c7b160b4eab5a07897d36e5abd8a6748085 Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Sat, 7 Jul 2012 16:30:52 +0900 Subject: Optimize range check. --- src/array.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/array.c b/src/array.c index 981da7afb..29f58d17e 100644 --- a/src/array.c +++ b/src/array.c @@ -566,9 +566,11 @@ mrb_ary_set(mrb_state *mrb, mrb_value ary, mrb_int n, mrb_value val) /* rb_ary_s ary_modify(mrb, a); /* range check */ - if (n < 0) n += a->len; if (n < 0) { - mrb_raise(mrb, E_INDEX_ERROR, "index %ld out of array", n - a->len); + n += a->len; + if (n < 0) { + mrb_raise(mrb, E_INDEX_ERROR, "index %ld out of array", n - a->len); + } } if (a->len <= (int)n) { if (a->aux.capa <= (int)n) @@ -592,9 +594,11 @@ mrb_ary_splice(mrb_state *mrb, mrb_value ary, mrb_int head, mrb_int len, mrb_val ary_modify(mrb, a); /* range check */ - if (head < 0) head += a->len; if (head < 0) { - mrb_raise(mrb, E_INDEX_ERROR, "index is out of array"); + head += a->len; + if (head < 0) { + mrb_raise(mrb, E_INDEX_ERROR, "index is out of array"); + } } tail = head + len; -- cgit v1.2.3 From 9f814a4e6e6cadea676a875990786903e37b1a06 Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Sat, 7 Jul 2012 23:04:09 +0900 Subject: Improvement of Module#include. - Add some methods: append_features, included_methods and included. - Modify Module#include to call append_features and included. --- src/class.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 74 insertions(+), 13 deletions(-) diff --git a/src/class.c b/src/class.c index 7e0512322..9003c3bc5 100644 --- a/src/class.c +++ b/src/class.c @@ -641,32 +641,90 @@ boot_defclass(mrb_state *mrb, struct RClass *super) return c; } +static int +find_in_ancestors(struct RClass *c, struct RClass *m) +{ + while(c) { + if (c == m || c->mt == m->mt){ + return 1; + } + c = c->super; + } + return 0; +} + void mrb_include_module(mrb_state *mrb, struct RClass *c, struct RClass *m) { - struct RClass *ic; + struct RClass *ic, *ins_pos; - if (m->super) mrb_include_module(mrb, c, m->super); - ic = (struct RClass*)mrb_obj_alloc(mrb, MRB_TT_ICLASS, mrb->class_class); - ic->c = m; - ic->mt = m->mt; - ic->iv = m->iv; - ic->super = c->super; - c->super = ic; - mrb_field_write_barrier(mrb, (struct RBasic*)c, (struct RBasic*)ic); + ins_pos = c; + while (m) { + if (!find_in_ancestors(c, m)) { + ic = (struct RClass*)mrb_obj_alloc(mrb, MRB_TT_ICLASS, mrb->class_class); + if (m->tt == MRB_TT_ICLASS) { + ic->c = m->c; + } + else { + ic->c = m; + } + ic->mt = m->mt; + ic->iv = m->iv; + ic->super = ins_pos->super; + ins_pos->super = ic; + mrb_field_write_barrier(mrb, (struct RBasic*)ins_pos, (struct RBasic*)ic); + ins_pos = ic; + } + m = m->super; + } } static mrb_value -mrb_mod_include(mrb_state *mrb, mrb_value klass) +mrb_mod_append_features(mrb_state *mrb, mrb_value mod) { - mrb_value mod; + mrb_value klass; - mrb_get_args(mrb, "o", &mod); mrb_check_type(mrb, mod, MRB_TT_MODULE); + mrb_get_args(mrb, "o", &klass); mrb_include_module(mrb, mrb_class_ptr(klass), mrb_class_ptr(mod)); return mod; } +static mrb_value +mrb_mod_include(mrb_state *mrb, mrb_value klass) +{ + mrb_value *argv; + int argc, i; + + mrb_get_args(mrb, "*", &argv, &argc); + for (i=0; itt == MRB_TT_ICLASS) { + mrb_ary_push(mrb, result, mrb_obj_value(c->c)); + } + c = c->super; + } + + return result; +} + static struct RClass * mrb_singleton_class_ptr(mrb_state *mrb, struct RClass *c) { @@ -1323,7 +1381,10 @@ mrb_init_class(mrb_state *mrb) mrb_define_method(mrb, cls, "superclass", mrb_class_superclass, ARGS_NONE()); /* 15.2.3.3.4 */ mrb_define_method(mrb, cls, "new", mrb_instance_new, ARGS_ANY()); /* 15.2.3.3.3 */ mrb_define_method(mrb, cls, "inherited", mrb_bob_init, ARGS_REQ(1)); - mrb_define_method(mrb, mod, "include", mrb_mod_include, ARGS_REQ(1)); /* 15.2.2.4.27 */ + mrb_define_method(mrb, mod, "include", mrb_mod_include, ARGS_ANY()); /* 15.2.2.4.27 */ + mrb_define_method(mrb, mod, "append_features", mrb_mod_append_features, ARGS_REQ(1)); /* 15.2.2.4.10 */ + mrb_define_method(mrb, mod, "included", mrb_bob_init, ARGS_REQ(1)); /* 15.2.2.4.29 */ + mrb_define_method(mrb, mod, "included_modules", mrb_mod_included_modules, ARGS_NONE()); /* 15.2.2.4.30 */ mrb_define_method(mrb, mod, "to_s", mrb_mod_to_s, ARGS_NONE()); mrb_define_method(mrb, mod, "alias_method", mrb_mod_alias, ARGS_ANY()); /* 15.2.2.4.8 */ -- cgit v1.2.3 From becb7e98779914cdb1e5703ffe01ce408910523f Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 8 Jul 2012 00:19:40 +0900 Subject: .. is weaker than == --- test/t/bs_block.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/t/bs_block.rb b/test/t/bs_block.rb index 084d3b30f..654a9ba5c 100644 --- a/test/t/bs_block.rb +++ b/test/t/bs_block.rb @@ -66,7 +66,7 @@ assert('BS Block 7') do a = [m, n] ans << a end - end == 1..3 + end == (1..3) end assert('BS Block 8') do -- cgit v1.2.3 From 0d99856b57f172948c4e579c8f96cc19aa3d8568 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 8 Jul 2012 00:20:56 +0900 Subject: proper type check when creating a range; #345 --- src/range.c | 58 ++++++++++++++++++++++++------------------------------ test/t/bs_block.rb | 2 +- 2 files changed, 27 insertions(+), 33 deletions(-) diff --git a/src/range.c b/src/range.c index 34ca79a0d..a26d38e22 100644 --- a/src/range.c +++ b/src/range.c @@ -21,6 +21,30 @@ #define RANGE_CLASS (mrb_class_obj_get(mrb, "Range")) +static void +range_check(mrb_state *mrb, mrb_value a, mrb_value b) +{ + mrb_value ans; + + switch (mrb_type(a)) { + case MRB_TT_FIXNUM: + case MRB_TT_FLOAT: + switch (mrb_type(b)) { + case MRB_TT_FIXNUM: + case MRB_TT_FLOAT: + return; + } + } + + mrb_p(mrb, a); + mrb_p(mrb, b); + ans = mrb_funcall(mrb, a, "<=>", 1, b); + if (mrb_nil_p(ans)) { + /* can not be compared */ + mrb_raise(mrb, E_ARGUMENT_ERROR, "bad value for range"); + } +} + mrb_value mrb_range_new(mrb_state *mrb, mrb_value beg, mrb_value end, int excl) { @@ -28,6 +52,7 @@ mrb_range_new(mrb_state *mrb, mrb_value beg, mrb_value end, int excl) r = (struct RRange*)mrb_obj_alloc(mrb, MRB_TT_RANGE, RANGE_CLASS); r->edges = mrb_malloc(mrb, sizeof(struct mrb_range_edges)); + range_check(mrb, beg, end); r->edges->beg = beg; r->edges->end = end; r->excl = excl; @@ -82,39 +107,12 @@ mrb_range_excl(mrb_state *mrb, mrb_value range) return r->excl ? mrb_true_value() : mrb_false_value(); } -/* - * call-seq: - * beg end - * args[0] <= args[1] => true - * args[0] > args[1] => false - */ -static int -range_check(mrb_state *mrb, mrb_value *args) -{ - mrb_value ans = mrb_funcall(mrb, args[0], "<=>", 1, args[1]); - /* beg end - ans :args[0] < args[1] => -1 - args[0] = args[1] => 0 - args[0] > args[1] => +1 */ - if (mrb_nil_p(ans)) return FALSE; - //if (mrb_obj_equal(mrb, ans, mrb_fixnum_value(1))) return FALSE; - if (mrb_fixnum(ans) == 1) return FALSE; - return TRUE; -} - static void range_init(mrb_state *mrb, mrb_value range, mrb_value beg, mrb_value end, mrb_int exclude_end) { - mrb_value args[2]; struct RRange *r = mrb_range_ptr(range); - if ((mrb_type(beg) != MRB_TT_FIXNUM) || (mrb_type(end) != MRB_TT_FIXNUM)) { - args[0] = beg; - args[1] = end; - if (!range_check(mrb, args)) { - printf("range_failed()\n"); - } - } + range_check(mrb, beg, end); r->excl = exclude_end; r->edges->beg = beg; r->edges->end = end; @@ -166,7 +164,6 @@ mrb_range_eq(mrb_state *mrb, mrb_value range) if (mrb_obj_equal(mrb, range, obj)) return mrb_true_value(); /* same class? */ - // if (!rb_obj_is_instance_of(obj, rb_obj_class(range))) if (!mrb_obj_is_instance_of(mrb, obj, mrb_obj_class(mrb, range))) return mrb_false_value(); @@ -199,12 +196,10 @@ r_le(mrb_state *mrb, mrb_value a, mrb_value b) static int r_gt(mrb_state *mrb, mrb_value a, mrb_value b) { - //int c; mrb_value r = mrb_funcall(mrb, a, "<=>", 1, b); /* output :a < b => -1, a = b => 0, a > b => +1 */ if (mrb_nil_p(r)) return FALSE; - if (mrb_obj_equal(mrb, r, mrb_fixnum_value(1))) return TRUE; return FALSE; } @@ -212,7 +207,6 @@ r_gt(mrb_state *mrb, mrb_value a, mrb_value b) static int r_ge(mrb_state *mrb, mrb_value a, mrb_value b) { - //int c; mrb_value r = mrb_funcall(mrb, a, "<=>", 1, b); /* compare result */ /* output :a < b => -1, a = b => 0, a > b => +1 */ diff --git a/test/t/bs_block.rb b/test/t/bs_block.rb index 654a9ba5c..bef9a8564 100644 --- a/test/t/bs_block.rb +++ b/test/t/bs_block.rb @@ -62,7 +62,7 @@ end assert('BS Block 7') do ans = [] for m in 1..3 - for n in 1..3 + for n in 2..4 a = [m, n] ans << a end -- cgit v1.2.3 From 0c10becf91cdd584a8072501a514695aaa049ec2 Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Sun, 8 Jul 2012 04:44:55 +0800 Subject: Add tests for Modules #append_features, #include, #included and #included_modules --- test/t/module.rb | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/test/t/module.rb b/test/t/module.rb index 95fbb7a86..63c2e7dc8 100644 --- a/test/t/module.rb +++ b/test/t/module.rb @@ -9,6 +9,23 @@ assert('Module superclass', '15.2.2.2') do Module.superclass == Object end +# TODO not implemented ATM assert('Module.constants', '15.2.2.3.1') do + +# TODO not implemented ATM assert('Module.nesting', '15.2.2.3.2') do + +assert('Module#append_features', '15.2.2.4.10') do + module Test4AppendFeatures + def self.append_features(mod) + Test4AppendFeatures2.const_set(:Const4AppendFeatures2, mod) + end + end + module Test4AppendFeatures2 + include Test4AppendFeatures + end + + Test4AppendFeatures2.const_get(:Const4AppendFeatures2) == Test4AppendFeatures2 +end + assert('Module#const_defined?', '15.2.2.4.20') do module Test4ConstDefined Const4Test4ConstDefined = true @@ -56,6 +73,41 @@ assert('Module#const_get', '15.2.2.4.23') do Test4ConstSet.const_get(:Const4Test4ConstSet) == 23 end -# TODO not implemented ATM assert('Module.constants', '15.2.2') do +assert('Module#include', '15.2.2.4.27') do + module Test4Include + Const4Include = 42 + end + module Test4Include2 + include Test4Include + end + + Test4Include2.const_get(:Const4Include) == 42 +end + +assert('Module#included', '15.2.2.4.29') do + module Test4Included + Const4Included = 42 + def Test4Included.included mod + Test4Included.const_set(:Const4Included2, mod) + end + end + module Test4Included2 + include Test4Included + end + + Test4Included2.const_get(:Const4Included) == 42 and + Test4Included2.const_get(:Const4Included2) == Test4Included2 +end + +assert('Module#included_modules', '15.2.2.4.30') do + r1 = true + module Test4includedModules + Const4Included = 42 + end + module Test4includedModules2 + r1 = included Test4includedModules + end + + Test4includedModules2.included_modules.class == Array +end -# TODO not implemented ATM assert('Module.nesting', '15.2.2') do -- cgit v1.2.3 From 611cf71a10051d77a7bb8998d8a7c34e26b0b1b0 Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Sun, 8 Jul 2012 11:33:49 +0900 Subject: Use mrb_calloc if you want zero cleard buffers. --- src/array.c | 3 +-- src/dump.c | 7 ++----- src/gc.c | 4 +--- src/parse.y | 3 +-- src/state.c | 3 +-- src/vm.c | 6 ++---- 6 files changed, 8 insertions(+), 18 deletions(-) diff --git a/src/array.c b/src/array.c index 29f58d17e..d65a99cc4 100644 --- a/src/array.c +++ b/src/array.c @@ -46,8 +46,7 @@ ary_new_capa(mrb_state *mrb, int capa) } a = (struct RArray*)mrb_obj_alloc(mrb, MRB_TT_ARRAY, mrb->array_class); - a->ptr = mrb_malloc(mrb, blen); - memset(a->ptr, 0, blen); + a->ptr = mrb_calloc(mrb, blen, 1); a->aux.capa = capa; a->len = 0; diff --git a/src/dump.c b/src/dump.c index 0e40cf3ed..a720090fa 100644 --- a/src/dump.c +++ b/src/dump.c @@ -460,11 +460,10 @@ calc_crc_section(mrb_state *mrb, mrb_irep *irep, uint16_t *crc, int section) default: return MRB_DUMP_GENERAL_FAILURE; } - if ((buf = mrb_malloc(mrb, buf_size)) == 0) + if ((buf = mrb_calloc(mrb, 1, buf_size)) == 0) return MRB_DUMP_GENERAL_FAILURE; buf_top = buf; - memset(buf, 0, buf_size); switch (section) { case DUMP_IREP_HEADER: buf += write_irep_header(mrb, irep, buf, type); break; @@ -598,11 +597,9 @@ dump_irep_record(mrb_state *mrb, int irep_no, FILE* fp, uint32_t *rlen) if (irep_record_size == 0) return MRB_DUMP_GENERAL_FAILURE; - if ((buf = mrb_malloc(mrb, irep_record_size)) == 0) + if ((buf = mrb_calloc(mrb, 1, irep_record_size)) == 0) return MRB_DUMP_GENERAL_FAILURE; - memset( buf, 0, irep_record_size); - if ((rc = write_irep_record(mrb, irep_no, buf, rlen, DUMP_TYPE_HEX)) != MRB_DUMP_OK) { rc = MRB_DUMP_GENERAL_FAILURE; goto error_exit; diff --git a/src/gc.c b/src/gc.c index 2149a2d43..78d8ee6a9 100644 --- a/src/gc.c +++ b/src/gc.c @@ -246,12 +246,10 @@ unlink_free_heap_page(mrb_state *mrb, struct heap_page *page) static void add_heap(mrb_state *mrb) { - struct heap_page *page = mrb_malloc(mrb, sizeof(struct heap_page)); + struct heap_page *page = mrb_calloc(mrb, 1, sizeof(struct heap_page)); RVALUE *p, *e; struct RBasic *prev = NULL; - memset(page, 0, sizeof(struct heap_page)); - for (p = page->objects, e=p+HEAP_PAGE_SIZE; pas.free.tt = MRB_TT_FREE; p->as.free.next = prev; diff --git a/src/parse.y b/src/parse.y index af91f09b6..dd1738010 100644 --- a/src/parse.y +++ b/src/parse.y @@ -4792,8 +4792,7 @@ mrbc_context_new(mrb_state *mrb) { mrbc_context *c; - c = mrb_malloc(mrb, sizeof(mrbc_context)); - memset(c, 0, sizeof(mrbc_context)); + c = mrb_calloc(mrb, 1, sizeof(mrbc_context)); return c; } diff --git a/src/state.c b/src/state.c index e4729ca70..7f74606ff 100644 --- a/src/state.c +++ b/src/state.c @@ -76,8 +76,7 @@ mrb_add_irep(mrb_state *mrb, int idx) int max = 256; if (idx > max) max = idx+1; - mrb->irep = mrb_malloc(mrb, sizeof(mrb_irep*)*max); - memset(mrb->irep, 0, sizeof(mrb_irep*)*max); + mrb->irep = mrb_calloc(mrb, max, sizeof(mrb_irep*)); mrb->irep_capa = max; } else if (mrb->irep_capa <= idx) { diff --git a/src/vm.c b/src/vm.c index 62fba24d0..9ee6b9883 100644 --- a/src/vm.c +++ b/src/vm.c @@ -28,16 +28,14 @@ static void stack_init(mrb_state *mrb) { /* assert(mrb->stack == NULL); */ - mrb->stbase = mrb_malloc(mrb, sizeof(mrb_value) * STACK_INIT_SIZE); - memset(mrb->stbase, 0, sizeof(mrb_value) * STACK_INIT_SIZE); + mrb->stbase = mrb_calloc(mrb, STACK_INIT_SIZE, sizeof(mrb_value)); mrb->stend = mrb->stbase + STACK_INIT_SIZE; mrb->stack = mrb->stbase; /* assert(mrb->ci == NULL); */ - mrb->cibase = mrb_malloc(mrb, sizeof(mrb_callinfo)*CALLINFO_INIT_SIZE); + mrb->cibase = mrb_calloc(mrb, CALLINFO_INIT_SIZE, sizeof(mrb_callinfo)); mrb->ciend = mrb->cibase + CALLINFO_INIT_SIZE; mrb->ci = mrb->cibase; - memset(mrb->ci, 0, sizeof(mrb_callinfo)); mrb->ci->target_class = mrb->object_class; } -- cgit v1.2.3 From 0e2a81740a284e823894ec5b1d804e282df15b7e Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 9 Jul 2012 11:42:15 +0900 Subject: we don't need xmalloc; close #356 --- include/mruby.h | 7 ------- 1 file changed, 7 deletions(-) diff --git a/include/mruby.h b/include/mruby.h index 0acd20842..a9027d896 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -467,13 +467,6 @@ mrb_value mrb_yield_with_self(mrb_state *mrb, mrb_value b, int argc, mrb_value * mrb_value mrb_class_new_instance(mrb_state *mrb, int, mrb_value*, struct RClass *); mrb_value mrb_class_new_instance_m(mrb_state *mrb, mrb_value klass); -#ifndef xmalloc -#define xmalloc malloc -#define xrealloc realloc -#define xcalloc calloc -#define xfree free -#endif - void mrb_gc_protect(mrb_state *mrb, mrb_value obj); mrb_value mrb_to_int(mrb_state *mrb, mrb_value val); void mrb_check_type(mrb_state *mrb, mrb_value x, enum mrb_vtype t); -- cgit v1.2.3 From 7496625fc3b2f306e97c8ef12f67a92693e13bf8 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 9 Jul 2012 11:50:48 +0900 Subject: initialize stuctures on stack without memset(); close #350 --- src/load.c | 4 ++-- src/time.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/load.c b/src/load.c index eb9cd119c..c1c0a7eed 100644 --- a/src/load.c +++ b/src/load.c @@ -248,12 +248,12 @@ mrb_load_irep(mrb_state *mrb, FILE* fp) unsigned char hex8[8], hcrc[4]; unsigned char *dst, *rite_dst = NULL; rite_binary_header bin_header; - RiteFILE ritefp, *rfp; + RiteFILE ritefp = { 0 }; + RiteFILE *rfp; if ((mrb == NULL) || (fp == NULL)) { return MRB_DUMP_INVALID_ARGUMENT; } - memset(&ritefp, 0, sizeof(ritefp)); ritefp.fp = fp; rfp = &ritefp; diff --git a/src/time.c b/src/time.c index 3da824e82..a8033f95d 100644 --- a/src/time.c +++ b/src/time.c @@ -239,7 +239,7 @@ time_mktime(mrb_state *mrb, mrb_int ayear, mrb_int amonth, mrb_int aday, enum mrb_timezone timezone) { time_t nowsecs; - struct tm nowtime; + struct tm nowtime = { 0 }; memset(&nowtime, 0, sizeof(struct tm)); nowtime.tm_year = (int)ayear - 1900; -- cgit v1.2.3 From 158e1e6fcea3e39cb0e7af3b82d11fdaee36f68a Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 9 Jul 2012 13:28:13 +0900 Subject: should remove memset initialization; update 7496625 --- src/time.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/time.c b/src/time.c index a8033f95d..45e796069 100644 --- a/src/time.c +++ b/src/time.c @@ -241,7 +241,6 @@ time_mktime(mrb_state *mrb, mrb_int ayear, mrb_int amonth, mrb_int aday, time_t nowsecs; struct tm nowtime = { 0 }; - memset(&nowtime, 0, sizeof(struct tm)); nowtime.tm_year = (int)ayear - 1900; nowtime.tm_mon = (int)amonth - 1; nowtime.tm_mday = (int)aday; -- cgit v1.2.3 From beda4d928a98231ddb81b32f1609228bdc00d647 Mon Sep 17 00:00:00 2001 From: suzukaze Date: Tue, 10 Jul 2012 00:31:45 +0900 Subject: replace Tab with spaces in src/parse.y --- src/parse.y | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/parse.y b/src/parse.y index af8b93cfa..c68bcb0bb 100644 --- a/src/parse.y +++ b/src/parse.y @@ -43,20 +43,20 @@ static void backref_error(parser_state *p, node *n); typedef unsigned int stack_type; -#define BITSTACK_PUSH(stack, n) ((stack) = ((stack)<<1)|((n)&1)) -#define BITSTACK_POP(stack) ((stack) = (stack) >> 1) -#define BITSTACK_LEXPOP(stack) ((stack) = ((stack) >> 1) | ((stack) & 1)) -#define BITSTACK_SET_P(stack) ((stack)&1) - -#define COND_PUSH(n) BITSTACK_PUSH(p->cond_stack, (n)) -#define COND_POP() BITSTACK_POP(p->cond_stack) -#define COND_LEXPOP() BITSTACK_LEXPOP(p->cond_stack) -#define COND_P() BITSTACK_SET_P(p->cond_stack) - -#define CMDARG_PUSH(n) BITSTACK_PUSH(p->cmdarg_stack, (n)) -#define CMDARG_POP() BITSTACK_POP(p->cmdarg_stack) -#define CMDARG_LEXPOP() BITSTACK_LEXPOP(p->cmdarg_stack) -#define CMDARG_P() BITSTACK_SET_P(p->cmdarg_stack) +#define BITSTACK_PUSH(stack, n) ((stack) = ((stack)<<1)|((n)&1)) +#define BITSTACK_POP(stack) ((stack) = (stack) >> 1) +#define BITSTACK_LEXPOP(stack) ((stack) = ((stack) >> 1) | ((stack) & 1)) +#define BITSTACK_SET_P(stack) ((stack)&1) + +#define COND_PUSH(n) BITSTACK_PUSH(p->cond_stack, (n)) +#define COND_POP() BITSTACK_POP(p->cond_stack) +#define COND_LEXPOP() BITSTACK_LEXPOP(p->cond_stack) +#define COND_P() BITSTACK_SET_P(p->cond_stack) + +#define CMDARG_PUSH(n) BITSTACK_PUSH(p->cmdarg_stack, (n)) +#define CMDARG_POP() BITSTACK_POP(p->cmdarg_stack) +#define CMDARG_LEXPOP() BITSTACK_LEXPOP(p->cmdarg_stack) +#define CMDARG_P() BITSTACK_SET_P(p->cmdarg_stack) static mrb_sym intern_gen(parser_state *p, const char *s) -- cgit v1.2.3 From b9215a01f924262a22d178cae378367c6bdc75a3 Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Mon, 9 Jul 2012 01:10:05 +0900 Subject: Add ary_modify to prevent corrupting shared array. --- src/array.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/array.c b/src/array.c index d65a99cc4..ec687bbf3 100644 --- a/src/array.c +++ b/src/array.c @@ -739,6 +739,7 @@ mrb_ary_delete_at(mrb_state *mrb, mrb_value self) if (index < 0) index += a->len; if (index < 0 || a->len <= (int)index) return mrb_nil_value(); + ary_modify(mrb, a); val = a->ptr[index]; ptr = a->ptr + index; @@ -850,6 +851,7 @@ mrb_ary_clear(mrb_state *mrb, mrb_value self) struct RArray *a = mrb_ary_ptr(self); a->len = 0; + ary_modify(mrb, a); ary_shrink_capa(mrb, a); return self; -- cgit v1.2.3 From 6b165d1b40f849e8f1ebdadabc1aaa0da057d6c9 Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Tue, 10 Jul 2012 01:25:56 +0900 Subject: Could you add me to AUTHORS? --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index 46d3e22f1..c1128a46c 100644 --- a/AUTHORS +++ b/AUTHORS @@ -7,3 +7,4 @@ Original Authors "mruby developers" are: Jon Maken Bjorn De Meyer Yuichiro MASUI + Masamitsu MURASE -- cgit v1.2.3 From e8b53090803caef8b20ff6f7cc17e3eb472a521e Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Tue, 10 Jul 2012 15:11:31 +0800 Subject: Add a Test Case for #359 Array Corruption --- test/t/array.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/t/array.rb b/test/t/array.rb index 3f441c1cc..a1ef830a2 100644 --- a/test/t/array.rb +++ b/test/t/array.rb @@ -243,3 +243,11 @@ assert('Array#to_s', '15.2.12.5.31') do end # Not ISO specified + +assert("Array (Shared Array Corruption)") do + a = [ "a", "b", "c", "d", "e", "f" ] + b = a.slice(1, 3) + a.clear + b.clear +end + -- cgit v1.2.3 From 0ebf5c0a6f76da27212b36c908c4187289d6fc24 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 11 Jul 2012 18:40:37 +0900 Subject: local variable order was screwed up in parser_init_cxt(); close #360 --- src/parse.y | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/parse.y b/src/parse.y index 97c2e6d2e..fe8752ec2 100644 --- a/src/parse.y +++ b/src/parse.y @@ -4683,11 +4683,11 @@ parser_init_cxt(parser_state *p, mrbc_context *cxt) if (cxt->lineno) p->lineno = cxt->lineno; if (cxt->filename) p->filename = cxt->filename; if (cxt->syms) { - int len = cxt->slen; + int i; p->locals = cons(0,0); - while (len--) { - local_add_f(p, cxt->syms[len]); + for (i=0; islen; i++) { + local_add_f(p, cxt->syms[i]); } } p->capture_errors = cxt->capture_errors; -- cgit v1.2.3 From 9e64e753a227e85425c990283117129d3a5fd625 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 12 Jul 2012 23:59:13 +0900 Subject: remove double stdio.h inclusion --- include/mruby/compile.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/mruby/compile.h b/include/mruby/compile.h index 42820896e..e3361feed 100644 --- a/include/mruby/compile.h +++ b/include/mruby/compile.h @@ -14,7 +14,6 @@ extern "C" { #include "mruby.h" #include #include -#include /* load context */ typedef struct mrbc_context { -- cgit v1.2.3 From ae2cd24afbf69e6e4c98ac8e642cb078e9d3750b Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Fri, 13 Jul 2012 00:24:44 +0900 Subject: remove st.h inclusion --- src/parse.y | 1 - src/re.h | 1 + src/string.c | 1 - src/variable.c | 1 - 4 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/parse.y b/src/parse.y index fe8752ec2..292e60cfa 100644 --- a/src/parse.y +++ b/src/parse.y @@ -22,7 +22,6 @@ #include "mruby/compile.h" #include "mruby/proc.h" #include "node.h" -#include "st.h" #include #include diff --git a/src/re.h b/src/re.h index 238b4e408..91bd1abc1 100644 --- a/src/re.h +++ b/src/re.h @@ -13,6 +13,7 @@ #include "node.h" #include "regex.h" #include "encoding.h" +#include "st.h" #define BEG(no) regs->beg[no] #define END(no) regs->end[no] diff --git a/src/string.c b/src/string.c index b2cdc1212..2b7bdb454 100644 --- a/src/string.c +++ b/src/string.c @@ -19,7 +19,6 @@ #include "re.h" #ifdef ENABLE_REGEXP #include "regex.h" -#include "st.h" #endif //ENABLE_REGEXP const char mrb_digitmap[] = "0123456789abcdefghijklmnopqrstuvwxyz"; diff --git a/src/variable.c b/src/variable.c index e785d56b7..33c9c0249 100644 --- a/src/variable.c +++ b/src/variable.c @@ -16,7 +16,6 @@ #ifdef ENABLE_REGEXP #include "re.h" -#include "st.h" #endif static void -- cgit v1.2.3 From fbd5305c1b2a6e29b866c5f87649e8a8faa6a14d Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Fri, 13 Jul 2012 10:11:11 +0900 Subject: remove comma from OP_ERR --- src/codegen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/codegen.c b/src/codegen.c index 3236713e2..00c6b566d 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -2310,7 +2310,7 @@ codedump(mrb_state *mrb, int n) printf("OP_TCLASS\tR%d\n", GETARG_A(c)); break; case OP_ERR: - printf("OP_ERR\t:L(%d)\n", GETARG_Bx(c)); + printf("OP_ERR\tL(%d)\n", GETARG_Bx(c)); break; case OP_EPUSH: printf("OP_EPUSH\t:I(%d)\n", n+GETARG_Bx(c)); -- cgit v1.2.3 From 48c73ac630c2bfb3326d608d3c00e544dcfbcfea Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Fri, 13 Jul 2012 10:13:47 +0900 Subject: less --- src/etc.c | 1 - src/gc.c | 1 - src/hash.c | 1 - src/kernel.c | 1 - src/pool.c | 1 - src/range.c | 2 -- src/string.c | 2 +- src/symbol.c | 1 - src/variable.c | 1 - 9 files changed, 1 insertion(+), 10 deletions(-) diff --git a/src/etc.c b/src/etc.c index 73cf31087..7e9381d16 100644 --- a/src/etc.c +++ b/src/etc.c @@ -126,7 +126,6 @@ mrb_block_proc(void) return mrb_nil_value();//proc_new(mrb_cProc, FALSE); } -#include static mrb_int float_id(mrb_float f) { diff --git a/src/gc.c b/src/gc.c index 78d8ee6a9..ada0bf31f 100644 --- a/src/gc.c +++ b/src/gc.c @@ -13,7 +13,6 @@ #include "mruby/range.h" #include "mruby/khash.h" #include -#include #include "mruby/struct.h" #include "mruby/proc.h" #include "mruby/data.h" diff --git a/src/hash.c b/src/hash.c index 888a1917e..ed8b70270 100644 --- a/src/hash.c +++ b/src/hash.c @@ -12,7 +12,6 @@ #include "mruby/string.h" #include "mruby/variable.h" #include -#include static inline khint_t mrb_hash_ht_hash_func(mrb_state *mrb, mrb_value key) diff --git a/src/kernel.c b/src/kernel.c index d230305da..1040dbe05 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -7,7 +7,6 @@ #include "mruby.h" #include "mruby/string.h" #include -#include #include #include "mruby/proc.h" #include "mruby/range.h" diff --git a/src/pool.c b/src/pool.c index 612bbe647..0f1baa776 100644 --- a/src/pool.c +++ b/src/pool.c @@ -35,7 +35,6 @@ struct mrb_pool { #undef TEST_POOL #ifdef TEST_POOL -#include #define mrb_malloc(m,s) malloc(s) #define mrb_free(m,p) free(p) diff --git a/src/range.c b/src/range.c index 1514313f1..b4d743e5f 100644 --- a/src/range.c +++ b/src/range.c @@ -11,8 +11,6 @@ #include "error.h" #include "mruby/numeric.h" #include "mruby/string.h" - -#include #include #ifndef OTHER diff --git a/src/string.c b/src/string.c index 2b7bdb454..14da83c51 100644 --- a/src/string.c +++ b/src/string.c @@ -16,8 +16,8 @@ #include "mruby/class.h" #include "mruby/variable.h" #include -#include "re.h" #ifdef ENABLE_REGEXP +#include "re.h" #include "regex.h" #endif //ENABLE_REGEXP diff --git a/src/symbol.c b/src/symbol.c index d2ae09655..91076e293 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -14,7 +14,6 @@ #include #include "mruby/class.h" #include "mruby/variable.h" -#include /* ------------------------------------------------------ */ typedef struct symbol_name { diff --git a/src/variable.c b/src/variable.c index 33c9c0249..e2f3a7d08 100644 --- a/src/variable.c +++ b/src/variable.c @@ -4,7 +4,6 @@ ** See Copyright Notice in mruby.h */ -#include #include "mruby.h" #include "mruby/class.h" #include "mruby/khash.h" -- cgit v1.2.3 From bbec03bb7af3fb0277a267e4ec5d38b58aa5cb46 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Fri, 13 Jul 2012 14:35:18 +0900 Subject: add missing (empty) default for swtch; close #364 --- src/class.c | 3 +++ src/codegen.c | 4 ++++ src/parse.y | 7 ++++++- src/range.c | 4 ++++ src/symbol.c | 4 +++- tools/mrbc/mrbc.c | 2 ++ tools/mruby/mruby.c | 2 ++ 7 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/class.c b/src/class.c index 9003c3bc5..783627a7d 100644 --- a/src/class.c +++ b/src/class.c @@ -620,6 +620,9 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) } } break; + default: + mrb_raise(mrb, E_ARGUMENT_ERROR, "invalide argument specifier %c", c); + break; } } if (!c && argc > i) { diff --git a/src/codegen.c b/src/codegen.c index 00c6b566d..3ef52a0d4 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -207,6 +207,8 @@ genop_peep(codegen_scope *s, mrb_code i, int val) return; } break; + default: + break; } break; case OP_SETIV: @@ -240,6 +242,8 @@ genop_peep(codegen_scope *s, mrb_code i, int val) return; } break; + default: + break; } } genop(s, i); diff --git a/src/parse.y b/src/parse.y index 292e60cfa..13643f68e 100644 --- a/src/parse.y +++ b/src/parse.y @@ -3041,6 +3041,8 @@ backref_error(parser_state *p, node *n) case NODE_BACK_REF: yyerror_i(p, "can't set variable $%c", (int)(intptr_t)n->cdr); break; + default: + break; } } @@ -3722,7 +3724,7 @@ parser_yylex(parser_state *p) } if (isspace(c)) { if (!IS_ARG()) { - int c2 = 0; + int c2; switch (c) { case ' ': c2 = 's'; @@ -3742,6 +3744,9 @@ parser_yylex(parser_state *p) case '\f': c2 = 'f'; break; + default: + c2 = 0; + break; } if (c2) { char buf[256]; diff --git a/src/range.c b/src/range.c index b4d743e5f..703ad12aa 100644 --- a/src/range.c +++ b/src/range.c @@ -31,7 +31,11 @@ range_check(mrb_state *mrb, mrb_value a, mrb_value b) case MRB_TT_FIXNUM: case MRB_TT_FLOAT: return; + default: + break; } + default: + break; } mrb_p(mrb, a); diff --git a/src/symbol.c b/src/symbol.c index 91076e293..baab0fb3c 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -276,6 +276,7 @@ symname_p(const char *name) case '>': switch (*++m) { case '>': case '=': ++m; break; + default: break; } break; @@ -319,7 +320,8 @@ id: while (is_identchar(*m)) m += 1; if (localid) { switch (*m) { - case '!': case '?': case '=': ++m; + case '!': case '?': case '=': ++m; + default: break; } } break; diff --git a/tools/mrbc/mrbc.c b/tools/mrbc/mrbc.c index 55e2fcf32..8da37832a 100644 --- a/tools/mrbc/mrbc.c +++ b/tools/mrbc/mrbc.c @@ -114,6 +114,8 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args) } else return -3; return 0; + default: + break; } } else if (args->rfp == NULL) { diff --git a/tools/mruby/mruby.c b/tools/mruby/mruby.c index 3628e79c9..12cdc86e9 100644 --- a/tools/mruby/mruby.c +++ b/tools/mruby/mruby.c @@ -110,6 +110,8 @@ append_cmdline: } else return -3; return 0; + default: + break; } } -- cgit v1.2.3 From 737eaea038af56794b8fdb5a66bb4138dbd446f6 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Fri, 13 Jul 2012 15:00:45 +0900 Subject: allow DISABLE/ENABLE_SATDIO --- include/mrbconf.h | 4 ++++ src/codegen.c | 8 ++++++++ src/object.c | 10 ++-------- src/parse.y | 7 ++++++- src/vm.c | 4 ++++ 5 files changed, 24 insertions(+), 9 deletions(-) diff --git a/include/mrbconf.h b/include/mrbconf.h index 4ed481e0b..5d307e66f 100644 --- a/include/mrbconf.h +++ b/include/mrbconf.h @@ -19,6 +19,7 @@ //#define DISABLE_MATH /* Math functions */ //#define DISABLE_TIME /* Time class */ //#define DISABLE_STRUCT /* Struct class */ +//#define DISABLE_STDIO /* use of stdio */ #undef HAVE_UNISTD_H /* WINDOWS */ #define HAVE_UNISTD_H /* LINUX */ @@ -50,6 +51,9 @@ typedef intptr_t mrb_sym; #ifndef DISABLE_STRUCT #define ENABLE_STRUCT #endif +#ifndef DISABLE_STDIO +#define ENABLE_STDIO +#endif #ifndef FALSE # define FALSE 0 diff --git a/src/codegen.c b/src/codegen.c index 3ef52a0d4..6db09f310 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -94,7 +94,9 @@ codegen_error(codegen_scope *s, const char *message) s = s->prev; } mrb_pool_close(s->mpool); +#ifdef ENABLE_STDIO fprintf(stderr, "codegen error: %s\n", message); +#endif longjmp(s->jmp, 1); } @@ -270,7 +272,9 @@ dispatch(codegen_scope *s, int pc) case OP_ONERR: break; default: +#ifdef ENABLE_STDIO fprintf(stderr, "bug: dispatch on non JMP op\n"); +#endif scope_error(s); } s->iseq[pc] = MKOP_AsBx(c, GETARG_A(i), diff); @@ -739,7 +743,9 @@ gen_assignment(codegen_scope *s, node *node, int sp, int val) break; default: +#ifdef ENABLE_STDIO printf("unknown lhs %d\n", type); +#endif break; } if (val) push(); @@ -2047,6 +2053,7 @@ loop_pop(codegen_scope *s, int val) static void codedump(mrb_state *mrb, int n) { +#ifdef ENABLE_STDIO mrb_irep *irep = mrb->irep[n]; int i; mrb_code c; @@ -2342,6 +2349,7 @@ codedump(mrb_state *mrb, int n) } } printf("\n"); +#endif } void diff --git a/src/object.c b/src/object.c index eb63c1293..29684b118 100644 --- a/src/object.c +++ b/src/object.c @@ -403,11 +403,6 @@ mrb_check_type(mrb_state *mrb, mrb_value x, enum mrb_vtype t) struct RString *s; int xt; - /*if (x == Qundef) { - //mrb_bug("undef leaked to the Ruby space"); - printf ("undef leaked to the Ruby space\n"); - }*/ - xt = mrb_type(x); if ((xt != t) || (xt == MRB_TT_DATA)) { while (type->type < MRB_TT_MAXDEFINE) { @@ -431,12 +426,11 @@ mrb_check_type(mrb_state *mrb, mrb_value x, enum mrb_vtype t) etype = mrb_obj_classname(mrb, x); } mrb_raise(mrb, E_TYPE_ERROR, "wrong argument type %s (expected %s)", - etype, type->name); + etype, type->name); } type++; } - /*mrb_bug("unknown type 0x%x", t);*/ - printf ("unknown type 0x%x (0x%x given)", t, mrb_type(x)); + mrb_raise(mrb, E_TYPE_ERROR, "unknown type 0x%x (0x%x given)", t, mrb_type(x)); } } diff --git a/src/parse.y b/src/parse.y index 13643f68e..8d626b5d8 100644 --- a/src/parse.y +++ b/src/parse.y @@ -2964,12 +2964,14 @@ yyerror(parser_state *p, const char *s) int n; if (! p->capture_errors) { +#ifdef ENABLE_STDIO if (p->filename) { fprintf(stderr, "%s:%d:%d: %s\n", p->filename, p->lineno, p->column, s); } else { fprintf(stderr, "line %d:%d: %s\n", p->lineno, p->column, s); } +#endif } else if (p->nerr < sizeof(p->error_buffer) / sizeof(p->error_buffer[0])) { n = strlen(s); @@ -2998,12 +3000,14 @@ yywarn(parser_state *p, const char *s) int n; if (! p->capture_errors) { +#ifdef ENABLE_STDIO if (p->filename) { fprintf(stderr, "%s:%d:%d: %s\n", p->filename, p->lineno, p->column, s); } else { fprintf(stderr, "line %d:%d: %s\n", p->lineno, p->column, s); } +#endif } else if (p->nerr < sizeof(p->warn_buffer) / sizeof(p->warn_buffer[0])) { n = strlen(s); @@ -4943,6 +4947,7 @@ dump_recur(mrb_state *mrb, node *tree, int offset) void parser_dump(mrb_state *mrb, node *tree, int offset) { +#ifdef ENABLE_STDIO int n; if (!tree) return; @@ -5631,7 +5636,7 @@ parser_dump(mrb_state *mrb, node *tree, int offset) printf("node type: %d (0x%x)\n", (int)n, (int)n); break; } - return; +#endif } #ifdef PARSER_TEST diff --git a/src/vm.c b/src/vm.c index 9ee6b9883..ef323f785 100644 --- a/src/vm.c +++ b/src/vm.c @@ -1577,7 +1577,11 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) CASE(OP_DEBUG) { /* A debug print R(A),R(B),R(C) */ +#ifdef ENABLE_STDIO printf("OP_DEBUG %d %d %d\n", GETARG_A(i), GETARG_B(i), GETARG_C(i)); +#else + abort(); +#endif NEXT; } -- cgit v1.2.3 From 8e1c842b7e17ecb58e25e48e0cac253bceb00f14 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Fri, 13 Jul 2012 15:36:43 +0900 Subject: simpify mruby/mrbc using context --- include/mruby/compile.h | 2 ++ src/parse.y | 20 ++++++++++++----- tools/mrbc/mrbc.c | 24 ++++++++------------ tools/mruby/mruby.c | 58 ++++++++++++++++++++----------------------------- 4 files changed, 49 insertions(+), 55 deletions(-) diff --git a/include/mruby/compile.h b/include/mruby/compile.h index e3361feed..4dd369adb 100644 --- a/include/mruby/compile.h +++ b/include/mruby/compile.h @@ -22,6 +22,8 @@ typedef struct mrbc_context { char *filename; int lineno; int capture_errors:1; + int dump_result:1; + int no_exec:1; } mrbc_context; mrbc_context* mrbc_context_new(mrb_state *mrb); diff --git a/src/parse.y b/src/parse.y index 8d626b5d8..5a22b3883 100644 --- a/src/parse.y +++ b/src/parse.y @@ -4721,6 +4721,9 @@ parser_update_cxt(parser_state *p, mrbc_context *cxt) } } +void codedump_all(mrb_state*, int); +void parser_dump(mrb_state *mrb, node *tree, int offset); + void mrb_parser_parse(parser_state *p, mrbc_context *c) { @@ -4756,6 +4759,9 @@ mrb_parser_parse(parser_state *p, mrbc_context *c) append(tree, p->tree); } } + if (c && c->dump_result) { + parser_dump(p->mrb, p->tree, 0); + } } parser_state* @@ -4862,7 +4868,7 @@ mrb_parse_string(mrb_state *mrb, const char *s, mrbc_context *c) } static mrb_value -load_exec(mrb_state *mrb, parser_state *p) +load_exec(mrb_state *mrb, parser_state *p, mrbc_context *c) { int n; @@ -4885,13 +4891,17 @@ load_exec(mrb_state *mrb, parser_state *p) mrb->exc = (struct RObject*)mrb_object(mrb_exc_new(mrb, E_SCRIPT_ERROR, "codegen error", 13)); return mrb_nil_value(); } + if (c) { + if (c->dump_result) codedump_all(mrb, n); + if (c->no_exec) return mrb_fixnum_value(n); + } return mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); } mrb_value mrb_load_file_cxt(mrb_state *mrb, FILE *f, mrbc_context *c) { - return load_exec(mrb, mrb_parse_file(mrb, f, c)); + return load_exec(mrb, mrb_parse_file(mrb, f, c), c); } mrb_value @@ -4903,7 +4913,7 @@ mrb_load_file(mrb_state *mrb, FILE *f) mrb_value mrb_load_nstring_cxt(mrb_state *mrb, const char *s, int len, mrbc_context *c) { - return load_exec(mrb, mrb_parse_nstring(mrb, s, len, c)); + return load_exec(mrb, mrb_parse_nstring(mrb, s, len, c), c); } mrb_value @@ -4915,7 +4925,7 @@ mrb_load_nstring(mrb_state *mrb, const char *s, int len) mrb_value mrb_load_string_cxt(mrb_state *mrb, const char *s, mrbc_context *c) { - return load_exec(mrb, mrb_parse_nstring(mrb, s, strlen(s), c)); + return mrb_load_nstring_cxt(mrb, s, strlen(s), c); } mrb_value @@ -4924,8 +4934,6 @@ mrb_load_string(mrb_state *mrb, const char *s) return mrb_load_string_cxt(mrb, s, NULL); } -void parser_dump(mrb_state *mrb, node *tree, int offset); - static void dump_prefix(int offset) { diff --git a/tools/mrbc/mrbc.c b/tools/mrbc/mrbc.c index 8da37832a..a70353d63 100644 --- a/tools/mrbc/mrbc.c +++ b/tools/mrbc/mrbc.c @@ -158,7 +158,8 @@ main(int argc, char **argv) mrb_state *mrb = mrb_open(); int n = -1; struct _args args; - struct mrb_parser_state *p; + mrbc_context *c; + mrb_value result; if (mrb == NULL) { fprintf(stderr, "Invalid mrb_state, exiting mrbc"); @@ -166,7 +167,6 @@ main(int argc, char **argv) } n = parse_args(mrb, argc, argv, &args); - if (n < 0 || args.rfp == NULL) { cleanup(&args); usage(argv[0]); @@ -174,22 +174,17 @@ main(int argc, char **argv) return n; } - p = mrb_parse_file(mrb, args.rfp, NULL); - if (!p || !p->tree || p->nerr) { + c = mrbc_context_new(mrb); + if (args.verbose) + c->dump_result = 1; + c->no_exec = 1; + result = mrb_load_file_cxt(mrb, args.rfp, c); + if (mrb_nil_p(result)) { cleanup(&args); mrb_close(mrb); return -1; } - - if (args.verbose) - parser_dump(mrb, p->tree, 0); - - n = mrb_generate_code(mrb, p->tree); - mrb_parser_free(p); - - if (args.verbose) - codedump_all(mrb, n); - + n = mrb_fixnum(result); if (n < 0 || args.check_syntax) { cleanup(&args); mrb_close(mrb); @@ -215,4 +210,3 @@ void mrb_init_mrblib(mrb_state *mrb) { } - diff --git a/tools/mruby/mruby.c b/tools/mruby/mruby.c index 12cdc86e9..65eae57e1 100644 --- a/tools/mruby/mruby.c +++ b/tools/mruby/mruby.c @@ -9,8 +9,6 @@ void mrb_show_version(mrb_state *); void mrb_show_copyright(mrb_state *); -void parser_dump(mrb_state*, struct mrb_ast_node*, int); -void codedump_all(mrb_state*, int); struct _args { FILE *rfp; @@ -149,7 +147,7 @@ main(int argc, char **argv) int n = -1; int i; struct _args args; - struct mrb_parser_state *p; + mrb_value ARGV; if (mrb == NULL) { fprintf(stderr, "Invalid mrb_state, exiting mruby"); @@ -163,50 +161,42 @@ main(int argc, char **argv) return n; } + ARGV = mrb_ary_new(mrb); + for (i = 0; i < args.argc; i++) { + mrb_ary_push(mrb, ARGV, mrb_str_new(mrb, args.argv[i], strlen(args.argv[i]))); + } + mrb_define_global_const(mrb, "ARGV", ARGV); + if (args.mrbfile) { n = mrb_load_irep(mrb, args.rfp); + if (n >= 0) { + if (!args.check_syntax) { + mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); + if (mrb->exc) { + mrb_p(mrb, mrb_obj_value(mrb->exc)); + } + } + } } else { mrbc_context *c = mrbc_context_new(mrb); + + if (args.verbose) + c->dump_result = 1; + if (args.check_syntax) + c->no_exec = 1; + if (args.cmdline) { mrbc_filename(mrb, c, "-e"); - p = mrb_parse_string(mrb, (char*)args.cmdline, c); - } + mrb_load_string_cxt(mrb, (char*)args.cmdline, c); + } else { mrbc_filename(mrb, c, argv[1]); - p = mrb_parse_file(mrb, args.rfp, c); + mrb_load_file_cxt(mrb, args.rfp, c); } mrbc_context_free(mrb, c); - if (!p || !p->tree || p->nerr) { - cleanup(mrb, &args); return -1; - } - - if (args.verbose) - parser_dump(mrb, p->tree, 0); - - n = mrb_generate_code(mrb, p->tree); - mrb_parser_free(p); - } - - if (n >= 0) { - mrb_value ARGV = mrb_ary_new(mrb); - for (i = 0; i < args.argc; i++) { - mrb_ary_push(mrb, ARGV, mrb_str_new(mrb, args.argv[i], strlen(args.argv[i]))); - } - mrb_define_global_const(mrb, "ARGV", ARGV); - - if (args.verbose) - codedump_all(mrb, n); - - if (!args.check_syntax) { - mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); - if (mrb->exc) { - mrb_p(mrb, mrb_obj_value(mrb->exc)); - } - } } - cleanup(mrb, &args); return n > 0 ? 0 : 1; -- cgit v1.2.3 From e2c4b35240d220f8c03c0ffb52ecfe159e0ceac4 Mon Sep 17 00:00:00 2001 From: Selman ULUG Date: Fri, 13 Jul 2012 13:05:20 +0300 Subject: clean -Wunused-function when defined DISABLE_STDIO --- src/parse.y | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/parse.y b/src/parse.y index 5a22b3883..f27cc0822 100644 --- a/src/parse.y +++ b/src/parse.y @@ -4934,6 +4934,8 @@ mrb_load_string(mrb_state *mrb, const char *s) return mrb_load_string_cxt(mrb, s, NULL); } +#ifdef ENABLE_STDIO + static void dump_prefix(int offset) { @@ -4952,6 +4954,8 @@ dump_recur(mrb_state *mrb, node *tree, int offset) } } +#endif + void parser_dump(mrb_state *mrb, node *tree, int offset) { -- cgit v1.2.3 From e3806922245c15ff9417ca4513c9052ebfa40021 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sat, 14 Jul 2012 07:38:43 +0900 Subject: mrb_load_xxx to return undef + mrb_undef_p --- include/mruby.h | 2 +- src/kernel.c | 2 +- src/parse.y | 6 +++--- src/sprintf.c | 8 ++++---- tools/mrbc/mrbc.c | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/include/mruby.h b/include/mruby.h index a9027d896..1124ba89c 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -81,7 +81,7 @@ typedef struct mrb_value { #define mrb_symbol(o) (o).value.sym #define mrb_object(o) ((struct RBasic *) (o).value.p) #define FIXNUM_P(o) ((o).tt == MRB_TT_FIXNUM) -#define UNDEF_P(o) ((o).tt == MRB_TT_UNDEF) +#define mrb_undef_p(o) ((o).tt == MRB_TT_UNDEF) #include "mruby/object.h" diff --git a/src/kernel.c b/src/kernel.c index 1040dbe05..240c0dcb3 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -1038,7 +1038,7 @@ mrb_obj_remove_instance_variable(mrb_state *mrb, mrb_value self) mrb_get_args(mrb, "n", &sym); val = mrb_iv_remove(mrb, self, sym); - if (UNDEF_P(val)) { + if (mrb_undef_p(val)) { mrb_name_error(mrb, sym, "instance variable %s not defined", mrb_sym2name(mrb, sym)); } return val; diff --git a/src/parse.y b/src/parse.y index 5a22b3883..40960e313 100644 --- a/src/parse.y +++ b/src/parse.y @@ -4874,7 +4874,7 @@ load_exec(mrb_state *mrb, parser_state *p, mrbc_context *c) if (!p) { mrb_parser_free(p); - return mrb_nil_value(); + return mrb_undef_value(); } if (p->capture_errors && (!p->tree || p->nerr)) { char buf[256]; @@ -4883,13 +4883,13 @@ load_exec(mrb_state *mrb, parser_state *p, mrbc_context *c) p->error_buffer[0].lineno, p->error_buffer[0].message); mrb->exc = (struct RObject*)mrb_object(mrb_exc_new(mrb, E_SYNTAX_ERROR, buf, n)); mrb_parser_free(p); - return mrb_nil_value(); + return mrb_undef_value(); } n = mrb_generate_code(mrb, p->tree); mrb_parser_free(p); if (n < 0) { mrb->exc = (struct RObject*)mrb_object(mrb_exc_new(mrb, E_SCRIPT_ERROR, "codegen error", 13)); - return mrb_nil_value(); + return mrb_undef_value(); } if (c) { if (c->dump_result) codedump_all(mrb, n); diff --git a/src/sprintf.c b/src/sprintf.c index d6104ad48..b597ff343 100644 --- a/src/sprintf.c +++ b/src/sprintf.c @@ -145,7 +145,7 @@ mrb_fix2binstr(mrb_state *mrb, mrb_value x, int base) blen += (l);\ } while (0) -#define GETARG() (!UNDEF_P(nextvalue) ? nextvalue : \ +#define GETARG() (!mrb_undef_p(nextvalue) ? nextvalue : \ posarg == -1 ? \ (mrb_raise(mrb, E_ARGUMENT_ERROR, "unnumbered(%d) mixed with numbered", nextarg), mrb_undef_value()) : \ posarg == -2 ? \ @@ -201,7 +201,7 @@ get_hash(mrb_state *mrb, mrb_value *hash, int argc, const mrb_value *argv) { mrb_value tmp; - if (!UNDEF_P(*hash)) return *hash; + if (!mrb_undef_p(*hash)) return *hash; if (argc != 2) { mrb_raise(mrb, E_ARGUMENT_ERROR, "one hash required"); } @@ -586,7 +586,7 @@ retry: n = 0; GETNUM(n, width); if (*p == '$') { - if (!UNDEF_P(nextvalue)) { + if (!mrb_undef_p(nextvalue)) { mrb_raise(mrb, E_ARGUMENT_ERROR, "value given twice - %d$", n); } nextvalue = GETPOSARG(n); @@ -614,7 +614,7 @@ retry: symname = mrb_str_new(mrb, start + 1, p - start - 1); id = mrb_intern_str(mrb, symname); nextvalue = GETNAMEARG(mrb_symbol_value(id), start, (int)(p - start + 1)); - if (UNDEF_P(nextvalue)) { + if (mrb_undef_p(nextvalue)) { mrb_raise(mrb, E_KEY_ERROR, "key%.*s not found", (int)(p - start + 1), start); } if (term == '}') goto format_s; diff --git a/tools/mrbc/mrbc.c b/tools/mrbc/mrbc.c index a70353d63..a121eaa0e 100644 --- a/tools/mrbc/mrbc.c +++ b/tools/mrbc/mrbc.c @@ -179,7 +179,7 @@ main(int argc, char **argv) c->dump_result = 1; c->no_exec = 1; result = mrb_load_file_cxt(mrb, args.rfp, c); - if (mrb_nil_p(result)) { + if (mrb_undef_p(result)) { cleanup(&args); mrb_close(mrb); return -1; -- cgit v1.2.3 From 59389561715aed3b37d571e34c0c80f17f192788 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sat, 14 Jul 2012 07:39:50 +0900 Subject: mrbc: better cleanup before exit --- tools/mrbc/mrbc.c | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/tools/mrbc/mrbc.c b/tools/mrbc/mrbc.c index a121eaa0e..428a3b781 100644 --- a/tools/mrbc/mrbc.c +++ b/tools/mrbc/mrbc.c @@ -144,12 +144,13 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args) } static void -cleanup(struct _args *args) +cleanup(mrb_state *mrb, struct _args *args) { if (args->rfp) fclose(args->rfp); if (args->wfp) fclose(args->wfp); + mrb_close(mrb); } int @@ -168,9 +169,8 @@ main(int argc, char **argv) n = parse_args(mrb, argc, argv, &args); if (n < 0 || args.rfp == NULL) { - cleanup(&args); + cleanup(mrb, &args); usage(argv[0]); - mrb_close(mrb); return n; } @@ -179,16 +179,14 @@ main(int argc, char **argv) c->dump_result = 1; c->no_exec = 1; result = mrb_load_file_cxt(mrb, args.rfp, c); - if (mrb_undef_p(result)) { - cleanup(&args); - mrb_close(mrb); - return -1; + if (mrb_undef_p(result) || mrb_fixnum(result) < 0) { + cleanup(mrb, &args); + return EXIT_FAILURE; } - n = mrb_fixnum(result); - if (n < 0 || args.check_syntax) { - cleanup(&args); - mrb_close(mrb); - return n; + if (args.check_syntax) { + printf("Syntax OK\n"); + cleanup(mrb, &args); + return EXIT_SUCCESS; } if (args.initname) { if (args.dump_type == DUMP_TYPE_BIN) @@ -200,10 +198,8 @@ main(int argc, char **argv) n = mrb_dump_irep(mrb, n, args.wfp); } - cleanup(&args); - mrb_close(mrb); - - return n; + cleanup(mrb, &args); + return EXIT_SUCCESS; } void -- cgit v1.2.3 From 83ccb715b2e1a4c9c718b38f9f5ab8558438e490 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sat, 14 Jul 2012 07:45:24 +0900 Subject: mruby: print Syntax OK on -c --- tools/mruby/mruby.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tools/mruby/mruby.c b/tools/mruby/mruby.c index 65eae57e1..a8b0b99df 100644 --- a/tools/mruby/mruby.c +++ b/tools/mruby/mruby.c @@ -180,6 +180,7 @@ main(int argc, char **argv) } else { mrbc_context *c = mrbc_context_new(mrb); + mrb_value v; if (args.verbose) c->dump_result = 1; @@ -188,14 +189,16 @@ main(int argc, char **argv) if (args.cmdline) { mrbc_filename(mrb, c, "-e"); - mrb_load_string_cxt(mrb, (char*)args.cmdline, c); + v = mrb_load_string_cxt(mrb, (char*)args.cmdline, c); } else { mrbc_filename(mrb, c, argv[1]); - mrb_load_file_cxt(mrb, args.rfp, c); + v = mrb_load_file_cxt(mrb, args.rfp, c); } mrbc_context_free(mrb, c); - return -1; + if (!mrb->exc && args.check_syntax) { + printf("Syntax OK\n"); + } } cleanup(mrb, &args); -- cgit v1.2.3 From bb20d3bc47f2dfb1069b8f1608a3cab18dc33ee0 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sat, 14 Jul 2012 07:48:32 +0900 Subject: mrb_load to set mrb->exc on errors --- src/parse.y | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/parse.y b/src/parse.y index 40960e313..0df475631 100644 --- a/src/parse.y +++ b/src/parse.y @@ -4876,19 +4876,24 @@ load_exec(mrb_state *mrb, parser_state *p, mrbc_context *c) mrb_parser_free(p); return mrb_undef_value(); } - if (p->capture_errors && (!p->tree || p->nerr)) { - char buf[256]; + if (!p->tree || p->nerr) { + if (p->capture_errors) { + char buf[256]; - n = snprintf(buf, sizeof(buf), "line %d: %s\n", - p->error_buffer[0].lineno, p->error_buffer[0].message); - mrb->exc = (struct RObject*)mrb_object(mrb_exc_new(mrb, E_SYNTAX_ERROR, buf, n)); + n = snprintf(buf, sizeof(buf), "line %d: %s\n", + p->error_buffer[0].lineno, p->error_buffer[0].message); + mrb->exc = (struct RObject*)mrb_object(mrb_exc_new(mrb, E_SYNTAX_ERROR, buf, n)); + } + else { + mrb->exc = (struct RObject*)mrb_object(mrb_exc_new(mrb, E_SYNTAX_ERROR, "", 0)); + } mrb_parser_free(p); return mrb_undef_value(); } n = mrb_generate_code(mrb, p->tree); mrb_parser_free(p); if (n < 0) { - mrb->exc = (struct RObject*)mrb_object(mrb_exc_new(mrb, E_SCRIPT_ERROR, "codegen error", 13)); + mrb->exc = (struct RObject*)mrb_object(mrb_exc_new(mrb, E_SCRIPT_ERROR, "", 0)); return mrb_undef_value(); } if (c) { -- cgit v1.2.3 From 96366117ea4bd91bccf00110469765ebc1ebaa8c Mon Sep 17 00:00:00 2001 From: Junji Sawada Date: Sat, 14 Jul 2012 11:39:25 +0900 Subject: Remove unnecessary header inclusion --- include/mruby/khash.h | 1 - src/cdump.c | 1 - src/codegen.c | 3 --- src/error.c | 5 ----- src/gc.c | 3 +-- src/hash.c | 1 - src/kernel.c | 5 ----- src/numeric.c | 4 ---- src/proc.c | 1 - src/range.c | 3 --- src/sprintf.c | 1 - src/string.c | 3 +-- src/struct.c | 4 ---- src/symbol.c | 4 ---- src/variable.c | 2 -- 15 files changed, 2 insertions(+), 39 deletions(-) diff --git a/include/mruby/khash.h b/include/mruby/khash.h index 0803521b7..09b23f6af 100644 --- a/include/mruby/khash.h +++ b/include/mruby/khash.h @@ -12,7 +12,6 @@ extern "C" { #endif #include -#include #include typedef uint32_t khint_t; diff --git a/src/cdump.c b/src/cdump.c index 16c1dc8ae..a4a2ac5e1 100644 --- a/src/cdump.c +++ b/src/cdump.c @@ -10,7 +10,6 @@ #include "mruby/irep.h" #include "mruby/string.h" -#include "re.h" #define MRB_CDUMP_LINE_LEN 128 diff --git a/src/codegen.c b/src/codegen.c index 6db09f310..9166b7144 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -10,15 +10,12 @@ #include "mruby.h" #include "mruby/string.h" #include "mruby/irep.h" -#include "mruby/proc.h" #include "mruby/compile.h" #include "mruby/numeric.h" #include "opcode.h" #include "node.h" #include #include -#include -#include #include typedef mrb_ast_node node; diff --git a/src/error.c b/src/error.c index e46e37cbb..5bfbc4319 100644 --- a/src/error.c +++ b/src/error.c @@ -6,14 +6,9 @@ #include "mruby.h" #include -#include #include #include #include "error.h" -#include "opcode.h" -#include "mruby/irep.h" -#include "mruby/proc.h" -#include "mruby/numeric.h" #include "mruby/variable.h" #include "mruby/string.h" #include "mruby/class.h" diff --git a/src/gc.c b/src/gc.c index ada0bf31f..3c00bb015 100644 --- a/src/gc.c +++ b/src/gc.c @@ -11,12 +11,10 @@ #include "mruby/string.h" #include "mruby/hash.h" #include "mruby/range.h" -#include "mruby/khash.h" #include #include "mruby/struct.h" #include "mruby/proc.h" #include "mruby/data.h" -#include "mruby/numeric.h" #include "mruby/variable.h" /* @@ -101,6 +99,7 @@ typedef struct { } RVALUE; #ifdef GC_PROFILE +#include #include static double program_invoke_time = 0; diff --git a/src/hash.c b/src/hash.c index ed8b70270..dacef4713 100644 --- a/src/hash.c +++ b/src/hash.c @@ -11,7 +11,6 @@ #include "mruby/array.h" #include "mruby/string.h" #include "mruby/variable.h" -#include static inline khint_t mrb_hash_ht_hash_func(mrb_state *mrb, mrb_value key) diff --git a/src/kernel.c b/src/kernel.c index 240c0dcb3..f5a1f3d53 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -6,14 +6,9 @@ #include "mruby.h" #include "mruby/string.h" -#include -#include #include "mruby/proc.h" -#include "mruby/range.h" #include "mruby/array.h" -#include "mruby/hash.h" #include "mruby/class.h" -#include "mruby/struct.h" #include "mruby/variable.h" #include "error.h" diff --git a/src/numeric.c b/src/numeric.c index 6638cf62c..ec3f97ca6 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -8,11 +8,7 @@ #include "mruby/numeric.h" #include "mruby/string.h" #include "mruby/array.h" -#include -#include "mruby/class.h" -#include "mruby/variable.h" -#include #include #include #include diff --git a/src/proc.c b/src/proc.c index 98f753ac6..3e9bf1f67 100644 --- a/src/proc.c +++ b/src/proc.c @@ -6,7 +6,6 @@ #include "mruby.h" #include "mruby/proc.h" -#include "mruby/array.h" #include "mruby/class.h" #include "opcode.h" diff --git a/src/range.c b/src/range.c index 703ad12aa..b05836914 100644 --- a/src/range.c +++ b/src/range.c @@ -7,9 +7,6 @@ #include "mruby.h" #include "mruby/class.h" #include "mruby/range.h" -#include "mruby/variable.h" -#include "error.h" -#include "mruby/numeric.h" #include "mruby/string.h" #include diff --git a/src/sprintf.c b/src/sprintf.c index b597ff343..519e40b4b 100644 --- a/src/sprintf.c +++ b/src/sprintf.c @@ -15,7 +15,6 @@ #include "mruby/hash.h" #include "mruby/numeric.h" #include -#include #include #ifdef HAVE_IEEEFP_H diff --git a/src/string.c b/src/string.c index 14da83c51..e41116ebc 100644 --- a/src/string.c +++ b/src/string.c @@ -10,11 +10,10 @@ #include #include "mruby/string.h" #include -#include "mruby/numeric.h" +#include #include "mruby/range.h" #include "mruby/array.h" #include "mruby/class.h" -#include "mruby/variable.h" #include #ifdef ENABLE_REGEXP #include "re.h" diff --git a/src/struct.c b/src/struct.c index 25cd02d3d..6d8ce057f 100644 --- a/src/struct.c +++ b/src/struct.c @@ -17,13 +17,9 @@ #include "encoding.h" #endif -#include "mruby/numeric.h" -#include "mruby/hash.h" #include "mruby/string.h" #include "mruby/class.h" #include "mruby/variable.h" -#include "mruby/range.h" -#include "error.h" //#include "defines.h" #define mrb_long2int(n) ((int)(n)) diff --git a/src/symbol.c b/src/symbol.c index baab0fb3c..40484d4b5 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -8,12 +8,8 @@ #include "mruby/khash.h" #include -#include -#include #include "mruby/string.h" #include -#include "mruby/class.h" -#include "mruby/variable.h" /* ------------------------------------------------------ */ typedef struct symbol_name { diff --git a/src/variable.c b/src/variable.c index e2f3a7d08..be686bf72 100644 --- a/src/variable.c +++ b/src/variable.c @@ -8,8 +8,6 @@ #include "mruby/class.h" #include "mruby/khash.h" #include "mruby/variable.h" -#include "mruby/string.h" -#include "mruby/range.h" #include "error.h" #include "mruby/array.h" -- cgit v1.2.3 From 7bbac9cfdf3a1b8e8c5697c060b5cb812a1f6949 Mon Sep 17 00:00:00 2001 From: Junji Sawada Date: Sat, 14 Jul 2012 12:13:48 +0900 Subject: Rename confusable argument name --- include/mruby/compile.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/include/mruby/compile.h b/include/mruby/compile.h index 4dd369adb..aae1b06b1 100644 --- a/include/mruby/compile.h +++ b/include/mruby/compile.h @@ -111,11 +111,11 @@ int mrb_generate_code(mrb_state*, mrb_ast_node*); /* program load functions */ mrb_value mrb_load_file(mrb_state*,FILE*); -mrb_value mrb_load_string(mrb_state *mrb, const char *path); -mrb_value mrb_load_nstring(mrb_state *mrb, const char *path, int len); +mrb_value mrb_load_string(mrb_state *mrb, const char *s); +mrb_value mrb_load_nstring(mrb_state *mrb, const char *s, int len); mrb_value mrb_load_file_cxt(mrb_state*,FILE*, mrbc_context *cxt); -mrb_value mrb_load_string_cxt(mrb_state *mrb, const char *path, mrbc_context *cxt); -mrb_value mrb_load_nstring_cxt(mrb_state *mrb, const char *path, int len, mrbc_context *cxt); +mrb_value mrb_load_string_cxt(mrb_state *mrb, const char *s, mrbc_context *cxt); +mrb_value mrb_load_nstring_cxt(mrb_state *mrb, const char *s, int len, mrbc_context *cxt); #if defined(__cplusplus) } /* extern "C" { */ -- cgit v1.2.3 From 72f7c51bc0bcef4096db8d57e7e5ab2a342e383f Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sat, 14 Jul 2012 15:39:53 +0900 Subject: mruby should print error properly --- src/parse.y | 5 ++++- tools/mruby/mruby.c | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/parse.y b/src/parse.y index 75a33c5b7..c766b3927 100644 --- a/src/parse.y +++ b/src/parse.y @@ -4871,6 +4871,7 @@ static mrb_value load_exec(mrb_state *mrb, parser_state *p, mrbc_context *c) { int n; + mrb_value v; if (!p) { mrb_parser_free(p); @@ -4900,7 +4901,9 @@ load_exec(mrb_state *mrb, parser_state *p, mrbc_context *c) if (c->dump_result) codedump_all(mrb, n); if (c->no_exec) return mrb_fixnum_value(n); } - return mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); + v = mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); + if (!mrb->exc) return mrb_undef_value(); + return v; } mrb_value diff --git a/tools/mruby/mruby.c b/tools/mruby/mruby.c index a8b0b99df..d3c22f96d 100644 --- a/tools/mruby/mruby.c +++ b/tools/mruby/mruby.c @@ -196,9 +196,12 @@ main(int argc, char **argv) v = mrb_load_file_cxt(mrb, args.rfp, c); } mrbc_context_free(mrb, c); - if (!mrb->exc && args.check_syntax) { + if (args.check_syntax) { printf("Syntax OK\n"); } + else if (!mrb_undef_p(v) && mrb->exc) { + mrb_p(mrb, mrb_obj_value(mrb->exc)); + } } cleanup(mrb, &args); -- cgit v1.2.3 From 8611f967775e251d98aa8ab7277f0eb75ccc70f0 Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Sat, 14 Jul 2012 23:02:48 +0900 Subject: Remove unnecessary mrb_const_set in class.c. --- src/class.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/class.c b/src/class.c index 783627a7d..774b020a8 100644 --- a/src/class.c +++ b/src/class.c @@ -254,7 +254,6 @@ mrb_define_class_under(mrb_state *mrb, struct RClass *outer, const char *name, s } c = mrb_class_new(mrb, super); setup_class(mrb, mrb_obj_value(outer), c, id); - mrb_const_set(mrb, mrb_obj_value(outer), id, mrb_obj_value(c)); return c; } @@ -274,7 +273,6 @@ mrb_define_module_under(mrb_state *mrb, struct RClass *outer, const char *name) } c = mrb_module_new(mrb); setup_class(mrb, mrb_obj_value(outer), c, id); - mrb_const_set(mrb, mrb_obj_value(outer), id, mrb_obj_value(c)); return c; } -- cgit v1.2.3 From 15f0c161d1f9bdbfa759be47bc54bc290ef51dd0 Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Sat, 14 Jul 2012 23:04:33 +0900 Subject: Suppress some warnings about pointer casting. --- src/parse.y | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/parse.y b/src/parse.y index c766b3927..48823233f 100644 --- a/src/parse.y +++ b/src/parse.y @@ -688,7 +688,7 @@ new_float(parser_state *p, const char *s) static node* new_str(parser_state *p, const char *s, int len) { - return cons((node*)NODE_STR, cons((node*)strndup(s, len), (node*)len)); + return cons((node*)NODE_STR, cons((node*)strndup(s, len), (node*)(intptr_t)len)); } // (:dstr . a) @@ -4708,7 +4708,7 @@ parser_update_cxt(parser_state *p, mrbc_context *cxt) int i = 0; if (!cxt) return; - if ((int)p->tree->car != NODE_SCOPE) return; + if ((int)(intptr_t)p->tree->car != NODE_SCOPE) return; n0 = n = p->tree->cdr->car; while (n) { i++; -- cgit v1.2.3 From 50f56a2436154211a383d34828efa1db2073aeed Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 15 Jul 2012 16:22:54 +0900 Subject: Array#join to accept only strings as sep --- src/array.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/array.c b/src/array.c index ec687bbf3..ed1c3f475 100644 --- a/src/array.c +++ b/src/array.c @@ -1006,7 +1006,7 @@ mrb_ary_join(mrb_state *mrb, mrb_value ary, mrb_value sep) /* * call-seq: - * ary.join(sep=nil) -> str + * ary.join(sep="") -> str * * Returns a string created by converting each element of the array to * a string, separated by sep. @@ -1020,7 +1020,7 @@ mrb_ary_join_m(mrb_state *mrb, mrb_value ary) { mrb_value sep = mrb_nil_value(); - mrb_get_args(mrb, "|o", &sep); + mrb_get_args(mrb, "|S", &sep); return mrb_ary_join(mrb, ary, sep); } -- cgit v1.2.3 From c8700c4a2178dc0ab1824e98746d12754611768c Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 15 Jul 2012 16:23:55 +0900 Subject: remove Syntax OK if syntax isn't ok; close #368 --- tools/mruby/mruby.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tools/mruby/mruby.c b/tools/mruby/mruby.c index d3c22f96d..abc0bdc5e 100644 --- a/tools/mruby/mruby.c +++ b/tools/mruby/mruby.c @@ -196,11 +196,13 @@ main(int argc, char **argv) v = mrb_load_file_cxt(mrb, args.rfp, c); } mrbc_context_free(mrb, c); - if (args.check_syntax) { - printf("Syntax OK\n"); + if (mrb->exc) { + if (!mrb_undef_p(v)) { + mrb_p(mrb, mrb_obj_value(mrb->exc)); + } } - else if (!mrb_undef_p(v) && mrb->exc) { - mrb_p(mrb, mrb_obj_value(mrb->exc)); + else if (args.check_syntax) { + printf("Syntax OK\n"); } } cleanup(mrb, &args); -- cgit v1.2.3 From 234b8e853cc8b3bac2945832d589562e41da1456 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 15 Jul 2012 16:37:23 +0900 Subject: make class_from_sym static --- include/mruby.h | 1 - src/class.c | 27 +++++++++++++++++++-------- src/variable.c | 13 ------------- 3 files changed, 19 insertions(+), 22 deletions(-) diff --git a/include/mruby.h b/include/mruby.h index 1124ba89c..137a1b94e 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -297,7 +297,6 @@ void mrb_undef_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); -struct RClass * mrb_class_from_sym(mrb_state *mrb, struct RClass *klass, mrb_sym name); struct RClass * mrb_class_get(mrb_state *mrb, const char *name); struct RClass * mrb_class_obj_get(mrb_state *mrb, const char *name); diff --git a/src/class.c b/src/class.c index 783627a7d..3985800d0 100644 --- a/src/class.c +++ b/src/class.c @@ -216,6 +216,23 @@ mrb_vm_define_class(mrb_state *mrb, mrb_value outer, mrb_value super, mrb_sym id return c; } +static struct RClass * +class_from_sym(mrb_state *mrb, struct RClass *klass, mrb_sym id) +{ + mrb_value c = mrb_const_get(mrb, mrb_obj_value(klass), id); + + if (c.tt != MRB_TT_MODULE && c.tt != MRB_TT_CLASS) { + mrb_raise(mrb, E_TYPE_ERROR, "%s is not a class/module", mrb_sym2name(mrb, id)); + } + return mrb_class_ptr(c); +} + +struct RClass * +mrb_class_get(mrb_state *mrb, const char *name) +{ + return class_from_sym(mrb, mrb->object_class, mrb_intern(mrb, name)); +} + /*! * Defines a class under the namespace of \a outer. * \param outer a class which contains the new class. @@ -239,10 +256,7 @@ mrb_define_class_under(mrb_state *mrb, struct RClass *outer, const char *name, s mrb_sym id = mrb_intern(mrb, name); if (mrb_const_defined_at(mrb, outer, id)) { - c = mrb_class_from_sym(mrb, outer, id); - if (c->tt != MRB_TT_CLASS) { - mrb_raise(mrb, E_TYPE_ERROR, "%s is not a class", mrb_sym2name(mrb, id)); - } + c = class_from_sym(mrb, outer, id); if (mrb_class_real(c->super) != super) { mrb_name_error(mrb, id, "%s is already defined", mrb_sym2name(mrb, id)); } @@ -266,10 +280,7 @@ mrb_define_module_under(mrb_state *mrb, struct RClass *outer, const char *name) mrb_sym id = mrb_intern(mrb, name); if (mrb_const_defined_at(mrb, outer, id)) { - c = mrb_class_from_sym(mrb, outer, id); - if (c->tt != MRB_TT_MODULE) { - mrb_raise(mrb, E_TYPE_ERROR, "%s is not a module", mrb_sym2name(mrb, id)); - } + c = class_from_sym(mrb, outer, id); return c; } c = mrb_module_new(mrb); diff --git a/src/variable.c b/src/variable.c index be686bf72..501bed5a6 100644 --- a/src/variable.c +++ b/src/variable.c @@ -495,19 +495,6 @@ mrb_const_defined_at(mrb_state *mrb, struct RClass *klass, mrb_sym id) return mrb_const_defined_0(mrb, klass, id, TRUE, FALSE); } -struct RClass * -mrb_class_from_sym(mrb_state *mrb, struct RClass *klass, mrb_sym id) -{ - mrb_value c = const_get(mrb, klass, id); - return mrb_class_ptr(c); -} - -struct RClass * -mrb_class_get(mrb_state *mrb, const char *name) -{ - return mrb_class_from_sym(mrb, mrb->object_class, mrb_intern(mrb, name)); -} - mrb_value mrb_attr_get(mrb_state *mrb, mrb_value obj, mrb_sym id) { -- cgit v1.2.3 From 3705bfb02011fb4d7e81cd91876527299ae2c9bb Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 15 Jul 2012 17:30:15 +0900 Subject: DIABLE_STDIO to disable __printstr__ --- src/init.c | 4 +++- src/print.c | 15 +++++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/init.c b/src/init.c index e2ab62339..e6af6989b 100644 --- a/src/init.c +++ b/src/init.c @@ -43,6 +43,7 @@ mrb_init_core(mrb_state *mrb) mrb_init_enumerable(mrb); mrb_init_symbol(mrb); + mrb_init_exception(mrb); mrb_init_proc(mrb); mrb_init_string(mrb); mrb_init_array(mrb); @@ -56,8 +57,9 @@ mrb_init_core(mrb_state *mrb) #ifdef ENABLE_REGEXP mrb_init_regexp(mrb); #endif - mrb_init_exception(mrb); +#ifdef ENABLE_STDIO mrb_init_print(mrb); +#endif #ifdef ENABLE_TIME mrb_init_time(mrb); #endif diff --git a/src/print.c b/src/print.c index e27a723dc..0de9e7429 100644 --- a/src/print.c +++ b/src/print.c @@ -5,10 +5,11 @@ */ #include "mruby.h" +#ifdef ENABLE_STDIO #include "mruby/string.h" #include -mrb_value +static void printstr(mrb_state *mrb, mrb_value obj) { struct RString *str; @@ -24,7 +25,6 @@ printstr(mrb_state *mrb, mrb_value obj) s++; } } - return obj; } mrb_value @@ -71,3 +71,14 @@ mrb_show_copyright(mrb_state *mrb) { printf("mruby - Copyright (c) 2010-2012 mruby developers\n"); } +#else +void +mrb_show_version(mrb_state *mrb) +{ +} + +void +mrb_show_copyright(mrb_state *mrb) +{ +} +#endif -- cgit v1.2.3 From a9247f723abf401fcf940fffaa984b516cc61052 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 15 Jul 2012 17:31:51 +0900 Subject: condition updated to preven printf from sprintf redefinition --- mrblib/print.rb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/mrblib/print.rb b/mrblib/print.rb index 3ebd77ee6..c4ce74d6b 100644 --- a/mrblib/print.rb +++ b/mrblib/print.rb @@ -51,11 +51,13 @@ module Kernel ## # Invoke method +sprintf+ and pass +*args+ to it. # Pass return value to +print+ of STDOUT. - def printf(*args) - if Kernel.respond_to?(:sprintf) + if Kernel.respond_to?(:sprintf) and Kernel.respond_to?(:__printstr__) + def printf(*args) __printstr__(sprintf(*args)) - else - raise NotImplementedError.new('sprintf not available') + end + else + def printf(*args) + raise NotImplementedError.new('printf not available') end end -- cgit v1.2.3 From 49cac5f97db1398776e99573a62a300e3ab12ce7 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 16 Jul 2012 11:54:35 +0900 Subject: case should care about return value; close #372 --- src/codegen.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/codegen.c b/src/codegen.c index 9166b7144..daa521130 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -479,10 +479,10 @@ lambda_body(codegen_scope *s, node *tree, int blk) pos = new_label(s); for (i=0; i 0) { - genop(s, MKOP_Ax(OP_JMP, 0)); + genop(s, MKOP_sBx(OP_JMP, 0)); } opt = tree->car->cdr->car; i = 0; @@ -1086,21 +1086,23 @@ codegen(codegen_scope *s, node *tree, int val) } if (tree->car->car) { pos1 = new_label(s); - genop(s, MKOP_AsBx(OP_JMP, cursp(), 0)); + genop(s, MKOP_sBx(OP_JMP, 0)); dispatch_linked(s, pos2); } - pop(); pop(); + pop(); codegen(s, tree->car->cdr, val); + pop(); tmp = new_label(s); - genop(s, MKOP_AsBx(OP_JMP, cursp(), pos3)); + genop(s, MKOP_sBx(OP_JMP, pos3)); pos3 = tmp; if (pos1) dispatch(s, pos1); tree = tree->cdr; - push(); push(); + push(); } pop(); - if (pos3) dispatch_linked(s, pos3); + genop(s, MKOP_A(OP_LOADNIL, cursp())); if (val) push(); + if (pos3) dispatch_linked(s, pos3); } break; -- cgit v1.2.3 From 0339317bd62881034987bcc8c5144fdd25bfc42d Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Mon, 16 Jul 2012 13:36:36 +0900 Subject: Supress using switches with fallthru or a empty default label. --- src/parse.y | 103 ++++++++++++++++++++++++++---------------------------------- src/range.c | 21 +++++-------- 2 files changed, 53 insertions(+), 71 deletions(-) diff --git a/src/parse.y b/src/parse.y index 48823233f..0c589d822 100644 --- a/src/parse.y +++ b/src/parse.y @@ -805,12 +805,8 @@ ret_args(parser_state *p, node *n) static void assignable(parser_state *p, node *lhs) { - switch ((int)(intptr_t)lhs->car) { - case NODE_LVAR: + if ((int)(intptr_t)lhs->car == NODE_LVAR) { local_add(p, (mrb_sym)lhs->cdr); - break; - default: - break; } } @@ -819,17 +815,14 @@ var_reference(parser_state *p, node *lhs) { node *n; - switch ((int)(intptr_t)lhs->car) { - case NODE_LVAR: + if ((int)(intptr_t)lhs->car == NODE_LVAR) { if (!local_var_p(p, (mrb_sym)lhs->cdr)) { n = new_fcall(p, (mrb_sym)lhs->cdr, 0); cons_free(lhs); return n; } - break; - default: - break; } + return lhs; } @@ -3038,15 +3031,16 @@ yywarning_s(parser_state *p, const char *fmt, const char *s) static void backref_error(parser_state *p, node *n) { - switch ((int)(intptr_t)n->car) { - case NODE_NTH_REF: + int c; + + c = (int)(intptr_t)n->car; + + if (c == NODE_NTH_REF) { yyerror_i(p, "can't set variable $%d", (int)(intptr_t)n->cdr); - break; - case NODE_BACK_REF: + } else if (c == NODE_BACK_REF) { yyerror_i(p, "can't set variable $%c", (int)(intptr_t)n->cdr); - break; - default: - break; + } else { + mrb_bug("Internal error in backref_error() : n=>car == %d", c); } } @@ -3589,11 +3583,10 @@ parser_yylex(parser_state *p) c = '*'; } } - switch (p->lstate) { - case EXPR_FNAME: case EXPR_DOT: - p->lstate = EXPR_ARG; break; - default: - p->lstate = EXPR_BEG; break; + if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) { + p->lstate = EXPR_ARG; + } else { + p->lstate = EXPR_BEG; } return c; @@ -3624,11 +3617,10 @@ parser_yylex(parser_state *p) goto retry; } } - switch (p->lstate) { - case EXPR_FNAME: case EXPR_DOT: - p->lstate = EXPR_ARG; break; - default: - p->lstate = EXPR_BEG; break; + if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) { + p->lstate = EXPR_ARG; + } else { + p->lstate = EXPR_BEG; } if ((c = nextc(p)) == '=') { if ((c = nextc(p)) == '=') { @@ -3660,13 +3652,13 @@ parser_yylex(parser_state *p) if (token) return token; } #endif - switch (p->lstate) { - case EXPR_FNAME: case EXPR_DOT: - p->lstate = EXPR_ARG; break; - case EXPR_CLASS: - p->cmd_start = TRUE; - default: - p->lstate = EXPR_BEG; break; + if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) { + p->lstate = EXPR_ARG; + } else { + p->lstate = EXPR_BEG; + if (p->lstate == EXPR_CLASS) { + p->cmd_start = TRUE; + } } if (c == '=') { if ((c = nextc(p)) == '>') { @@ -3688,11 +3680,10 @@ parser_yylex(parser_state *p) return '<'; case '>': - switch (p->lstate) { - case EXPR_FNAME: case EXPR_DOT: - p->lstate = EXPR_ARG; break; - default: - p->lstate = EXPR_BEG; break; + if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) { + p->lstate = EXPR_ARG; + } else { + p->lstate = EXPR_BEG; } if ((c = nextc(p)) == '=') { return tGEQ; @@ -3820,10 +3811,9 @@ parser_yylex(parser_state *p) else { c = '&'; } - switch (p->lstate) { - case EXPR_FNAME: case EXPR_DOT: - p->lstate = EXPR_ARG; break; - default: + if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) { + p->lstate = EXPR_ARG; + } else { p->lstate = EXPR_BEG; } return c; @@ -4206,11 +4196,10 @@ parser_yylex(parser_state *p) #endif return tREGEXP_BEG; } - switch (p->lstate) { - case EXPR_FNAME: case EXPR_DOT: - p->lstate = EXPR_ARG; break; - default: - p->lstate = EXPR_BEG; break; + if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) { + p->lstate = EXPR_ARG; + } else { + p->lstate = EXPR_BEG; } return '/'; @@ -4220,11 +4209,10 @@ parser_yylex(parser_state *p) p->lstate = EXPR_BEG; return tOP_ASGN; } - switch (p->lstate) { - case EXPR_FNAME: case EXPR_DOT: - p->lstate = EXPR_ARG; break; - default: - p->lstate = EXPR_BEG; break; + if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) { + p->lstate = EXPR_ARG; + } else { + p->lstate = EXPR_BEG; } pushback(p, c); return '^'; @@ -4409,11 +4397,10 @@ parser_yylex(parser_state *p) if (IS_SPCARG(c)) { goto quotation; } - switch (p->lstate) { - case EXPR_FNAME: case EXPR_DOT: - p->lstate = EXPR_ARG; break; - default: - p->lstate = EXPR_BEG; break; + if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) { + p->lstate = EXPR_ARG; + } else { + p->lstate = EXPR_BEG; } pushback(p, c); return '%'; diff --git a/src/range.c b/src/range.c index b05836914..2fa6763a6 100644 --- a/src/range.c +++ b/src/range.c @@ -20,19 +20,14 @@ static void range_check(mrb_state *mrb, mrb_value a, mrb_value b) { mrb_value ans; - - switch (mrb_type(a)) { - case MRB_TT_FIXNUM: - case MRB_TT_FLOAT: - switch (mrb_type(b)) { - case MRB_TT_FIXNUM: - case MRB_TT_FLOAT: - return; - default: - break; - } - default: - break; + int ta; + int tb; + + ta = mrb_type(a); + tb = mrb_type(b); + if ((ta == MRB_TT_FIXNUM || ta == MRB_TT_FLOAT) && + (tb == MRB_TT_FIXNUM || tb == MRB_TT_FLOAT)) { + return; } mrb_p(mrb, a); -- cgit v1.2.3 From cd502421462db2ad588cf8fe8c80a590f3d6f640 Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Mon, 16 Jul 2012 17:54:13 +0900 Subject: Reduce strlen(). refs #301 --- src/dump.c | 9 +++++---- src/vm.c | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/dump.c b/src/dump.c index a720090fa..d8768f771 100644 --- a/src/dump.c +++ b/src/dump.c @@ -222,15 +222,16 @@ get_pool_block_size(mrb_state *mrb, mrb_irep *irep, int type) for (pool_no = 0; pool_no < irep->plen; pool_no++) { uint16_t nlen =0; + int len; switch (irep->pool[pool_no].tt) { case MRB_TT_FIXNUM: - sprintf( buf, "%d", irep->pool[pool_no].value.i); - size += strlen(buf); + len = sprintf( buf, "%d", irep->pool[pool_no].value.i); + size += (uint32_t)len; break; case MRB_TT_FLOAT: - sprintf( buf, "%.16e", irep->pool[pool_no].value.f); - size += strlen(buf); + len = sprintf( buf, "%.16e", irep->pool[pool_no].value.f); + size += (uint32_t)len; break; case MRB_TT_STRING: str = mrb_string_value( mrb, &irep->pool[pool_no]); diff --git a/src/vm.c b/src/vm.c index ef323f785..bd3d05d81 100644 --- a/src/vm.c +++ b/src/vm.c @@ -892,8 +892,8 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) struct REnv *e = uvenv(mrb, lv-1); if (!e) { mrb_value exc; - const char *m = "super called outside of method"; - exc = mrb_exc_new(mrb, E_NOMETHOD_ERROR, m, strlen(m)); + static const char m[] = "super called outside of method"; + exc = mrb_exc_new(mrb, E_NOMETHOD_ERROR, m, sizeof(m) - 1); mrb->exc = (struct RObject*)mrb_object(exc); goto L_RAISE; } -- cgit v1.2.3 From ba08a2b9dddf97c84a73ab72f708e2bfef2d6b82 Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Tue, 17 Jul 2012 00:42:35 +0900 Subject: Add Module#extend_object and Module#extended. --- src/class.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/class.c b/src/class.c index 1409c0b33..338b01e3d 100644 --- a/src/class.c +++ b/src/class.c @@ -720,6 +720,17 @@ mrb_mod_include(mrb_state *mrb, mrb_value klass) return klass; } +static mrb_value +mrb_mod_extend_object(mrb_state *mrb, mrb_value mod) +{ + mrb_value obj; + + mrb_check_type(mrb, mod, MRB_TT_MODULE); + mrb_get_args(mrb, "o", &obj); + mrb_include_module(mrb, mrb_class_ptr(mrb_singleton_class(mrb, obj)), mrb_class_ptr(mod)); + return mod; +} + static mrb_value mrb_mod_included_modules(mrb_state *mrb, mrb_value self) { @@ -1393,6 +1404,8 @@ mrb_init_class(mrb_state *mrb) mrb_define_method(mrb, cls, "superclass", mrb_class_superclass, ARGS_NONE()); /* 15.2.3.3.4 */ mrb_define_method(mrb, cls, "new", mrb_instance_new, ARGS_ANY()); /* 15.2.3.3.3 */ mrb_define_method(mrb, cls, "inherited", mrb_bob_init, ARGS_REQ(1)); + mrb_define_method(mrb, mod, "extend_object", mrb_mod_extend_object, ARGS_REQ(1)); /* 15.2.2.4.25 */ + mrb_define_method(mrb, mod, "extended", mrb_bob_init, ARGS_REQ(1)); /* 15.2.2.4.26 */ mrb_define_method(mrb, mod, "include", mrb_mod_include, ARGS_ANY()); /* 15.2.2.4.27 */ mrb_define_method(mrb, mod, "append_features", mrb_mod_append_features, ARGS_REQ(1)); /* 15.2.2.4.10 */ mrb_define_method(mrb, mod, "included", mrb_bob_init, ARGS_REQ(1)); /* 15.2.2.4.29 */ -- cgit v1.2.3 From 8020c280aa88354d797bdaf754c7beeb42dabab4 Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Tue, 17 Jul 2012 00:56:18 +0900 Subject: Add test for Kernel#extend. --- test/t/kernel.rb | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/test/t/kernel.rb b/test/t/kernel.rb index 5aa7672d7..4f1d2b42f 100644 --- a/test/t/kernel.rb +++ b/test/t/kernel.rb @@ -187,6 +187,21 @@ assert('Kernel#dup', '15.3.1.3.9') do c.respond_to?(:test) == false end +assert('Kernel#extend', '15.3.1.3.13') do + class Test4ExtendClass + end + + module Test4ExtendModule + def test_method; end + end + + a = Test4ExtendClass.new + a.extend(Test4ExtendModule) + b = Test4ExtendClass.new + + a.respond_to?(:test_method) == true && b.respond_to?(:test_method) == false +end + assert('Kernel#global_variables', '15.3.1.3.14') do global_variables.class == Array end -- cgit v1.2.3 From 526dd09b7a7bbaaddfe4d73b5d407409d518742d Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 17 Jul 2012 01:33:40 +0900 Subject: add Module#ancestors 15.2.2.4.9 --- src/class.c | 21 +++++++++++++++++++++ test/t/module.rb | 14 +++++++++----- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/class.c b/src/class.c index 1409c0b33..976642224 100644 --- a/src/class.c +++ b/src/class.c @@ -720,6 +720,26 @@ mrb_mod_include(mrb_state *mrb, mrb_value klass) return klass; } +static mrb_value +mrb_mod_ancestors(mrb_state *mrb, mrb_value self) +{ + mrb_value result; + struct RClass *c = mrb_class_ptr(self); + + result = mrb_ary_new(mrb); + while (c) { + if (c->tt == MRB_TT_ICLASS) { + mrb_ary_push(mrb, result, mrb_obj_value(c->c)); + } + else { + mrb_ary_push(mrb, result, mrb_obj_value(c)); + } + c = c->super; + } + + return result; +} + static mrb_value mrb_mod_included_modules(mrb_state *mrb, mrb_value self) { @@ -1400,6 +1420,7 @@ mrb_init_class(mrb_state *mrb) mrb_define_method(mrb, mod, "to_s", mrb_mod_to_s, ARGS_NONE()); mrb_define_method(mrb, mod, "alias_method", mrb_mod_alias, ARGS_ANY()); /* 15.2.2.4.8 */ + mrb_define_method(mrb, mod, "ancestors", mrb_mod_ancestors, ARGS_NONE()); /* 15.2.2.4.9 */ mrb_define_method(mrb, mod, "undef_method", mrb_mod_undef, ARGS_ANY()); /* 15.2.2.4.41 */ mrb_define_method(mrb, mod, "const_defined?", mrb_mod_const_defined, ARGS_REQ(1)); /* 15.2.2.4.20 */ mrb_define_method(mrb, mod, "const_get", mrb_mod_const_get, ARGS_REQ(1)); /* 15.2.2.4.21 */ diff --git a/test/t/module.rb b/test/t/module.rb index 63c2e7dc8..0e5abff81 100644 --- a/test/t/module.rb +++ b/test/t/module.rb @@ -13,6 +13,12 @@ end # TODO not implemented ATM assert('Module.nesting', '15.2.2.3.2') do +assert('Module#ancestors', '15.2.2.4.9') do + + r = String.ancestors + r.class == Array and r.include?(String) and r.include?(Object) +end + assert('Module#append_features', '15.2.2.4.10') do module Test4AppendFeatures def self.append_features(mod) @@ -100,14 +106,12 @@ assert('Module#included', '15.2.2.4.29') do end assert('Module#included_modules', '15.2.2.4.30') do - r1 = true module Test4includedModules - Const4Included = 42 end module Test4includedModules2 - r1 = included Test4includedModules + include Test4includedModules end - Test4includedModules2.included_modules.class == Array + r = Test4includedModules2.included_modules + r.class == Array and r.include?(Test4includedModules) end - -- cgit v1.2.3 From 6696876e729a99a0a54e0989ef38361687fb0b5d Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 17 Jul 2012 02:01:52 +0900 Subject: refactoring on module tests --- test/t/module.rb | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/test/t/module.rb b/test/t/module.rb index 0e5abff81..5b847e8b7 100644 --- a/test/t/module.rb +++ b/test/t/module.rb @@ -14,7 +14,6 @@ end # TODO not implemented ATM assert('Module.nesting', '15.2.2.3.2') do assert('Module#ancestors', '15.2.2.4.9') do - r = String.ancestors r.class == Array and r.include?(String) and r.include?(Object) end @@ -53,21 +52,12 @@ assert('Module.const_missing', '15.2.2.4.22') do e1 = nil module Test4ConstMissing - def const_missing(sym) - # ATM this redirect doesn't work - puts "PLEASE GO TO TEST CASE Module.const_missing!" - puts "IT IS WORKING NOW!! PLEASE FINALIZE." - puts "Thanks :)" + def self.const_missing(sym) + 42 # the answer to everything end end - begin - Test4ConstMissing.const_get(:ConstDoesntExist) - rescue => e2 - e1 = e2 - end - - e1.class == NameError + Test4ConstMissing.const_get(:ConstDoesntExist) == 42 end assert('Module#const_get', '15.2.2.4.23') do @@ -93,7 +83,7 @@ end assert('Module#included', '15.2.2.4.29') do module Test4Included Const4Included = 42 - def Test4Included.included mod + def self.included mod Test4Included.const_set(:Const4Included2, mod) end end -- cgit v1.2.3 From e8ade38104e006ca4b41332f1e61e4f4392162e6 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 17 Jul 2012 02:17:16 +0900 Subject: undef append_features for Classes --- src/class.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/class.c b/src/class.c index 2784327f3..e1a325b51 100644 --- a/src/class.c +++ b/src/class.c @@ -1441,4 +1441,5 @@ mrb_init_class(mrb_state *mrb) mrb_define_method(mrb, mod, "define_method", mod_define_method, ARGS_REQ(1)); mrb_define_method(mrb, mod, "===", mrb_mod_eqq, ARGS_REQ(1)); + mrb_undef_method(mrb, cls, "append_features"); } -- cgit v1.2.3 From 8ce2af99f37caba9d5b8494195c2d096c652c3aa Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 17 Jul 2012 03:31:56 +0900 Subject: CRuby style inclusion order; close #377 --- src/class.c | 52 +++++++++++++++++++++++++++------------------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/src/class.c b/src/class.c index e1a325b51..d0063529d 100644 --- a/src/class.c +++ b/src/class.c @@ -653,40 +653,42 @@ boot_defclass(mrb_state *mrb, struct RClass *super) return c; } -static int -find_in_ancestors(struct RClass *c, struct RClass *m) -{ - while(c) { - if (c == m || c->mt == m->mt){ - return 1; - } - c = c->super; - } - return 0; -} - void mrb_include_module(mrb_state *mrb, struct RClass *c, struct RClass *m) { - struct RClass *ic, *ins_pos; + struct RClass *ins_pos; ins_pos = c; while (m) { - if (!find_in_ancestors(c, m)) { - ic = (struct RClass*)mrb_obj_alloc(mrb, MRB_TT_ICLASS, mrb->class_class); - if (m->tt == MRB_TT_ICLASS) { - ic->c = m->c; + struct RClass *p = c, *ic; + int superclass_seen = 0; + + while(p) { + if (c != p && p->tt == MRB_TT_CLASS) { + superclass_seen = 1; } - else { - ic->c = m; + else if (p->mt == m->mt){ + if (p->tt == MRB_TT_ICLASS && !superclass_seen) { + ins_pos = p; + } + goto skip; } - ic->mt = m->mt; - ic->iv = m->iv; - ic->super = ins_pos->super; - ins_pos->super = ic; - mrb_field_write_barrier(mrb, (struct RBasic*)ins_pos, (struct RBasic*)ic); - ins_pos = ic; + p = p->super; + } + ic = (struct RClass*)mrb_obj_alloc(mrb, MRB_TT_ICLASS, mrb->class_class); + if (m->tt == MRB_TT_ICLASS) { + ic->c = m->c; + } + else { + ic->c = m; } + ic->mt = m->mt; + ic->iv = m->iv; + ic->super = ins_pos->super; + ins_pos->super = ic; + mrb_field_write_barrier(mrb, (struct RBasic*)ins_pos, (struct RBasic*)ic); + ins_pos = ic; + skip: m = m->super; } } -- cgit v1.2.3 From 0ac2d7ac977e640c0188fbb6e68f934ce35a79e1 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 17 Jul 2012 23:38:43 +0900 Subject: remove debug print --- src/range.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/range.c b/src/range.c index 2fa6763a6..14fa2a6a3 100644 --- a/src/range.c +++ b/src/range.c @@ -30,8 +30,6 @@ range_check(mrb_state *mrb, mrb_value a, mrb_value b) return; } - mrb_p(mrb, a); - mrb_p(mrb, b); ans = mrb_funcall(mrb, a, "<=>", 1, b); if (mrb_nil_p(ans)) { /* can not be compared */ -- cgit v1.2.3 From 87daf837d602b0e7217fd0a684f2983c6c1a2c14 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 17 Jul 2012 23:40:05 +0900 Subject: prepare empty mrb_p() to make like work --- src/print.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/print.c b/src/print.c index 0de9e7429..663db11df 100644 --- a/src/print.c +++ b/src/print.c @@ -72,6 +72,12 @@ mrb_show_copyright(mrb_state *mrb) printf("mruby - Copyright (c) 2010-2012 mruby developers\n"); } #else +mrb_value +mrb_p(mrb_state *mrb, mrb_value obj) +{ + return mrb_nil_value(); +} + void mrb_show_version(mrb_state *mrb) { -- cgit v1.2.3 From cb8fe4400fc2424a71d58411fb720e4507287167 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 17 Jul 2012 23:41:02 +0900 Subject: mrb_p() should return the argument --- src/print.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/print.c b/src/print.c index 663db11df..1b199fb44 100644 --- a/src/print.c +++ b/src/print.c @@ -75,7 +75,7 @@ mrb_show_copyright(mrb_state *mrb) mrb_value mrb_p(mrb_state *mrb, mrb_value obj) { - return mrb_nil_value(); + return obj; } void -- cgit v1.2.3 From 6ea5c6b5172eebd0937710418ad99f82fbcf28e7 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 17 Jul 2012 23:46:48 +0900 Subject: make mirb work even when DISABLE_STDIO is set --- tools/mirb/mirb.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/tools/mirb/mirb.c b/tools/mirb/mirb.c index 8b36cb5a6..4159f12bd 100644 --- a/tools/mirb/mirb.c +++ b/tools/mirb/mirb.c @@ -13,6 +13,19 @@ #include #include +#ifndef ENABLE_STDIO +#include +static void +p(mrb_state *mrb, mrb_value obj) +{ + obj = mrb_funcall(mrb, obj, "inspect", 0); + fwrite(RSTRING_PTR(obj), RSTRING_LEN(obj), 1, stdout); + putc('\n', stdout); +} +#else +#define p(mrb,obj) mrb_p(mrb,obj) +#endif + /* Guess if the user might want to enter more * or if he wants an evaluation of his code now */ int @@ -219,13 +232,13 @@ main(void) mrb_top_self(mrb)); /* did an exception occur? */ if (mrb->exc) { - mrb_p(mrb, mrb_obj_value(mrb->exc)); + p(mrb, mrb_obj_value(mrb->exc)); mrb->exc = 0; } else { /* no */ printf(" => "); - mrb_p(mrb, result); + p(mrb, result); } } memset(ruby_code, 0, sizeof(*ruby_code)); -- cgit v1.2.3 From 36664174cb5f4150533f51b36b19491474023988 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 17 Jul 2012 23:48:55 +0900 Subject: change return type of mrb_p() to void --- include/mruby.h | 2 +- src/print.c | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/include/mruby.h b/include/mruby.h index 137a1b94e..8afde3439 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -354,7 +354,7 @@ int mrb_checkstack(mrb_state*,int); mrb_value mrb_top_self(mrb_state *); mrb_value mrb_run(mrb_state*, struct RProc*, mrb_value); -mrb_value mrb_p(mrb_state*, mrb_value); +void mrb_p(mrb_state*, mrb_value); mrb_int mrb_obj_id(mrb_value obj); mrb_sym mrb_to_id(mrb_state *mrb, mrb_value name); diff --git a/src/print.c b/src/print.c index 1b199fb44..e081989d2 100644 --- a/src/print.c +++ b/src/print.c @@ -27,13 +27,12 @@ printstr(mrb_state *mrb, mrb_value obj) } } -mrb_value +void mrb_p(mrb_state *mrb, mrb_value obj) { obj = mrb_funcall(mrb, obj, "inspect", 0); printstr(mrb, obj); putc('\n', stdout); - return obj; } /* 15.3.1.2.9 */ @@ -72,10 +71,9 @@ mrb_show_copyright(mrb_state *mrb) printf("mruby - Copyright (c) 2010-2012 mruby developers\n"); } #else -mrb_value +void mrb_p(mrb_state *mrb, mrb_value obj) { - return obj; } void -- cgit v1.2.3 From 1cffba6ae10aec7e2433e673e1bb5ab075885418 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 17 Jul 2012 23:50:19 +0900 Subject: use fwrite() instead of loop putc --- src/print.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/print.c b/src/print.c index e081989d2..e6805edbf 100644 --- a/src/print.c +++ b/src/print.c @@ -20,10 +20,7 @@ printstr(mrb_state *mrb, mrb_value obj) str = mrb_str_ptr(obj); s = str->ptr; len = str->len; - while (len--) { - putc(*s, stdout); - s++; - } + fwrite(s, len, 1, stdout); } } -- cgit v1.2.3 From 42cfe5c9f39bf5b32d4b4754c170cfeb947389b4 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 17 Jul 2012 23:51:57 +0900 Subject: make mruby work even when DISABLE_STDIO is set --- tools/mruby/mruby.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/tools/mruby/mruby.c b/tools/mruby/mruby.c index abc0bdc5e..26b1e44d5 100644 --- a/tools/mruby/mruby.c +++ b/tools/mruby/mruby.c @@ -7,6 +7,18 @@ #include #include +#ifndef ENABLE_STDIO +static void +p(mrb_state *mrb, mrb_value obj) +{ + obj = mrb_funcall(mrb, obj, "inspect", 0); + fwrite(RSTRING_PTR(obj), RSTRING_LEN(obj), 1, stdout); + putc('\n', stdout); +} +#else +#define p(mrb,obj) mrb_p(mrb,obj) +#endif + void mrb_show_version(mrb_state *); void mrb_show_copyright(mrb_state *); @@ -173,7 +185,7 @@ main(int argc, char **argv) if (!args.check_syntax) { mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); if (mrb->exc) { - mrb_p(mrb, mrb_obj_value(mrb->exc)); + p(mrb, mrb_obj_value(mrb->exc)); } } } @@ -198,7 +210,7 @@ main(int argc, char **argv) mrbc_context_free(mrb, c); if (mrb->exc) { if (!mrb_undef_p(v)) { - mrb_p(mrb, mrb_obj_value(mrb->exc)); + p(mrb, mrb_obj_value(mrb->exc)); } } else if (args.check_syntax) { -- cgit v1.2.3 From a18699a80c14e0e44e904b7537d6d57463b6f39c Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 17 Jul 2012 23:56:57 +0900 Subject: print.rb: raise NotImplementedError for disabled methods --- mrblib/print.rb | 117 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 61 insertions(+), 56 deletions(-) diff --git a/mrblib/print.rb b/mrblib/print.rb index c4ce74d6b..dea088e2b 100644 --- a/mrblib/print.rb +++ b/mrblib/print.rb @@ -3,71 +3,76 @@ # # ISO 15.3.1 module Kernel + unless Kernel.respond_to?(:__printstr__) + def print(*a) + raise NotImplementedError.new('print not available') + end + def puts(*a) + raise NotImplementedError.new('puts not available') + end + def p(*a) + raise NotImplementedError.new('p not available') + end + def printf(*args) + raise NotImplementedError.new('printf not available') + end + else + unless Kernel.respond_to?(:sprintf) + def printf(*args) + raise NotImplementedError.new('printf not available') + end + def sprintf(*args) + raise NotImplementedError.new('sprintf not available') + end + end - ## - # Invoke method +print+ on STDOUT and passing +*args+ - # - # ISO 15.3.1.2.10 - def print(*args) - i = 0 - len = args.size - while i < len - __printstr__ args[i].to_s - i += 1 + + ## + # Invoke method +print+ on STDOUT and passing +*args+ + # + # ISO 15.3.1.2.10 + def print(*args) + i = 0 + len = args.size + while i < len + __printstr__ args[i].to_s + i += 1 + end end - end - ## - # Invoke method +puts+ on STDOUT and passing +*args*+ - # - # ISO 15.3.1.2.11 - def puts(*args) - i = 0 - len = args.size - while i < len - __printstr__ args[i].to_s - __printstr__ "\n" - i += 1 + ## + # Invoke method +puts+ on STDOUT and passing +*args*+ + # + # ISO 15.3.1.2.11 + def puts(*args) + i = 0 + len = args.size + while i < len + __printstr__ args[i].to_s + __printstr__ "\n" + i += 1 + end + __printstr__ "\n" if len == 0 + nil end - __printstr__ "\n" if len == 0 - nil - end - ## - # Print human readable object description - # - # ISO 15.3.1.3.34 - def p(*args) - i = 0 - len = args.size - while i < len - __printstr__ args[i].inspect - __printstr__ "\n" - i += 1 + ## + # Print human readable object description + # + # ISO 15.3.1.3.34 + def p(*args) + i = 0 + len = args.size + while i < len + __printstr__ args[i].inspect + __printstr__ "\n" + i += 1 + end + args[0] end - args[0] - end - ## - # Invoke method +sprintf+ and pass +*args+ to it. - # Pass return value to +print+ of STDOUT. - if Kernel.respond_to?(:sprintf) and Kernel.respond_to?(:__printstr__) def printf(*args) __printstr__(sprintf(*args)) end - else - def printf(*args) - raise NotImplementedError.new('printf not available') - end - end - - ## - # +sprintf+ is defined in +src/sprintf.c+ - # This stub method is only to inform the user - # that +sprintf+ isn't implemented. - unless Kernel.respond_to?(:sprintf) - def sprintf(*args) - raise NotImplementedError.new('sprintf not available') - end end end -- cgit v1.2.3 From 265aa0b885e330001b0bf3dd5c6468e5c74f3e59 Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Wed, 18 Jul 2012 02:07:42 +0900 Subject: Undef Class#extend_object. --- src/class.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/class.c b/src/class.c index d0063529d..027eceb10 100644 --- a/src/class.c +++ b/src/class.c @@ -1444,4 +1444,5 @@ mrb_init_class(mrb_state *mrb) mrb_define_method(mrb, mod, "===", mrb_mod_eqq, ARGS_REQ(1)); mrb_undef_method(mrb, cls, "append_features"); + mrb_undef_method(mrb, cls, "extend_object"); } -- cgit v1.2.3 From 2936ba19aa7066771e6aaa9d95a9c9f642af7d0c Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Wed, 18 Jul 2012 02:11:43 +0900 Subject: proc_lambda should return blk instead of self. --- src/proc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/proc.c b/src/proc.c index 3e9bf1f67..e27d5d578 100644 --- a/src/proc.c +++ b/src/proc.c @@ -137,7 +137,7 @@ proc_lambda(mrb_state *mrb, mrb_value self) p2->flags |= MRB_PROC_STRICT; return mrb_obj_value(p2); } - return self; + return blk; } void -- cgit v1.2.3 From a0c4f8558b15f1b5de0cb22f2d45d215f15ecd08 Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Wed, 18 Jul 2012 02:17:29 +0900 Subject: Kernel#respond_to? should return false if the method is undefined. --- src/class.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/class.c b/src/class.c index d0063529d..8a58eb70e 100644 --- a/src/class.c +++ b/src/class.c @@ -1052,8 +1052,14 @@ mrb_obj_respond_to(struct RClass* c, mrb_sym mid) if (h) { k = kh_get(mt, h, mid); - if (k != kh_end(h)) - return 1; /* exist method */ + if (k != kh_end(h)) { + if (kh_value(h, k)) { + return 1; /* exist method */ + } + else { + return 0; + } + } } c = c->super; } -- cgit v1.2.3 From 6f2aefae1f6032be5c7a7ba82734543b90be5ccc Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Wed, 18 Jul 2012 02:23:16 +0900 Subject: Add test for 'respond_to?'. --- test/t/kernel.rb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/test/t/kernel.rb b/test/t/kernel.rb index 4f1d2b42f..6e68b1b22 100644 --- a/test/t/kernel.rb +++ b/test/t/kernel.rb @@ -300,7 +300,12 @@ assert('Kernel#raise', '15.3.1.3.40') do end assert('Kernel#respond_to?', '15.3.1.3.43') do - respond_to? :nil? + class Test4RespondTo + def test_method; end + undef test_method + end + + respond_to?(:nil?) and Test4RespondTo.new.respond_to?(:test_method) == false end assert('Kernel#send', '15.3.1.3.44') do -- cgit v1.2.3 From e6f1e7b899e25c523a43fab59d7f536877bd05ce Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Wed, 18 Jul 2012 02:25:34 +0900 Subject: Add tests for Kernel#lambda and Kernel.lambda. --- test/t/kernel.rb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/test/t/kernel.rb b/test/t/kernel.rb index 4f1d2b42f..da818778a 100644 --- a/test/t/kernel.rb +++ b/test/t/kernel.rb @@ -36,7 +36,9 @@ assert('Kernel.lambda', '15.3.1.2.6') do true end - l.call and l.class == Proc + m = Kernel.lambda(&l) + + l.call and l.class == Proc and m.call and m.class == Proc end # Not implemented at the moment @@ -235,7 +237,9 @@ assert('Kernel#lambda', '15.3.1.3.27') do true end - l.call and l.class == Proc + m = lambda(&l) + + l.call and l.class == Proc and m.call and m.class == Proc end # Not implemented yet -- cgit v1.2.3 From fdc224ff2fd43edfcb8cbe3d60a57bbe6daf1459 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 18 Jul 2012 14:43:14 +0900 Subject: remove unused label; close #381 --- tools/xpcat/xpcat.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/tools/xpcat/xpcat.c b/tools/xpcat/xpcat.c index c9d1abe73..ce3d5854e 100644 --- a/tools/xpcat/xpcat.c +++ b/tools/xpcat/xpcat.c @@ -60,9 +60,7 @@ main(int argc, char *argv[]) } } -done: fclose(outfile); - return EXIT_SUCCESS; } -- cgit v1.2.3 From 7bb71a7d5826accc50a521e770b5b7afe283ad90 Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Tue, 26 Jun 2012 16:02:38 +0900 Subject: Remove magic numbers in mrb_funcall() --- src/class.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/class.c b/src/class.c index 7f53b7a2b..bf63198dd 100644 --- a/src/class.c +++ b/src/class.c @@ -7,6 +7,7 @@ #include "mruby.h" #include #include +#include #include "mruby/class.h" #include "mruby/proc.h" #include "mruby/string.h" @@ -863,26 +864,31 @@ mrb_method_search(mrb_state *mrb, struct RClass* c, mrb_sym mid) } mrb_value -mrb_funcall(mrb_state *mrb, mrb_value self, const char *name, int argc,...) +mrb_funcall(mrb_state *mrb, mrb_value self, const char *name, int argc, ...) { - mrb_value args[16]; + mrb_value *args; + mrb_value result; va_list ap; int i; - if (argc == 0) { - for (i=0; i<5; i++) { - args[i] = mrb_nil_value(); - } - } - else { + if (argc != 0) { + args = mrb_malloc(mrb, sizeof(mrb_value) * argc); + assert(args != 0); + va_start(ap, argc); - // assert(argc < 16); - for (i=0; i Date: Wed, 18 Jul 2012 15:47:57 +0900 Subject: MRB_FUNCALL_ARGC_MAX support. (refs comments in #324). --- include/mrbconf.h | 4 ++++ src/class.c | 20 +++++++++++++++----- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/include/mrbconf.h b/include/mrbconf.h index 5d307e66f..757192d89 100644 --- a/include/mrbconf.h +++ b/include/mrbconf.h @@ -23,6 +23,10 @@ #undef HAVE_UNISTD_H /* WINDOWS */ #define HAVE_UNISTD_H /* LINUX */ + +#define MRB_FUNCALL_ARGC_MAX 16U /* Allocate arrays using auto variable. */ +//#undef MRB_FUNCALL_ARGC_MAX /* Allocate arrays using mrb_malloc if undefned. */ + /* end of configuration */ #ifdef MRB_USE_FLOAT diff --git a/src/class.c b/src/class.c index bf63198dd..762fa1591 100644 --- a/src/class.c +++ b/src/class.c @@ -7,7 +7,6 @@ #include "mruby.h" #include #include -#include #include "mruby/class.h" #include "mruby/proc.h" #include "mruby/string.h" @@ -866,27 +865,38 @@ mrb_method_search(mrb_state *mrb, struct RClass* c, mrb_sym mid) mrb_value mrb_funcall(mrb_state *mrb, mrb_value self, const char *name, int argc, ...) { - mrb_value *args; +#if defined(MRB_FUNCALL_ARGC_MAX) + mrb_value args[MRB_FUNCALL_ARGC_MAX]; +#else + mrb_value *args = NULL; +#endif mrb_value result; va_list ap; int i; if (argc != 0) { +#if !defined(MRB_FUNCALL_ARGC_MAX) args = mrb_malloc(mrb, sizeof(mrb_value) * argc); - assert(args != 0); +#else + if (argc > MRB_FUNCALL_ARGC_MAX) { + mrb_raise(mrb, E_ARGUMENT_ERROR, "Too long arguments. (limit=%d)\n", MRB_FUNCALL_ARGC_MAX); + } +#endif va_start(ap, argc); for (i = 0; i < argc; i++) { args[i] = va_arg(ap, mrb_value); } va_end(ap); - } else { - args = NULL; } + result = mrb_funcall_argv(mrb, self, name, argc, args); + +#if !defined(MRB_FUNCALL_ARGC_MAX) if (args != NULL) { mrb_free(mrb, args); } +#endif return result; } -- cgit v1.2.3 From b60baedae5e1f00646987c89791d4577ae961410 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 19 Jul 2012 08:23:49 +0900 Subject: replace strcpy by memcpy; close #383 --- src/codegen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/codegen.c b/src/codegen.c index daa521130..e032ec509 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -553,7 +553,7 @@ attrsym(codegen_scope *s, mrb_sym a) name = mrb_sym2name_len(s->mrb, a, &len); name2 = codegen_palloc(s, len+1); - strcpy(name2, name); + memcpy(name2, name, len); name2[len] = '='; name2[len+1] = '\0'; -- cgit v1.2.3 From 8ae67d10b33aef56eab8ccd13b2a7471968df1ee Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 19 Jul 2012 11:28:06 +0900 Subject: make MRB_ARENA_SIZE to be configurable --- include/mruby.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/include/mruby.h b/include/mruby.h index 8afde3439..7abf66cb9 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -190,7 +190,9 @@ struct mrb_state; typedef void* (*mrb_allocf) (struct mrb_state *mrb, void*, size_t); -#define MRB_ARENA_SIZE 1024 //256 up kusuda 2011/04/30 +#ifndef MRB_ARENA_SIZE +#define MRB_ARENA_SIZE 1024 +#endif #define ruby_debug (mrb_nil_value()) #define ruby_verbose (mrb_nil_value()) -- cgit v1.2.3 From 4b9ef5dabee09115edc15ecad05b335ecfaf598d Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 19 Jul 2012 17:45:13 +0900 Subject: use no malloc in mrb_funcall; close #386 --- include/mrbconf.h | 5 ++--- src/class.c | 24 +++++------------------- 2 files changed, 7 insertions(+), 22 deletions(-) diff --git a/include/mrbconf.h b/include/mrbconf.h index 757192d89..cf8217b23 100644 --- a/include/mrbconf.h +++ b/include/mrbconf.h @@ -21,12 +21,11 @@ //#define DISABLE_STRUCT /* Struct class */ //#define DISABLE_STDIO /* use of stdio */ +//#define MRB_FUNCALL_ARGC_MAX 16 /* argv size in mrb_funcall */ + #undef HAVE_UNISTD_H /* WINDOWS */ #define HAVE_UNISTD_H /* LINUX */ -#define MRB_FUNCALL_ARGC_MAX 16U /* Allocate arrays using auto variable. */ -//#undef MRB_FUNCALL_ARGC_MAX /* Allocate arrays using mrb_malloc if undefned. */ - /* end of configuration */ #ifdef MRB_USE_FLOAT diff --git a/src/class.c b/src/class.c index 762fa1591..38eb5ea1f 100644 --- a/src/class.c +++ b/src/class.c @@ -862,26 +862,21 @@ mrb_method_search(mrb_state *mrb, struct RClass* c, mrb_sym mid) return m; } +#ifndef MRB_FUNCALL_ARGC_MAX +#define MRB_FUNCALL_ARGC_MAX 16 +#endif + mrb_value mrb_funcall(mrb_state *mrb, mrb_value self, const char *name, int argc, ...) { -#if defined(MRB_FUNCALL_ARGC_MAX) mrb_value args[MRB_FUNCALL_ARGC_MAX]; -#else - mrb_value *args = NULL; -#endif - mrb_value result; va_list ap; int i; if (argc != 0) { -#if !defined(MRB_FUNCALL_ARGC_MAX) - args = mrb_malloc(mrb, sizeof(mrb_value) * argc); -#else if (argc > MRB_FUNCALL_ARGC_MAX) { mrb_raise(mrb, E_ARGUMENT_ERROR, "Too long arguments. (limit=%d)\n", MRB_FUNCALL_ARGC_MAX); } -#endif va_start(ap, argc); for (i = 0; i < argc; i++) { @@ -889,16 +884,7 @@ mrb_funcall(mrb_state *mrb, mrb_value self, const char *name, int argc, ...) } va_end(ap); } - - result = mrb_funcall_argv(mrb, self, name, argc, args); - -#if !defined(MRB_FUNCALL_ARGC_MAX) - if (args != NULL) { - mrb_free(mrb, args); - } -#endif - - return result; + return mrb_funcall_argv(mrb, self, name, argc, args); } -- cgit v1.2.3 From 4bc416cae97283db07e8eb9dc695dd89814e4387 Mon Sep 17 00:00:00 2001 From: Jiro Nishiguchi Date: Thu, 19 Jul 2012 23:13:29 +0900 Subject: mrb_load_* should return value --- src/parse.y | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/parse.y b/src/parse.y index 0c589d822..87962b4bb 100644 --- a/src/parse.y +++ b/src/parse.y @@ -4889,7 +4889,7 @@ load_exec(mrb_state *mrb, parser_state *p, mrbc_context *c) if (c->no_exec) return mrb_fixnum_value(n); } v = mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); - if (!mrb->exc) return mrb_undef_value(); + if (mrb->exc) return mrb_undef_value(); return v; } -- cgit v1.2.3 From 7010aebbce970aba6e451f238789e3e92a76afbc Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Sat, 21 Jul 2012 19:40:20 +0900 Subject: Modify allocation size of mrb->irep. --- src/state.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/state.c b/src/state.c index 7f74606ff..0d236e660 100644 --- a/src/state.c +++ b/src/state.c @@ -83,7 +83,7 @@ mrb_add_irep(mrb_state *mrb, int idx) while (mrb->irep_capa <= idx) { mrb->irep_capa *= 2; } - mrb->irep = mrb_realloc(mrb, mrb->irep, sizeof(mrb_irep)*mrb->irep_capa); + mrb->irep = mrb_realloc(mrb, mrb->irep, sizeof(mrb_irep*)*mrb->irep_capa); } } -- cgit v1.2.3 From a4c6b1c75edc7308a9751ebc1858d86774434542 Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Sun, 22 Jul 2012 00:35:49 +0900 Subject: Remove initialization of mt. --- src/class.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/class.c b/src/class.c index 38eb5ea1f..b8532cdcc 100644 --- a/src/class.c +++ b/src/class.c @@ -115,7 +115,6 @@ mrb_define_module_id(mrb_state *mrb, mrb_sym name) { struct RClass *m = mrb_module_new(mrb); - m->mt = kh_init(mt, mrb); mrb_obj_iv_set(mrb, (struct RObject*)mrb->object_class, name, mrb_obj_value(m)); mrb_name_class(mrb, m, name); -- cgit v1.2.3 From 9dd3ac36d1ae16fffb1902e9d459c1bf9aec86a4 Mon Sep 17 00:00:00 2001 From: Akira Kuroda Date: Sun, 22 Jul 2012 21:06:38 +0900 Subject: add test cases for floor, inifinite?, truncate, ceil, and round --- test/t/float.rb | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/test/t/float.rb b/test/t/float.rb index 5c5245c73..30b470272 100644 --- a/test/t/float.rb +++ b/test/t/float.rb @@ -65,7 +65,11 @@ assert('Float#==', '15.2.9.3.7') do end assert('Float#ceil', '15.2.9.3.8') do - 3.123456789.ceil == 4 + a = 3.123456789.ceil + b = 3.0.ceil + c = -3.123456789.ceil + d = -3.0.ceil + a == 4 and b == 3 and c == -3 and d == -3 end assert('Float#finite?', '15.2.9.3.9') do @@ -74,20 +78,34 @@ assert('Float#finite?', '15.2.9.3.9') do end assert('Float#floor', '15.2.9.3.10') do - 3.123456789.floor == 3 + a = 3.123456789.floor + b = 3.0.floor + c = -3.123456789.floor + d = -3.0.floor + a == 3 and b == 3 and c == -4 and d == -3 end assert('Float#infinite?', '15.2.9.3.11') do - not 3.123456789.infinite? and - (1.0 / 0.0).infinite? + a = 3.123456789.infinite? + b = (1.0 / 0.0).infinite? + c = (-1.0 / 0.0).infinite? + + a == nil and b == 1 and c == -1 end assert('Float#round', '15.2.9.3.12') do a = 3.123456789.round b = 3.5.round c = 3.499999999.round + d = (-3.123456789).round + e = (-3.5).round + f = 12345.67.round(-1) + g = 3.123456789.round(0) + h = 3.123456789.round(1) + i = 3.123456789.round(4) - a == 3 and b == 4 and c == 3 + a == 3 and b == 4 and c == 3 and d == -3 and e == -4 and + f == 12350 and g == 3 and h == 3.1 and i == 3.1235 end assert('Float#to_f', '15.2.9.3.13') do @@ -101,5 +119,5 @@ assert('Float#to_i', '15.2.9.3.14') do end assert('Float#truncate', '15.2.9.3.15') do - 3.123456789.truncate == 3 + 3.123456789.truncate == 3 and -3.1.truncate == -3 end -- cgit v1.2.3 From 6ada0df27ec557c343ffa22dee8ba43211f51a0f Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 22 Jul 2012 23:07:21 +0900 Subject: mruby should print exception --- src/parse.y | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/parse.y b/src/parse.y index 87962b4bb..a2a12b14d 100644 --- a/src/parse.y +++ b/src/parse.y @@ -4871,25 +4871,27 @@ load_exec(mrb_state *mrb, parser_state *p, mrbc_context *c) n = snprintf(buf, sizeof(buf), "line %d: %s\n", p->error_buffer[0].lineno, p->error_buffer[0].message); mrb->exc = (struct RObject*)mrb_object(mrb_exc_new(mrb, E_SYNTAX_ERROR, buf, n)); + mrb_parser_free(p); + return mrb_undef_value(); } else { - mrb->exc = (struct RObject*)mrb_object(mrb_exc_new(mrb, E_SYNTAX_ERROR, "", 0)); + mrb->exc = (struct RObject*)mrb_object(mrb_exc_new(mrb, E_SYNTAX_ERROR, "syntax error", 0)); + mrb_parser_free(p); + return mrb_nil_value(); } - mrb_parser_free(p); - return mrb_undef_value(); } n = mrb_generate_code(mrb, p->tree); mrb_parser_free(p); if (n < 0) { - mrb->exc = (struct RObject*)mrb_object(mrb_exc_new(mrb, E_SCRIPT_ERROR, "", 0)); - return mrb_undef_value(); + mrb->exc = (struct RObject*)mrb_object(mrb_exc_new(mrb, E_SCRIPT_ERROR, "codegen error", 0)); + return mrb_nil_value(); } if (c) { if (c->dump_result) codedump_all(mrb, n); if (c->no_exec) return mrb_fixnum_value(n); } v = mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); - if (mrb->exc) return mrb_undef_value(); + if (mrb->exc) return mrb_nil_value(); return v; } -- cgit v1.2.3 From d61cb77346708754ec0b4625c79841d45f01fff3 Mon Sep 17 00:00:00 2001 From: crimsonwoods Date: Sun, 22 Jul 2012 23:10:15 +0900 Subject: fix: SIZE_MAX is not defined in "stdint.h" --- src/gc.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/gc.c b/src/gc.c index 3c00bb015..819fb94c6 100644 --- a/src/gc.c +++ b/src/gc.c @@ -17,6 +17,10 @@ #include "mruby/data.h" #include "mruby/variable.h" +#ifndef SIZE_MAX +#include // for SIZE_MAX +#endif + /* = Tri-color Incremental Garbage Collection -- cgit v1.2.3 From a9a91c3561ff68d361c7aaf5bfd3379598012c82 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 22 Jul 2012 23:16:40 +0900 Subject: Time.at should take optional second argument --- src/time.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/time.c b/src/time.c index 45e796069..94b76c8f9 100644 --- a/src/time.c +++ b/src/time.c @@ -227,9 +227,10 @@ mrb_time_now(mrb_state *mrb, mrb_value self) static mrb_value mrb_time_at(mrb_state *mrb, mrb_value self) { - mrb_float f; + mrb_float f, f2 = 0; - mrb_get_args(mrb, "f", &f); + mrb_get_args(mrb, "f|f", &f, &f2); + f += f2 * 1e-6; return mrb_time_make(mrb, mrb_class_ptr(self), f, MRB_TIMEZONE_LOCAL); } -- cgit v1.2.3 From 8dc69cf216b265859732ba4600cdc4d1fb1c65d1 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 23 Jul 2012 07:33:18 +0900 Subject: time.c: separate sec and usec to keep precisions --- src/time.c | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/time.c b/src/time.c index 94b76c8f9..f3072b7d9 100644 --- a/src/time.c +++ b/src/time.c @@ -160,13 +160,17 @@ mrb_time_wrap(mrb_state *mrb, struct RClass *tc, struct mrb_time *tm) /* Allocates a mrb_time object and initializes it. */ static struct mrb_time* -mrb_time_alloc(mrb_state *mrb, mrb_float seconds, enum mrb_timezone timezone) +mrb_time_alloc(mrb_state *mrb, mrb_float sec, mrb_float usec, enum mrb_timezone timezone) { struct mrb_time *tm; tm = mrb_malloc(mrb, sizeof(struct mrb_time)); - tm->sec = (time_t)seconds; - tm->usec = (seconds - tm->sec) * 1.0e6; + tm->sec = (time_t)sec; + tm->usec = (sec - tm->sec) * 1.0e6 + usec; + if (tm->usec < 0) { + tm->sec--; + tm->usec += 1.0e6; + } tm->timezone = timezone; mrb_time_update_datetime(tm); @@ -174,9 +178,9 @@ mrb_time_alloc(mrb_state *mrb, mrb_float seconds, enum mrb_timezone timezone) } static mrb_value -mrb_time_make(mrb_state *mrb, struct RClass *c, mrb_float seconds, enum mrb_timezone timezone) +mrb_time_make(mrb_state *mrb, struct RClass *c, mrb_float sec, mrb_float usec, enum mrb_timezone timezone) { - return mrb_time_wrap(mrb, c, mrb_time_alloc(mrb, seconds, timezone)); + return mrb_time_wrap(mrb, c, mrb_time_alloc(mrb, sec, usec, timezone)); } static struct mrb_time* @@ -230,8 +234,7 @@ mrb_time_at(mrb_state *mrb, mrb_value self) mrb_float f, f2 = 0; mrb_get_args(mrb, "f|f", &f, &f2); - f += f2 * 1e-6; - return mrb_time_make(mrb, mrb_class_ptr(self), f, MRB_TIMEZONE_LOCAL); + return mrb_time_make(mrb, mrb_class_ptr(self), f, f2, MRB_TIMEZONE_LOCAL); } static struct mrb_time* @@ -259,7 +262,7 @@ time_mktime(mrb_state *mrb, mrb_int ayear, mrb_int amonth, mrb_int aday, mrb_raise(mrb, E_ARGUMENT_ERROR, "Not a valid time."); } - return mrb_time_alloc(mrb, nowsecs+ausec/10e6, timezone); + return mrb_time_alloc(mrb, nowsecs, ausec, timezone); } /* 15.2.19.6.2 */ @@ -343,7 +346,7 @@ mrb_time_plus(mrb_state *mrb, mrb_value self) if (!tm) return mrb_nil_value(); f += tm->sec; f += (mrb_float)tm->usec / 1.0e6; - return mrb_time_make(mrb, mrb_obj_class(mrb, self), f, tm->timezone); + return mrb_time_make(mrb, mrb_obj_class(mrb, self), f, 0, tm->timezone); } static mrb_value @@ -364,11 +367,10 @@ mrb_time_minus(mrb_state *mrb, mrb_value self) return mrb_float_value(f); } else { - mrb_float f, f2; - mrb_get_args(mrb, "f", &f2); + mrb_float f; - f = ((mrb_float)tm->sec + (mrb_float)tm->usec/1.0e6); - return mrb_time_make(mrb, mrb_obj_class(mrb, self), f-f2, tm->timezone); + mrb_get_args(mrb, "f", &f); + return mrb_time_make(mrb, mrb_obj_class(mrb, self), tm->sec-f, tm->usec, tm->timezone); } } -- cgit v1.2.3 From 8b6f6faf1e3771c04a1e2a58b1bbc84fe7d5c1e2 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 23 Jul 2012 08:38:24 +0900 Subject: separate sec and usec in mrb_time_plus --- src/time.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/time.c b/src/time.c index f3072b7d9..938e8af36 100644 --- a/src/time.c +++ b/src/time.c @@ -344,9 +344,7 @@ mrb_time_plus(mrb_state *mrb, mrb_value self) mrb_get_args(mrb, "f", &f); tm = mrb_get_datatype(mrb, self, &mrb_time_type); if (!tm) return mrb_nil_value(); - f += tm->sec; - f += (mrb_float)tm->usec / 1.0e6; - return mrb_time_make(mrb, mrb_obj_class(mrb, self), f, 0, tm->timezone); + return mrb_time_make(mrb, mrb_obj_class(mrb, self), tm->sec+f, tm->usec, tm->timezone); } static mrb_value -- cgit v1.2.3 From cac740c75068e6465725e50d7aca576c1bf550c5 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 23 Jul 2012 08:45:53 +0900 Subject: remove duplicated variable declaration --- src/time.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/time.c b/src/time.c index 938e8af36..8f9e6dd0c 100644 --- a/src/time.c +++ b/src/time.c @@ -365,8 +365,6 @@ mrb_time_minus(mrb_state *mrb, mrb_value self) return mrb_float_value(f); } else { - mrb_float f; - mrb_get_args(mrb, "f", &f); return mrb_time_make(mrb, mrb_obj_class(mrb, self), tm->sec-f, tm->usec, tm->timezone); } -- cgit v1.2.3 From d73a54d80a8c31067aefbeb1c8d26a726ba25f3d Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Mon, 23 Jul 2012 10:18:11 +0900 Subject: Use memcpy instead of strncpy --- src/symbol.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/symbol.c b/src/symbol.c index 40484d4b5..6e92fb6c7 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -339,7 +339,7 @@ sym_inspect(mrb_state *mrb, mrb_value sym) memcpy(RSTRING(str)->ptr+1, name, len); if (!symname_p(name) || strlen(name) != len) { str = mrb_str_dump(mrb, str); - strncpy(RSTRING(str)->ptr, ":\"", 2); + memcpy(RSTRING(str)->ptr, ":\"", 2); } return str; } -- cgit v1.2.3 From 328353b287bcacf29108766f8f89891bb1cf3281 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 23 Jul 2012 23:25:00 +0900 Subject: treat exceptional usec value --- src/time.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/time.c b/src/time.c index 8f9e6dd0c..c988d0fd0 100644 --- a/src/time.c +++ b/src/time.c @@ -167,10 +167,14 @@ mrb_time_alloc(mrb_state *mrb, mrb_float sec, mrb_float usec, enum mrb_timezone tm = mrb_malloc(mrb, sizeof(struct mrb_time)); tm->sec = (time_t)sec; tm->usec = (sec - tm->sec) * 1.0e6 + usec; - if (tm->usec < 0) { + while (tm->usec < 0) { tm->sec--; tm->usec += 1.0e6; } + while (tm->usec > 1.0e6) { + tm->sec++; + tm->usec -= 1.0e6; + } tm->timezone = timezone; mrb_time_update_datetime(tm); -- cgit v1.2.3 From 42b7d75a6728d4a17af68ee8e0bd4b0dabf7e9ab Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 24 Jul 2012 22:57:59 +0900 Subject: instance_eval should raise NotImplementedError on string argument --- src/kernel.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kernel.c b/src/kernel.c index f5a1f3d53..e75fcfc88 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -582,7 +582,7 @@ mrb_obj_instance_eval(mrb_state *mrb, mrb_value self) mrb_value a, b; if (mrb_get_args(mrb, "|S&", &a, &b) == 1) { - mrb_raise(mrb, E_RUNTIME_ERROR, "instance_eval with string not implemented"); + mrb_raise(mrb, E_NOTIMP_ERROR, "instance_eval with string not implemented"); } return mrb_yield_with_self(mrb, b, 0, 0, self); } -- cgit v1.2.3 From 88b638cf823741e3db204856e43f422229a1005c Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 24 Jul 2012 23:16:41 +0900 Subject: instance_eval should set target_class in the block --- include/mruby.h | 1 - src/kernel.c | 6 +++++- src/vm.c | 17 +++++++++++++---- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/include/mruby.h b/include/mruby.h index 7abf66cb9..4fd7bccd5 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -464,7 +464,6 @@ NUM2CHR(mrb_value x) mrb_value mrb_yield(mrb_state *mrb, mrb_value v, mrb_value blk); mrb_value mrb_yield_argv(mrb_state *mrb, mrb_value b, int argc, mrb_value *argv); -mrb_value mrb_yield_with_self(mrb_state *mrb, mrb_value b, int argc, mrb_value *argv, mrb_value self); mrb_value mrb_class_new_instance(mrb_state *mrb, int, mrb_value*, struct RClass *); mrb_value mrb_class_new_instance_m(mrb_state *mrb, mrb_value klass); diff --git a/src/kernel.c b/src/kernel.c index e75fcfc88..468891b23 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -555,6 +555,8 @@ mrb_obj_init_copy(mrb_state *mrb, mrb_value self) return self; } +mrb_value mrb_yield_internal(mrb_state *mrb, mrb_value b, int argc, mrb_value *argv, mrb_value self, struct RClass *c); + /* 15.3.1.3.18 */ /* * call-seq: @@ -580,11 +582,13 @@ mrb_value mrb_obj_instance_eval(mrb_state *mrb, mrb_value self) { mrb_value a, b; + mrb_value cv; if (mrb_get_args(mrb, "|S&", &a, &b) == 1) { mrb_raise(mrb, E_NOTIMP_ERROR, "instance_eval with string not implemented"); } - return mrb_yield_with_self(mrb, b, 0, 0, self); + cv = mrb_singleton_class(mrb, self); + return mrb_yield_internal(mrb, b, 0, 0, self, mrb_class_ptr(cv)); } int diff --git a/src/vm.c b/src/vm.c index bd3d05d81..62ef5069d 100644 --- a/src/vm.c +++ b/src/vm.c @@ -237,7 +237,7 @@ mrb_funcall_argv(mrb_state *mrb, mrb_value self, const char *name, int argc, mrb } mrb_value -mrb_yield_with_self(mrb_state *mrb, mrb_value b, int argc, mrb_value *argv, mrb_value self) +mrb_yield_internal(mrb_state *mrb, mrb_value b, int argc, mrb_value *argv, mrb_value self, struct RClass *c) { struct RProc *p; mrb_sym mid = mrb->ci->mid; @@ -251,7 +251,7 @@ mrb_yield_with_self(mrb_state *mrb, mrb_value b, int argc, mrb_value *argv, mrb_ ci->proc = p; ci->stackidx = mrb->stack - mrb->stbase; ci->argc = argc; - ci->target_class = p->target_class; + ci->target_class = c; ci->nregs = argc + 2; ci->acc = -1; mrb->stack = mrb->stack + n; @@ -277,13 +277,17 @@ mrb_yield_with_self(mrb_state *mrb, mrb_value b, int argc, mrb_value *argv, mrb_ mrb_value mrb_yield_argv(mrb_state *mrb, mrb_value b, int argc, mrb_value *argv) { - return mrb_yield_with_self(mrb, b, argc, argv, mrb->stack[0]); + struct RProc *p = mrb_proc_ptr(b); + + return mrb_yield_internal(mrb, b, argc, argv, mrb->stack[0], p->target_class); } mrb_value mrb_yield(mrb_state *mrb, mrb_value b, mrb_value v) { - return mrb_yield_with_self(mrb, b, 1, &v, mrb->stack[0]); + struct RProc *p = mrb_proc_ptr(b); + + return mrb_yield_internal(mrb, b, 1, &v, mrb->stack[0], p->target_class); } static void @@ -1564,6 +1568,11 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) CASE(OP_TCLASS) { /* A B R(A) := target_class */ + if (!mrb->ci->target_class) { + mrb_value exc = mrb_exc_new(mrb, E_TYPE_ERROR, "no target class or module", 25); + mrb->exc = (struct RObject*)mrb_object(exc); + goto L_RAISE; + } regs[GETARG_A(i)] = mrb_obj_value(mrb->ci->target_class); NEXT; } -- cgit v1.2.3 From f114e3e25236cd43d2f71419e4929caaa755020e Mon Sep 17 00:00:00 2001 From: Akira Kuroda Date: Wed, 25 Jul 2012 00:05:51 +0900 Subject: fix segmentation fault in Array#last --- src/array.c | 3 +++ test/t/array.rb | 10 +++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/array.c b/src/array.c index ed1c3f475..0f52c38ef 100644 --- a/src/array.c +++ b/src/array.c @@ -789,6 +789,9 @@ mrb_ary_last(mrb_state *mrb, mrb_value self) /* len == 1 */ size = mrb_fixnum(*vals); + if (size < 0) { + mrb_raise(mrb, E_ARGUMENT_ERROR, "negative array size"); + } if (size > a->len) size = a->len; if ((a->flags & MRB_ARY_SHARED) || size > ARY_DEFAULT_LEN) { return ary_subseq(mrb, a, a->len - size, size); diff --git a/test/t/array.rb b/test/t/array.rb index a1ef830a2..4ed12a58f 100644 --- a/test/t/array.rb +++ b/test/t/array.rb @@ -152,7 +152,15 @@ end assert('Array#last', '15.2.12.5.18') do a = [1,2,3] - a.last == 3 and [].last == nil + e2 = nil + begin + # this will cause an exception due to the wrong argument + [1,2,3].last(-1) + rescue => e1 + e2 = e1 + end + + a.last == 3 and [].last == nil and e2.class == ArgumentError end assert('Array#length', '15.2.12.5.19') do -- cgit v1.2.3 From 08213e32e817f83313b1586d76c0e8735ba210e7 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 25 Jul 2012 08:53:49 +0900 Subject: const reference from instance_eval should not cause SEGV --- src/variable.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/variable.c b/src/variable.c index 501bed5a6..a1a7f2e82 100644 --- a/src/variable.c +++ b/src/variable.c @@ -10,6 +10,7 @@ #include "mruby/variable.h" #include "error.h" #include "mruby/array.h" +#include "mruby/proc.h" #ifdef ENABLE_REGEXP #include "re.h" @@ -342,7 +343,10 @@ mrb_const_get(mrb_state *mrb, mrb_value mod, mrb_sym sym) mrb_value mrb_vm_const_get(mrb_state *mrb, mrb_sym sym) { - return const_get(mrb, mrb->ci->target_class, sym); + struct RClass *c = mrb->ci->proc->target_class; + + if (!c) c = mrb->ci->target_class; + return const_get(mrb, c, sym); } void @@ -355,7 +359,10 @@ mrb_const_set(mrb_state *mrb, mrb_value mod, mrb_sym sym, mrb_value v) void mrb_vm_const_set(mrb_state *mrb, mrb_sym sym, mrb_value v) { - mrb_obj_iv_set(mrb, (struct RObject*)mrb->ci->target_class, sym, v); + struct RClass *c = mrb->ci->proc->target_class; + + if (!c) c = mrb->ci->target_class; + mrb_obj_iv_set(mrb, (struct RObject*)c, sym, v); } void -- cgit v1.2.3 From 1cda5e0768e6d57db30a82f343d6aff2c6bc6b24 Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Wed, 25 Jul 2012 16:13:44 +0900 Subject: Add tests for coverage. --- test/t/array.rb | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/test/t/array.rb b/test/t/array.rb index a1ef830a2..a113df1f4 100644 --- a/test/t/array.rb +++ b/test/t/array.rb @@ -65,6 +65,7 @@ assert('Array#[]=', '15.2.12.5.5') do end [1,2,3].[]=(1,4) == [1, 4, 3] and + [1,2,3].[]=(1,2,3) == [1, 3] and e2.class == ArgumentError and e3.class == ArgumentError end @@ -242,6 +243,21 @@ assert('Array#to_s', '15.2.12.5.31') do r1 == r2 and r1 == "[2, 3, 4, 5]" end +assert('Array#==', '15.2.12.5.33') do + r1 = [ "a", "c" ] == [ "a", "c", 7 ] #=> false + r2 = [ "a", "c", 7 ] == [ "a", "c", 7 ] #=> true + r3 = [ "a", "c", 7 ] == [ "a", "d", "f" ] #=> false + + r1 == false and r2 == true and r3 == false +end + +assert('Array#<=>', '15.2.12.5.36') do + r1 = [ "a", "a", "c" ] <=> [ "a", "b", "c" ] #=> -1 + r2 = [ 1, 2, 3, 4, 5, 6 ] <=> [ 1, 2 ] #=> +1 + + r1 == -1 and r2 == +1 +end + # Not ISO specified assert("Array (Shared Array Corruption)") do -- cgit v1.2.3 From ea259129993cf7eb6ffc0b8bb76719913fea314c Mon Sep 17 00:00:00 2001 From: Max Anselm Date: Wed, 25 Jul 2012 18:22:26 -0400 Subject: Undefine new for class rather than instance. Applies to NilClass, TrueClass, FalseClass, Fixnum, and Float. Add mrb_undef_class_method for DRYness. --- include/mruby.h | 1 + src/class.c | 6 ++++++ src/numeric.c | 4 ++-- src/object.c | 6 +++--- src/re.c | 2 +- 5 files changed, 13 insertions(+), 6 deletions(-) diff --git a/include/mruby.h b/include/mruby.h index 4fd7bccd5..6fcda4d35 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -296,6 +296,7 @@ void mrb_define_singleton_method(mrb_state*, struct RObject*, const char*, mrb_f void mrb_define_module_function(mrb_state*, struct RClass*, const char*, mrb_func_t,int); void mrb_define_const(mrb_state*, struct RClass*, const char *name, mrb_value); void mrb_undef_method(mrb_state*, struct RClass*, const char*); +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); diff --git a/src/class.c b/src/class.c index b8532cdcc..f0393c7ec 100644 --- a/src/class.c +++ b/src/class.c @@ -1307,6 +1307,12 @@ mrb_undef_method(mrb_state *mrb, struct RClass *c, const char *name) undef_method(mrb, c, mrb_intern(mrb, name)); } +void +mrb_undef_class_method(mrb_state *mrb, struct RClass *c, const char *name) +{ + mrb_undef_method(mrb, mrb_class_ptr(mrb_singleton_class(mrb, mrb_obj_value(c))), name); +} + mrb_value mrb_mod_undef(mrb_state *mrb, mrb_value mod) { diff --git a/src/numeric.c b/src/numeric.c index ec3f97ca6..d294597ee 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -1288,7 +1288,7 @@ mrb_init_numeric(mrb_state *mrb) integer = mrb_define_class(mrb, "Integer", numeric); fixnum = mrb->fixnum_class = mrb_define_class(mrb, "Fixnum", integer); - mrb_undef_method(mrb, fixnum, "new"); + mrb_undef_class_method(mrb, fixnum, "new"); mrb_define_method(mrb, fixnum, "+", fix_plus, ARGS_REQ(1)); /* 15.2.8.3.1 */ mrb_define_method(mrb, fixnum, "-", fix_minus, ARGS_REQ(1)); /* 15.2.8.3.2 */ mrb_define_method(mrb, fixnum, "-@", fix_uminus, ARGS_REQ(1)); /* 15.2.7.4.2 */ @@ -1316,7 +1316,7 @@ mrb_init_numeric(mrb_state *mrb) /* Float Class */ fl = mrb->float_class = mrb_define_class(mrb, "Float", numeric); - mrb_undef_method(mrb, fl, "new"); + mrb_undef_class_method(mrb, fl, "new"); mrb_define_method(mrb, fl, "+", flo_plus, ARGS_REQ(1)); /* 15.2.9.3.1 */ mrb_define_method(mrb, fl, "-", flo_minus, ARGS_REQ(1)); /* 15.2.9.3.2 */ mrb_define_method(mrb, fl, "*", flo_mul, ARGS_REQ(1)); /* 15.2.9.3.3 */ diff --git a/src/object.c b/src/object.c index 29684b118..43e064fb0 100644 --- a/src/object.c +++ b/src/object.c @@ -275,7 +275,7 @@ mrb_init_object(mrb_state *mrb) struct RClass *f; n = mrb->nil_class = mrb_define_class(mrb, "NilClass", mrb->object_class); - mrb_undef_method(mrb, n, "new"); + mrb_undef_class_method(mrb, n, "new"); mrb_define_method(mrb, n, "&", false_and, ARGS_REQ(1)); /* 15.2.4.3.1 */ mrb_define_method(mrb, n, "^", false_xor, ARGS_REQ(1)); /* 15.2.4.3.2 */ mrb_define_method(mrb, n, "|", false_or, ARGS_REQ(1)); /* 15.2.4.3.3 */ @@ -283,14 +283,14 @@ mrb_init_object(mrb_state *mrb) mrb_define_method(mrb, n, "to_s", nil_to_s, ARGS_NONE()); /* 15.2.4.3.5 */ t = mrb->true_class = mrb_define_class(mrb, "TrueClass", mrb->object_class); - mrb_undef_method(mrb, n, "new"); + mrb_undef_class_method(mrb, t, "new"); mrb_define_method(mrb, t, "&", true_and, ARGS_REQ(1)); /* 15.2.5.3.1 */ mrb_define_method(mrb, t, "^", true_xor, ARGS_REQ(1)); /* 15.2.5.3.2 */ mrb_define_method(mrb, t, "to_s", true_to_s, ARGS_NONE()); /* 15.2.5.3.3 */ mrb_define_method(mrb, t, "|", true_or, ARGS_REQ(1)); /* 15.2.5.3.4 */ f = mrb->false_class = mrb_define_class(mrb, "FalseClass", mrb->object_class); - mrb_undef_method(mrb, n, "new"); + mrb_undef_class_method(mrb, f, "new"); mrb_define_method(mrb, f, "&", false_and, ARGS_REQ(1)); /* 15.2.6.3.1 */ mrb_define_method(mrb, f, "^", false_xor, ARGS_REQ(1)); /* 15.2.6.3.2 */ mrb_define_method(mrb, f, "to_s", false_to_s, ARGS_NONE()); /* 15.2.6.3.3 */ diff --git a/src/re.c b/src/re.c index 3639a41c6..f3cfea484 100644 --- a/src/re.c +++ b/src/re.c @@ -2041,7 +2041,7 @@ mrb_init_regexp(mrb_state *mrb) mrb_define_const(mrb, s, "FIXEDENCODING", mrb_fixnum_value(ARG_ENCODING_FIXED)); s = mrb_define_class(mrb, "MatchData", mrb->object_class); - //mrb_undef_method(CLASS_OF(rb_cMatch), "new"); + //mrb_undef_class_method(CLASS_OF(rb_cMatch), "new"); mrb_define_method(mrb, s, "[]", mrb_match_aref, ARGS_ANY()); /* 15.2.16.3.1 */ mrb_define_method(mrb, s, "begin", mrb_match_begin, ARGS_REQ(1)); /* 15.2.16.3.2 */ -- cgit v1.2.3 From 344946233c7070d22f0b654a191ad20b0f92a1a0 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 26 Jul 2012 23:00:34 +0900 Subject: do not use TrueClass/FalseClass.new --- test/t/false.rb | 8 ++++---- test/t/true.rb | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/test/t/false.rb b/test/t/false.rb index ae605205d..50ba5623a 100644 --- a/test/t/false.rb +++ b/test/t/false.rb @@ -14,17 +14,17 @@ assert('FalseClass false', '15.2.6.1') do end assert('FalseClass#&', '15.2.6.3.1') do - not FalseClass.new.&(true) and not FalseClass.new.&(false) + not false.&(true) and not false.&(false) end assert('FalseClass#^', '15.2.6.3.2') do - FalseClass.new.^(true) and not FalseClass.new.^(false) + false.^(true) and not false.^(false) end assert('FalseClass#to_s', '15.2.6.3.3') do - FalseClass.new.to_s == 'false' + false.to_s == 'false' end assert('FalseClass#|', '15.2.6.3.4') do - FalseClass.new.|(true) and not FalseClass.new.|(false) + false.|(true) and not false.|(false) end diff --git a/test/t/true.rb b/test/t/true.rb index 2662f7cd8..ae83e0baa 100644 --- a/test/t/true.rb +++ b/test/t/true.rb @@ -14,17 +14,17 @@ assert('TrueClass true', '15.2.5.1') do end assert('TrueClass#&', '15.2.5.3.1') do - TrueClass.new.&(true) and not TrueClass.new.&(false) + true.&(true) and not true.&(false) end assert('TrueClass#^', '15.2.5.3.2') do - not TrueClass.new.^(true) and TrueClass.new.^(false) + not true.^(true) and true.^(false) end assert('TrueClass#to_s', '15.2.5.3.3') do - TrueClass.new.to_s == 'true' + true.to_s == 'true' end assert('TrueClass#|', '15.2.5.3.4') do - TrueClass.new.|(true) and TrueClass.new.|(false) + true.|(true) and true.|(false) end -- cgit v1.2.3 From 92d37403f162c6876e60247114bc982d00d14aa2 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Fri, 27 Jul 2012 05:57:22 +0900 Subject: temporary protection not to access out of stack --- src/gc.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gc.c b/src/gc.c index 819fb94c6..c0d4e1599 100644 --- a/src/gc.c +++ b/src/gc.c @@ -563,6 +563,7 @@ root_scan_phase(mrb_state *mrb) /* mark stack */ e = mrb->stack - mrb->stbase; if (mrb->ci) e += mrb->ci->nregs; + if (mrb->stbase + e > mrb->stend) e = mrb->stend - mrb->stbase; for (i=0; istbase[i]); } -- cgit v1.2.3 From 638a66fd7801624a47858d4e8e3927ca69a52f00 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Fri, 27 Jul 2012 10:05:47 +0900 Subject: adjust ci->nregs for C implemented methods --- src/gc.c | 2 ++ src/vm.c | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/gc.c b/src/gc.c index c0d4e1599..1468dd994 100644 --- a/src/gc.c +++ b/src/gc.c @@ -545,6 +545,8 @@ obj_free(mrb_state *mrb, struct RBasic *obj) obj->tt = MRB_TT_FREE; } +#include + static void root_scan_phase(mrb_state *mrb) { diff --git a/src/vm.c b/src/vm.c index 62ef5069d..9aa21eed4 100644 --- a/src/vm.c +++ b/src/vm.c @@ -121,7 +121,6 @@ uvset(mrb_state *mrb, int up, int idx, mrb_value v) static mrb_callinfo* cipush(mrb_state *mrb) { - size_t nregs = mrb->ci->nregs; int eidx = mrb->ci->eidx; int ridx = mrb->ci->ridx; @@ -133,7 +132,7 @@ cipush(mrb_state *mrb) mrb->ciend = mrb->cibase + size * 2; } mrb->ci++; - mrb->ci->nregs = nregs; + mrb->ci->nregs = 0; mrb->ci->eidx = eidx; mrb->ci->ridx = ridx; mrb->ci->env = 0; @@ -719,6 +718,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) mrb->stack += a; if (MRB_PROC_CFUNC_P(m)) { + ci->nregs = n + 1; mrb->stack[0] = m->body.func(mrb, recv); mrb->arena_idx = ai; if (mrb->exc) goto L_RAISE; -- cgit v1.2.3 From 88043c5ccd198b60b54b97d103d3f420c698c882 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Fri, 27 Jul 2012 12:54:19 +0900 Subject: remove that added for debugging --- src/gc.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/gc.c b/src/gc.c index 1468dd994..c0d4e1599 100644 --- a/src/gc.c +++ b/src/gc.c @@ -545,8 +545,6 @@ obj_free(mrb_state *mrb, struct RBasic *obj) obj->tt = MRB_TT_FREE; } -#include - static void root_scan_phase(mrb_state *mrb) { -- cgit v1.2.3 From 7f8076ef90be326d7a199baad32d0a84ebbec6d3 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sat, 28 Jul 2012 11:23:29 +0900 Subject: more peephole optimization on OP_MOVE --- src/codegen.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/codegen.c b/src/codegen.c index e032ec509..3bf0e496c 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -145,7 +145,7 @@ genop(codegen_scope *s, mrb_code i) static void genop_peep(codegen_scope *s, mrb_code i, int val) { - // peephole optimization + /* peephole optimization */ if (!val && s->lastlabel != s->pc && s->pc > 0) { mrb_code i0 = s->iseq[s->pc-1]; int c1 = GET_OPCODE(i); @@ -156,9 +156,13 @@ genop_peep(codegen_scope *s, mrb_code i, int val) switch (c0) { case OP_MOVE: if (GETARG_B(i) == GETARG_A(i0) && GETARG_A(i) == GETARG_B(i0) && GETARG_A(i) >= s->nlocals) { - // skip swapping OP_MOVE + /* skip swapping OP_MOVE */ return; } + if (GETARG_B(i) == GETARG_A(i0) && GETARG_A(i0) >= s->nlocals) { + s->iseq[s->pc-1] = MKOP_AB(OP_MOVE, GETARG_A(i), GETARG_B(i0)); + return; + } break; case OP_LOADI: if (GETARG_B(i) == GETARG_A(i0) && GETARG_A(i0) >= s->nlocals) { -- cgit v1.2.3 From a985cf7945d6aec6d483f76b9427382bb5d984e1 Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Sat, 28 Jul 2012 19:16:54 +0900 Subject: Modify ci->nregs. --- src/vm.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/vm.c b/src/vm.c index 9aa21eed4..e8dcf1b80 100644 --- a/src/vm.c +++ b/src/vm.c @@ -718,7 +718,12 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) mrb->stack += a; if (MRB_PROC_CFUNC_P(m)) { - ci->nregs = n + 1; + if (n == CALL_MAXARGS) { + ci->nregs = 3; + } + else { + ci->nregs = n + 2; + } mrb->stack[0] = m->body.func(mrb, recv); mrb->arena_idx = ai; if (mrb->exc) goto L_RAISE; -- cgit v1.2.3 From b48cfea73619f0fbf64324209f5fa5d7cc725856 Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Sat, 28 Jul 2012 21:00:47 +0900 Subject: Protect deleted key and value from GC. --- src/hash.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/hash.c b/src/hash.c index dacef4713..04e8c60be 100644 --- a/src/hash.c +++ b/src/hash.c @@ -568,7 +568,9 @@ mrb_hash_shift(mrb_state *mrb, mrb_value hash) if (!kh_exist(h,k)) continue; delKey = kh_key(h,k); + mrb_gc_protect(mrb, delKey); delVal = mrb_hash_delete_key(mrb, hash, delKey); + mrb_gc_protect(mrb, delVal); return mrb_assoc_new(mrb, delKey, delVal); } -- cgit v1.2.3 From a2aa7e7f520b42a2de393039bd8d468dbd299026 Mon Sep 17 00:00:00 2001 From: Akira Kuroda Date: Sun, 29 Jul 2012 00:21:40 +0900 Subject: fix segmentation fault in Array#first --- src/array.c | 3 +++ test/t/array.rb | 19 ++++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/array.c b/src/array.c index 0f52c38ef..ccd22674e 100644 --- a/src/array.c +++ b/src/array.c @@ -764,6 +764,9 @@ mrb_ary_first(mrb_state *mrb, mrb_value self) if (mrb_get_args(mrb, "|i", &size) == 0) { return (a->len > 0)? a->ptr[0]: mrb_nil_value(); } + if (size < 0) { + mrb_raise(mrb, E_ARGUMENT_ERROR, "negative array size"); + } if (size > a->len) size = a->len; if (a->flags & MRB_ARY_SHARED) { diff --git a/test/t/array.rb b/test/t/array.rb index 7029cd3c6..cb99cea6a 100644 --- a/test/t/array.rb +++ b/test/t/array.rb @@ -118,7 +118,24 @@ assert('Array#first', '15.2.12.5.13') do a = [] b = [1,2,3] - a.first == nil and b.first == 1 + e2 = nil + e3 = nil + begin + # this will cause an exception due to the wrong argument + [1,2,3].first(-1) + rescue => e1 + e2 = e1 + end + begin + # this will cause an exception due to the wrong argument + [1,2,3].first(1,2) + rescue => e1 + e3 = e1 + end + + a.first == nil and b.first == 1 and b.first(0) == [] and + b.first(1) == [1] and b.first(4) == [1,2,3] and + e2.class == ArgumentError and e3.class == ArgumentError end assert('Array#index', '15.2.12.5.14') do -- cgit v1.2.3 From 6cbaeda1e67e21312c219cb9dc7e26da699d4b2c Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Sun, 29 Jul 2012 14:11:33 +0900 Subject: Add Masaki Muranaka. --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index c1128a46c..bba8b8a66 100644 --- a/AUTHORS +++ b/AUTHORS @@ -8,3 +8,4 @@ Original Authors "mruby developers" are: Bjorn De Meyer Yuichiro MASUI Masamitsu MURASE + Masaki Muranaka -- cgit v1.2.3 From 99e2035f42c0f29b316b335a91085ae6fbde5893 Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Sat, 14 Jul 2012 23:07:00 +0900 Subject: Modify mrb_vm_define_class. * Check mismatch of superclass. * Check constant value whose name is specified as a class's name. --- src/class.c | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/src/class.c b/src/class.c index f0393c7ec..6efc9f5e7 100644 --- a/src/class.c +++ b/src/class.c @@ -187,30 +187,39 @@ mrb_define_class(mrb_state *mrb, const char *name, struct RClass *super) struct RClass* mrb_vm_define_class(mrb_state *mrb, mrb_value outer, mrb_value super, mrb_sym id) { - struct RClass *c = 0; + struct RClass *c, *s; if (mrb_const_defined(mrb, outer, id)) { mrb_value v = mrb_const_get(mrb, outer, id); + mrb_check_type(mrb, v, MRB_TT_CLASS); c = mrb_class_ptr(v); - if (!mrb_nil_p(super) && (c->tt != MRB_TT_CLASS || c->super != mrb_class_ptr(super))) { - c = 0; + if (!mrb_nil_p(super)) { + if (mrb_type(super) != MRB_TT_CLASS) { + mrb_raise(mrb, E_TYPE_ERROR, "superclass must be a Class (%s given)", mrb_obj_classname(mrb, super)); + } + + if (!c->super || mrb_class_ptr(super) != mrb_class_real(c->super)) { + mrb_raise(mrb, E_TYPE_ERROR, "superclass mismatch for class %s", mrb_sym2name(mrb, id)); + } } + + return c; } - if (!c) { - struct RClass *s = 0; - if (!mrb_nil_p(super)) { - mrb_check_type(mrb, super, MRB_TT_CLASS); - s = mrb_class_ptr(super); - } - if (!s) { - s = mrb->object_class; + if (!mrb_nil_p(super)) { + if (mrb_type(super) != MRB_TT_CLASS) { + mrb_raise(mrb, E_TYPE_ERROR, "superclass must be a Class (%s given)", mrb_obj_classname(mrb, super)); } - c = mrb_class_new(mrb, s); - setup_class(mrb, outer, c, id); - mrb_funcall(mrb, mrb_obj_value(s), "inherited", 1, mrb_obj_value(c)); + s = mrb_class_ptr(super); } + else { + s = mrb->object_class; + } + + c = mrb_class_new(mrb, s); + setup_class(mrb, outer, c, id); + mrb_funcall(mrb, mrb_obj_value(s), "inherited", 1, mrb_obj_value(c)); return c; } -- cgit v1.2.3 From b71063b239cbbdbdd6779d7b590c0cad59e0c3ae Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Sun, 29 Jul 2012 14:02:07 +0900 Subject: Modify test for Class. * Rename some classes in test/t/class.rb to avoid name conflict. * Add tests for mismatch fo superclass. --- test/t/class.rb | 76 +++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 61 insertions(+), 15 deletions(-) diff --git a/test/t/class.rb b/test/t/class.rb index 1b809a832..d6c4715dd 100644 --- a/test/t/class.rb +++ b/test/t/class.rb @@ -47,36 +47,82 @@ end # Not ISO specified assert('Class 1') do - class C; end - C.class == Class + class C1; end + C1.class == Class end assert('Class 2') do - class C; end - C.new.class == C + class C2; end + C2.new.class == C2 end assert('Class 3') do - class C; end - C.new.class.class == Class + class C3; end + C3.new.class.class == Class end assert('Class 4') do - class A; end - class C < A; end - C.class == Class + class C4_A; end + class C4 < C4_A; end + C4.class == Class end assert('Class 5') do - class A; end - class C < A; end - C.new.class == C + class C5_A; end + class C5 < C5_A; end + C5.new.class == C5 end assert('Class 6') do - class A; end - class C < A; end - C.new.class.class == Class + class C6_A; end + class C6 < C6_A; end + C6.new.class.class == Class +end + +assert('Class 7') do + class C7_A; end + class C7_B; end + + class C7 < C7_A; end + + error = false + begin + # Different superclass. + class C7 < C7_B; end + rescue TypeError + error = true + end + + error +end + +assert('Class 8') do + class C8_A; end + + class C8; end # superclass is Object + + error = false + begin + # Different superclass. + class C8 < C8_A; end + rescue TypeError + error = true + end + + error +end + +assert('Class 9') do + Class9Const = "a" + + error = false + begin + class Class9Const; end + rescue TypeError + error = true + end + + error end assert('Class Module 1') do -- cgit v1.2.3 From b2fc62f3a917e9ab1d562b49312f8d7dd2e057c5 Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Sun, 29 Jul 2012 15:25:14 +0900 Subject: Remove commented out code. --- src/error.c | 9 ------- src/etc.c | 5 ---- src/hash.c | 8 +++---- src/kernel.c | 76 ++++++++++++++++------------------------------------------ src/object.c | 1 - src/range.c | 1 - src/string.c | 9 ------- src/struct.c | 9 ------- src/variable.c | 5 ---- 9 files changed, 24 insertions(+), 99 deletions(-) diff --git a/src/error.c b/src/error.c index 5bfbc4319..e71245509 100644 --- a/src/error.c +++ b/src/error.c @@ -29,7 +29,6 @@ mrb_exc_new3(mrb_state *mrb, struct RClass* c, mrb_value str) return mrb_funcall(mrb, mrb_obj_value(c), "new", 1, str); } -//mrb_value make_exception(mrb_state *mrb, int argc, mrb_value *argv, int isstr); /* * call-seq: * Exception.new(msg = nil) -> exception @@ -307,14 +306,6 @@ make_exception(mrb_state *mrb, int argc, mrb_value *argv, int isstr) case 3: n = 1; exception_call: - //if (argv[0] == sysstack_error) return argv[0]; - - //CONST_ID(mrb, exception, "exception"); - //mesg = mrb_check_funcall(mrb, argv[0], exception, n, argv+1); - //if (mrb_nil_p(mesg)) { - // /* undef */ - // mrb_raise(mrb, E_TYPE_ERROR, "exception class/object expected"); - //} if (mrb_respond_to(mrb, argv[0], mrb_intern(mrb, "exception"))) { mesg = mrb_funcall_argv(mrb, argv[0], "exception", n, argv+1); } diff --git a/src/etc.c b/src/etc.c index 7e9381d16..d14498d9c 100644 --- a/src/etc.c +++ b/src/etc.c @@ -52,11 +52,6 @@ mrb_check_datatype(mrb_state *mrb, mrb_value obj, const struct mrb_data_type *ty mrb_value mrb_lastline_get(mrb_state *mrb) { - //mrb_value *var = mrb_svar(0); - //if (var) { - // return *var; - //} - //return mrb_nil_value(); mrb_value *argv; int argc; diff --git a/src/hash.c b/src/hash.c index 04e8c60be..5d3835019 100644 --- a/src/hash.c +++ b/src/hash.c @@ -1339,9 +1339,9 @@ mrb_init_hash(mrb_state *mrb) mrb_define_method(mrb, h, "default_proc", mrb_hash_default_proc,ARGS_NONE()); /* 15.2.13.4.7 */ mrb_define_method(mrb, h, "default_proc=", mrb_hash_set_default_proc,ARGS_REQ(1)); /* 15.2.13.4.7 */ mrb_define_method(mrb, h, "__delete", mrb_hash_delete, ARGS_REQ(1)); /* core of 15.2.13.4.8 */ -//mrb_define_method(mrb, h, "each", mrb_hash_each_pair, ARGS_NONE()); /* 15.2.13.4.9 */ /* move to mrblib\hash.rb */ -//mrb_define_method(mrb, h, "each_key", mrb_hash_each_key, ARGS_NONE()); /* 15.2.13.4.10 */ /* move to mrblib\hash.rb */ -//mrb_define_method(mrb, h, "each_value", mrb_hash_each_value, ARGS_NONE()); /* 15.2.13.4.11 */ /* move to mrblib\hash.rb */ +// "each" 15.2.13.4.9 move to mrblib/hash.rb +// "each_key" 15.2.13.4.10 move to mrblib/hash.rb +// "each_value" 15.2.13.4.11 move to mrblib/hash.rb mrb_define_method(mrb, h, "empty?", mrb_hash_empty_p, ARGS_NONE()); /* 15.2.13.4.12 */ mrb_define_method(mrb, h, "has_key?", mrb_hash_has_key, ARGS_REQ(1)); /* 15.2.13.4.13 */ mrb_define_method(mrb, h, "has_value?", mrb_hash_has_value, ARGS_REQ(1)); /* 15.2.13.4.14 */ @@ -1352,7 +1352,7 @@ mrb_init_hash(mrb_state *mrb) mrb_define_method(mrb, h, "keys", mrb_hash_keys, ARGS_NONE()); /* 15.2.13.4.19 */ mrb_define_method(mrb, h, "length", mrb_hash_size_m, ARGS_NONE()); /* 15.2.13.4.20 */ mrb_define_method(mrb, h, "member?", mrb_hash_has_key, ARGS_REQ(1)); /* 15.2.13.4.21 */ -//mrb_define_method(mrb, h, "merge", mrb_hash_merge, ARGS_REQ(1)); /* 15.2.13.4.22 */ /* move to mrblib\hash.rb */ +// "merge" 15.2.13.4.22 move to mrblib/hash.rb mrb_define_method(mrb, h, "replace", mrb_hash_replace, ARGS_REQ(1)); /* 15.2.13.4.23 */ mrb_define_method(mrb, h, "shift", mrb_hash_shift, ARGS_NONE()); /* 15.2.13.4.24 */ mrb_define_method(mrb, h, "size", mrb_hash_size_m, ARGS_NONE()); /* 15.2.13.4.25 */ diff --git a/src/kernel.c b/src/kernel.c index 468891b23..8aba1a808 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -72,9 +72,6 @@ inspect_obj(mrb_state *mrb, mrb_value obj, mrb_value str, int recur) int mrb_obj_basic_to_s_p(mrb_state *mrb, mrb_value obj) { - //const mrb_method_entry_t *me = mrb_method_entry(CLASS_OF(obj), mrb_intern("to_s")); - //if (me && me->def && me->def->type == VM_METHOD_TYPE_CFUNC && - //me->def->body.cfunc.func == mrb_any_to_s) struct RProc *me = mrb_method_search(mrb, mrb_class(mrb, obj), mrb_intern(mrb, "to_s")); if (me && MRB_PROC_CFUNC_P(me) && (me->body.func == mrb_any_to_s)) return 1; @@ -314,52 +311,38 @@ mrb_singleton_class_clone(mrb_state *mrb, mrb_value obj) { struct RClass *klass = RBASIC(obj)->c; - //if (!FL_TEST(klass, FL_SINGLETON)) - //return klass; if (klass->tt != MRB_TT_SCLASS) return klass; else { - //struct clone_method_data data; - /* copy singleton(unnamed) class */ - //VALUE clone = class_alloc(RBASIC(klass)->flags, 0); + /* copy singleton(unnamed) class */ struct RClass *clone = (struct RClass*)mrb_obj_alloc(mrb, klass->tt, mrb->class_class); - //clone->super = objklass->super; - if ((mrb_type(obj) == MRB_TT_CLASS) || - (mrb_type(obj) == MRB_TT_SCLASS)) { /* BUILTIN_TYPE(obj) == T_CLASS */ - clone->c = clone; - } - else { - clone->c = mrb_singleton_class_clone(mrb, mrb_obj_value(klass)); - } + if ((mrb_type(obj) == MRB_TT_CLASS) || + (mrb_type(obj) == MRB_TT_SCLASS)) { /* BUILTIN_TYPE(obj) == T_CLASS */ + clone->c = clone; + } + else { + clone->c = mrb_singleton_class_clone(mrb, mrb_obj_value(klass)); + } - clone->super = klass->super; - if (klass->iv) { - clone->iv = klass->iv; - } - if (klass->mt) { - clone->mt = kh_copy(mt, mrb, klass->mt); - } - else { - clone->mt = kh_init(mt, mrb); - } - clone->tt = MRB_TT_SCLASS; - return clone; + clone->super = klass->super; + if (klass->iv) { + clone->iv = klass->iv; + } + if (klass->mt) { + clone->mt = kh_copy(mt, mrb, klass->mt); + } + else { + clone->mt = kh_init(mt, mrb); + } + clone->tt = MRB_TT_SCLASS; + return clone; } } static void init_copy(mrb_state *mrb, mrb_value dest, mrb_value obj) { - //if (OBJ_FROZEN(dest)) { - // rb_raise(rb_eTypeError, "[bug] frozen object (%s) allocated", rb_obj_classname(dest)); - //} - //RBASIC(dest)->flags &= ~(T_MASK|FL_EXIVAR); - //RBASIC(dest)->flags |= RBASIC(obj)->flags & (T_MASK|FL_EXIVAR|FL_TAINT); - //if (FL_TEST(obj, FL_EXIVAR)) { - // mrb_copy_generic_ivar(dest, obj); - //} - //mrb_gc_copy_finalizer(dest, obj); switch (mrb_type(obj)) { case MRB_TT_OBJECT: case MRB_TT_CLASS: @@ -416,8 +399,6 @@ mrb_obj_clone(mrb_state *mrb, mrb_value self) clone = (struct RObject*)mrb_obj_alloc(mrb, self.tt, mrb_obj_class(mrb, self)); clone->c = mrb_singleton_class_clone(mrb, self); init_copy(mrb, mrb_obj_value(clone), self); - //1-9-2 no bug mrb_funcall(mrb, clone, "initialize_clone", 1, self); - //RBASIC(clone)->flags |= RBASIC(obj)->flags & FL_FREEZE; return mrb_obj_value(clone); } @@ -466,7 +447,6 @@ mrb_obj_extend(mrb_state *mrb, int argc, mrb_value *argv, mrb_value obj) mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments (at least 1)"); } for (i = 0; i < argc; i++) { - //Check_Type(argv[i], T_MODULE); mrb_check_type(mrb, argv[i], MRB_TT_MODULE); } while (argc--) { @@ -511,19 +491,6 @@ mrb_obj_extend_m(mrb_state *mrb, mrb_value self) return mrb_obj_extend(mrb, argc, argv, self); } -/* 15.3.1.2.4 */ -/* 15.3.1.3.14 */ -/* - * call-seq: - * global_variables -> array - * - * Returns an array of the names of global variables. - * - * global_variables.grep /std/ #=> [:$stdin, :$stdout, :$stderr] - */ -//mrb_value -//mrb_f_global_variables(mrb_state *mrb, mrb_value self) - /* 15.3.1.3.15 */ /* * call-seq: @@ -824,7 +791,6 @@ mrb_obj_singleton_methods(mrb_state *mrb, int argc, mrb_value *argv, mrb_value o recur = mrb_true_value(); } else { - //mrb_scan_args(argc, argv, "01", &recur); recur = argv[0]; } klass = mrb_class(mrb, obj); @@ -853,7 +819,6 @@ retry: else { mrb_value recur; - //mrb_scan_args(argc, argv, "1", &recur); recur = argv[0]; if (mrb_test(recur)) { argc = 0; @@ -1073,7 +1038,6 @@ obj_respond_to(mrb_state *mrb, mrb_value self) mrb_sym id; mrb_get_args(mrb, "*", &argv, &argc); - //mrb_scan_args(argc, argv, "11", &mid, &priv); mid = argv[0]; if (argc > 1) priv = argv[1]; else priv = mrb_nil_value(); diff --git a/src/object.c b/src/object.c index 43e064fb0..4f5fb1d28 100644 --- a/src/object.c +++ b/src/object.c @@ -516,7 +516,6 @@ mrb_to_integer(mrb_state *mrb, mrb_value val, const char *method) mrb_value v; if (FIXNUM_P(val)) return val; - //if (TYPE(val) == T_BIGNUM) return val; v = convert_type(mrb, val, "Integer", method, TRUE); if (!mrb_obj_is_kind_of(mrb, v, mrb->fixnum_class)) { const char *cname = mrb_obj_classname(mrb, val); diff --git a/src/range.c b/src/range.c index 14fa2a6a3..9113a810a 100644 --- a/src/range.c +++ b/src/range.c @@ -412,7 +412,6 @@ range_initialize_copy(mrb_state *mrb, mrb_value copy) mrb_get_args(mrb, "o", &src); if (mrb_obj_equal(mrb, copy, src)) return copy; - //mrb_check_frozen(copy); if (!mrb_obj_is_instance_of(mrb, src, mrb_obj_class(mrb, copy))) { mrb_raise(mrb, E_TYPE_ERROR, "wrong argument class"); } diff --git a/src/string.c b/src/string.c index e41116ebc..0a5dee88e 100644 --- a/src/string.c +++ b/src/string.c @@ -1354,7 +1354,6 @@ str_gsub(mrb_state *mrb, mrb_value str, mrb_int bang) static mrb_value mrb_str_gsub(mrb_state *mrb, mrb_value self) { - //return str_gsub(argc, argv, self, 0); return str_gsub(mrb, self, 0); } @@ -1469,10 +1468,8 @@ mrb_str_index_m(mrb_state *mrb, mrb_value str) int argc; mrb_value sub; - //mrb_value initpos; mrb_int pos; - //if (mrb_scan_args(argc, argv, "11", &sub, &initpos) == 2) { mrb_get_args(mrb, "*", &argv, &argc); if (argc == 2) { pos = mrb_fixnum(argv[1]); @@ -1959,7 +1956,6 @@ scan_once(mrb_state *mrb, mrb_value str, mrb_value pat, mrb_int *start) if (mrb_reg_search(mrb, pat, str, *start, 0) >= 0) { match = mrb_backref_get(mrb); - //regs = RMATCH(match)->regs; pmatch = mrb_match_ptr(match); regs = &pmatch->rmatch->regs; if (regs->beg[0] == regs->end[0]) { @@ -2143,7 +2139,6 @@ mrb_str_split_m(mrb_state *mrb, mrb_value str) split_type = awk; } else { -//fs_set: if (mrb_type(spat) == MRB_TT_STRING) { split_type = string; #ifdef ENABLE_REGEXP @@ -2546,7 +2541,6 @@ mrb_str_to_inum(mrb_state *mrb, mrb_value str, int base, int badcheck) if (s) { len = RSTRING_LEN(str); if (s[len]) { /* no sentinel somehow */ - //char *p = ALLOCA_N(char, len+1); char *p = mrb_malloc(mrb, len+1); //MEMCPY(p, s, char, len); @@ -2584,10 +2578,8 @@ mrb_str_to_i(mrb_state *mrb, mrb_value self) { mrb_value *argv; int argc; - //mrb_value b; int base; - //mrb_scan_args(argc, *argv, "01", &b); mrb_get_args(mrb, "*", &argv, &argc); if (argc == 0) base = 10; @@ -2710,7 +2702,6 @@ mrb_str_to_dbl(mrb_state *mrb, mrb_value str, int badcheck) static mrb_value mrb_str_to_f(mrb_state *mrb, mrb_value self) { - //return mrb_float_new(mrb_str_to_dbl(self, 0/*Qfalse*/)); return mrb_float_value(mrb_str_to_dbl(mrb, self, 0/*Qfalse*/)); } diff --git a/src/struct.c b/src/struct.c index 6d8ce057f..0a95f9e49 100644 --- a/src/struct.c +++ b/src/struct.c @@ -38,8 +38,6 @@ struct_ivar_get(mrb_state *mrb, mrb_value c, mrb_sym id) mrb_value ans; for (;;) { - //if (mrb_ivar_defined(c, id)) - // return mrb_iv_get(mrb, c, id); ans = mrb_iv_get(mrb, c, id); if (!mrb_nil_p(ans)) return ans; kclass = RCLASS_SUPER(c); @@ -260,19 +258,15 @@ make_struct(mrb_state *mrb, mrb_value name, mrb_value members, struct RClass * k //OBJ_FREEZE(members); if (mrb_nil_p(name)) { c = mrb_class_new(mrb, klass); - //mrb_make_metaclass(nstr, RBASIC(klass)->c); - //mrb_class_inherited(klass, nstr); } else { /* old style: should we warn? */ name = mrb_str_to_str(mrb, name); id = mrb_to_id(mrb, name); if (!mrb_is_const_id(id)) { - //mrb_name_error(id, "identifier %s needs to be constant", StringValuePtr(name)); mrb_name_error(mrb, id, "identifier %s needs to be constant", mrb_string_value_ptr(mrb, name)); } if (mrb_const_defined_at(mrb, klass, id)) { - //mrb_warn("redefining constant Struct::%s", StringValuePtr(name)); mrb_warn("redefining constant Struct::%s", mrb_string_value_ptr(mrb, name)); //?rb_mod_remove_const(klass, mrb_sym2name(mrb, id)); } @@ -376,7 +370,6 @@ mrb_struct_s_def(mrb_state *mrb, mrb_value klass) mrb_get_args(mrb, "&*", &b, &argv, &argc); if (argc > 0) name = argv[0]; if (argc > 1) rest = argv[1]; - //mrb_scan_args(argc, argv, "1*", &name, &rest); if (mrb_type(rest) == MRB_TT_ARRAY) { if (!mrb_nil_p(name) && SYMBOL_P(name)) { /* 1stArgument:symbol -> name=nil rest=argv[0]-[n] */ @@ -389,7 +382,6 @@ mrb_struct_s_def(mrb_state *mrb, mrb_value klass) argcnt = argc-1; if (!mrb_nil_p(name) && SYMBOL_P(name)) { /* 1stArgument:symbol -> name=nil rest=argv[0]-[n] */ - //mrb_ary_unshift(mrb, rest, name); name = mrb_nil_value(); pargv = &argv[0]; argcnt++; @@ -557,7 +549,6 @@ mrb_struct_init_copy(mrb_state *mrb, mrb_value copy) mrb_get_args(mrb, "o", &s); if (mrb_obj_equal(mrb, copy, s)) return copy; - //mrb_check_frozen(copy); if (!mrb_obj_is_instance_of(mrb, s, mrb_obj_class(mrb, copy))) { mrb_raise(mrb, E_TYPE_ERROR, "wrong argument class"); } diff --git a/src/variable.c b/src/variable.c index a1a7f2e82..04e5ad9f7 100644 --- a/src/variable.c +++ b/src/variable.c @@ -460,10 +460,6 @@ kiv_lookup(khash_t(iv)* table, mrb_sym key, mrb_value *value) khash_t(iv) *h=table; khiter_t k; - // you must check(iv==0), before you call this function. - //if (!obj->iv) { - // return 0; - //} k = kh_get(iv, h, key); if (k != kh_end(h)) { *value = kh_value(h, k); @@ -505,7 +501,6 @@ mrb_const_defined_at(mrb_state *mrb, struct RClass *klass, mrb_sym id) mrb_value mrb_attr_get(mrb_state *mrb, mrb_value obj, mrb_sym id) { - //return ivar_get(obj, id, FALSE); return mrb_iv_get(mrb, obj, id); } -- cgit v1.2.3 From d5bcaafd9167be0942f46ffa6a67c7ea673bdf8b Mon Sep 17 00:00:00 2001 From: Masamitsu MURASE Date: Sun, 29 Jul 2012 18:45:47 +0900 Subject: Modify return value of mrbtest. This is an improvement for CI, such as Travis. --- test/driver.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/test/driver.c b/test/driver.c index 4fe58432d..d2ad31b26 100644 --- a/test/driver.c +++ b/test/driver.c @@ -11,6 +11,7 @@ #include #include #include +#include void mrb_init_mrbtest(mrb_state *); @@ -23,12 +24,24 @@ void print_hint(void) printf("Thanks :)\n\n"); } +static int +check_error(mrb_state *mrb) +{ + /* Error check */ + /* $ko_test and $kill_test should be 0 */ + mrb_value ko_test = mrb_gv_get(mrb, mrb_intern(mrb, "$ko_test")); + mrb_value kill_test = mrb_gv_get(mrb, mrb_intern(mrb, "$kill_test")); + + return FIXNUM_P(ko_test) && mrb_fixnum(ko_test) == 0 && FIXNUM_P(kill_test) && mrb_fixnum(kill_test) == 0; +} + int main(void) { mrb_state *mrb; mrb_value return_value; const char *prog = "report()"; + int ret = EXIT_SUCCESS; print_hint(); @@ -46,11 +59,12 @@ main(void) if (mrb->exc) { mrb_p(mrb, return_value); mrb->exc = 0; + ret = EXIT_FAILURE; } - else { - /* no */ + else if (!check_error(mrb)) { + ret = EXIT_FAILURE; } mrb_close(mrb); - return EXIT_SUCCESS; + return ret; } -- cgit v1.2.3 From 22b032fcdf4bc73eb2aaaafc823c10b5cd0ade31 Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Sun, 29 Jul 2012 20:11:43 +0900 Subject: mrb_hash_delete_key(), mrb_hash_keys() : Declare as static. mrb_check_hash_type(): Remove as no implementation. --- include/mruby/hash.h | 3 --- src/hash.c | 4 ++-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/include/mruby/hash.h b/include/mruby/hash.h index 7a16d7b5a..f3755eb25 100644 --- a/include/mruby/hash.h +++ b/include/mruby/hash.h @@ -26,10 +26,7 @@ mrb_value mrb_hash_new(mrb_state *mrb); void mrb_hash_set(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value val); mrb_value mrb_hash_get(mrb_state *mrb, mrb_value hash, mrb_value key); mrb_value mrb_hash_fetch(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value def); -mrb_value mrb_hash_delete_key(mrb_state *mrb, mrb_value hash, mrb_value key); -mrb_value mrb_hash_keys(mrb_state *mrb, mrb_value hash); mrb_value mrb_hash(mrb_state *mrb, mrb_value obj); -mrb_value mrb_check_hash_type(mrb_state *mrb, mrb_value self); /* RHASH_TBL allocates st_table if not available. */ #define RHASH(obj) ((struct RHash*)((obj).value.p)) diff --git a/src/hash.c b/src/hash.c index 5d3835019..927e40e66 100644 --- a/src/hash.c +++ b/src/hash.c @@ -488,7 +488,7 @@ mrb_hash_set_default_proc(mrb_state *mrb, mrb_value hash) return ifnone; } -mrb_value +static mrb_value mrb_hash_delete_key(mrb_state *mrb, mrb_value hash, mrb_value key) { khash_t(ht) *h = RHASH_TBL(hash); @@ -965,7 +965,7 @@ mrb_hash_to_hash(mrb_state *mrb, mrb_value hash) * */ -mrb_value +static mrb_value mrb_hash_keys(mrb_state *mrb, mrb_value hash) { khash_t(ht) *h = RHASH_TBL(hash); -- cgit v1.2.3 From 7ac4b56141db4a4bea28ddd1874b98b92f231150 Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Sun, 29 Jul 2012 20:35:23 +0900 Subject: Remove unimplemented declarations. --- include/mruby/array.h | 1 - include/mruby/numeric.h | 1 - include/mruby/string.h | 3 --- include/mruby/struct.h | 3 --- include/mruby/variable.h | 1 - 5 files changed, 9 deletions(-) diff --git a/include/mruby/array.h b/include/mruby/array.h index f42146f3e..bc10d8919 100644 --- a/include/mruby/array.h +++ b/include/mruby/array.h @@ -54,7 +54,6 @@ mrb_value mrb_ary_unshift(mrb_state *mrb, mrb_value self, mrb_value item); mrb_value mrb_ary_new4(mrb_state *mrb, int n, const mrb_value *elts); mrb_value mrb_assoc_new(mrb_state *mrb, mrb_value car, mrb_value cdr); mrb_value mrb_ary_entry(mrb_value ary, int offset); -mrb_value mrb_ary_sort(mrb_state *mrb, mrb_value ary); mrb_value mrb_ary_shift(mrb_state *mrb, mrb_value self); #if defined(__cplusplus) diff --git a/include/mruby/numeric.h b/include/mruby/numeric.h index a3768db2f..867aa27d9 100644 --- a/include/mruby/numeric.h +++ b/include/mruby/numeric.h @@ -18,7 +18,6 @@ extern "C" { #define FIXABLE(f) (POSFIXABLE(f) && NEGFIXABLE(f)) mrb_value mrb_flt2big(mrb_state *mrb, mrb_float d); -void mrb_num_zerodiv(mrb_state *mrb); mrb_value mrb_fix2str(mrb_state *mrb, mrb_value x, int base); mrb_value mrb_fixnum_plus(mrb_state *mrb, mrb_value x, mrb_value y); diff --git a/include/mruby/string.h b/include/mruby/string.h index 1449a2edf..c6f7c4ab5 100644 --- a/include/mruby/string.h +++ b/include/mruby/string.h @@ -52,7 +52,6 @@ struct RString { void mrb_str_decref(mrb_state*, struct mrb_shared_string*); mrb_value mrb_str_literal(mrb_state*, mrb_value); void mrb_str_concat(mrb_state*, mrb_value, mrb_value); -mrb_value mrb_obj_to_str(mrb_state*, mrb_value); mrb_value mrb_str_plus(mrb_state*, mrb_value, mrb_value); mrb_value mrb_obj_as_string(mrb_state *mrb, mrb_value obj); mrb_value mrb_str_resize(mrb_state *mrb, mrb_value str, int len); /* mrb_str_resize */ @@ -78,8 +77,6 @@ int mrb_str_hash_cmp(mrb_state *mrb, mrb_value str1, mrb_value str2); 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_value * mrb_svar(mrb_int cnt); -mrb_value mrb_str_drop_bytes(mrb_state *mrb, mrb_value str, long len); 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, long len); mrb_value mrb_str_append(mrb_state *mrb, mrb_value str, mrb_value str2); diff --git a/include/mruby/struct.h b/include/mruby/struct.h index 1aee64883..514f66dfe 100644 --- a/include/mruby/struct.h +++ b/include/mruby/struct.h @@ -20,9 +20,6 @@ struct RStruct { #define RSTRUCT_LEN(st) ((int)(RSTRUCT(st)->len)) #define RSTRUCT_PTR(st) (RSTRUCT(st)->ptr) -mrb_value mrb_yield_values(int n, ...); -mrb_value mrb_mod_module_eval(mrb_state *mrb, int argc, mrb_value *argv, mrb_value mod); - #if defined(__cplusplus) } /* extern "C" { */ #endif diff --git a/include/mruby/variable.h b/include/mruby/variable.h index a4ed9a0ee..e93a77c55 100644 --- a/include/mruby/variable.h +++ b/include/mruby/variable.h @@ -44,7 +44,6 @@ const char * mrb_class2name(mrb_state *mrb, struct RClass* klass); mrb_value mrb_iv_get(mrb_state *mrb, mrb_value obj, mrb_sym sym); void mrb_iv_set(mrb_state *mrb, mrb_value obj, mrb_sym sym, mrb_value v); mrb_value mrb_iv_remove(mrb_state *mrb, mrb_value obj, mrb_sym sym); -void mrb_copy_generic_ivar(mrb_value clone, mrb_value obj); int mrb_const_defined_at(mrb_state *mrb, struct RClass *klass, mrb_sym id); mrb_value mrb_f_global_variables(mrb_state *mrb, mrb_value self); mrb_value mrb_gv_get(mrb_state *mrb, mrb_sym sym); -- cgit v1.2.3 From ef993d75495c95a57863d6d0f900acbe8778336e Mon Sep 17 00:00:00 2001 From: Yuichiro MASUI Date: Sun, 29 Jul 2012 20:58:02 +0900 Subject: Added mrbc support output to stdout --- tools/mrbc/mrbc.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tools/mrbc/mrbc.c b/tools/mrbc/mrbc.c index 428a3b781..f9810aa4f 100644 --- a/tools/mrbc/mrbc.c +++ b/tools/mrbc/mrbc.c @@ -135,7 +135,10 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args) if (outfile == NULL) outfile = get_outfilename(infile, args->ext); - if ((args->wfp = fopen(outfile, "wb")) == NULL) { + if (strcmp("-", outfile) == 0) { + args->wfp = stdout; + } + else if ((args->wfp = fopen(outfile, "wb")) == NULL) { printf("%s: Cannot open output file. (%s)\n", *origargv, outfile); return 0; } -- cgit v1.2.3 From ee899778c4f6cb0d201e50996e73639eabf98704 Mon Sep 17 00:00:00 2001 From: Max Anselm Date: Sun, 29 Jul 2012 19:44:49 -0400 Subject: Define __STDC_LIMIT_MACROS for INT32_MAX in C++ --- include/mrbconf.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/include/mrbconf.h b/include/mrbconf.h index cf8217b23..b0a33aa43 100644 --- a/include/mrbconf.h +++ b/include/mrbconf.h @@ -7,6 +7,9 @@ #ifndef MRUBYCONF_H #define MRUBYCONF_H +#if defined(__cplusplus) +#define __STDC_LIMIT_MACROS +#endif #include /* configuration options: */ -- cgit v1.2.3 From 5a4beeed2d0c229a3a558650f03c8390da2d556c Mon Sep 17 00:00:00 2001 From: Max Anselm Date: Sun, 29 Jul 2012 19:45:27 -0400 Subject: Make all(?) void casts explicit for C++ --- src/array.c | 12 +++++------ src/cdump.c | 4 ++-- src/codegen.c | 26 ++++++++++++------------ src/dump.c | 14 ++++++------- src/gc.c | 2 +- src/kernel.c | 2 +- src/load.c | 22 ++++++++++---------- src/math.c | 1 + src/pool.c | 4 ++-- src/proc.c | 4 ++-- src/range.c | 2 +- src/st.c | 12 +++++------ src/state.c | 6 +++--- src/string.c | 30 ++++++++++++++-------------- src/struct.c | 4 ++-- src/symbol.c | 2 +- src/time.c | 64 +++++++++++++++++++++++++++++------------------------------ src/vm.c | 16 +++++++-------- 18 files changed, 114 insertions(+), 113 deletions(-) diff --git a/src/array.c b/src/array.c index ccd22674e..c385fe99b 100644 --- a/src/array.c +++ b/src/array.c @@ -46,7 +46,7 @@ ary_new_capa(mrb_state *mrb, int capa) } a = (struct RArray*)mrb_obj_alloc(mrb, MRB_TT_ARRAY, mrb->array_class); - a->ptr = mrb_calloc(mrb, blen, 1); + a->ptr = (mrb_value *)mrb_calloc(mrb, blen, 1); a->aux.capa = capa; a->len = 0; @@ -116,7 +116,7 @@ ary_modify(mrb_state *mrb, struct RArray *a) p = a->ptr; len = a->len * sizeof(mrb_value); - ptr = mrb_malloc(mrb, len); + ptr = (mrb_value *)mrb_malloc(mrb, len); if (p) { memcpy(ptr, p, len); } @@ -132,11 +132,11 @@ static void ary_make_shared(mrb_state *mrb, struct RArray *a) { if (!(a->flags & MRB_ARY_SHARED)) { - struct mrb_shared_array *shared = mrb_malloc(mrb, sizeof(struct mrb_shared_array)); + struct mrb_shared_array *shared = (struct mrb_shared_array *)mrb_malloc(mrb, sizeof(struct mrb_shared_array)); shared->refcnt = 1; if (a->aux.capa > a->len) { - a->ptr = shared->ptr = mrb_realloc(mrb, a->ptr, sizeof(mrb_value)*a->len+1); + a->ptr = shared->ptr = (mrb_value *)mrb_realloc(mrb, a->ptr, sizeof(mrb_value)*a->len+1); } else { shared->ptr = a->ptr; @@ -173,7 +173,7 @@ ary_expand_capa(mrb_state *mrb, struct RArray *a, int len) if (capa > a->aux.capa) { a->aux.capa = capa; - a->ptr = mrb_realloc(mrb, a->ptr, sizeof(mrb_value)*capa); + a->ptr = (mrb_value *)mrb_realloc(mrb, a->ptr, sizeof(mrb_value)*capa); } } @@ -195,7 +195,7 @@ ary_shrink_capa(mrb_state *mrb, struct RArray *a) if (capa > a->len && capa < a->aux.capa) { a->aux.capa = capa; - a->ptr = mrb_realloc(mrb, a->ptr, sizeof(mrb_value)*capa); + a->ptr = (mrb_value *)mrb_realloc(mrb, a->ptr, sizeof(mrb_value)*capa); } } diff --git a/src/cdump.c b/src/cdump.c index a4a2ac5e1..32982e6fe 100644 --- a/src/cdump.c +++ b/src/cdump.c @@ -107,7 +107,7 @@ make_cdump_irep(mrb_state *mrb, int irep_no, FILE *f) return -1; buf_len = MRB_CDUMP_LINE_LEN; - if ((buf = mrb_malloc(mrb, buf_len)) == 0 ) { + if ((buf = (char *)mrb_malloc(mrb, buf_len)) == 0 ) { return MRB_CDUMP_GENERAL_FAILURE; } @@ -144,7 +144,7 @@ make_cdump_irep(mrb_state *mrb, int irep_no, FILE *f) str_len = str_format_len(irep->pool[n]) + 1; if ( str_len > buf_len ) { buf_len = str_len; - if ((buf = mrb_realloc(mrb, buf, buf_len)) == 0 ) { + if ((buf = (char *)mrb_realloc(mrb, buf, buf_len)) == 0 ) { return MRB_CDUMP_GENERAL_FAILURE; } } diff --git a/src/codegen.c b/src/codegen.c index 3bf0e496c..2e8104fdd 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -136,7 +136,7 @@ genop(codegen_scope *s, mrb_code i) { if (s->pc == s->icapa) { s->icapa *= 2; - s->iseq = codegen_realloc(s, s->iseq, sizeof(mrb_code)*s->icapa); + s->iseq = (mrb_code *)codegen_realloc(s, s->iseq, sizeof(mrb_code)*s->icapa); } s->iseq[s->pc] = i; s->pc++; @@ -323,7 +323,7 @@ new_lit(codegen_scope *s, mrb_value val) } if (s->plen == s->pcapa) { s->pcapa *= 2; - s->pool = codegen_realloc(s, s->pool, sizeof(mrb_value)*s->pcapa); + s->pool = (mrb_value *)codegen_realloc(s, s->pool, sizeof(mrb_value)*s->pcapa); } s->pool[s->plen] = val; return s->plen++; @@ -357,7 +357,7 @@ new_sym(codegen_scope *s, mrb_sym sym) if (s->syms[i] == sym) return i; } if (s->slen > 125 && s->slen < 256) { - s->syms = codegen_realloc(s, s->syms, sizeof(mrb_sym)*65536); + s->syms = (mrb_sym *)codegen_realloc(s, s->syms, sizeof(mrb_sym)*65536); memset(s->syms+s->slen, 0, sizeof(mrb_sym)*(256-s->slen)); s->slen = 256; } @@ -556,7 +556,7 @@ attrsym(codegen_scope *s, mrb_sym a) char *name2; name = mrb_sym2name_len(s->mrb, a, &len); - name2 = codegen_palloc(s, len+1); + name2 = (char *)codegen_palloc(s, len+1); memcpy(name2, name, len); name2[len] = '='; name2[len+1] = '\0'; @@ -1927,7 +1927,7 @@ static codegen_scope* scope_new(mrb_state *mrb, codegen_scope *prev, node *lv) { mrb_pool *pool = mrb_pool_open(mrb); - codegen_scope *p = mrb_pool_alloc(pool, sizeof(codegen_scope)); + codegen_scope *p = (codegen_scope *)mrb_pool_alloc(pool, sizeof(codegen_scope)); if (!p) return 0; memset(p, 0, sizeof(codegen_scope)); @@ -1940,12 +1940,12 @@ scope_new(mrb_state *mrb, codegen_scope *prev, node *lv) p->mrb = prev->mrb; p->icapa = 1024; - p->iseq = mrb_malloc(mrb, sizeof(mrb_code)*p->icapa); + p->iseq = (mrb_code *)mrb_malloc(mrb, sizeof(mrb_code)*p->icapa); p->pcapa = 32; - p->pool = mrb_malloc(mrb, sizeof(mrb_value)*p->pcapa); + p->pool = (mrb_value *)mrb_malloc(mrb, sizeof(mrb_value)*p->pcapa); - p->syms = mrb_malloc(mrb, sizeof(mrb_sym)*256); + p->syms = (mrb_sym *)mrb_malloc(mrb, sizeof(mrb_sym)*256); p->lv = lv; p->sp += node_len(lv)+2; @@ -1964,20 +1964,20 @@ scope_finish(codegen_scope *s, int idx) mrb_irep *irep; mrb_add_irep(mrb, idx); - irep = mrb->irep[idx] = mrb_malloc(mrb, sizeof(mrb_irep)); + irep = mrb->irep[idx] = (mrb_irep *)mrb_malloc(mrb, sizeof(mrb_irep)); irep->idx = idx; irep->flags = 0; if (s->iseq) { - irep->iseq = codegen_realloc(s, s->iseq, sizeof(mrb_code)*s->pc); + irep->iseq = (mrb_code *)codegen_realloc(s, s->iseq, sizeof(mrb_code)*s->pc); irep->ilen = s->pc; } if (s->pool) { - irep->pool = codegen_realloc(s, s->pool, sizeof(mrb_value)*s->plen); + irep->pool = (mrb_value *)codegen_realloc(s, s->pool, sizeof(mrb_value)*s->plen); irep->plen = s->plen; } if (s->syms) { - irep->syms = codegen_realloc(s, s->syms, sizeof(mrb_sym)*s->slen); + irep->syms = (mrb_sym *)codegen_realloc(s, s->syms, sizeof(mrb_sym)*s->slen); irep->slen = s->slen; } @@ -1991,7 +1991,7 @@ scope_finish(codegen_scope *s, int idx) static struct loopinfo* loop_push(codegen_scope *s, enum looptype t) { - struct loopinfo *p = codegen_palloc(s, sizeof(struct loopinfo)); + struct loopinfo *p = (struct loopinfo *)codegen_palloc(s, sizeof(struct loopinfo)); p->type = t; p->pc1 = p->pc2 = p->pc3 = 0; diff --git a/src/dump.c b/src/dump.c index d8768f771..230ba9bba 100644 --- a/src/dump.c +++ b/src/dump.c @@ -335,7 +335,7 @@ write_pool_block(mrb_state *mrb, mrb_irep *irep, char *buf, int type) int len; buf_size = MRB_DUMP_DEFAULT_STR_LEN; - if ((char_buf = mrb_malloc(mrb, buf_size)) == 0) + if ((char_buf = (char *)mrb_malloc(mrb, buf_size)) == 0) goto error_exit; buf += uint32_dump((uint32_t)irep->plen, buf, type); /* number of pool */ @@ -360,7 +360,7 @@ write_pool_block(mrb_state *mrb, mrb_irep *irep, char *buf, int type) nlen = str_dump_len(RSTRING_PTR(str), RSTRING_LEN(str), type); if ( nlen > buf_size - 1) { buf_size = nlen + 1; - if ((char_buf = mrb_realloc(mrb, char_buf, buf_size)) == 0) + if ((char_buf = (char *)mrb_realloc(mrb, char_buf, buf_size)) == 0) goto error_exit; memset(char_buf, 0, buf_size); } @@ -409,7 +409,7 @@ write_syms_block(mrb_state *mrb, mrb_irep *irep, char *buf, int type) uint16_t buf_size =0; buf_size = MRB_DUMP_DEFAULT_STR_LEN; - if ((char_buf = mrb_malloc(mrb, buf_size)) == 0) + if ((char_buf = (char *)mrb_malloc(mrb, buf_size)) == 0) goto error_exit; buf += uint32_dump((uint32_t)irep->slen, buf, type); /* number of symbol */ @@ -425,7 +425,7 @@ write_syms_block(mrb_state *mrb, mrb_irep *irep, char *buf, int type) nlen = str_dump_len((char*)name, len, type); if ( nlen > buf_size - 1) { buf_size = nlen + 1; - if ((char_buf = mrb_realloc(mrb, char_buf, buf_size)) == 0) + if ((char_buf = (char *)mrb_realloc(mrb, char_buf, buf_size)) == 0) goto error_exit; } memset(char_buf, 0, buf_size); @@ -461,7 +461,7 @@ calc_crc_section(mrb_state *mrb, mrb_irep *irep, uint16_t *crc, int section) default: return MRB_DUMP_GENERAL_FAILURE; } - if ((buf = mrb_calloc(mrb, 1, buf_size)) == 0) + if ((buf = (char *)mrb_calloc(mrb, 1, buf_size)) == 0) return MRB_DUMP_GENERAL_FAILURE; buf_top = buf; @@ -598,7 +598,7 @@ dump_irep_record(mrb_state *mrb, int irep_no, FILE* fp, uint32_t *rlen) if (irep_record_size == 0) return MRB_DUMP_GENERAL_FAILURE; - if ((buf = mrb_calloc(mrb, 1, irep_record_size)) == 0) + if ((buf = (char *)mrb_calloc(mrb, 1, irep_record_size)) == 0) return MRB_DUMP_GENERAL_FAILURE; if ((rc = write_irep_record(mrb, irep_no, buf, rlen, DUMP_TYPE_HEX)) != MRB_DUMP_OK) { @@ -690,7 +690,7 @@ mrb_bdump_irep(mrb_state *mrb, int n, FILE *f,const char *initname) buf_size += get_irep_record_size(mrb, irep_no, DUMP_TYPE_BIN); buf_size += MRB_DUMP_SIZE_OF_LONG; /* end of file */ - if ((buf = mrb_malloc(mrb, buf_size)) == 0) + if ((buf = (char *)mrb_malloc(mrb, buf_size)) == 0) return MRB_DUMP_GENERAL_FAILURE; rc = mrb_write_irep(mrb, n, buf); diff --git a/src/gc.c b/src/gc.c index c0d4e1599..59a6b7eb4 100644 --- a/src/gc.c +++ b/src/gc.c @@ -248,7 +248,7 @@ unlink_free_heap_page(mrb_state *mrb, struct heap_page *page) static void add_heap(mrb_state *mrb) { - struct heap_page *page = mrb_calloc(mrb, 1, sizeof(struct heap_page)); + struct heap_page *page = (struct heap_page *)mrb_calloc(mrb, 1, sizeof(struct heap_page)); RVALUE *p, *e; struct RBasic *prev = NULL; diff --git a/src/kernel.c b/src/kernel.c index 8aba1a808..36dfbe769 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -853,7 +853,7 @@ mrb_obj_methods_m(mrb_state *mrb, mrb_value self) int argc; mrb_get_args(mrb, "*", &argv, &argc); - return mrb_obj_methods(mrb, argc, argv, self, 0); /* everything but private */ + return mrb_obj_methods(mrb, argc, argv, self, (mrb_method_flag_t)0); /* everything but private */ } /* 15.3.1.3.32 */ diff --git a/src/load.c b/src/load.c index c1c0a7eed..cee985f43 100644 --- a/src/load.c +++ b/src/load.c @@ -143,7 +143,7 @@ load_rite_irep_record(mrb_state *mrb, RiteFILE* rfp, unsigned char* dst, uint32_ uint16_t buf_size =0; buf_size = MRB_DUMP_DEFAULT_STR_LEN; - if ((char_buf = mrb_malloc(mrb, buf_size)) == 0) + if ((char_buf = (char *)mrb_malloc(mrb, buf_size)) == 0) goto error_exit; pStart = dst; @@ -192,7 +192,7 @@ load_rite_irep_record(mrb_state *mrb, RiteFILE* rfp, unsigned char* dst, uint32_ if ( pdl > buf_size - 1) { buf_size = pdl + 1; - if ((char_buf = mrb_realloc(mrb, char_buf, buf_size)) == 0) + if ((char_buf = (char *)mrb_realloc(mrb, char_buf, buf_size)) == 0) goto error_exit; } memset(char_buf, '\0', buf_size); @@ -219,7 +219,7 @@ load_rite_irep_record(mrb_state *mrb, RiteFILE* rfp, unsigned char* dst, uint32_ if ( snl > buf_size - 1) { buf_size = snl + 1; - if ((char_buf = mrb_realloc(mrb, char_buf, buf_size)) == 0) + if ((char_buf = (char *)mrb_realloc(mrb, char_buf, buf_size)) == 0) goto error_exit; } memset(char_buf, '\0', buf_size); @@ -262,7 +262,7 @@ mrb_load_irep(mrb_state *mrb, FILE* fp) return ret; len = sizeof(rite_binary_header) + bin_to_uint32(bin_header.rbds); - if ((rite_dst = mrb_malloc(mrb, len)) == NULL) + if ((rite_dst = (unsigned char *)mrb_malloc(mrb, len)) == NULL) return MRB_DUMP_GENERAL_FAILURE; dst = rite_dst; @@ -331,7 +331,7 @@ read_rite_irep_record(mrb_state *mrb, unsigned char *src, mrb_irep *irep, uint32 int ai = mrb_gc_arena_save(mrb); recordStart = src; - buf = mrb_malloc(mrb, bufsize); + buf = (char *)mrb_malloc(mrb, bufsize); if (buf == NULL) { ret = MRB_DUMP_INVALID_IREP; goto error_exit; @@ -359,7 +359,7 @@ read_rite_irep_record(mrb_state *mrb, unsigned char *src, mrb_irep *irep, uint32 irep->ilen = bin_to_uint32(src); //iseq length src += MRB_DUMP_SIZE_OF_LONG; if (irep->ilen > 0) { - if ((irep->iseq = mrb_malloc(mrb, sizeof(mrb_code) * irep->ilen)) == NULL) { + if ((irep->iseq = (mrb_code *)mrb_malloc(mrb, sizeof(mrb_code) * irep->ilen)) == NULL) { ret = MRB_DUMP_GENERAL_FAILURE; goto error_exit; } @@ -380,7 +380,7 @@ read_rite_irep_record(mrb_state *mrb, unsigned char *src, mrb_irep *irep, uint32 irep->plen = bin_to_uint32(src); //pool length src += MRB_DUMP_SIZE_OF_LONG; if (irep->plen > 0) { - irep->pool = mrb_malloc(mrb, sizeof(mrb_value) * irep->plen); + irep->pool = (mrb_value *)mrb_malloc(mrb, sizeof(mrb_value) * irep->plen); if (irep->pool == NULL) { ret = MRB_DUMP_INVALID_IREP; goto error_exit; @@ -394,7 +394,7 @@ read_rite_irep_record(mrb_state *mrb, unsigned char *src, mrb_irep *irep, uint32 if (pdl > bufsize - 1) { mrb_free(mrb, buf); bufsize = pdl + 1; - if ((buf = mrb_malloc(mrb, bufsize)) == NULL) { + if ((buf = (char *)mrb_malloc(mrb, bufsize)) == NULL) { ret = MRB_DUMP_GENERAL_FAILURE; goto error_exit; } @@ -443,7 +443,7 @@ read_rite_irep_record(mrb_state *mrb, unsigned char *src, mrb_irep *irep, uint32 irep->slen = bin_to_uint32(src); //syms length src += MRB_DUMP_SIZE_OF_LONG; if (irep->slen > 0) { - if ((irep->syms = mrb_malloc(mrb, sizeof(mrb_sym) * irep->slen)) == NULL) { + if ((irep->syms = (mrb_sym *)mrb_malloc(mrb, sizeof(mrb_sym) * irep->slen)) == NULL) { ret = MRB_DUMP_INVALID_IREP; goto error_exit; } @@ -461,7 +461,7 @@ read_rite_irep_record(mrb_state *mrb, unsigned char *src, mrb_irep *irep, uint32 if (snl > bufsize - 1) { mrb_free(mrb, buf); bufsize = snl + 1; - if ((buf = mrb_malloc(mrb, bufsize)) == NULL) { + if ((buf = (char *)mrb_malloc(mrb, bufsize)) == NULL) { ret = MRB_DUMP_GENERAL_FAILURE; goto error_exit; } @@ -509,7 +509,7 @@ mrb_read_irep(mrb_state *mrb, const char *bin) mrb_add_irep(mrb, sirep + nirep); for (n=0,i=sirep; nirep[i] = mrb_malloc(mrb, sizeof(mrb_irep))) == NULL) { + if ((mrb->irep[i] = (mrb_irep *)mrb_malloc(mrb, sizeof(mrb_irep))) == NULL) { ret = MRB_DUMP_GENERAL_FAILURE; goto error_exit; } diff --git a/src/math.c b/src/math.c index cf9a20489..ecf9fbf43 100644 --- a/src/math.c +++ b/src/math.c @@ -5,6 +5,7 @@ */ #include "mruby.h" +#include "mruby/array.h" #ifdef ENABLE_MATH #include diff --git a/src/pool.c b/src/pool.c index 0f1baa776..36c6fa8eb 100644 --- a/src/pool.c +++ b/src/pool.c @@ -49,7 +49,7 @@ struct mrb_pool { mrb_pool* mrb_pool_open(mrb_state *mrb) { - mrb_pool *pool = mrb_malloc(mrb, sizeof(mrb_pool)); + mrb_pool *pool = (mrb_pool *)mrb_malloc(mrb, sizeof(mrb_pool)); if (pool) { pool->mrb = mrb; @@ -81,7 +81,7 @@ page_alloc(mrb_pool *pool, size_t len) if (len < POOL_PAGE_SIZE) len = POOL_PAGE_SIZE; - page = mrb_malloc(pool->mrb, sizeof(struct mrb_pool_page)+len-1); + page = (struct mrb_pool_page *)mrb_malloc(pool->mrb, sizeof(struct mrb_pool_page)+len-1); if (page) { page->offset = 0; page->len = len; diff --git a/src/proc.c b/src/proc.c index e27d5d578..d223fa760 100644 --- a/src/proc.c +++ b/src/proc.c @@ -144,8 +144,8 @@ void mrb_init_proc(mrb_state *mrb) { struct RProc *m; - mrb_code *call_iseq = mrb_malloc(mrb, sizeof(mrb_code)); - mrb_irep *call_irep = mrb_calloc(mrb, sizeof(mrb_irep), 1); + mrb_code *call_iseq = (mrb_code *)mrb_malloc(mrb, sizeof(mrb_code)); + mrb_irep *call_irep = (mrb_irep *)mrb_calloc(mrb, sizeof(mrb_irep), 1); if ( call_iseq == NULL || call_irep == NULL ) return; diff --git a/src/range.c b/src/range.c index 9113a810a..db17c7d40 100644 --- a/src/range.c +++ b/src/range.c @@ -43,7 +43,7 @@ mrb_range_new(mrb_state *mrb, mrb_value beg, mrb_value end, int excl) struct RRange *r; r = (struct RRange*)mrb_obj_alloc(mrb, MRB_TT_RANGE, RANGE_CLASS); - r->edges = mrb_malloc(mrb, sizeof(struct mrb_range_edges)); + r->edges = (struct mrb_range_edges *)mrb_malloc(mrb, sizeof(struct mrb_range_edges)); range_check(mrb, beg, end); r->edges->beg = beg; r->edges->end = end; diff --git a/src/st.c b/src/st.c index 257da7e2b..c3c20c80a 100644 --- a/src/st.c +++ b/src/st.c @@ -24,21 +24,21 @@ static int numcmp(long, long); static st_index_t numhash(long); static struct st_hash_type type_numhash = { - numcmp, - numhash, + (int (*)(ANYARGS))numcmp, + (st_index_t (*)(ANYARGS))numhash, }; /* extern int strcmp(const char *, const char *); */ static st_index_t strhash(const char*); static struct st_hash_type type_strhash = { - strcmp, - strhash, + (int (*)(ANYARGS))strcmp, + (st_index_t (*)(ANYARGS))strhash, }; static st_index_t strcasehash(st_data_t); static const struct st_hash_type type_strcasehash = { - st_strcasecmp, - strcasehash, + (int (*)(ANYARGS))st_strcasecmp, + (st_index_t (*)(ANYARGS))strcasehash, }; static void rehash(st_table*); diff --git a/src/state.c b/src/state.c index 0d236e660..26e7dff4a 100644 --- a/src/state.c +++ b/src/state.c @@ -15,7 +15,7 @@ void mrb_init_ext(mrb_state*); mrb_state* mrb_open_allocf(mrb_allocf f) { - mrb_state *mrb = (f)(NULL, NULL, sizeof(mrb_state)); + mrb_state *mrb = (mrb_state *)(f)(NULL, NULL, sizeof(mrb_state)); if (mrb == NULL) return NULL; memset(mrb, 0, sizeof(mrb_state)); @@ -76,14 +76,14 @@ mrb_add_irep(mrb_state *mrb, int idx) int max = 256; if (idx > max) max = idx+1; - mrb->irep = mrb_calloc(mrb, max, sizeof(mrb_irep*)); + mrb->irep = (mrb_irep **)mrb_calloc(mrb, max, sizeof(mrb_irep*)); mrb->irep_capa = max; } else if (mrb->irep_capa <= idx) { while (mrb->irep_capa <= idx) { mrb->irep_capa *= 2; } - mrb->irep = mrb_realloc(mrb, mrb->irep, sizeof(mrb_irep*)*mrb->irep_capa); + mrb->irep = (mrb_irep **)mrb_realloc(mrb, mrb->irep, sizeof(mrb_irep*)*mrb->irep_capa); } } diff --git a/src/string.c b/src/string.c index 0a5dee88e..11990c22d 100644 --- a/src/string.c +++ b/src/string.c @@ -29,7 +29,7 @@ static mrb_value str_replace(mrb_state *mrb, struct RString *s1, struct RString static mrb_value mrb_str_subseq(mrb_state *mrb, mrb_value str, int beg, int len); #define RESIZE_CAPA(s,capacity) do {\ - s->ptr = mrb_realloc(mrb, s->ptr, (capacity)+1);\ + s->ptr = (char *)mrb_realloc(mrb, s->ptr, (capacity)+1);\ s->aux.capa = capacity;\ } while (0) @@ -60,7 +60,7 @@ str_modify(mrb_state *mrb, struct RString *s) p = s->ptr; len = s->len; - ptr = mrb_malloc(mrb, len+1); + ptr = (char *)mrb_malloc(mrb, len+1); if (p) { memcpy(ptr, p, len); } @@ -83,7 +83,7 @@ mrb_str_resize(mrb_state *mrb, mrb_value str, int len) slen = s->len; if (len != slen) { if (slen < len || slen -len > 1024) { - s->ptr = mrb_realloc(mrb, s->ptr, len+1); + s->ptr = (char *)mrb_realloc(mrb, s->ptr, len+1); } s->aux.capa = len; s->len = len; @@ -133,7 +133,7 @@ str_new(mrb_state *mrb, const char *p, int len) s->len = len; s->aux.capa = len; - s->ptr = mrb_malloc(mrb, len+1); + s->ptr = (char *)mrb_malloc(mrb, len+1); if (p) { memcpy(s->ptr, p, len); } @@ -168,7 +168,7 @@ mrb_str_buf_new(mrb_state *mrb, int capa) } s->len = 0; s->aux.capa = capa; - s->ptr = mrb_malloc(mrb, capa+1); + s->ptr = (char *)mrb_malloc(mrb, capa+1); s->ptr[0] = '\0'; return mrb_obj_value(s); @@ -249,7 +249,7 @@ mrb_str_new_cstr(mrb_state *mrb, const char *p) int len = strlen(p); s = mrb_obj_alloc_string(mrb); - s->ptr = mrb_malloc(mrb, len+1); + s->ptr = (char *)mrb_malloc(mrb, len+1); memcpy(s->ptr, p, len); s->ptr[len] = 0; s->len = len; @@ -262,11 +262,11 @@ static void str_make_shared(mrb_state *mrb, struct RString *s) { if (!(s->flags & MRB_STR_SHARED)) { - struct mrb_shared_string *shared = mrb_malloc(mrb, sizeof(struct mrb_shared_string)); + struct mrb_shared_string *shared = (struct mrb_shared_string *)mrb_malloc(mrb, sizeof(struct mrb_shared_string)); shared->refcnt = 1; if (s->aux.capa > s->len) { - s->ptr = shared->ptr = mrb_realloc(mrb, s->ptr, s->len+1); + s->ptr = shared->ptr = (char *)mrb_realloc(mrb, s->ptr, s->len+1); } else { shared->ptr = s->ptr; @@ -341,7 +341,7 @@ mrb_str_concat(mrb_state *mrb, mrb_value self, mrb_value other) if (s1->aux.capa < len) { s1->aux.capa = len; - s1->ptr = mrb_realloc(mrb, s1->ptr, len+1); + s1->ptr = (char *)mrb_realloc(mrb, s1->ptr, len+1); } memcpy(s1->ptr+s1->len, s2->ptr, s2->len); s1->len = len; @@ -664,7 +664,7 @@ mrb_memsearch_qs(const unsigned char *xs, long m, const unsigned char *ys, long static int mrb_memsearch(const void *x0, int m, const void *y0, int n) { - const unsigned char *x = x0, *y = y0; + const unsigned char *x = (const unsigned char *)x0, *y = (const unsigned char *)y0; if (m > n) return -1; else if (m == n) { @@ -681,7 +681,7 @@ mrb_memsearch(const void *x0, int m, const void *y0, int n) } return -1; } - return mrb_memsearch_qs(x0, m, y0, n); + return mrb_memsearch_qs((const unsigned char *)x0, m, (const unsigned char *)y0, n); } static mrb_int @@ -1564,10 +1564,10 @@ str_replace(mrb_state *mrb, struct RString *s1, struct RString *s2) if (s1->flags & MRB_STR_SHARED) { mrb_str_decref(mrb, s1->aux.shared); s1->flags &= ~MRB_STR_SHARED; - s1->ptr = mrb_malloc(mrb, s2->len+1); + s1->ptr = (char *)mrb_malloc(mrb, s2->len+1); } else { - s1->ptr = mrb_realloc(mrb, s1->ptr, s2->len+1); + s1->ptr = (char *)mrb_realloc(mrb, s1->ptr, s2->len+1); } memcpy(s1->ptr, s2->ptr, s2->len); s1->ptr[s2->len] = 0; @@ -2541,7 +2541,7 @@ mrb_str_to_inum(mrb_state *mrb, mrb_value str, int base, int badcheck) if (s) { len = RSTRING_LEN(str); if (s[len]) { /* no sentinel somehow */ - char *p = mrb_malloc(mrb, len+1); + char *p = (char *)mrb_malloc(mrb, len+1); //MEMCPY(p, s, char, len); memcpy(p, s, sizeof(char)*len); @@ -2675,7 +2675,7 @@ mrb_str_to_dbl(mrb_state *mrb, mrb_value str, int badcheck) mrb_raise(mrb, E_ARGUMENT_ERROR, "string for Float contains null byte"); } if (s[len]) { /* no sentinel somehow */ - char *p = mrb_malloc(mrb, len+1); + char *p = (char *)mrb_malloc(mrb, len+1); memcpy(p, s, sizeof(char)*len); p[len] = '\0'; diff --git a/src/struct.c b/src/struct.c index 0a95f9e49..a133dc046 100644 --- a/src/struct.c +++ b/src/struct.c @@ -184,7 +184,7 @@ mrb_id_attrset(mrb_state *mrb, mrb_sym id) mrb_sym mid; name = mrb_sym2name_len(mrb, id, &len); - buf = mrb_malloc(mrb, len+2); + buf = (char *)mrb_malloc(mrb, len+2); memcpy(buf, name, len); buf[len] = '='; buf[len+1] = '\0'; @@ -427,7 +427,7 @@ mrb_struct_initialize_withArg(mrb_state *mrb, int argc, mrb_value *argv, mrb_val mrb_raise(mrb, E_ARGUMENT_ERROR, "struct size differs"); } st = RSTRUCT(self); - st->ptr = mrb_calloc(mrb, sizeof(mrb_value), n); + st->ptr = (mrb_value *)mrb_calloc(mrb, sizeof(mrb_value), n); st->len = n; memcpy(st->ptr, argv, sizeof(mrb_value)*argc); diff --git a/src/symbol.c b/src/symbol.c index 6e92fb6c7..b81296929 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -50,7 +50,7 @@ mrb_intern2(mrb_state *mrb, const char *name, int len) return kh_value(h, k); sym = ++mrb->symidx; - p = mrb_malloc(mrb, len+1); + p = (char *)mrb_malloc(mrb, len+1); memcpy(p, name, len); p[len] = 0; sname.name = (const char*)p; diff --git a/src/time.c b/src/time.c index c988d0fd0..e71fc17fe 100644 --- a/src/time.c +++ b/src/time.c @@ -164,7 +164,7 @@ mrb_time_alloc(mrb_state *mrb, mrb_float sec, mrb_float usec, enum mrb_timezone { struct mrb_time *tm; - tm = mrb_malloc(mrb, sizeof(struct mrb_time)); + tm = (struct mrb_time *)mrb_malloc(mrb, sizeof(struct mrb_time)); tm->sec = (time_t)sec; tm->usec = (sec - tm->sec) * 1.0e6 + usec; while (tm->usec < 0) { @@ -192,7 +192,7 @@ current_mrb_time(mrb_state *mrb) { struct mrb_time *tm; - tm = mrb_malloc(mrb, sizeof(*tm)); + tm = (struct mrb_time *)mrb_malloc(mrb, sizeof(*tm)); #ifdef NO_GETTIMEOFDAY { static time_t last_sec = 0, last_usec = 0; @@ -304,8 +304,8 @@ mrb_time_eq(mrb_state *mrb, mrb_value self) struct mrb_time *tm1, *tm2; mrb_get_args(mrb, "o", &other); - tm1 = mrb_get_datatype(mrb, self, &mrb_time_type); - tm2 = mrb_get_datatype(mrb, other, &mrb_time_type); + tm1 = (struct mrb_time *)mrb_get_datatype(mrb, self, &mrb_time_type); + tm2 = (struct mrb_time *)mrb_get_datatype(mrb, other, &mrb_time_type); if (!tm1 || !tm2) return mrb_false_value(); if (tm1->sec == tm2->sec && tm1->usec == tm2->usec) { return mrb_true_value(); @@ -320,8 +320,8 @@ mrb_time_cmp(mrb_state *mrb, mrb_value self) struct mrb_time *tm1, *tm2; mrb_get_args(mrb, "o", &other); - tm1 = mrb_get_datatype(mrb, self, &mrb_time_type); - tm2 = mrb_get_datatype(mrb, other, &mrb_time_type); + tm1 = (struct mrb_time *)mrb_get_datatype(mrb, self, &mrb_time_type); + tm2 = (struct mrb_time *)mrb_get_datatype(mrb, other, &mrb_time_type); if (!tm1 || !tm2) return mrb_nil_value(); if (tm1->sec > tm2->sec) { return mrb_fixnum_value(1); @@ -346,7 +346,7 @@ mrb_time_plus(mrb_state *mrb, mrb_value self) struct mrb_time *tm; mrb_get_args(mrb, "f", &f); - tm = mrb_get_datatype(mrb, self, &mrb_time_type); + tm = (struct mrb_time *)mrb_get_datatype(mrb, self, &mrb_time_type); if (!tm) return mrb_nil_value(); return mrb_time_make(mrb, mrb_obj_class(mrb, self), tm->sec+f, tm->usec, tm->timezone); } @@ -359,10 +359,10 @@ mrb_time_minus(mrb_state *mrb, mrb_value self) struct mrb_time *tm, *tm2; mrb_get_args(mrb, "o", &other); - tm = mrb_get_datatype(mrb, self, &mrb_time_type); + tm = (struct mrb_time *)mrb_get_datatype(mrb, self, &mrb_time_type); if (!tm) return mrb_nil_value(); - tm2 = mrb_get_datatype(mrb, other, &mrb_time_type); + tm2 = (struct mrb_time *)mrb_get_datatype(mrb, other, &mrb_time_type); if (tm2) { f = (mrb_float)(tm->sec - tm2->sec) + (mrb_float)(tm->usec - tm2->usec) / 1.0e6; @@ -381,7 +381,7 @@ mrb_time_wday(mrb_state *mrb, mrb_value self) { struct mrb_time *tm; - tm = mrb_get_datatype(mrb, self, &mrb_time_type); + tm = (struct mrb_time *)mrb_get_datatype(mrb, self, &mrb_time_type); if (!tm) return mrb_nil_value(); return mrb_fixnum_value(tm->datetime.tm_wday); } @@ -393,7 +393,7 @@ mrb_time_yday(mrb_state *mrb, mrb_value self) { struct mrb_time *tm; - tm = mrb_check_datatype(mrb, self, &mrb_time_type); + tm = (struct mrb_time *)mrb_check_datatype(mrb, self, &mrb_time_type); if (!tm) return mrb_nil_value(); return mrb_fixnum_value(tm->datetime.tm_yday); } @@ -405,7 +405,7 @@ mrb_time_year(mrb_state *mrb, mrb_value self) { struct mrb_time *tm; - tm = mrb_get_datatype(mrb, self, &mrb_time_type); + tm = (struct mrb_time *)mrb_get_datatype(mrb, self, &mrb_time_type); if (!tm) return mrb_nil_value(); return mrb_fixnum_value(tm->datetime.tm_year + 1900); } @@ -417,7 +417,7 @@ mrb_time_zone(mrb_state *mrb, mrb_value self) { struct mrb_time *tm; - tm = mrb_get_datatype(mrb, self, &mrb_time_type); + tm = (struct mrb_time *)mrb_get_datatype(mrb, self, &mrb_time_type); if (!tm) return mrb_nil_value(); if (tm->timezone <= MRB_TIMEZONE_NONE) return mrb_nil_value(); if (tm->timezone >= MRB_TIMEZONE_LAST) return mrb_nil_value(); @@ -434,7 +434,7 @@ mrb_time_asctime(mrb_state *mrb, mrb_value self) char buf[256]; int len; - tm = mrb_get_datatype(mrb, self, &mrb_time_type); + tm = (struct mrb_time *)mrb_get_datatype(mrb, self, &mrb_time_type); if (!tm) return mrb_nil_value(); d = &tm->datetime; len = snprintf(buf, sizeof(buf), "%s %s %02d %02d:%02d:%02d %s%d", @@ -452,7 +452,7 @@ mrb_time_day(mrb_state *mrb, mrb_value self) { struct mrb_time *tm; - tm = mrb_get_datatype(mrb, self, &mrb_time_type); + tm = (struct mrb_time *)mrb_get_datatype(mrb, self, &mrb_time_type); if (!tm) return mrb_nil_value(); return mrb_fixnum_value(tm->datetime.tm_mday); } @@ -465,7 +465,7 @@ mrb_time_dstp(mrb_state *mrb, mrb_value self) { struct mrb_time *tm; - tm = mrb_get_datatype(mrb, self, &mrb_time_type); + tm = (struct mrb_time *)mrb_get_datatype(mrb, self, &mrb_time_type); if (!tm) return mrb_nil_value(); return mrb_bool_value(tm->datetime.tm_isdst); } @@ -478,9 +478,9 @@ mrb_time_getutc(mrb_state *mrb, mrb_value self) { struct mrb_time *tm, *tm2; - tm = mrb_get_datatype(mrb, self, &mrb_time_type); + tm = (struct mrb_time *)mrb_get_datatype(mrb, self, &mrb_time_type); if (!tm) return self; - tm2 = mrb_malloc(mrb, sizeof(*tm)); + tm2 = (struct mrb_time *)mrb_malloc(mrb, sizeof(*tm)); *tm2 = *tm; tm2->timezone = MRB_TIMEZONE_UTC; mrb_time_update_datetime(tm2); @@ -494,9 +494,9 @@ mrb_time_getlocal(mrb_state *mrb, mrb_value self) { struct mrb_time *tm, *tm2; - tm = mrb_get_datatype(mrb, self, &mrb_time_type); + tm = (struct mrb_time *)mrb_get_datatype(mrb, self, &mrb_time_type); if (!tm) return self; - tm2 = mrb_malloc(mrb, sizeof(*tm)); + tm2 = (struct mrb_time *)mrb_malloc(mrb, sizeof(*tm)); *tm2 = *tm; tm2->timezone = MRB_TIMEZONE_LOCAL; mrb_time_update_datetime(tm2); @@ -510,7 +510,7 @@ mrb_time_hour(mrb_state *mrb, mrb_value self) { struct mrb_time *tm; - tm = mrb_get_datatype(mrb, self, &mrb_time_type); + tm = (struct mrb_time *)mrb_get_datatype(mrb, self, &mrb_time_type); if (!tm) return mrb_nil_value(); return mrb_fixnum_value(tm->datetime.tm_hour); } @@ -524,7 +524,7 @@ mrb_time_initialize(mrb_state *mrb, mrb_value self) amin = 0, asec = 0, ausec = 0; struct mrb_time *tm; - tm = mrb_get_datatype(mrb, self, &mrb_time_type); + tm = (struct mrb_time *)mrb_get_datatype(mrb, self, &mrb_time_type); if (tm) { mrb_time_free(mrb, tm); } @@ -568,7 +568,7 @@ mrb_time_localtime(mrb_state *mrb, mrb_value self) { struct mrb_time *tm; - tm = mrb_get_datatype(mrb, self, &mrb_time_type); + tm = (struct mrb_time *)mrb_get_datatype(mrb, self, &mrb_time_type); if (!tm) return self; tm->timezone = MRB_TIMEZONE_LOCAL; mrb_time_update_datetime(tm); @@ -582,7 +582,7 @@ mrb_time_mday(mrb_state *mrb, mrb_value self) { struct mrb_time *tm; - tm = mrb_get_datatype(mrb, self, &mrb_time_type); + tm = (struct mrb_time *)mrb_get_datatype(mrb, self, &mrb_time_type); if (!tm) return mrb_nil_value(); return mrb_fixnum_value(tm->datetime.tm_mday); } @@ -594,7 +594,7 @@ mrb_time_min(mrb_state *mrb, mrb_value self) { struct mrb_time *tm; - tm = mrb_get_datatype(mrb, self, &mrb_time_type); + tm = (struct mrb_time *)mrb_get_datatype(mrb, self, &mrb_time_type); if (!tm) return mrb_nil_value(); return mrb_fixnum_value(tm->datetime.tm_min); } @@ -606,7 +606,7 @@ mrb_time_mon(mrb_state *mrb, mrb_value self) { struct mrb_time *tm; - tm = mrb_get_datatype(mrb, self, &mrb_time_type); + tm = (struct mrb_time *)mrb_get_datatype(mrb, self, &mrb_time_type); if (!tm) return mrb_nil_value(); return mrb_fixnum_value(tm->datetime.tm_mon + 1); } @@ -618,7 +618,7 @@ mrb_time_sec(mrb_state *mrb, mrb_value self) { struct mrb_time *tm; - tm = mrb_get_datatype(mrb, self, &mrb_time_type); + tm = (struct mrb_time *)mrb_get_datatype(mrb, self, &mrb_time_type); if (!tm) return mrb_nil_value(); return mrb_fixnum_value(tm->datetime.tm_sec); } @@ -631,7 +631,7 @@ mrb_time_to_f(mrb_state *mrb, mrb_value self) { struct mrb_time *tm; - tm = mrb_get_datatype(mrb, self, &mrb_time_type); + tm = (struct mrb_time *)mrb_get_datatype(mrb, self, &mrb_time_type); if (!tm) return mrb_nil_value(); return mrb_float_value((mrb_float)tm->sec + (mrb_float)tm->usec/1.0e6); } @@ -643,7 +643,7 @@ mrb_time_to_i(mrb_state *mrb, mrb_value self) { struct mrb_time *tm; - tm = mrb_get_datatype(mrb, self, &mrb_time_type); + tm = (struct mrb_time *)mrb_get_datatype(mrb, self, &mrb_time_type); if (!tm) return mrb_nil_value(); return mrb_fixnum_value(tm->sec); } @@ -655,7 +655,7 @@ mrb_time_usec(mrb_state *mrb, mrb_value self) { struct mrb_time *tm; - tm = mrb_get_datatype(mrb, self, &mrb_time_type); + tm = (struct mrb_time *)mrb_get_datatype(mrb, self, &mrb_time_type); if (!tm) return mrb_nil_value(); return mrb_fixnum_value(tm->usec); } @@ -667,7 +667,7 @@ mrb_time_utc(mrb_state *mrb, mrb_value self) { struct mrb_time *tm; - tm = mrb_get_datatype(mrb, self, &mrb_time_type); + tm = (struct mrb_time *)mrb_get_datatype(mrb, self, &mrb_time_type); if (tm) { tm->timezone = MRB_TIMEZONE_UTC; mrb_time_update_datetime(tm); @@ -681,7 +681,7 @@ static mrb_value mrb_time_utcp(mrb_state *mrb, mrb_value self) { struct mrb_time *tm; - tm = mrb_get_datatype(mrb, self, &mrb_time_type); + tm = (struct mrb_time *)mrb_get_datatype(mrb, self, &mrb_time_type); if (!tm) return mrb_nil_value(); return mrb_bool_value(tm->timezone == MRB_TIMEZONE_UTC); } diff --git a/src/vm.c b/src/vm.c index e8dcf1b80..5e14ff139 100644 --- a/src/vm.c +++ b/src/vm.c @@ -28,12 +28,12 @@ static void stack_init(mrb_state *mrb) { /* assert(mrb->stack == NULL); */ - mrb->stbase = mrb_calloc(mrb, STACK_INIT_SIZE, sizeof(mrb_value)); + mrb->stbase = (mrb_value *)mrb_calloc(mrb, STACK_INIT_SIZE, sizeof(mrb_value)); mrb->stend = mrb->stbase + STACK_INIT_SIZE; mrb->stack = mrb->stbase; /* assert(mrb->ci == NULL); */ - mrb->cibase = mrb_calloc(mrb, CALLINFO_INIT_SIZE, sizeof(mrb_callinfo)); + mrb->cibase = (mrb_callinfo *)mrb_calloc(mrb, CALLINFO_INIT_SIZE, sizeof(mrb_callinfo)); mrb->ciend = mrb->cibase + CALLINFO_INIT_SIZE; mrb->ci = mrb->cibase; mrb->ci->target_class = mrb->object_class; @@ -70,7 +70,7 @@ stack_extend(mrb_state *mrb, int room, int keep) size *= 2; else size += room; - mrb->stbase = mrb_realloc(mrb, mrb->stbase, sizeof(mrb_value) * size); + mrb->stbase = (mrb_value *)mrb_realloc(mrb, mrb->stbase, sizeof(mrb_value) * size); mrb->stack = mrb->stbase + off; mrb->stend = mrb->stbase + size; envadjust(mrb, oldbase, mrb->stbase); @@ -127,7 +127,7 @@ cipush(mrb_state *mrb) if (mrb->ci + 1 == mrb->ciend) { size_t size = mrb->ci - mrb->cibase; - mrb->cibase = mrb_realloc(mrb, mrb->cibase, sizeof(mrb_callinfo)*size*2); + mrb->cibase = (mrb_callinfo *)mrb_realloc(mrb, mrb->cibase, sizeof(mrb_callinfo)*size*2); mrb->ci = mrb->cibase + size; mrb->ciend = mrb->cibase + size * 2; } @@ -145,7 +145,7 @@ cipop(mrb_state *mrb) if (mrb->ci->env) { struct REnv *e = mrb->ci->env; int len = (int)e->flags; - mrb_value *p = mrb_malloc(mrb, sizeof(mrb_value)*len); + mrb_value *p = (mrb_value *)mrb_malloc(mrb, sizeof(mrb_value)*len); e->cioff = -1; memcpy(p, e->stack, sizeof(mrb_value)*len); @@ -395,7 +395,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) mrb_value *regs = NULL; mrb_code i; int ai = mrb->arena_idx; - jmp_buf *prev_jmp = mrb->jmp; + jmp_buf *prev_jmp = (jmp_buf *)mrb->jmp; jmp_buf c_jmp; #ifdef DIRECT_THREADED @@ -620,7 +620,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) if (mrb->rsize <= mrb->ci->ridx) { if (mrb->rsize == 0) mrb->rsize = 16; else mrb->rsize *= 2; - mrb->rescue = mrb_realloc(mrb, mrb->rescue, sizeof(mrb_code*) * mrb->rsize); + mrb->rescue = (mrb_code **)mrb_realloc(mrb, mrb->rescue, sizeof(mrb_code*) * mrb->rsize); } mrb->rescue[mrb->ci->ridx++] = pc + GETARG_sBx(i); NEXT; @@ -657,7 +657,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) if (mrb->esize <= mrb->ci->eidx) { if (mrb->esize == 0) mrb->esize = 16; else mrb->esize *= 2; - mrb->ensure = mrb_realloc(mrb, mrb->ensure, sizeof(struct RProc*) * mrb->esize); + mrb->ensure = (struct RProc **)mrb_realloc(mrb, mrb->ensure, sizeof(struct RProc*) * mrb->esize); } mrb->ensure[mrb->ci->eidx++] = p; NEXT; -- cgit v1.2.3 From dacae7fda9a30ec8e92f7b094f48b9168f0a51ee Mon Sep 17 00:00:00 2001 From: Max Anselm Date: Sun, 29 Jul 2012 19:51:14 -0400 Subject: Remove unnecessary mrb_assoc_new prototype Include array.h instead. --- src/math.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/math.c b/src/math.c index ecf9fbf43..519d4f37b 100644 --- a/src/math.c +++ b/src/math.c @@ -89,10 +89,6 @@ erfc(double x) #endif - -mrb_value -mrb_assoc_new(mrb_state *mrb, mrb_value car, mrb_value cdr); - /* TRIGONOMETRIC FUNCTIONS */ -- cgit v1.2.3 From 50b9f54a6527477d825049c4f0a8f14f7bb4482c Mon Sep 17 00:00:00 2001 From: Max Anselm Date: Sun, 29 Jul 2012 20:11:08 -0400 Subject: Make void casts explicit. (Forgot a couple files) --- src/parse.y | 20 ++++++++++---------- tools/mruby/mruby.c | 6 +++--- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/parse.y b/src/parse.y index a2a12b14d..a9afc5c96 100644 --- a/src/parse.y +++ b/src/parse.y @@ -94,7 +94,7 @@ cons_gen(parser_state *p, node *car, node *cdr) p->cells = p->cells->cdr; } else { - c = parser_palloc(p, sizeof(mrb_ast_node)); + c = (node *)parser_palloc(p, sizeof(mrb_ast_node)); } c->car = car; @@ -165,7 +165,7 @@ append_gen(parser_state *p, node *a, node *b) static char* parser_strndup(parser_state *p, const char *s, size_t len) { - char *b = parser_palloc(p, len+1); + char *b = (char *)parser_palloc(p, len+1); memcpy(b, s, len); b[len] = '\0'; @@ -2852,7 +2852,7 @@ singleton : var_ref yyerror(p, "can't define singleton method for ()."); } else { - switch ((enum node_type)$3->car) { + switch ((enum node_type)(int)(intptr_t)$3->car) { case NODE_STR: case NODE_DSTR: case NODE_DREGX: @@ -2968,7 +2968,7 @@ yyerror(parser_state *p, const char *s) } else if (p->nerr < sizeof(p->error_buffer) / sizeof(p->error_buffer[0])) { n = strlen(s); - c = parser_palloc(p, n + 1); + c = (char *)parser_palloc(p, n + 1); memcpy(c, s, n + 1); p->error_buffer[p->nerr].message = c; p->error_buffer[p->nerr].lineno = p->lineno; @@ -3004,7 +3004,7 @@ yywarn(parser_state *p, const char *s) } else if (p->nerr < sizeof(p->warn_buffer) / sizeof(p->warn_buffer[0])) { n = strlen(s); - c = parser_palloc(p, n + 1); + c = (char *)parser_palloc(p, n + 1); memcpy(c, s, n + 1); p->warn_buffer[p->nwarn].message = c; p->warn_buffer[p->nwarn].lineno = p->lineno; @@ -3254,7 +3254,7 @@ scan_hex(const int *start, int len, int *retlen) register unsigned long retval = 0; char *tmp; - while (len-- && *s && (tmp = strchr(hexdigit, *s))) { + while (len-- && *s && (tmp = (char *)strchr(hexdigit, *s))) { retval <<= 4; retval |= (tmp - hexdigit) & 15; s++; @@ -4701,7 +4701,7 @@ parser_update_cxt(parser_state *p, mrbc_context *cxt) i++; n = n->cdr; } - cxt->syms = mrb_realloc(p->mrb, cxt->syms, i*sizeof(mrb_sym)); + cxt->syms = (mrb_sym *)mrb_realloc(p->mrb, cxt->syms, i*sizeof(mrb_sym)); cxt->slen = i; for (i=0, n=n0; n; i++,n=n->cdr) { cxt->syms[i] = (mrb_sym)n->car; @@ -4759,7 +4759,7 @@ mrb_parser_new(mrb_state *mrb) pool = mrb_pool_open(mrb); if (!pool) return 0; - p = mrb_pool_alloc(pool, sizeof(parser_state)); + p = (parser_state *)mrb_pool_alloc(pool, sizeof(parser_state)); if (!p) return 0; memset(p, 0, sizeof(parser_state)); @@ -4793,7 +4793,7 @@ mrbc_context_new(mrb_state *mrb) { mrbc_context *c; - c = mrb_calloc(mrb, 1, sizeof(mrbc_context)); + c = (mrbc_context *)mrb_calloc(mrb, 1, sizeof(mrbc_context)); return c; } @@ -4810,7 +4810,7 @@ mrbc_filename(mrb_state *mrb, mrbc_context *c, const char *s) { if (s) { int len = strlen(s); - char *p = mrb_malloc(mrb, len); + char *p = (char *)mrb_malloc(mrb, len); memcpy(p, s, len); if (c->filename) mrb_free(mrb, c->filename); diff --git a/tools/mruby/mruby.c b/tools/mruby/mruby.c index 26b1e44d5..e6a088672 100644 --- a/tools/mruby/mruby.c +++ b/tools/mruby/mruby.c @@ -86,12 +86,12 @@ append_cmdline: if (!args->cmdline) { char *buf; - buf = mrb_malloc(mrb, strlen(item)+1); + buf = (char *)mrb_malloc(mrb, strlen(item)+1); strcpy(buf, item); args->cmdline = buf; } else { - args->cmdline = mrb_realloc(mrb, args->cmdline, strlen(args->cmdline)+strlen(item)+2); + args->cmdline = (char *)mrb_realloc(mrb, args->cmdline, strlen(args->cmdline)+strlen(item)+2); strcat(args->cmdline, "\n"); strcat(args->cmdline, item); } @@ -133,7 +133,7 @@ append_cmdline: return 0; } } - args->argv = mrb_realloc(mrb, args->argv, sizeof(char*) * (argc + 1)); + args->argv = (char **)mrb_realloc(mrb, args->argv, sizeof(char*) * (argc + 1)); memcpy(args->argv, argv, (argc+1) * sizeof(char*)); args->argc = argc; -- cgit v1.2.3 From bd035bcbb6b6ed79501b073111ca2c5ea8b29dee Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 30 Jul 2012 09:40:41 +0900 Subject: do not use INT32_MAX; close #407 --- src/string.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/string.c b/src/string.c index 0a5dee88e..aab8c9616 100644 --- a/src/string.c +++ b/src/string.c @@ -431,7 +431,7 @@ mrb_str_times(mrb_state *mrb, mrb_value self) if (times < 0) { mrb_raise(mrb, E_ARGUMENT_ERROR, "negative argument"); } - if (times && INT32_MAX/times < RSTRING_LEN(self)) { + if (times && INT_MAX/times < RSTRING_LEN(self)) { mrb_raise(mrb, E_ARGUMENT_ERROR, "argument too big"); } -- cgit v1.2.3 From eb34ad365b4fc70f174398b6898e14f3001aca69 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 30 Jul 2012 09:45:37 +0900 Subject: fixed the comment English --- include/mrbconf.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/mrbconf.h b/include/mrbconf.h index b0a33aa43..45a5afabb 100644 --- a/include/mrbconf.h +++ b/include/mrbconf.h @@ -16,7 +16,7 @@ /* add -DMRB_USE_FLOAT to use float instead of double for floating point numbers */ //#define MRB_USE_FLOAT -/* -DDISABLE_XXXX to change to drop the feature */ +/* -DDISABLE_XXXX to drop the feature */ #define DISABLE_REGEXP /* regular expression classes */ //#define DISABLE_SPRINTF /* Kernel.sprintf method */ //#define DISABLE_MATH /* Math functions */ -- cgit v1.2.3 From 446005620babeb0bf5ef8b8d2b6552c3c85aefd1 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 30 Jul 2012 10:51:24 +0900 Subject: remove __STDC_LIMIT_MACROS for INT32_MAX --- include/mrbconf.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/include/mrbconf.h b/include/mrbconf.h index 45a5afabb..0113136d6 100644 --- a/include/mrbconf.h +++ b/include/mrbconf.h @@ -7,9 +7,6 @@ #ifndef MRUBYCONF_H #define MRUBYCONF_H -#if defined(__cplusplus) -#define __STDC_LIMIT_MACROS -#endif #include /* configuration options: */ -- cgit v1.2.3 From 14410d1391c645733013e3798539e7ecedd83a6b Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 30 Jul 2012 13:18:24 +0900 Subject: configurable MRB_HEAP_PAGE_SIZE --- src/gc.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/gc.c b/src/gc.c index 59a6b7eb4..29dc1d55f 100644 --- a/src/gc.c +++ b/src/gc.c @@ -189,7 +189,9 @@ mrb_free(mrb_state *mrb, void *p) return (mrb->allocf)(mrb, p, 0); } -#define HEAP_PAGE_SIZE 1024 +#ifndef MRB_HEAP_PAGE_SIZE +#define MRB_HEAP_PAGE_SIZE 1024 +#endif struct heap_page { struct RBasic *freelist; @@ -197,7 +199,7 @@ struct heap_page { struct heap_page *next; struct heap_page *free_next; struct heap_page *free_prev; - RVALUE objects[HEAP_PAGE_SIZE]; + RVALUE objects[MRB_HEAP_PAGE_SIZE]; }; static void @@ -252,7 +254,7 @@ add_heap(mrb_state *mrb) RVALUE *p, *e; struct RBasic *prev = NULL; - for (p = page->objects, e=p+HEAP_PAGE_SIZE; pobjects, e=p+MRB_HEAP_PAGE_SIZE; pas.free.tt = MRB_TT_FREE; p->as.free.next = prev; prev = &p->as.basic; @@ -708,7 +710,7 @@ incremental_sweep_phase(mrb_state *mrb, size_t limit) while (page && (tried_sweep < limit)) { RVALUE *p = page->objects; - RVALUE *e = p + HEAP_PAGE_SIZE; + RVALUE *e = p + MRB_HEAP_PAGE_SIZE; size_t freed = 0; int dead_slot = 1; int full = (page->freelist == NULL); @@ -730,7 +732,7 @@ incremental_sweep_phase(mrb_state *mrb, size_t limit) } /* free dead slot */ - if (dead_slot && freed < HEAP_PAGE_SIZE) { + if (dead_slot && freed < MRB_HEAP_PAGE_SIZE) { struct heap_page *next = page->next; unlink_heap_page(mrb, page); @@ -744,7 +746,7 @@ incremental_sweep_phase(mrb_state *mrb, size_t limit) } page = page->next; } - tried_sweep += HEAP_PAGE_SIZE; + tried_sweep += MRB_HEAP_PAGE_SIZE; mrb->live -= freed; mrb->gc_live_after_mark -= freed; } @@ -1158,7 +1160,7 @@ test_incremental_gc(void) page = mrb->heaps; while (page) { RVALUE *p = page->objects; - RVALUE *e = p + HEAP_PAGE_SIZE; + RVALUE *e = p + MRB_HEAP_PAGE_SIZE; while (pas.basic)) { live++; @@ -1169,7 +1171,7 @@ test_incremental_gc(void) p++; } page = page->next; - total += HEAP_PAGE_SIZE; + total += MRB_HEAP_PAGE_SIZE; } gc_assert(mrb->gray_list == NULL); @@ -1204,7 +1206,7 @@ test_incremental_sweep_phase(void) gc_assert(mrb->heaps->next->next == NULL); gc_assert(mrb->free_heaps->next->next == NULL); - incremental_sweep_phase(mrb, HEAP_PAGE_SIZE*3); + incremental_sweep_phase(mrb, MRB_HEAP_PAGE_SIZE*3); gc_assert(mrb->heaps->next == NULL); gc_assert(mrb->heaps == mrb->free_heaps); -- cgit v1.2.3 From b1cc715b36166bcd6c1fff3ef3180115743cdae7 Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Mon, 30 Jul 2012 15:31:49 +0900 Subject: MRB_INITIAL_HASH_SIZE : Make the initial hash size configurable. --- include/mruby/khash.h | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/include/mruby/khash.h b/include/mruby/khash.h index 09b23f6af..a50698fc9 100644 --- a/include/mruby/khash.h +++ b/include/mruby/khash.h @@ -17,7 +17,10 @@ extern "C" { typedef uint32_t khint_t; typedef khint_t khiter_t; -#define INITIAL_HASH_SIZE 32 +#if !defined(MRB_INITIAL_HASH_SIZE) +# define MRB_INITIAL_HASH_SIZE 32 +#endif + #define UPPER_BOUND(x) ((x)>>2|(x>>1)) //extern uint8_t __m[]; @@ -88,7 +91,7 @@ static const uint8_t __m[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; } \ kh_##name##_t *kh_init_##name(mrb_state *mrb){ \ kh_##name##_t *h = (kh_##name##_t*)mrb_calloc(mrb, 1, sizeof(kh_##name##_t)); \ - h->n_buckets = INITIAL_HASH_SIZE; \ + h->n_buckets = MRB_INITIAL_HASH_SIZE; \ h->mrb = mrb; \ kh_alloc_##name(h); \ return h; \ @@ -123,14 +126,16 @@ static const uint8_t __m[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; } \ void kh_resize_##name(kh_##name##_t *h, khint_t new_n_buckets) \ { \ - if( new_n_bucketse_flags; \ khkey_t *old_keys = h->keys; \ khval_t *old_vals = h->vals; \ @@ -140,10 +145,10 @@ static const uint8_t __m[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; kh_alloc_##name(h); \ /* relocate */ \ for( i=0 ; imrb, old_e_flags); \ mrb_free(h->mrb, old_keys); \ -- cgit v1.2.3 From c808f647aa8fde6e1698b25df15d7a93bafe4f42 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 30 Jul 2012 16:41:05 +0900 Subject: allow specifying khash initial size --- include/mruby/khash.h | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/include/mruby/khash.h b/include/mruby/khash.h index a50698fc9..87ba44674 100644 --- a/include/mruby/khash.h +++ b/include/mruby/khash.h @@ -17,7 +17,7 @@ extern "C" { typedef uint32_t khint_t; typedef khint_t khiter_t; -#if !defined(MRB_INITIAL_HASH_SIZE) +#ifndef MRB_INITIAL_HASH_SIZE # define MRB_INITIAL_HASH_SIZE 32 #endif @@ -89,13 +89,16 @@ static const uint8_t __m[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; h->mask = sz-1; \ h->inc = sz/2-1; \ } \ - kh_##name##_t *kh_init_##name(mrb_state *mrb){ \ + kh_##name##_t *kh_init_##name##_size(mrb_state *mrb, khint_t size) { \ kh_##name##_t *h = (kh_##name##_t*)mrb_calloc(mrb, 1, sizeof(kh_##name##_t)); \ - h->n_buckets = MRB_INITIAL_HASH_SIZE; \ + h->n_buckets = size; \ h->mrb = mrb; \ kh_alloc_##name(h); \ return h; \ } \ + kh_##name##_t *kh_init_##name(mrb_state *mrb){ \ + return kh_init_##name##_size(mrb, MRB_INITIAL_HASH_SIZE); \ + } \ void kh_destroy_##name(kh_##name##_t *h) \ { \ if( h ){ \ -- cgit v1.2.3 From e75c76ecee3a0b5b1b0b19d4fdd8c31b3e8bbd9b Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 30 Jul 2012 17:16:05 +0900 Subject: iv khash initial size to 8 --- include/mruby/khash.h | 34 ++++++++++++++++++---------------- src/variable.c | 4 ++-- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/include/mruby/khash.h b/include/mruby/khash.h index 87ba44674..b28cd0702 100644 --- a/include/mruby/khash.h +++ b/include/mruby/khash.h @@ -39,7 +39,7 @@ static const uint8_t __m[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; name: ash name khkey_t: key data type khval_t: value data type - kh_is_map: (not implemented / not used in RiteVM ) + kh_is_map: (not implemented / not used in RiteVM) */ #define KHASH_DECLARE(name, khkey_t, khval_t, kh_is_map) \ typedef struct kh_##name { \ @@ -56,6 +56,7 @@ static const uint8_t __m[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; mrb_state *mrb; \ } kh_##name##_t; \ void kh_alloc_##name(kh_##name##_t *h); \ + kh_##name##_t *kh_init_##name##_size(mrb_state *mrb, khint_t size); \ kh_##name##_t *kh_init_##name(mrb_state *mrb); \ void kh_destroy_##name(kh_##name##_t *h); \ void kh_clear_##name(kh_##name##_t *h); \ @@ -70,7 +71,7 @@ static const uint8_t __m[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; name: ash name khkey_t: key data type khval_t: value data type - kh_is_map: (not implemented / not used in RiteVM ) + kh_is_map: (not implemented / not used in RiteVM) __hash_func: hash function __hash_equal: hash comparation function */ @@ -101,7 +102,7 @@ static const uint8_t __m[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; } \ void kh_destroy_##name(kh_##name##_t *h) \ { \ - if( h ){ \ + if (h) { \ mrb_free(h->mrb, h->keys); \ mrb_free(h->mrb, h->vals); \ mrb_free(h->mrb, h->e_flags); \ @@ -110,7 +111,7 @@ static const uint8_t __m[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; } \ void kh_clear_##name(kh_##name##_t *h) \ { \ - if( h && h->e_flags ){ \ + if (h && h->e_flags) { \ memset(h->e_flags, 0xff, h->n_buckets/8*sizeof(uint8_t)); \ memset(h->d_flags, 0x00, h->n_buckets/8*sizeof(uint8_t)); \ h->size = h->n_occupied = 0; \ @@ -119,9 +120,9 @@ static const uint8_t __m[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; 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) ){ \ - if( __hash_equal(h->mrb,h->keys[k], key) ) return k; \ + while (!__ac_isempty(h->e_flags, h->d_flags, k)) { \ + if (!__ac_isdel(h->e_flags, h->d_flags, k)) { \ + if (__hash_equal(h->mrb,h->keys[k], key)) return k; \ } \ k = (k+h->inc) & (h->mask); \ } \ @@ -129,12 +130,12 @@ static const uint8_t __m[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; } \ void kh_resize_##name(kh_##name##_t *h, khint_t new_n_buckets) \ { \ - if( new_n_bucketsn_buckets = new_n_buckets; \ kh_alloc_##name(h); \ /* relocate */ \ - for( i=0 ; in_occupied >= h->upper_bound ){ \ + if (h->n_occupied >= h->upper_bound) { \ 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) ){ \ - if( __hash_equal(h->mrb,h->keys[k], key) ) break; \ + while (!__ac_iseither(h->e_flags, h->d_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->e_flags, h->d_flags, k)) { \ /* put at empty */ \ h->keys[k] = key; \ h->e_flags[k/8] &= ~__m[k%8]; \ h->size++; \ h->n_occupied++; \ - } else if( __ac_isdel(h->e_flags, h->d_flags, k) ) { \ + } else if (__ac_isdel(h->e_flags, h->d_flags, k)) { \ /* put at del */ \ h->keys[k] = key; \ h->d_flags[k/8] &= ~__m[k%8]; \ @@ -206,6 +207,7 @@ static const uint8_t __m[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; #define khash_t(name) kh_##name##_t +#define kh_init_size(name,mrb,size) kh_init_##name##_size(mrb,size) #define kh_init(name,mrb) kh_init_##name(mrb) #define kh_destroy(name, h) kh_destroy_##name(h) #define kh_clear(name, h) kh_clear_##name(h) diff --git a/src/variable.c b/src/variable.c index 04e5ad9f7..49665a9ae 100644 --- a/src/variable.c +++ b/src/variable.c @@ -130,7 +130,7 @@ mrb_obj_iv_set(mrb_state *mrb, struct RObject *obj, mrb_sym sym, mrb_value v) khash_t(iv) *h; if (!obj->iv) { - h = obj->iv = kh_init(iv, mrb); + h = obj->iv = kh_init_size(iv, mrb, 8); } else { h = obj->iv; @@ -266,7 +266,7 @@ mrb_vm_cv_set(mrb_state *mrb, mrb_sym sym, mrb_value v) c = mrb->ci->target_class; h = c->iv; if (!h) { - c->iv = h = kh_init(iv, mrb); + c->iv = h = kh_init_size(iv, mrb, 8); } k = kh_put(iv, h, sym); kh_value(h, k) = v; -- cgit v1.2.3 From d91f475e5514248ad660172d35ccdf21872d63e7 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 30 Jul 2012 17:16:13 +0900 Subject: better mrbconf decsription --- include/mrbconf.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/include/mrbconf.h b/include/mrbconf.h index 0113136d6..c4cf23017 100644 --- a/include/mrbconf.h +++ b/include/mrbconf.h @@ -13,6 +13,12 @@ /* add -DMRB_USE_FLOAT to use float instead of double for floating point numbers */ //#define MRB_USE_FLOAT +/* initial size of khash table bucket; should be power of 2 (n >= 8) */ +//#define MRB_INITIAL_HASH_SIZE 32 + +/* argv max size in mrb_funcall */ +//#define MRB_FUNCALL_ARGC_MAX 16 + /* -DDISABLE_XXXX to drop the feature */ #define DISABLE_REGEXP /* regular expression classes */ //#define DISABLE_SPRINTF /* Kernel.sprintf method */ @@ -21,8 +27,6 @@ //#define DISABLE_STRUCT /* Struct class */ //#define DISABLE_STDIO /* use of stdio */ -//#define MRB_FUNCALL_ARGC_MAX 16 /* argv size in mrb_funcall */ - #undef HAVE_UNISTD_H /* WINDOWS */ #define HAVE_UNISTD_H /* LINUX */ -- cgit v1.2.3 From 0c55f7ecc3fa61fc3a1fd19c2632389377779305 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 30 Jul 2012 17:18:32 +0900 Subject: add description of MRB_HEAP_PAGE_SIZE --- include/mrbconf.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/include/mrbconf.h b/include/mrbconf.h index c4cf23017..f5f8de969 100644 --- a/include/mrbconf.h +++ b/include/mrbconf.h @@ -19,6 +19,9 @@ /* argv max size in mrb_funcall */ //#define MRB_FUNCALL_ARGC_MAX 16 +/* number of object per heap page */ +//#define MRB_HEAP_PAGE_SIZE 1024 + /* -DDISABLE_XXXX to drop the feature */ #define DISABLE_REGEXP /* regular expression classes */ //#define DISABLE_SPRINTF /* Kernel.sprintf method */ -- cgit v1.2.3 From 857370c2b703a7158dfde5766e4b3b6eedcff10c Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 30 Jul 2012 17:33:54 +0900 Subject: use const MRB_IV_INITIAL_SIZE --- src/variable.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/variable.c b/src/variable.c index 49665a9ae..b81b292d9 100644 --- a/src/variable.c +++ b/src/variable.c @@ -16,6 +16,10 @@ #include "re.h" #endif +#ifndef MRB_IV_INITIAL_SIZE +#define MRB_IV_INITIAL_SIZE 8 +#endif + static void mark_tbl(mrb_state *mrb, struct kh_iv *h) { @@ -130,7 +134,7 @@ mrb_obj_iv_set(mrb_state *mrb, struct RObject *obj, mrb_sym sym, mrb_value v) khash_t(iv) *h; if (!obj->iv) { - h = obj->iv = kh_init_size(iv, mrb, 8); + h = obj->iv = kh_init_size(iv, mrb, MRB_IV_INITIAL_SIZE); } else { h = obj->iv; @@ -266,7 +270,7 @@ mrb_vm_cv_set(mrb_state *mrb, mrb_sym sym, mrb_value v) c = mrb->ci->target_class; h = c->iv; if (!h) { - c->iv = h = kh_init_size(iv, mrb, 8); + c->iv = h = kh_init_size(iv, mrb, MRB_IV_INITIAL_SIZE); } k = kh_put(iv, h, sym); kh_value(h, k) = v; -- cgit v1.2.3 From 515862cc015097144a003aa0f253af3a58dbab37 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 30 Jul 2012 23:55:35 +0900 Subject: khash refactoring; no more MRB_KHASH_INITIAL_SIZE --- include/mrbconf.h | 6 +++--- include/mruby/khash.h | 32 +++++++++++++++++++------------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/include/mrbconf.h b/include/mrbconf.h index f5f8de969..955e6538b 100644 --- a/include/mrbconf.h +++ b/include/mrbconf.h @@ -13,15 +13,15 @@ /* add -DMRB_USE_FLOAT to use float instead of double for floating point numbers */ //#define MRB_USE_FLOAT -/* initial size of khash table bucket; should be power of 2 (n >= 8) */ -//#define MRB_INITIAL_HASH_SIZE 32 - /* argv max size in mrb_funcall */ //#define MRB_FUNCALL_ARGC_MAX 16 /* number of object per heap page */ //#define MRB_HEAP_PAGE_SIZE 1024 +/* default size of khash table bucket */ +//#define KHASH_DEFAULT_SIZE 32 + /* -DDISABLE_XXXX to drop the feature */ #define DISABLE_REGEXP /* regular expression classes */ //#define DISABLE_SPRINTF /* Kernel.sprintf method */ diff --git a/include/mruby/khash.h b/include/mruby/khash.h index b28cd0702..16a35c3d5 100644 --- a/include/mruby/khash.h +++ b/include/mruby/khash.h @@ -17,9 +17,10 @@ extern "C" { typedef uint32_t khint_t; typedef khint_t khiter_t; -#ifndef MRB_INITIAL_HASH_SIZE -# define MRB_INITIAL_HASH_SIZE 32 +#ifndef KHASH_DEFAULT_SIZE +# define KHASH_DEFAULT_SIZE 32 #endif +#define KHASH_MIN_SIZE 8 #define UPPER_BOUND(x) ((x)>>2|(x>>1)) @@ -32,7 +33,15 @@ static const uint8_t __m[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; #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 khash_power2(v) do { \ + v--;\ + v |= v >> 1;\ + v |= v >> 2;\ + v |= v >> 4;\ + v |= v >> 8;\ + v |= v >> 16;\ + v++;\ +} while (0); /* declare struct kh_xxx and kh_xxx_funcs @@ -92,13 +101,16 @@ static const uint8_t __m[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; } \ kh_##name##_t *kh_init_##name##_size(mrb_state *mrb, khint_t size) { \ kh_##name##_t *h = (kh_##name##_t*)mrb_calloc(mrb, 1, sizeof(kh_##name##_t)); \ + if (size < KHASH_MIN_SIZE) \ + size = KHASH_MIN_SIZE; \ + khash_power2(size); \ h->n_buckets = size; \ h->mrb = mrb; \ kh_alloc_##name(h); \ return h; \ } \ kh_##name##_t *kh_init_##name(mrb_state *mrb){ \ - return kh_init_##name##_size(mrb, MRB_INITIAL_HASH_SIZE); \ + return kh_init_##name##_size(mrb, KHASH_DEFAULT_SIZE); \ } \ void kh_destroy_##name(kh_##name##_t *h) \ { \ @@ -130,15 +142,9 @@ static const uint8_t __m[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; } \ void kh_resize_##name(kh_##name##_t *h, khint_t new_n_buckets) \ { \ - if (new_n_bucketse_flags; \ khkey_t *old_keys = h->keys; \ -- cgit v1.2.3 From d749ccfd3eb3f6020146ab287b0cea74f35e169f Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 30 Jul 2012 23:56:34 +0900 Subject: add description of MRB_IV_INITIAL_SIZE --- include/mrbconf.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/include/mrbconf.h b/include/mrbconf.h index 955e6538b..3d1e1757d 100644 --- a/include/mrbconf.h +++ b/include/mrbconf.h @@ -19,6 +19,9 @@ /* number of object per heap page */ //#define MRB_HEAP_PAGE_SIZE 1024 +/* initial size for IV khash */ +//#define MRB_IV_INITIAL_SIZE 8 + /* default size of khash table bucket */ //#define KHASH_DEFAULT_SIZE 32 -- cgit v1.2.3 From 998830e1bc995d722e98067b6e658b926b93f970 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 31 Jul 2012 10:55:30 +0900 Subject: reduce restoration of arena_idx in vm loop --- src/vm.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/vm.c b/src/vm.c index 5e14ff139..b646ced77 100644 --- a/src/vm.c +++ b/src/vm.c @@ -364,7 +364,7 @@ argnum_error(mrb_state *mrb, int num) #define INIT_DISPATCH for (;;) { i = *pc; switch (GET_OPCODE(i)) { #define CASE(op) case op: -#define NEXT mrb->arena_idx = ai; pc++; break +#define NEXT pc++; break #define JUMP break #define END_DISPATCH }} @@ -372,7 +372,7 @@ argnum_error(mrb_state *mrb, int num) #define INIT_DISPATCH JUMP; return mrb_nil_value(); #define CASE(op) L_ ## op: -#define NEXT mrb->arena_idx = ai; i=*++pc; goto *optable[GET_OPCODE(i)] +#define NEXT i=*++pc; goto *optable[GET_OPCODE(i)] #define JUMP i=*pc; goto *optable[GET_OPCODE(i)] #define END_DISPATCH @@ -660,6 +660,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) mrb->ensure = (struct RProc **)mrb_realloc(mrb, mrb->ensure, sizeof(struct RProc*) * mrb->esize); } mrb->ensure[mrb->ci->eidx++] = p; + mrb->arena_idx = ai; NEXT; } @@ -671,6 +672,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) for (n=0; nci->eidx); } + mrb->arena_idx = ai; NEXT; } @@ -934,6 +936,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) rest->len = m1+len+m2; } regs[a+1] = stack[m1+r+m2]; + mrb->arena_idx = ai; NEXT; } @@ -1219,6 +1222,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) case TYPES2(MRB_TT_STRING,MRB_TT_STRING): regs[a] = mrb_str_plus(mrb, regs[a], regs[a+1]); break;); + mrb->arena_idx = ai; NEXT; } @@ -1351,6 +1355,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) mrb_ary_push(mrb, ary, regs[b++]); } regs[GETARG_A(i)] = ary; + mrb->arena_idx = ai; NEXT; } @@ -1358,6 +1363,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) /* A B mrb_ary_concat(R(A),R(B)) */ mrb_ary_concat(mrb, regs[GETARG_A(i)], mrb_ary_splat(mrb, regs[GETARG_B(i)])); + mrb->arena_idx = ai; NEXT; } @@ -1429,12 +1435,14 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) } } } + mrb->arena_idx = ai; NEXT; } CASE(OP_STRING) { /* A Bx R(A) := str_new(Lit(Bx)) */ regs[GETARG_A(i)] = mrb_str_literal(mrb, pool[GETARG_Bx(i)]); + mrb->arena_idx = ai; NEXT; } @@ -1456,6 +1464,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) b+=2; } regs[GETARG_A(i)] = hash; + mrb->arena_idx = ai; NEXT; } @@ -1472,6 +1481,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) } if (c & OP_L_STRICT) p->flags |= MRB_PROC_STRICT; regs[GETARG_A(i)] = mrb_obj_value(p); + mrb->arena_idx = ai; NEXT; } @@ -1495,6 +1505,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) } c = mrb_vm_define_class(mrb, base, super, id); regs[a] = mrb_obj_value(c); + mrb->arena_idx = ai; NEXT; } @@ -1511,6 +1522,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) } c = mrb_vm_define_module(mrb, base, id); regs[a] = mrb_obj_value(c); + mrb->arena_idx = ai; NEXT; } @@ -1562,12 +1574,14 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) struct RClass *c = mrb_class_ptr(regs[a]); mrb_define_method_vm(mrb, c, syms[GETARG_B(i)], regs[a+1]); + mrb->arena_idx = ai; NEXT; } CASE(OP_SCLASS) { /* A B R(A) := R(B).singleton_class */ regs[GETARG_A(i)] = mrb_singleton_class(mrb, regs[GETARG_B(i)]); + mrb->arena_idx = ai; NEXT; } @@ -1586,6 +1600,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) /* A B C R(A) := range_new(R(B),R(B+1),C) */ int b = GETARG_B(i); regs[GETARG_A(i)] = mrb_range_new(mrb, regs[b], regs[b+1], GETARG_C(i)); + mrb->arena_idx = ai; NEXT; } -- cgit v1.2.3 From bc7dc06c51a1566c7918b1992cb546e70d78c552 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 31 Jul 2012 10:57:14 +0900 Subject: mark mrb->exc object --- src/gc.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gc.c b/src/gc.c index 29dc1d55f..9c82f858c 100644 --- a/src/gc.c +++ b/src/gc.c @@ -561,7 +561,10 @@ root_scan_phase(mrb_state *mrb) for (i=0,e=mrb->arena_idx; iarena[i]); } + /* mark class hierarchy */ mrb_gc_mark(mrb, (struct RBasic*)mrb->object_class); + /* mark exception */ + mrb_gc_mark(mrb, (struct RBasic*)mrb->exc); /* mark stack */ e = mrb->stack - mrb->stbase; if (mrb->ci) e += mrb->ci->nregs; -- cgit v1.2.3 From cc1fc5332ab0508d1e5f848e4fece3afa10606de Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Tue, 31 Jul 2012 14:52:44 +0900 Subject: Remove redundant code in mrb_array_aget(). --- src/array.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/array.c b/src/array.c index c385fe99b..804c946da 100644 --- a/src/array.c +++ b/src/array.c @@ -682,10 +682,10 @@ mrb_ary_aget(mrb_state *mrb, mrb_value self) if (mrb_type(argv[0]) != MRB_TT_FIXNUM) { mrb_raise(mrb, E_TYPE_ERROR, "expected Fixnum"); } - len = mrb_fixnum(argv[0]); if (index < 0) index += a->len; if (index < 0 || a->len < (int)index) return mrb_nil_value(); - if ((len = mrb_fixnum(argv[0])) < 0) return mrb_nil_value(); + len = mrb_fixnum(argv[0]); + if (len < 0) return mrb_nil_value(); if (a->len == (int)index) return mrb_ary_new(mrb); if ((int)len > a->len - index) len = a->len - index; return ary_subseq(mrb, a, index, len); -- cgit v1.2.3 From 0cee3bb5317a220da7c123059a2c08daec288d30 Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Tue, 31 Jul 2012 16:47:53 +0900 Subject: POOL_ALIGNMENT POOL_PAGE_SIZE : Configurable parameters. --- include/mrbconf.h | 6 ++++++ src/pool.c | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/include/mrbconf.h b/include/mrbconf.h index 3d1e1757d..20f49ec29 100644 --- a/include/mrbconf.h +++ b/include/mrbconf.h @@ -25,6 +25,12 @@ /* default size of khash table bucket */ //#define KHASH_DEFAULT_SIZE 32 +/* allocated memory address alignment */ +//#define POOL_ALIGNMENT 4 + +/* page size of memory pool */ +//#define POOL_PAGE_SIZE 16000 + /* -DDISABLE_XXXX to drop the feature */ #define DISABLE_REGEXP /* regular expression classes */ //#define DISABLE_SPRINTF /* Kernel.sprintf method */ diff --git a/src/pool.c b/src/pool.c index 36c6fa8eb..daa6d0f69 100644 --- a/src/pool.c +++ b/src/pool.c @@ -9,7 +9,7 @@ #include /* configuration section */ -/* allcated memory address should be multiple of POOL_ALLOC_ALIGN */ +/* allocated memory address should be multiple of POOL_ALIGNMENT */ /* or undef it if alignment does not matter */ #ifndef POOL_ALIGNMENT #define POOL_ALIGNMENT 4 -- cgit v1.2.3 From e064ff2098f8cf6e409b86df2d3b0da3217ff1a8 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 31 Jul 2012 19:00:52 +0900 Subject: add some benchmark programs --- benchmark/ao-render.rb | 316 +++++++++++++++++++++++++++++++++++++++++++++++ benchmark/bm_so_lists.rb | 47 +++++++ 2 files changed, 363 insertions(+) create mode 100644 benchmark/ao-render.rb create mode 100644 benchmark/bm_so_lists.rb diff --git a/benchmark/ao-render.rb b/benchmark/ao-render.rb new file mode 100644 index 000000000..eccb15e52 --- /dev/null +++ b/benchmark/ao-render.rb @@ -0,0 +1,316 @@ +# AO render benchmark +# Original program (C) Syoyo Fujita in Javascript (and other languages) +# http://lucille.atso-net.jp/blog/?p=642 +# http://lucille.atso-net.jp/blog/?p=711 +# Ruby(yarv2llvm) version by Hideki Miura +# mruby version by Hideki Miura +# + +IMAGE_WIDTH = 256 +IMAGE_HEIGHT = 256 +NSUBSAMPLES = 2 +NAO_SAMPLES = 8 + +module Rand + # Use xorshift + @@x = 123456789 + @@y = 362436069 + @@z = 521288629 + @@w = 88675123 + BNUM = 1 << 29 + BNUMF = BNUM.to_f + def self.rand + x = @@x + t = x ^ ((x & 0xfffff) << 11) + w = @@w + @@x, @@y, @@z = @@y, @@z, w + w = @@w = (w ^ (w >> 19) ^ (t ^ (t >> 8))) + (w % BNUM) / BNUMF + end +end + + +class Vec + 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 + + def vsub(b) + Vec.new(@x - b.x, @y - b.y, @z - b.z) + end + + def vcross(b) + Vec.new(@y * b.z - @z * b.y, + @z * b.x - @x * b.z, + @x * b.y - @y * b.x) + end + + def vdot(b) + r = @x * b.x + @y * b.y + @z * b.z + r + end + + def vlength + Math.sqrt(@x * @x + @y * @y + @z * @z) + end + + def vnormalize + len = vlength + v = Vec.new(@x, @y, @z) + if len > 1.0e-17 then + v.x = v.x / len + v.y = v.y / len + v.z = v.z / len + end + v + end +end + + +class Sphere + 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) + c = rs.vdot(rs) - (@radius * @radius) + d = b * b - c + if d > 0.0 then + t = - b - Math.sqrt(d) + + if t > 0.0 and t < isect.t then + isect.t = t + isect.hit = true + isect.pl = Vec.new(ray.org.x + ray.dir.x * t, + ray.org.y + ray.dir.y * t, + ray.org.z + ray.dir.z * t) + n = isect.pl.vsub(@center) + isect.n = n.vnormalize + end + end + end +end + +class Plane + def initialize(p, n) + @p = p + @n = n + end + + def intersect(ray, isect) + d = -@p.vdot(@n) + v = ray.dir.vdot(@n) + v0 = v + if v < 0.0 then + v0 = -v + end + if v0 < 1.0e-17 then + return + end + + t = -(ray.org.vdot(@n) + d) / v + + if t > 0.0 and t < isect.t then + isect.hit = true + isect.t = t + isect.n = @n + isect.pl = Vec.new(ray.org.x + t * ray.dir.x, + ray.org.y + t * ray.dir.y, + ray.org.z + t * ray.dir.z) + end + end +end + +class Ray + 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 + 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) + i = f * 255.5 + if i > 255.0 then + i = 255.0 + end + if i < 0.0 then + i = 0.0 + end + i.to_i +end + +def otherBasis(basis, n) + basis[2] = Vec.new(n.x, n.y, n.z) + basis[1] = Vec.new(0.0, 0.0, 0.0) + + if n.x < 0.6 and n.x > -0.6 then + basis[1].x = 1.0 + elsif n.y < 0.6 and n.y > -0.6 then + basis[1].y = 1.0 + elsif n.z < 0.6 and n.z > -0.6 then + basis[1].z = 1.0 + else + basis[1].x = 1.0 + end + + basis[0] = basis[1].vcross(basis[2]) + basis[0] = basis[0].vnormalize + + basis[1] = basis[2].vcross(basis[0]) + basis[1] = basis[1].vnormalize +end + +class Scene + def initialize + @spheres = Array.new + @spheres[0] = Sphere.new(Vec.new(-2.0, 0.0, -3.5), 0.5) + @spheres[1] = Sphere.new(Vec.new(-0.5, 0.0, -3.0), 0.5) + @spheres[2] = Sphere.new(Vec.new(1.0, 0.0, -2.2), 0.5) + @plane = Plane.new(Vec.new(0.0, -0.5, 0.0), Vec.new(0.0, 1.0, 0.0)) + end + + def ambient_occlusion(isect) + basis = Array.new(3) + otherBasis(basis, isect.n) + + ntheta = NAO_SAMPLES + nphi = NAO_SAMPLES + eps = 0.0001 + occlusion = 0.0 + + p0 = Vec.new(isect.pl.x + eps * isect.n.x, + isect.pl.y + eps * isect.n.y, + isect.pl.z + eps * isect.n.z) + nphi.times do |j| + ntheta.times do |i| + r = Rand::rand + phi = 2.0 * 3.14159265 * Rand::rand + x = Math.cos(phi) * Math.sqrt(1.0 - r) + y = Math.sin(phi) * Math.sqrt(1.0 - r) + z = Math.sqrt(r) + + rx = x * basis[0].x + y * basis[1].x + z * basis[2].x + ry = x * basis[0].y + y * basis[1].y + z * basis[2].y + rz = x * basis[0].z + y * basis[1].z + z * basis[2].z + + raydir = Vec.new(rx, ry, rz) + ray = Ray.new(p0, raydir) + + occisect = Isect.new + @spheres[0].intersect(ray, occisect) + @spheres[1].intersect(ray, occisect) + @spheres[2].intersect(ray, occisect) + @plane.intersect(ray, occisect) + if occisect.hit then + occlusion = occlusion + 1.0 + else + 0.0 + end + end + end + + occlusion = (ntheta.to_f * nphi.to_f - occlusion) / (ntheta.to_f * nphi.to_f) + Vec.new(occlusion, occlusion, occlusion) + end + + def render(w, h, nsubsamples) + cnt = 0 + nsf = nsubsamples.to_f + h.times do |y| + w.times do |x| + rad = Vec.new(0.0, 0.0, 0.0) + + # Subsmpling + nsubsamples.times do |v| + nsubsamples.times do |u| + cnt = cnt + 1 + wf = w.to_f + hf = h.to_f + xf = x.to_f + yf = y.to_f + uf = u.to_f + vf = v.to_f + + px = (xf + (uf / nsf) - (wf / 2.0)) / (wf / 2.0) + py = -(yf + (vf / nsf) - (hf / 2.0)) / (hf / 2.0) + + eye = Vec.new(px, py, -1.0).vnormalize + + ray = Ray.new(Vec.new(0.0, 0.0, 0.0), eye) + + isect = Isect.new + @spheres[0].intersect(ray, isect) + @spheres[1].intersect(ray, isect) + @spheres[2].intersect(ray, isect) + @plane.intersect(ray, isect) + if isect.hit then + col = ambient_occlusion(isect) + rad.x = rad.x + col.x + rad.y = rad.y + col.y + rad.z = rad.z + col.z + else + 0.0 + end + end + end + + 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)) + end + end + end +end + +# File.open("ao.ppm", "w") do |fp| + printf("P6\n") + printf("%d %d\n", IMAGE_WIDTH, IMAGE_HEIGHT) + printf("255\n", IMAGE_WIDTH, IMAGE_HEIGHT) + Scene.new.render(IMAGE_WIDTH, IMAGE_HEIGHT, NSUBSAMPLES) +# Scene.new.render(256, 256, 2) +# end diff --git a/benchmark/bm_so_lists.rb b/benchmark/bm_so_lists.rb new file mode 100644 index 000000000..f8d26797a --- /dev/null +++ b/benchmark/bm_so_lists.rb @@ -0,0 +1,47 @@ +#from http://www.bagley.org/~doug/shootout/bench/lists/lists.ruby + +NUM = 300 +SIZE = 10000 + +def test_lists() + # create a list of integers (Li1) from 1 to SIZE + li1 = (1..SIZE).to_a + # copy the list to li2 (not by individual items) + li2 = li1.dup + # remove each individual item from left side of li2 and + # append to right side of li3 (preserving order) + li3 = Array.new + while (not li2.empty?) + li3.push(li2.shift) + end + # li2 must now be empty + # remove each individual item from right side of li3 and + # append to right side of li2 (reversing list) + while (not li3.empty?) + li2.push(li3.pop) + end + # li3 must now be empty + # reverse li1 in place + li1.reverse! + # check that first item is now SIZE + if li1[0] != SIZE then + p "not SIZE" + 0 + else + # compare li1 and li2 for equality + if li1 != li2 then + return(0) + else + # return the length of the list + li1.length + end + end +end + +i = 0 +while i Date: Tue, 31 Jul 2012 19:34:52 +0900 Subject: space and newline reformatting --- benchmark/ao-render.rb | 631 ++++++++++++++++++++++++------------------------- 1 file changed, 315 insertions(+), 316 deletions(-) diff --git a/benchmark/ao-render.rb b/benchmark/ao-render.rb index eccb15e52..793804a7b 100644 --- a/benchmark/ao-render.rb +++ b/benchmark/ao-render.rb @@ -1,316 +1,315 @@ -# AO render benchmark -# Original program (C) Syoyo Fujita in Javascript (and other languages) -# http://lucille.atso-net.jp/blog/?p=642 -# http://lucille.atso-net.jp/blog/?p=711 -# Ruby(yarv2llvm) version by Hideki Miura -# mruby version by Hideki Miura -# - -IMAGE_WIDTH = 256 -IMAGE_HEIGHT = 256 -NSUBSAMPLES = 2 -NAO_SAMPLES = 8 - -module Rand - # Use xorshift - @@x = 123456789 - @@y = 362436069 - @@z = 521288629 - @@w = 88675123 - BNUM = 1 << 29 - BNUMF = BNUM.to_f - def self.rand - x = @@x - t = x ^ ((x & 0xfffff) << 11) - w = @@w - @@x, @@y, @@z = @@y, @@z, w - w = @@w = (w ^ (w >> 19) ^ (t ^ (t >> 8))) - (w % BNUM) / BNUMF - end -end - - -class Vec - 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 - - def vsub(b) - Vec.new(@x - b.x, @y - b.y, @z - b.z) - end - - def vcross(b) - Vec.new(@y * b.z - @z * b.y, - @z * b.x - @x * b.z, - @x * b.y - @y * b.x) - end - - def vdot(b) - r = @x * b.x + @y * b.y + @z * b.z - r - end - - def vlength - Math.sqrt(@x * @x + @y * @y + @z * @z) - end - - def vnormalize - len = vlength - v = Vec.new(@x, @y, @z) - if len > 1.0e-17 then - v.x = v.x / len - v.y = v.y / len - v.z = v.z / len - end - v - end -end - - -class Sphere - 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) - c = rs.vdot(rs) - (@radius * @radius) - d = b * b - c - if d > 0.0 then - t = - b - Math.sqrt(d) - - if t > 0.0 and t < isect.t then - isect.t = t - isect.hit = true - isect.pl = Vec.new(ray.org.x + ray.dir.x * t, - ray.org.y + ray.dir.y * t, - ray.org.z + ray.dir.z * t) - n = isect.pl.vsub(@center) - isect.n = n.vnormalize - end - end - end -end - -class Plane - def initialize(p, n) - @p = p - @n = n - end - - def intersect(ray, isect) - d = -@p.vdot(@n) - v = ray.dir.vdot(@n) - v0 = v - if v < 0.0 then - v0 = -v - end - if v0 < 1.0e-17 then - return - end - - t = -(ray.org.vdot(@n) + d) / v - - if t > 0.0 and t < isect.t then - isect.hit = true - isect.t = t - isect.n = @n - isect.pl = Vec.new(ray.org.x + t * ray.dir.x, - ray.org.y + t * ray.dir.y, - ray.org.z + t * ray.dir.z) - end - end -end - -class Ray - 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 - 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) - i = f * 255.5 - if i > 255.0 then - i = 255.0 - end - if i < 0.0 then - i = 0.0 - end - i.to_i -end - -def otherBasis(basis, n) - basis[2] = Vec.new(n.x, n.y, n.z) - basis[1] = Vec.new(0.0, 0.0, 0.0) - - if n.x < 0.6 and n.x > -0.6 then - basis[1].x = 1.0 - elsif n.y < 0.6 and n.y > -0.6 then - basis[1].y = 1.0 - elsif n.z < 0.6 and n.z > -0.6 then - basis[1].z = 1.0 - else - basis[1].x = 1.0 - end - - basis[0] = basis[1].vcross(basis[2]) - basis[0] = basis[0].vnormalize - - basis[1] = basis[2].vcross(basis[0]) - basis[1] = basis[1].vnormalize -end - -class Scene - def initialize - @spheres = Array.new - @spheres[0] = Sphere.new(Vec.new(-2.0, 0.0, -3.5), 0.5) - @spheres[1] = Sphere.new(Vec.new(-0.5, 0.0, -3.0), 0.5) - @spheres[2] = Sphere.new(Vec.new(1.0, 0.0, -2.2), 0.5) - @plane = Plane.new(Vec.new(0.0, -0.5, 0.0), Vec.new(0.0, 1.0, 0.0)) - end - - def ambient_occlusion(isect) - basis = Array.new(3) - otherBasis(basis, isect.n) - - ntheta = NAO_SAMPLES - nphi = NAO_SAMPLES - eps = 0.0001 - occlusion = 0.0 - - p0 = Vec.new(isect.pl.x + eps * isect.n.x, - isect.pl.y + eps * isect.n.y, - isect.pl.z + eps * isect.n.z) - nphi.times do |j| - ntheta.times do |i| - r = Rand::rand - phi = 2.0 * 3.14159265 * Rand::rand - x = Math.cos(phi) * Math.sqrt(1.0 - r) - y = Math.sin(phi) * Math.sqrt(1.0 - r) - z = Math.sqrt(r) - - rx = x * basis[0].x + y * basis[1].x + z * basis[2].x - ry = x * basis[0].y + y * basis[1].y + z * basis[2].y - rz = x * basis[0].z + y * basis[1].z + z * basis[2].z - - raydir = Vec.new(rx, ry, rz) - ray = Ray.new(p0, raydir) - - occisect = Isect.new - @spheres[0].intersect(ray, occisect) - @spheres[1].intersect(ray, occisect) - @spheres[2].intersect(ray, occisect) - @plane.intersect(ray, occisect) - if occisect.hit then - occlusion = occlusion + 1.0 - else - 0.0 - end - end - end - - occlusion = (ntheta.to_f * nphi.to_f - occlusion) / (ntheta.to_f * nphi.to_f) - Vec.new(occlusion, occlusion, occlusion) - end - - def render(w, h, nsubsamples) - cnt = 0 - nsf = nsubsamples.to_f - h.times do |y| - w.times do |x| - rad = Vec.new(0.0, 0.0, 0.0) - - # Subsmpling - nsubsamples.times do |v| - nsubsamples.times do |u| - cnt = cnt + 1 - wf = w.to_f - hf = h.to_f - xf = x.to_f - yf = y.to_f - uf = u.to_f - vf = v.to_f - - px = (xf + (uf / nsf) - (wf / 2.0)) / (wf / 2.0) - py = -(yf + (vf / nsf) - (hf / 2.0)) / (hf / 2.0) - - eye = Vec.new(px, py, -1.0).vnormalize - - ray = Ray.new(Vec.new(0.0, 0.0, 0.0), eye) - - isect = Isect.new - @spheres[0].intersect(ray, isect) - @spheres[1].intersect(ray, isect) - @spheres[2].intersect(ray, isect) - @plane.intersect(ray, isect) - if isect.hit then - col = ambient_occlusion(isect) - rad.x = rad.x + col.x - rad.y = rad.y + col.y - rad.z = rad.z + col.z - else - 0.0 - end - end - end - - 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)) - end - end - end -end - -# File.open("ao.ppm", "w") do |fp| - printf("P6\n") - printf("%d %d\n", IMAGE_WIDTH, IMAGE_HEIGHT) - printf("255\n", IMAGE_WIDTH, IMAGE_HEIGHT) - Scene.new.render(IMAGE_WIDTH, IMAGE_HEIGHT, NSUBSAMPLES) -# Scene.new.render(256, 256, 2) -# end +# AO render benchmark +# Original program (C) Syoyo Fujita in Javascript (and other languages) +# http://lucille.atso-net.jp/blog/?p=642 +# http://lucille.atso-net.jp/blog/?p=711 +# Ruby(yarv2llvm) version by Hideki Miura +# mruby version by Hideki Miura +# + +IMAGE_WIDTH = 256 +IMAGE_HEIGHT = 256 +NSUBSAMPLES = 2 +NAO_SAMPLES = 8 + +module Rand + # Use xorshift + @@x = 123456789 + @@y = 362436069 + @@z = 521288629 + @@w = 88675123 + BNUM = 1 << 29 + BNUMF = BNUM.to_f + def self.rand + x = @@x + t = x ^ ((x & 0xfffff) << 11) + w = @@w + @@x, @@y, @@z = @@y, @@z, w + w = @@w = (w ^ (w >> 19) ^ (t ^ (t >> 8))) + (w % BNUM) / BNUMF + end +end + +class Vec + 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 + + def vsub(b) + Vec.new(@x - b.x, @y - b.y, @z - b.z) + end + + def vcross(b) + Vec.new(@y * b.z - @z * b.y, + @z * b.x - @x * b.z, + @x * b.y - @y * b.x) + end + + def vdot(b) + r = @x * b.x + @y * b.y + @z * b.z + r + end + + def vlength + Math.sqrt(@x * @x + @y * @y + @z * @z) + end + + def vnormalize + len = vlength + v = Vec.new(@x, @y, @z) + if len > 1.0e-17 then + v.x = v.x / len + v.y = v.y / len + v.z = v.z / len + end + v + end +end + + +class Sphere + 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) + c = rs.vdot(rs) - (@radius * @radius) + d = b * b - c + if d > 0.0 then + t = - b - Math.sqrt(d) + + if t > 0.0 and t < isect.t then + isect.t = t + isect.hit = true + isect.pl = Vec.new(ray.org.x + ray.dir.x * t, + ray.org.y + ray.dir.y * t, + ray.org.z + ray.dir.z * t) + n = isect.pl.vsub(@center) + isect.n = n.vnormalize + end + end + end +end + +class Plane + def initialize(p, n) + @p = p + @n = n + end + + def intersect(ray, isect) + d = -@p.vdot(@n) + v = ray.dir.vdot(@n) + v0 = v + if v < 0.0 then + v0 = -v + end + if v0 < 1.0e-17 then + return + end + + t = -(ray.org.vdot(@n) + d) / v + + if t > 0.0 and t < isect.t then + isect.hit = true + isect.t = t + isect.n = @n + isect.pl = Vec.new(ray.org.x + t * ray.dir.x, + ray.org.y + t * ray.dir.y, + ray.org.z + t * ray.dir.z) + end + end +end + +class Ray + 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 + 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) + i = f * 255.5 + if i > 255.0 then + i = 255.0 + end + if i < 0.0 then + i = 0.0 + end + i.to_i +end + +def otherBasis(basis, n) + basis[2] = Vec.new(n.x, n.y, n.z) + basis[1] = Vec.new(0.0, 0.0, 0.0) + + if n.x < 0.6 and n.x > -0.6 then + basis[1].x = 1.0 + elsif n.y < 0.6 and n.y > -0.6 then + basis[1].y = 1.0 + elsif n.z < 0.6 and n.z > -0.6 then + basis[1].z = 1.0 + else + basis[1].x = 1.0 + end + + basis[0] = basis[1].vcross(basis[2]) + basis[0] = basis[0].vnormalize + + basis[1] = basis[2].vcross(basis[0]) + basis[1] = basis[1].vnormalize +end + +class Scene + def initialize + @spheres = Array.new + @spheres[0] = Sphere.new(Vec.new(-2.0, 0.0, -3.5), 0.5) + @spheres[1] = Sphere.new(Vec.new(-0.5, 0.0, -3.0), 0.5) + @spheres[2] = Sphere.new(Vec.new(1.0, 0.0, -2.2), 0.5) + @plane = Plane.new(Vec.new(0.0, -0.5, 0.0), Vec.new(0.0, 1.0, 0.0)) + end + + def ambient_occlusion(isect) + basis = Array.new(3) + otherBasis(basis, isect.n) + + ntheta = NAO_SAMPLES + nphi = NAO_SAMPLES + eps = 0.0001 + occlusion = 0.0 + + p0 = Vec.new(isect.pl.x + eps * isect.n.x, + isect.pl.y + eps * isect.n.y, + isect.pl.z + eps * isect.n.z) + nphi.times do |j| + ntheta.times do |i| + r = Rand::rand + phi = 2.0 * 3.14159265 * Rand::rand + x = Math.cos(phi) * Math.sqrt(1.0 - r) + y = Math.sin(phi) * Math.sqrt(1.0 - r) + z = Math.sqrt(r) + + rx = x * basis[0].x + y * basis[1].x + z * basis[2].x + ry = x * basis[0].y + y * basis[1].y + z * basis[2].y + rz = x * basis[0].z + y * basis[1].z + z * basis[2].z + + raydir = Vec.new(rx, ry, rz) + ray = Ray.new(p0, raydir) + + occisect = Isect.new + @spheres[0].intersect(ray, occisect) + @spheres[1].intersect(ray, occisect) + @spheres[2].intersect(ray, occisect) + @plane.intersect(ray, occisect) + if occisect.hit then + occlusion = occlusion + 1.0 + else + 0.0 + end + end + end + + occlusion = (ntheta.to_f * nphi.to_f - occlusion) / (ntheta.to_f * nphi.to_f) + Vec.new(occlusion, occlusion, occlusion) + end + + def render(w, h, nsubsamples) + cnt = 0 + nsf = nsubsamples.to_f + h.times do |y| + w.times do |x| + rad = Vec.new(0.0, 0.0, 0.0) + + # Subsmpling + nsubsamples.times do |v| + nsubsamples.times do |u| + cnt = cnt + 1 + wf = w.to_f + hf = h.to_f + xf = x.to_f + yf = y.to_f + uf = u.to_f + vf = v.to_f + + px = (xf + (uf / nsf) - (wf / 2.0)) / (wf / 2.0) + py = -(yf + (vf / nsf) - (hf / 2.0)) / (hf / 2.0) + + eye = Vec.new(px, py, -1.0).vnormalize + + ray = Ray.new(Vec.new(0.0, 0.0, 0.0), eye) + + isect = Isect.new + @spheres[0].intersect(ray, isect) + @spheres[1].intersect(ray, isect) + @spheres[2].intersect(ray, isect) + @plane.intersect(ray, isect) + if isect.hit then + col = ambient_occlusion(isect) + rad.x = rad.x + col.x + rad.y = rad.y + col.y + rad.z = rad.z + col.z + else + 0.0 + end + end + end + + 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)) + end + end + end +end + +# File.open("ao.ppm", "w") do |fp| + printf("P6\n") + printf("%d %d\n", IMAGE_WIDTH, IMAGE_HEIGHT) + printf("255\n", IMAGE_WIDTH, IMAGE_HEIGHT) + Scene.new.render(IMAGE_WIDTH, IMAGE_HEIGHT, NSUBSAMPLES) +# Scene.new.render(256, 256, 2) +# end -- cgit v1.2.3 From e87c95eba786b91c71f1c3ae8944c9b2e19f8711 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 31 Jul 2012 22:21:42 +0900 Subject: codegen optimization based on http://d.hatena.ne.jp/mirichi/20120730/p1 [Japanese]. --- src/codegen.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/codegen.c b/src/codegen.c index 2e8104fdd..b944f348e 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -1027,13 +1027,14 @@ codegen(codegen_scope *s, node *tree, int val) struct loopinfo *lp = loop_push(s, LOOP_NORMAL); lp->pc1 = new_label(s); - codegen(s, tree->car, VAL); - pop(); + genop(s, MKOP_sBx(OP_JMP, 0)); lp->pc2 = new_label(s); - genop(s, MKOP_AsBx(OP_JMPNOT, cursp(), 0)); codegen(s, tree->cdr, NOVAL); - genop(s, MKOP_sBx(OP_JMP, lp->pc1 - s->pc)); - dispatch(s, lp->pc2); + dispatch(s, lp->pc1); + codegen(s, tree->car, VAL); + pop(); + genop(s, MKOP_AsBx(OP_JMPIF, cursp(), lp->pc2 - s->pc)); + loop_pop(s, val); } break; @@ -1043,13 +1044,14 @@ codegen(codegen_scope *s, node *tree, int val) struct loopinfo *lp = loop_push(s, LOOP_NORMAL); lp->pc1 = new_label(s); - codegen(s, tree->car, VAL); - pop(); + genop(s, MKOP_sBx(OP_JMP, 0)); lp->pc2 = new_label(s); - genop(s, MKOP_AsBx(OP_JMPIF, cursp(), 0)); codegen(s, tree->cdr, NOVAL); - genop(s, MKOP_sBx(OP_JMP, lp->pc1 - s->pc)); - dispatch(s, lp->pc2); + dispatch(s, lp->pc1); + codegen(s, tree->car, VAL); + pop(); + genop(s, MKOP_AsBx(OP_JMPNOT, cursp(), lp->pc2 - s->pc)); + loop_pop(s, val); } break; -- cgit v1.2.3 From 1d64ecf0fafc940b4523ee44355840104d2f56fb Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 31 Jul 2012 23:56:35 +0900 Subject: float do not have enough precision if MRB_USE_FLOAT is set --- src/time.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/time.c b/src/time.c index e71fc17fe..96a3309e4 100644 --- a/src/time.c +++ b/src/time.c @@ -160,7 +160,7 @@ mrb_time_wrap(mrb_state *mrb, struct RClass *tc, struct mrb_time *tm) /* Allocates a mrb_time object and initializes it. */ static struct mrb_time* -mrb_time_alloc(mrb_state *mrb, mrb_float sec, mrb_float usec, enum mrb_timezone timezone) +mrb_time_alloc(mrb_state *mrb, double sec, double usec, enum mrb_timezone timezone) { struct mrb_time *tm; @@ -182,7 +182,7 @@ mrb_time_alloc(mrb_state *mrb, mrb_float sec, mrb_float usec, enum mrb_timezone } static mrb_value -mrb_time_make(mrb_state *mrb, struct RClass *c, mrb_float sec, mrb_float usec, enum mrb_timezone timezone) +mrb_time_make(mrb_state *mrb, struct RClass *c, double sec, double usec, enum mrb_timezone timezone) { return mrb_time_wrap(mrb, c, mrb_time_alloc(mrb, sec, usec, timezone)); } -- cgit v1.2.3 From 1563cdfcce7764f47dc8a536ab97368315e15e86 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 1 Aug 2012 00:06:50 +0900 Subject: float do not have enough precision to represent Fixnum if MRB_USE_FLOAT is set --- src/codegen.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/codegen.c b/src/codegen.c index b944f348e..cfb52ceed 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -806,11 +806,11 @@ raise_error(codegen_scope *s, const char *msg) genop(s, MKOP_ABx(OP_ERR, 0, idx)); } -static mrb_float +static double readint_float(codegen_scope *s, const char *p, int base) { const char *e = p + strlen(p); - mrb_float f = 0; + double f = 0; int n; if (*p == '+') p++; @@ -1589,7 +1589,7 @@ codegen(codegen_scope *s, node *tree, int val) if (val) { char *p = (char*)tree->car; int base = (intptr_t)tree->cdr->car; - mrb_float f; + double f; mrb_int i; mrb_code co; -- cgit v1.2.3 From 0270d11c81c28a5616eebd64d10be5133de4d7a0 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 1 Aug 2012 00:45:12 +0900 Subject: float do not have enough precision to round if MRB_USE_FLOAT is set --- src/numeric.c | 27 ++++++++++++++------------- test/t/float.rb | 34 +++++++++++++++++----------------- 2 files changed, 31 insertions(+), 30 deletions(-) diff --git a/src/numeric.c b/src/numeric.c index d294597ee..012e69741 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -195,7 +195,11 @@ flo_to_s(mrb_state *mrb, mrb_value flt) } else if(isnan(value)) return mrb_str_new(mrb, "NaN", 3); +#ifdef MRB_USE_FLOAT + n = sprintf(buf, "%.7g", value); +#else n = sprintf(buf, "%.14g", value); +#endif assert(n >= 0); return mrb_str_new(mrb, buf, n); } @@ -511,21 +515,13 @@ flo_ceil(mrb_state *mrb, mrb_value num) */ static mrb_value -flo_round(mrb_state *mrb, /*int argc, mrb_value *argv,*/ mrb_value num) +flo_round(mrb_state *mrb, mrb_value num) { - mrb_value nd; - mrb_float number, f; + double number, f; int ndigits = 0, i; - mrb_value *argv; - int argc; - - mrb_get_args(mrb, "*", &argv, &argc); - if (argc == 1) { - nd = argv[0]; - ndigits = mrb_fixnum(nd); - } - number = mrb_float(num); + mrb_get_args(mrb, "|i", &ndigits); + number = mrb_float(num); f = 1.0; i = abs(ndigits); while (--i >= 0) @@ -535,7 +531,7 @@ flo_round(mrb_state *mrb, /*int argc, mrb_value *argv,*/ mrb_value num) if (ndigits < 0) number = 0; } else { - mrb_float d; + double d; if (ndigits < 0) number /= f; else number *= f; @@ -554,6 +550,11 @@ flo_round(mrb_state *mrb, /*int argc, mrb_value *argv,*/ mrb_value num) else number /= f; } + { + mrb_value ff = mrb_float_value(number); + + printf("%f.round(%d) = %f\n", mrb_float(num), ndigits, mrb_float(ff)); + } if (ndigits > 0) return mrb_float_value(number); return mrb_fixnum_value((mrb_int)number); } diff --git a/test/t/float.rb b/test/t/float.rb index 30b470272..e2c139c03 100644 --- a/test/t/float.rb +++ b/test/t/float.rb @@ -26,11 +26,11 @@ assert('Float#-', '15.2.9.3.2') do end assert('Float#*', '15.2.9.3.3') do - a = 3.123456789 * 3.123456789 - b = 3.123456789 * 1 + a = 3.125 * 3.125 + b = 3.125 * 1 - check_float(a, 9.75598231275019) and - check_float(b, 3.123456789) + check_float(a, 9.765625) and + check_float(b, 3.125) end assert('Float#/', '15.2.9.3.4') do @@ -42,19 +42,19 @@ assert('Float#/', '15.2.9.3.4') do end assert('Float#%', '15.2.9.3.5') do - a = 3.123456789 % 3.123456789 - b = 3.123456789 % 1 + a = 3.125 % 3.125 + b = 3.125 % 1 check_float(a, 0.0) and - check_float(b, 0.123456789) + check_float(b, 0.125) end assert('Float#<=>', '15.2.9.3.6') do - a = 3.123456789 <=> 3.123456788 - b = 3.123456789 <=> 3.123456789 - c = 3.123456789 <=> 3.123456790 - a2 = 3.123456789 <=> 3 - c2 = 3.123456789 <=> 4 + a = 3.125 <=> 3.123 + b = 3.125 <=> 3.125 + c = 3.125 <=> 3.126 + a2 = 3.125 <=> 3 + c2 = 3.125 <=> 4 a == 1 and b == 0 and c == -1 and a2 == 1 and c2 == -1 @@ -96,16 +96,16 @@ end assert('Float#round', '15.2.9.3.12') do a = 3.123456789.round b = 3.5.round - c = 3.499999999.round + c = 3.4999.round d = (-3.123456789).round e = (-3.5).round f = 12345.67.round(-1) - g = 3.123456789.round(0) - h = 3.123456789.round(1) - i = 3.123456789.round(4) + g = 3.423456789.round(0) + h = 3.423456789.round(1) + i = 3.423456789.round(3) a == 3 and b == 4 and c == 3 and d == -3 and e == -4 and - f == 12350 and g == 3 and h == 3.1 and i == 3.1235 + f == 12350 and g == 3 and h == 3.4 and i == 3.423 end assert('Float#to_f', '15.2.9.3.13') do -- cgit v1.2.3 From d6bd191cc4ad98488b954b16cb6d9a872106186b Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 1 Aug 2012 00:46:27 +0900 Subject: remove stupid debug print --- src/numeric.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/numeric.c b/src/numeric.c index 012e69741..8280921c7 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -549,12 +549,6 @@ flo_round(mrb_state *mrb, mrb_value num) if (ndigits < 0) number *= f; else number /= f; } - - { - mrb_value ff = mrb_float_value(number); - - printf("%f.round(%d) = %f\n", mrb_float(num), ndigits, mrb_float(ff)); - } if (ndigits > 0) return mrb_float_value(number); return mrb_fixnum_value((mrb_int)number); } -- cgit v1.2.3 From cde3c35666c0617bfcc705aa83b7a679ec83569c Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 1 Aug 2012 01:11:16 +0900 Subject: too much peephole optimization --- src/codegen.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/codegen.c b/src/codegen.c index cfb52ceed..69ad744fd 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -188,7 +188,6 @@ genop_peep(codegen_scope *s, mrb_code i, int val) case OP_GETSPECIAL: case OP_LOADL: case OP_STRING: - case OP_GETMCNST: if (GETARG_B(i) == GETARG_A(i0) && GETARG_A(i0) >= s->nlocals) { s->iseq[s->pc-1] = MKOP_ABx(c0, GETARG_A(i), GETARG_Bx(i0)); return; -- cgit v1.2.3 From 34cf05679c5ce9ee40be6bd4ccace0ec94fcebdf Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 1 Aug 2012 01:12:09 +0900 Subject: add Math::TOLERANCE --- src/math.c | 28 +++++++++++++++++----------- test/assert.rb | 3 +-- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/math.c b/src/math.c index 519d4f37b..fe10848c3 100644 --- a/src/math.c +++ b/src/math.c @@ -634,18 +634,24 @@ mrb_init_math(mrb_state *mrb) struct RClass *mrb_math; mrb_math = mrb_define_module(mrb, "Math"); - #ifdef M_PI - mrb_define_const(mrb, mrb_math, "PI", mrb_float_value(M_PI)); - #else - mrb_define_const(mrb, mrb_math, "PI", mrb_float_value(atan(1.0)*4.0)); - #endif - - #ifdef M_E - mrb_define_const(mrb, mrb_math, "E", mrb_float_value(M_E)); - #else - mrb_define_const(mrb, mrb_math, "E", mrb_float_value(exp(1.0))); - #endif +#ifdef M_PI + mrb_define_const(mrb, mrb_math, "PI", mrb_float_value(M_PI)); +#else + mrb_define_const(mrb, mrb_math, "PI", mrb_float_value(atan(1.0)*4.0)); +#endif +#ifdef M_E + mrb_define_const(mrb, mrb_math, "E", mrb_float_value(M_E)); +#else + mrb_define_const(mrb, mrb_math, "E", mrb_float_value(exp(1.0))); +#endif + +#ifdef MRB_USE_FLOAT + mrb_define_const(mrb, mrb_math, "TOLERANCE", mrb_float_value(1e-6)); +#else + mrb_define_const(mrb, mrb_math, "TOLERANCE", mrb_float_value(1e-12)); +#endif + mrb_define_module_function(mrb, mrb_math, "sin", math_sin, ARGS_REQ(1)); mrb_define_module_function(mrb, mrb_math, "cos", math_cos, ARGS_REQ(1)); mrb_define_module_function(mrb, mrb_math, "tan", math_tan, ARGS_REQ(1)); diff --git a/test/assert.rb b/test/assert.rb index 9329638c9..89e820a00 100644 --- a/test/assert.rb +++ b/test/assert.rb @@ -81,7 +81,7 @@ end # Performs fuzzy check for equality on methods returning floats # on the basis of the Math::TOLERANCE constant. def check_float(a, b) - tolerance = 1e-12 + tolerance = Math::TOLERANCE a = a.to_f b = b.to_f if a.finite? and b.finite? @@ -90,4 +90,3 @@ def check_float(a, b) true end end - -- cgit v1.2.3 From 883b97ab05ac8e509ff575c0c8533066f7e900c7 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 1 Aug 2012 01:23:34 +0900 Subject: some test requires double precision --- src/math.c | 2 +- test/t/math.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/math.c b/src/math.c index fe10848c3..9aae87acd 100644 --- a/src/math.c +++ b/src/math.c @@ -647,7 +647,7 @@ mrb_init_math(mrb_state *mrb) #endif #ifdef MRB_USE_FLOAT - mrb_define_const(mrb, mrb_math, "TOLERANCE", mrb_float_value(1e-6)); + mrb_define_const(mrb, mrb_math, "TOLERANCE", mrb_float_value(1e-5)); #else mrb_define_const(mrb, mrb_math, "TOLERANCE", mrb_float_value(1e-12)); #endif diff --git a/test/t/math.rb b/test/t/math.rb index 025551b82..d71e44fc9 100644 --- a/test/t/math.rb +++ b/test/t/math.rb @@ -12,7 +12,7 @@ if Object.const_defined?(:Math) assert('Fundamental trig identities') do result = true - N = 15 + N = 13 N.times do |i| a = Math::PI / N * i ca = Math::PI / 2 - a -- cgit v1.2.3 From 1a541208697a80cdff52c7dbd0b0fc1e0a754b90 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 1 Aug 2012 01:56:37 +0900 Subject: add cast to pacify optimizer --- src/time.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/time.c b/src/time.c index 96a3309e4..272402bd7 100644 --- a/src/time.c +++ b/src/time.c @@ -348,7 +348,7 @@ mrb_time_plus(mrb_state *mrb, mrb_value self) mrb_get_args(mrb, "f", &f); tm = (struct mrb_time *)mrb_get_datatype(mrb, self, &mrb_time_type); if (!tm) return mrb_nil_value(); - return mrb_time_make(mrb, mrb_obj_class(mrb, self), tm->sec+f, tm->usec, tm->timezone); + return mrb_time_make(mrb, mrb_obj_class(mrb, self), (double)tm->sec+f, tm->usec, tm->timezone); } static mrb_value @@ -370,7 +370,7 @@ mrb_time_minus(mrb_state *mrb, mrb_value self) } else { mrb_get_args(mrb, "f", &f); - return mrb_time_make(mrb, mrb_obj_class(mrb, self), tm->sec-f, tm->usec, tm->timezone); + return mrb_time_make(mrb, mrb_obj_class(mrb, self), (double)tm->sec-f, tm->usec, tm->timezone); } } -- cgit v1.2.3 From 0220953efe0c4dba5ce4af5057faa2d56fda6553 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 1 Aug 2012 02:33:55 +0900 Subject: no OP_LOADNIL for operators (OP_ADD, etc) --- src/codegen.c | 28 ++++++++++++++++------------ src/vm.c | 4 ++++ 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/codegen.c b/src/codegen.c index 69ad744fd..5cfd6d3f2 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -606,7 +606,7 @@ gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val) { mrb_sym sym = name ? name : (mrb_sym)tree->cdr->car; int idx; - int n = 0, noop = 0, sendv = 0; + int n = 0, noop = 0, sendv = 0, blk = 0; codegen(s, tree->car, VAL); /* receiver */ idx = new_msym(s, sym); @@ -636,40 +636,44 @@ gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val) pop(); } else { - genop(s, MKOP_A(OP_LOADNIL, cursp())); + blk = cursp(); } pop_n(n+1); { - const char *name = mrb_sym2name(s->mrb, sym); + int len; + const char *name = mrb_sym2name_len(s->mrb, sym, &len); - if (!noop && name[0] == '+' && name[1] == '\0') { + if (!noop && len == 1 && name[0] == '+') { genop(s, MKOP_ABC(OP_ADD, cursp(), idx, n)); } - else if (!noop && name[0] == '-' && name[1] == '\0') { + else if (!noop && len == 1 && name[0] == '-') { genop(s, MKOP_ABC(OP_SUB, cursp(), idx, n)); } - else if (!noop && name[0] == '*' && name[1] == '\0') { + else if (!noop && len == 1 && name[0] == '*') { genop(s, MKOP_ABC(OP_MUL, cursp(), idx, n)); } - else if (!noop && name[0] == '/' && name[1] == '\0') { + else if (!noop && len == 1 && name[0] == '/') { genop(s, MKOP_ABC(OP_DIV, cursp(), idx, n)); } - else if (!noop && name[0] == '<' && name[1] == '\0') { + else if (!noop && len == 1 && name[0] == '<') { genop(s, MKOP_ABC(OP_LT, cursp(), idx, n)); } - else if (!noop && name[0] == '<' && name[1] == '=' && name[2] == '\0') { + else if (!noop && len == 2 && name[0] == '<' && name[1] == '=') { genop(s, MKOP_ABC(OP_LE, cursp(), idx, n)); } - else if (!noop && name[0] == '>' && name[1] == '\0') { + else if (!noop && len == 1 && name[0] == '>') { genop(s, MKOP_ABC(OP_GT, cursp(), idx, n)); } - else if (!noop && name[0] == '>' && name[1] == '=' && name[2] == '\0') { + else if (!noop && len == 2 && name[0] == '>' && name[1] == '=') { genop(s, MKOP_ABC(OP_GE, cursp(), idx, n)); } - else if (!noop && name[0] == '=' && name[1] == '=' && name[2] == '\0') { + else if (!noop && len == 2 && name[0] == '=' && name[1] == '=') { genop(s, MKOP_ABC(OP_EQ, cursp(), idx, n)); } else { + if (blk > 0) { /* no block */ + genop(s, MKOP_A(OP_LOADNIL, blk)); + } if (sendv) n = CALL_MAXARGS; genop(s, MKOP_ABC(OP_SEND, cursp(), idx, n)); } diff --git a/src/vm.c b/src/vm.c index b646ced77..3e7dd2084 100644 --- a/src/vm.c +++ b/src/vm.c @@ -1211,6 +1211,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) break;\ s\ default:\ + SET_NIL_VALUE(regs[a+2]);\ i = MKOP_ABC(OP_SEND, a, GETARG_B(i), GETARG_C(i));\ goto L_SEND;\ }\ @@ -1257,6 +1258,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) regs[a].value.f += GETARG_C(i); break; default: + SET_NIL_VALUE(regs[a+2]); SET_INT_VALUE(regs[a+1], GETARG_C(i)); i = MKOP_ABC(OP_SEND, a, GETARG_B(i), 1); goto L_SEND; @@ -1277,6 +1279,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) regs[a].value.f -= GETARG_C(i); break; default: + SET_NIL_VALUE(regs[a+2]); SET_INT_VALUE(regs[a+1], GETARG_C(i)); i = MKOP_ABC(OP_SEND, a, GETARG_B(i), 1); goto L_SEND; @@ -1310,6 +1313,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) OP_CMP_BODY(op,f,f);\ break;\ default:\ + SET_NIL_VALUE(regs[a+2]);\ i = MKOP_ABC(OP_SEND, a, GETARG_B(i), GETARG_C(i));\ goto L_SEND;\ }\ -- cgit v1.2.3 From 7511508a64250af30fdad4b7e342bb703e7af6c9 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 1 Aug 2012 12:54:57 +0900 Subject: restore arena index after funcall --- src/vm.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vm.c b/src/vm.c index 3e7dd2084..2a13f0ea4 100644 --- a/src/vm.c +++ b/src/vm.c @@ -219,7 +219,9 @@ mrb_funcall_with_block(mrb_state *mrb, mrb_value self, const char *name, int arg mrb->stack[argc+1] = blk; if (MRB_PROC_CFUNC_P(p)) { + int ai = mrb->arena_idx; val = p->body.func(mrb, self); + mrb->arena_idx = ai; mrb->stack = mrb->stbase + ci->stackidx; cipop(mrb); } -- cgit v1.2.3 From d271bf0aa6e44a315802cf4246f5b92552be010a Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 1 Aug 2012 13:15:02 +0900 Subject: make mrb_funcall_argv and mrb_funcall_with_block to take mrb_sym as a method name --- include/mruby.h | 4 ++-- src/class.c | 36 ++++++++++++++++++++++++------------ src/error.c | 17 ++++++++++------- src/kernel.c | 2 +- src/re.c | 2 +- src/variable.c | 4 ++-- src/vm.c | 10 ++++++---- 7 files changed, 46 insertions(+), 29 deletions(-) diff --git a/include/mruby.h b/include/mruby.h index 6fcda4d35..451b4eb8b 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -330,8 +330,8 @@ struct RClass * mrb_define_module_under(mrb_state *mrb, struct RClass *outer, co int mrb_get_args(mrb_state *mrb, const char *format, ...); mrb_value mrb_funcall(mrb_state*, mrb_value, const char*, int,...); -mrb_value mrb_funcall_argv(mrb_state*, mrb_value, const char*, int, mrb_value*); -mrb_value mrb_funcall_with_block(mrb_state*, mrb_value, const char*, int, mrb_value*, mrb_value); +mrb_value mrb_funcall_argv(mrb_state*, mrb_value, mrb_sym, int, mrb_value*); +mrb_value mrb_funcall_with_block(mrb_state*, mrb_value, mrb_sym, int, mrb_value*, mrb_value); mrb_sym mrb_intern(mrb_state*,const char*); mrb_sym mrb_intern2(mrb_state*,const char*,int); mrb_sym mrb_intern_str(mrb_state*,mrb_value); diff --git a/src/class.c b/src/class.c index 6efc9f5e7..50d0b6317 100644 --- a/src/class.c +++ b/src/class.c @@ -723,8 +723,8 @@ mrb_mod_include(mrb_state *mrb, mrb_value klass) mrb_check_type(mrb, argv[i], MRB_TT_MODULE); } while (argc--) { - mrb_funcall_argv(mrb, argv[argc], "append_features", 1, &klass); - mrb_funcall_argv(mrb, argv[argc], "included", 1, &klass); + mrb_funcall(mrb, argv[argc], "append_features", 1, klass); + mrb_funcall(mrb, argv[argc], "included", 1, klass); } return klass; @@ -877,29 +877,41 @@ mrb_method_search(mrb_state *mrb, struct RClass* c, mrb_sym mid) mrb_value mrb_funcall(mrb_state *mrb, mrb_value self, const char *name, int argc, ...) { - mrb_value args[MRB_FUNCALL_ARGC_MAX]; + mrb_sym mid = mrb_intern(mrb, name); va_list ap; int i; - if (argc != 0) { + if (argc == 0) { + return mrb_funcall_argv(mrb, self, mid, 0, 0); + } + else if (argc == 1) { + mrb_value v; + + va_start(ap, argc); + v = va_arg(ap, mrb_value); + va_end(ap); + return mrb_funcall_argv(mrb, self, mid, 1, &v); + } + else { + mrb_value argv[MRB_FUNCALL_ARGC_MAX]; + if (argc > MRB_FUNCALL_ARGC_MAX) { - mrb_raise(mrb, E_ARGUMENT_ERROR, "Too long arguments. (limit=%d)\n", MRB_FUNCALL_ARGC_MAX); - } + mrb_raise(mrb, E_ARGUMENT_ERROR, "Too long arguments. (limit=%d)", MRB_FUNCALL_ARGC_MAX); + } va_start(ap, argc); for (i = 0; i < argc; i++) { - args[i] = va_arg(ap, mrb_value); + argv[i] = va_arg(ap, mrb_value); } va_end(ap); + return mrb_funcall_argv(mrb, self, mid, argc, argv); } - return mrb_funcall_argv(mrb, self, name, argc, args); } - void mrb_obj_call_init(mrb_state *mrb, mrb_value obj, int argc, mrb_value *argv) { - mrb_funcall_argv(mrb, obj, "initialize", argc, argv); + mrb_funcall_argv(mrb, obj, mrb_intern(mrb, "initialize"), argc, argv); } /* @@ -938,7 +950,7 @@ mrb_class_new_instance_m(mrb_state *mrb, mrb_value klass) c = (struct RClass*)mrb_obj_alloc(mrb, k->tt, k); c->super = k; obj = mrb_obj_value(c); - mrb_funcall_with_block(mrb, obj, "initialize", argc, argv, blk); + mrb_funcall_with_block(mrb, obj, mrb_intern(mrb, "initialize"), argc, argv, blk); return obj; } @@ -957,7 +969,7 @@ mrb_instance_new(mrb_state *mrb, mrb_value cv) o = (struct RObject*)mrb_obj_alloc(mrb, ttype, c); obj = mrb_obj_value(o); mrb_get_args(mrb, "*&", &argv, &argc, &blk); - mrb_funcall_with_block(mrb, obj, "initialize", argc, argv, blk); + mrb_funcall_with_block(mrb, obj, mrb_intern(mrb, "initialize"), argc, argv, blk); return obj; } diff --git a/src/error.c b/src/error.c index e71245509..6fe839cb2 100644 --- a/src/error.c +++ b/src/error.c @@ -144,7 +144,7 @@ exc_equal(mrb_state *mrb, mrb_value exc) if (mrb_obj_equal(mrb, exc, obj)) return mrb_true_value(); if (mrb_obj_class(mrb, exc) != mrb_obj_class(mrb, obj)) { - if ( mrb_respond_to(mrb, obj, mrb_intern(mrb, "message")) ) { + if (mrb_respond_to(mrb, obj, mrb_intern(mrb, "message"))) { mesg = mrb_funcall(mrb, obj, "message", 0); } else @@ -306,12 +306,15 @@ make_exception(mrb_state *mrb, int argc, mrb_value *argv, int isstr) case 3: n = 1; exception_call: - if (mrb_respond_to(mrb, argv[0], mrb_intern(mrb, "exception"))) { - mesg = mrb_funcall_argv(mrb, argv[0], "exception", n, argv+1); - } - else { - /* undef */ - mrb_raise(mrb, E_TYPE_ERROR, "exception class/object expected"); + { + mrb_sym exc = mrb_intern(mrb, "exception"); + if (mrb_respond_to(mrb, argv[0], exc)) { + mesg = mrb_funcall_argv(mrb, argv[0], exc, n, argv+1); + } + else { + /* undef */ + mrb_raise(mrb, E_TYPE_ERROR, "exception class/object expected"); + } } break; diff --git a/src/kernel.c b/src/kernel.c index 36dfbe769..740960f80 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -245,7 +245,7 @@ mrb_f_send(mrb_state *mrb, mrb_value self) int argc; mrb_get_args(mrb, "n*&", &name, &argv, &argc, &block); - return mrb_funcall_with_block(mrb,self, mrb_sym2name(mrb, name), argc, argv, block); + return mrb_funcall_with_block(mrb,self, name, argc, argv, block); } /* 15.3.1.2.2 */ diff --git a/src/re.c b/src/re.c index f3cfea484..0022f9a9c 100644 --- a/src/re.c +++ b/src/re.c @@ -76,7 +76,7 @@ mrb_reg_s_new_instance(mrb_state *mrb, /*int argc, mrb_value *argv, */mrb_value re->ptr = 0; re->src = 0; re->usecnt = 0; - return mrb_funcall_argv(mrb, mrb_obj_value(re), "initialize", argc, argv); + return mrb_funcall_argv(mrb, mrb_obj_value(re), mrb_intern(mrb, "initialize"), argc, argv); } mrb_value diff --git a/src/variable.c b/src/variable.c index b81b292d9..a62e7e126 100644 --- a/src/variable.c +++ b/src/variable.c @@ -320,8 +320,8 @@ const_get(mrb_state *mrb, struct RClass *base, mrb_sym sym) return kh_value(h, k); } if (mrb_respond_to(mrb, mrb_obj_value(c), cm)) { - mrb_value argv = mrb_symbol_value(sym); - return mrb_funcall_argv(mrb, mrb_obj_value(c), "const_missing", 1, &argv); + mrb_value name = mrb_symbol_value(sym); + return mrb_funcall(mrb, mrb_obj_value(c), "const_missing", 1, name); } } c = c->super; diff --git a/src/vm.c b/src/vm.c index 2a13f0ea4..130e56071 100644 --- a/src/vm.c +++ b/src/vm.c @@ -179,16 +179,18 @@ ecall(mrb_state *mrb, int i) } mrb_value -mrb_funcall_with_block(mrb_state *mrb, mrb_value self, const char *name, int argc, mrb_value *argv, mrb_value blk) +mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, int argc, mrb_value *argv, mrb_value blk) { struct RProc *p; struct RClass *c; - mrb_sym mid = mrb_intern(mrb, name); mrb_sym undef = 0; mrb_callinfo *ci; int n = mrb->ci->nregs; mrb_value val; + if (argc < 0) { + mrb_raise(mrb, E_ARGUMENT_ERROR, "negative argc for funcall (%d)", argc); + } c = mrb_class(mrb, self); p = mrb_method_search_vm(mrb, &c, mid); if (!p) { @@ -232,9 +234,9 @@ mrb_funcall_with_block(mrb_state *mrb, mrb_value self, const char *name, int arg } mrb_value -mrb_funcall_argv(mrb_state *mrb, mrb_value self, const char *name, int argc, mrb_value *argv) +mrb_funcall_argv(mrb_state *mrb, mrb_value self, mrb_sym mid, int argc, mrb_value *argv) { - return mrb_funcall_with_block(mrb, self, name, argc, argv, mrb_nil_value()); + return mrb_funcall_with_block(mrb, self, mid, argc, argv, mrb_nil_value()); } mrb_value -- cgit v1.2.3 From 1ff6dfd081664625d71c0f6fcb3c2c1ae58ef1f5 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 1 Aug 2012 17:52:14 +0900 Subject: should not leave open code on syntax errors; close #413 --- tools/mirb/mirb.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/mirb/mirb.c b/tools/mirb/mirb.c index 4159f12bd..54588d57e 100644 --- a/tools/mirb/mirb.c +++ b/tools/mirb/mirb.c @@ -50,10 +50,10 @@ is_code_block_open(struct mrb_parser_state *parser) code_block_open = TRUE; } else if (strcmp(message, "syntax error, unexpected keyword_end") == 0) { - code_block_open = TRUE; + code_block_open = FALSE; } else if (strcmp(message, "syntax error, unexpected tREGEXP_BEG") == 0) { - code_block_open = TRUE; + code_block_open = FALSE; } return code_block_open; } -- cgit v1.2.3 From 47ff5a06430a3e8cf00f53a585cef1013ff8011d Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 2 Aug 2012 00:43:38 +0900 Subject: move OP_LOADNIL just before OP_SEND to improve performance on some platforms --- src/vm.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/vm.c b/src/vm.c index 130e56071..9075f74bd 100644 --- a/src/vm.c +++ b/src/vm.c @@ -481,14 +481,6 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) NEXT; } - CASE(OP_LOADNIL) { - /* A B R(A) := nil */ - int a = GETARG_A(i); - - SET_NIL_VALUE(regs[a]); - NEXT; - } - CASE(OP_LOADSELF) { /* A R(A) := self */ regs[GETARG_A(i)] = mrb->stack[0]; @@ -680,6 +672,14 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) NEXT; } + CASE(OP_LOADNIL) { + /* A B R(A) := nil */ + int a = GETARG_A(i); + + SET_NIL_VALUE(regs[a]); + NEXT; + } + L_SEND: CASE(OP_SEND) { /* A B C R(A) := call(R(A),Sym(B),R(A+1),... ,R(A+C-1)) */ -- cgit v1.2.3 From dcfff971ffb2ecd5747d58c7150c5ff581883ef6 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 2 Aug 2012 00:48:50 +0900 Subject: remove OP_LOADNIL from NODE_OP_ASGN --- src/codegen.c | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/codegen.c b/src/codegen.c index 5cfd6d3f2..866bfcb44 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -1278,12 +1278,14 @@ codegen(codegen_scope *s, node *tree, int val) case NODE_OP_ASGN: { mrb_sym sym = (mrb_sym)tree->cdr->car; - const char *name = mrb_sym2name(s->mrb, sym); - int idx; + int len; + const char *name = mrb_sym2name_len(s->mrb, sym, &len); + int idx, blk = 0; codegen(s, tree->car, VAL); - if ((name[0] == '|' && name[1] == '|' && name[2] == '\0') || - (name[0] == '&' && name[1] == '&' && name[2] == '\0')) { + if (len == 2 && + ((name[0] == '|' && name[1] == '|') || + (name[0] == '&' && name[1] == '&'))) { int pos; pop(); @@ -1296,29 +1298,32 @@ codegen(codegen_scope *s, node *tree, int val) break; } codegen(s, tree->cdr->cdr->car, VAL); - genop(s, MKOP_A(OP_LOADNIL, cursp())); + blk = cursp(); pop(); pop(); idx = new_msym(s, sym); - if (name[0] == '+' && name[1] == '\0') { + if (len == 1 && name[0] == '+') { genop(s, MKOP_ABC(OP_ADD, cursp(), idx, 1)); } - else if (name[0] == '-' && name[1] == '\0') { + else if (len == 1 && name[0] == '-') { genop(s, MKOP_ABC(OP_SUB, cursp(), idx, 1)); } - else if (name[0] == '<' && name[1] == '\0') { + else if (len == 1 && name[0] == '<') { genop(s, MKOP_ABC(OP_LT, cursp(), idx, 1)); } - else if (name[0] == '<' && name[1] == '=' && name[2] == '\0') { + else if (len == 2 && name[0] == '<' && name[1] == '=') { genop(s, MKOP_ABC(OP_LE, cursp(), idx, 1)); } - else if (name[0] == '>' && name[1] == '\0') { + else if (len == 1 && name[0] == '>') { genop(s, MKOP_ABC(OP_GT, cursp(), idx, 1)); } - else if (name[0] == '>' && name[1] == '=' && name[2] == '\0') { + else if (len == 2 && name[0] == '>' && name[1] == '=') { genop(s, MKOP_ABC(OP_GE, cursp(), idx, 1)); } else { + if (blk > 0) { + genop(s, MKOP_A(OP_LOADNIL, blk)); + } genop(s, MKOP_ABC(OP_SEND, cursp(), idx, 1)); } } -- cgit v1.2.3 From 9ccf9767e1661739bb046cc8956a4437e2e75b55 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 2 Aug 2012 01:13:45 +0900 Subject: protect return value from mrb_funcall --- src/vm.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vm.c b/src/vm.c index 9075f74bd..c04216c94 100644 --- a/src/vm.c +++ b/src/vm.c @@ -224,6 +224,7 @@ mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, int argc, mr int ai = mrb->arena_idx; val = p->body.func(mrb, self); mrb->arena_idx = ai; + mrb_gc_protect(mrb, val); mrb->stack = mrb->stbase + ci->stackidx; cipop(mrb); } -- cgit v1.2.3 From b00529e672a6b64ec41b36c25395d66364f8cc20 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 2 Aug 2012 01:53:01 +0900 Subject: reduce invoking const_missing --- src/variable.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/variable.c b/src/variable.c index a62e7e126..0b4288734 100644 --- a/src/variable.c +++ b/src/variable.c @@ -309,7 +309,8 @@ const_get(mrb_state *mrb, struct RClass *base, mrb_sym sym) struct RClass *c = base; khash_t(iv) *h; khiter_t k; - mrb_sym cm = mrb_intern(mrb, "const_missing"); + int retry = 0; + mrb_sym cm; L_RETRY: while (c) { @@ -319,18 +320,23 @@ const_get(mrb_state *mrb, struct RClass *base, mrb_sym sym) if (k != kh_end(h)) { return kh_value(h, k); } - if (mrb_respond_to(mrb, mrb_obj_value(c), cm)) { - mrb_value name = mrb_symbol_value(sym); - return mrb_funcall(mrb, mrb_obj_value(c), "const_missing", 1, name); - } } c = c->super; } - - if (base->tt == MRB_TT_MODULE) { - c = base = mrb->object_class; + if (!retry && base->tt == MRB_TT_MODULE) { + c = mrb->object_class; + retry = 1; goto L_RETRY; } + c = base; + cm = mrb_intern(mrb, "const_missing"); + while (c) { + if (mrb_respond_to(mrb, mrb_obj_value(c), cm)) { + mrb_value name = mrb_symbol_value(sym); + return mrb_funcall(mrb, mrb_obj_value(c), "const_missing", 1, name); + } + c = c->super; + } mrb_raise(mrb, E_NAME_ERROR, "uninitialized constant %s", mrb_sym2name(mrb, sym)); /* not reached */ -- cgit v1.2.3 From bce9198732d489daa3d179b185c532544a6d6c60 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 2 Aug 2012 01:53:35 +0900 Subject: reduce invoking mrb_intern from convert_type --- src/object.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/object.c b/src/object.c index 4f5fb1d28..25439e1d2 100644 --- a/src/object.c +++ b/src/object.c @@ -317,7 +317,7 @@ convert_type(mrb_state *mrb, mrb_value val, const char *tname, const char *metho return mrb_nil_value(); } } - return mrb_funcall(mrb, val, method, 0); + return mrb_funcall_argv(mrb, val, m, 0, 0); } mrb_value -- cgit v1.2.3 From 1549502079ed1b3b7bbae66e661e4a15a9a3f3d6 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 2 Aug 2012 01:58:20 +0900 Subject: mrb_check_convert_type should always return nil on error --- src/object.c | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/object.c b/src/object.c index 25439e1d2..26df48afd 100644 --- a/src/object.c +++ b/src/object.c @@ -327,8 +327,7 @@ mrb_check_to_integer(mrb_state *mrb, mrb_value val, const char *method) if (mrb_type(val) == MRB_TT_FIXNUM) return val; v = convert_type(mrb, val, "Integer", method, FALSE); - if (mrb_nil_p(v)) return (v); - if (!mrb_obj_is_kind_of(mrb, v, mrb_obj_class(mrb, v))) { + if (mrb_nil_p(v) || mrb_type(v) != MRB_TT_FIXNUM) { return mrb_nil_value(); } return v; @@ -343,7 +342,7 @@ mrb_convert_type(mrb_state *mrb, mrb_value val, mrb_int type, const char *tname, v = convert_type(mrb, val, tname, method, 1/*Qtrue*/); if (mrb_type(v) != type) { mrb_raise(mrb, E_TYPE_ERROR, "%s cannot be converted to %s by #%s", - mrb_obj_classname(mrb, val), tname, method); + mrb_obj_classname(mrb, val), tname, method); } return v; } @@ -353,14 +352,9 @@ mrb_check_convert_type(mrb_state *mrb, mrb_value val, mrb_int type, const char * { mrb_value v; - /* always convert T_DATA */ if (mrb_type(val) == type && type != MRB_TT_DATA) return val; v = convert_type(mrb, val, tname, method, 0/*Qfalse*/); - if (mrb_nil_p(v)) return mrb_nil_value(); - if (mrb_type(v) != type) { - mrb_raise(mrb, E_TYPE_ERROR, "%s#%s should return %s", - mrb_obj_classname(mrb, val), method, tname); - } + if (mrb_nil_p(v) || mrb_type(v) != type) return mrb_nil_value(); return v; } -- cgit v1.2.3 From 29d4eb6e200bf1d886d2737776fff9d615b67a73 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 2 Aug 2012 04:00:42 +0900 Subject: stack pos should be adjusted for CFUNC OP_EXEC --- src/vm.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/vm.c b/src/vm.c index c04216c94..875a6d94f 100644 --- a/src/vm.c +++ b/src/vm.c @@ -1551,6 +1551,9 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) ci->argc = 0; ci->target_class = mrb_class_ptr(regs[GETARG_A(i)]); + /* prepare stack */ + mrb->stack += a; + p = mrb_proc_new(mrb, mrb->irep[irep->idx+GETARG_Bx(i)]); p->target_class = ci->target_class; ci->proc = p; @@ -1569,8 +1572,8 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) irep = p->body.irep; pool = irep->pool; syms = irep->syms; - mrb->stack += a; stack_extend(mrb, irep->nregs, 1); + ci->nregs = irep->nregs; regs = mrb->stack; pc = irep->iseq; JUMP; -- cgit v1.2.3 From 90323f545f4e1c317062821653f032ec151ba63e Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 2 Aug 2012 07:56:23 +0900 Subject: keep minimal stack space (recv and blk) --- src/vm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vm.c b/src/vm.c index 875a6d94f..f3c408809 100644 --- a/src/vm.c +++ b/src/vm.c @@ -132,7 +132,7 @@ cipush(mrb_state *mrb) mrb->ciend = mrb->cibase + size * 2; } mrb->ci++; - mrb->ci->nregs = 0; + mrb->ci->nregs = 2; mrb->ci->eidx = eidx; mrb->ci->ridx = ridx; mrb->ci->env = 0; @@ -1549,7 +1549,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) ci->mid = 0; ci->stackidx = mrb->stack - mrb->stbase; ci->argc = 0; - ci->target_class = mrb_class_ptr(regs[GETARG_A(i)]); + ci->target_class = mrb_class_ptr(recv); /* prepare stack */ mrb->stack += a; -- cgit v1.2.3 From 91318da3bc2f7465ed490544afb531041aa4a092 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 2 Aug 2012 12:57:57 +0900 Subject: wrong return value from empty block/lambda --- src/codegen.c | 13 ++++++++++--- src/vm.c | 3 +-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/codegen.c b/src/codegen.c index 866bfcb44..321223d9d 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -308,7 +308,8 @@ push_(codegen_scope *s) } #define push() push_(s) -#define pop() (s->sp--) +#define pop_(s) ((s)->sp--) +#define pop() pop_(s) #define pop_n(n) (s->sp-=(n)) #define cursp() (s->sp) @@ -508,6 +509,9 @@ lambda_body(codegen_scope *s, node *tree, int blk) pop(); c = s->iseq[s->pc-1]; if (GET_OPCODE(c) != OP_RETURN || GETARG_B(c) != OP_R_NORMAL || s->pc == s->lastlabel) { + if (s->nregs == 0) { + genop(s, MKOP_A(OP_LOADNIL, cursp())); + } genop(s, MKOP_AB(OP_RETURN, cursp(), OP_R_NORMAL)); } if (blk) { @@ -524,12 +528,15 @@ scope_body(codegen_scope *s, node *tree) codegen_scope *scope = scope_new(s->mrb, s, tree->car); int idx = scope->idx; + codegen(scope, tree->cdr, VAL); if (!s->iseq) { - codegen(scope, tree->cdr, VAL); genop(scope, MKOP_A(OP_STOP, 0)); } else { - codegen(scope, tree->cdr, VAL); + pop_(scope); + if (scope->nregs == 0) { + genop(scope, MKOP_A(OP_LOADNIL, scope->sp)); + } genop(scope, MKOP_AB(OP_RETURN, scope->sp, OP_R_NORMAL)); } scope_finish(scope, idx); diff --git a/src/vm.c b/src/vm.c index f3c408809..7b5e1e87a 100644 --- a/src/vm.c +++ b/src/vm.c @@ -1563,12 +1563,11 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) mrb->arena_idx = ai; if (mrb->exc) goto L_RAISE; /* pop stackpos */ - regs = mrb->stack = mrb->stbase + ci->stackidx; + mrb->stack = mrb->stbase + ci->stackidx; cipop(mrb); NEXT; } else { - /* setup environment for calling method */ irep = p->body.irep; pool = irep->pool; syms = irep->syms; -- cgit v1.2.3 From a7f0e3bc8081f30bbcfe0058824a4edae7ea7af4 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 2 Aug 2012 13:13:41 +0900 Subject: small return optimization: use R0 to set return value if possible --- src/codegen.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 58 insertions(+), 7 deletions(-) diff --git a/src/codegen.c b/src/codegen.c index 321223d9d..0d4de9734 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -244,6 +244,51 @@ genop_peep(codegen_scope *s, mrb_code i, int val) return; } break; + case OP_RETURN: + switch (c0) { + case OP_MOVE: + s->iseq[s->pc-1] = MKOP_AB(OP_MOVE, 0, GETARG_B(i0)); + genop(s, MKOP_AB(OP_RETURN, 0, OP_R_NORMAL)); + return; + case OP_LOADI: + s->iseq[s->pc-1] = MKOP_AsBx(OP_LOADI, 0, GETARG_sBx(i0)); + genop(s, MKOP_AB(OP_RETURN, 0, OP_R_NORMAL)); + return; + case OP_ARRAY: + case OP_HASH: + case OP_RANGE: + case OP_AREF: + case OP_GETUPVAR: + s->iseq[s->pc-1] = MKOP_ABC(c0, 0, GETARG_B(i0), GETARG_C(i0)); + genop(s, MKOP_AB(OP_RETURN, 0, OP_R_NORMAL)); + return; + case OP_LOADSYM: + case OP_GETGLOBAL: + case OP_GETIV: + case OP_GETCV: + case OP_GETCONST: + case OP_GETSPECIAL: + case OP_LOADL: + case OP_STRING: + s->iseq[s->pc-1] = MKOP_ABx(c0, 0, GETARG_Bx(i0)); + genop(s, MKOP_AB(OP_RETURN, 0, OP_R_NORMAL)); + return; + case OP_SCLASS: + s->iseq[s->pc-1] = MKOP_AB(c0, GETARG_A(i), GETARG_B(i0)); + genop(s, MKOP_AB(OP_RETURN, 0, OP_R_NORMAL)); + return; + case OP_LOADNIL: + case OP_LOADSELF: + case OP_LOADT: + case OP_LOADF: + case OP_OCLASS: + s->iseq[s->pc-1] = MKOP_A(c0, 0); + genop(s, MKOP_AB(OP_RETURN, 0, OP_R_NORMAL)); + return; + default: + break; + } + break; default: break; } @@ -427,7 +472,7 @@ for_body(codegen_scope *s, node *tree) pop(); c = s->iseq[s->pc-1]; if (GET_OPCODE(c) != OP_RETURN || GETARG_B(c) != OP_R_NORMAL || s->pc == s->lastlabel) { - genop(s, MKOP_AB(OP_RETURN, cursp(), OP_R_NORMAL)); + genop_peep(s, MKOP_AB(OP_RETURN, cursp(), OP_R_NORMAL), NOVAL); } loop_pop(s, NOVAL); scope_finish(s, idx); @@ -510,9 +555,12 @@ lambda_body(codegen_scope *s, node *tree, int blk) c = s->iseq[s->pc-1]; if (GET_OPCODE(c) != OP_RETURN || GETARG_B(c) != OP_R_NORMAL || s->pc == s->lastlabel) { if (s->nregs == 0) { - genop(s, MKOP_A(OP_LOADNIL, cursp())); + genop(s, MKOP_A(OP_LOADNIL, 0)); + genop(s, MKOP_AB(OP_RETURN, 0, OP_R_NORMAL)); + } + else { + genop_peep(s, MKOP_AB(OP_RETURN, cursp(), OP_R_NORMAL), NOVAL); } - genop(s, MKOP_AB(OP_RETURN, cursp(), OP_R_NORMAL)); } if (blk) { loop_pop(s, NOVAL); @@ -535,9 +583,12 @@ scope_body(codegen_scope *s, node *tree) else { pop_(scope); if (scope->nregs == 0) { - genop(scope, MKOP_A(OP_LOADNIL, scope->sp)); + genop(scope, MKOP_A(OP_LOADNIL, 0)); + genop(scope, MKOP_AB(OP_RETURN, 0, OP_R_NORMAL)); + } + else { + genop_peep(scope, MKOP_AB(OP_RETURN, scope->sp, OP_R_NORMAL), NOVAL); } - genop(scope, MKOP_AB(OP_RETURN, scope->sp, OP_R_NORMAL)); } scope_finish(scope, idx); @@ -1397,7 +1448,7 @@ codegen(codegen_scope *s, node *tree, int val) genop(s, MKOP_AB(OP_RETURN, cursp(), OP_R_RETURN)); } else { - genop(s, MKOP_AB(OP_RETURN, cursp(), OP_R_NORMAL)); + genop_peep(s, MKOP_AB(OP_RETURN, cursp(), OP_R_NORMAL), NOVAL); } break; @@ -1449,7 +1500,7 @@ codegen(codegen_scope *s, node *tree, int val) else { codegen(s, tree, VAL); pop(); - genop(s, MKOP_AB(OP_RETURN, cursp(), OP_R_NORMAL)); + genop_peep(s, MKOP_AB(OP_RETURN, cursp(), OP_R_NORMAL), NOVAL); } if (val) push(); break; -- cgit v1.2.3 From cc0f249c17a68eaa5e016638b465c2087b983148 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 2 Aug 2012 21:53:23 +0900 Subject: Time.new may not take any argument --- src/time.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/time.c b/src/time.c index 272402bd7..ac04745e5 100644 --- a/src/time.c +++ b/src/time.c @@ -522,18 +522,20 @@ mrb_time_initialize(mrb_state *mrb, mrb_value self) { mrb_int ayear = 0, amonth = 1, aday = 1, ahour = 0, amin = 0, asec = 0, ausec = 0; + int n; struct mrb_time *tm; tm = (struct mrb_time *)mrb_get_datatype(mrb, self, &mrb_time_type); if (tm) { mrb_time_free(mrb, tm); } - if (mrb->ci->argc == 0) { + + n = mrb_get_args(mrb, "|iiiiiii", + &ayear, &amonth, &aday, &ahour, &amin, &asec, &ausec); + if (n == 0) { tm = current_mrb_time(mrb); } else { - mrb_get_args(mrb, "iiiiiii", - &ayear, &amonth, &aday, &ahour, &amin, &asec, &ausec); tm = time_mktime(mrb, ayear, amonth, aday, ahour, amin, asec, ausec, MRB_TIMEZONE_LOCAL); } DATA_PTR(self) = tm; -- cgit v1.2.3 From 6491693d00038f62f8b4f8f3c5cef93068f65956 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 2 Aug 2012 22:03:53 +0900 Subject: mrb_get_args("&") gave wrong value --- src/class.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/class.c b/src/class.c index 50d0b6317..d6c7a92fb 100644 --- a/src/class.c +++ b/src/class.c @@ -602,12 +602,15 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) case '&': { - mrb_value *p, *bp = mrb->stack + 1; + mrb_value *p, *bp; p = va_arg(ap, mrb_value*); - if (mrb->ci->argc > 0) { - bp += mrb->ci->argc; + if (mrb->ci->argc < 0) { + bp = mrb->stack + 2; } + else { + bp = mrb->stack + mrb->ci->argc + 1; + } *p = *bp; } break; -- cgit v1.2.3 From b8b22c1d17a8597bf230f77196118e8e76ad75a2 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 2 Aug 2012 22:15:49 +0900 Subject: use mrb_obj_equal to check pool --- src/codegen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/codegen.c b/src/codegen.c index 0d4de9734..8d2313314 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -364,7 +364,7 @@ new_lit(codegen_scope *s, mrb_value val) int i; for (i=0; iplen; i++) { - if (memcmp(&s->pool[i], &val, sizeof(mrb_value)) == 0) return i; + if (mrb_obj_equal(s->mrb, s->pool[i], val)) return i; } if (s->plen == s->pcapa) { s->pcapa *= 2; -- cgit v1.2.3 From 6f6e18ef825fbae10410c4c84460773e745ae056 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 2 Aug 2012 22:17:27 +0900 Subject: struct.c refactoring --- src/struct.c | 35 ++++------------------------------- 1 file changed, 4 insertions(+), 31 deletions(-) diff --git a/src/struct.c b/src/struct.c index a133dc046..beb7c2f46 100644 --- a/src/struct.c +++ b/src/struct.c @@ -367,7 +367,7 @@ mrb_struct_s_def(mrb_state *mrb, mrb_value klass) name = mrb_nil_value(); rest = mrb_nil_value(); - mrb_get_args(mrb, "&*", &b, &argv, &argc); + mrb_get_args(mrb, "*&", &argv, &argc, &b); if (argc > 0) name = argv[0]; if (argc > 1) rest = argv[1]; if (mrb_type(rest) == MRB_TT_ARRAY) { @@ -400,7 +400,7 @@ mrb_struct_s_def(mrb_state *mrb, mrb_value klass) return st; } -static long +static int num_members(mrb_state *mrb, struct RClass *klass) { mrb_value members; @@ -418,7 +418,7 @@ static mrb_value mrb_struct_initialize_withArg(mrb_state *mrb, int argc, mrb_value *argv, mrb_value self) { struct RClass *klass = mrb_obj_class(mrb, self); - long n; + int n; struct RStruct *st; mrb_struct_modify(self); @@ -447,34 +447,7 @@ mrb_struct_initialize_m(mrb_state *mrb, /*int argc, mrb_value *argv,*/ mrb_value mrb_value mrb_struct_initialize(mrb_state *mrb, mrb_value self, mrb_value values) { - return mrb_struct_initialize_withArg(mrb, RARRAY_LEN/*INT*/(values), RARRAY_PTR(values), self); -} - -mrb_value -mrb_struct_alloc(mrb_state *mrb, mrb_value klass, mrb_value values) -{ - return mrb_class_new_instance(mrb, RARRAY_LEN(values), RARRAY_PTR(values), mrb_class(mrb, klass)); -} - -mrb_value -mrb_struct_new(mrb_state *mrb, struct RClass *klass, ...) -{ - mrb_value tmpargs[N_REF_FUNC], *mem = tmpargs; - int size, i; - va_list args; - - size = mrb_long2int(num_members(mrb, klass)); - if (size > numberof(tmpargs)) { - tmpargs[0] = mrb_ary_new_capa(mrb, size); - mem = RARRAY_PTR(tmpargs[0]); - } - va_start(args, klass); - for (i=0; i Date: Fri, 3 Aug 2012 00:40:36 +0900 Subject: update regs after cfunc call --- src/vm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vm.c b/src/vm.c index 7b5e1e87a..fc4d11891 100644 --- a/src/vm.c +++ b/src/vm.c @@ -867,7 +867,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) mrb->arena_idx = ai; if (mrb->exc) goto L_RAISE; /* pop stackpos */ - mrb->stack = mrb->stbase + ci->stackidx; + regs = mrb->stack = mrb->stbase + ci->stackidx; cipop(mrb); NEXT; } @@ -1563,7 +1563,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) mrb->arena_idx = ai; if (mrb->exc) goto L_RAISE; /* pop stackpos */ - mrb->stack = mrb->stbase + ci->stackidx; + regs = mrb->stack = mrb->stbase + ci->stackidx; cipop(mrb); NEXT; } -- cgit v1.2.3 From 6fb88f7e1dfb9c6e62fd994ef8158360e1823f01 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Fri, 3 Aug 2012 01:02:43 +0900 Subject: update regs after cfunc call [2] --- src/vm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vm.c b/src/vm.c index fc4d11891..c2b461fd0 100644 --- a/src/vm.c +++ b/src/vm.c @@ -735,7 +735,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) mrb->arena_idx = ai; if (mrb->exc) goto L_RAISE; /* pop stackpos */ - mrb->stack = mrb->stbase + ci->stackidx; + regs = mrb->stack = mrb->stbase + ci->stackidx; cipop(mrb); NEXT; } @@ -1040,7 +1040,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) } if (ci == mrb->cibase) { if (ci->ridx == 0) { - mrb->stack = mrb->stbase; + regs = mrb->stack = mrb->stbase; goto L_STOP; } break; -- cgit v1.2.3 From 81b41e84e98004fefe9e466304c6a93b5f20d156 Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Fri, 3 Aug 2012 14:03:53 +0900 Subject: Fix a memory leak in mrb_realloc(). --- src/gc.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/gc.c b/src/gc.c index 9c82f858c..9a630f626 100644 --- a/src/gc.c +++ b/src/gc.c @@ -151,13 +151,15 @@ gettimeofday_time(void) void* mrb_realloc(mrb_state *mrb, void *p, size_t len) { - p = (mrb->allocf)(mrb, p, len); + void *p2; - if (!p && len > 0 && mrb->heaps) { + p2 = (mrb->allocf)(mrb, p, len); + + if (!p2 && len > 0 && mrb->heaps) { mrb_garbage_collect(mrb); - p = (mrb->allocf)(mrb, p, len); + p2 = (mrb->allocf)(mrb, p, len); } - return p; + return p2; } void* -- cgit v1.2.3 From f121558f9379c92a20051e3d87489d4c8125e9f9 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Fri, 3 Aug 2012 19:55:01 +0900 Subject: mrb_define_method_vm should update target_class --- src/class.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/class.c b/src/class.c index d6c7a92fb..13c2d0469 100644 --- a/src/class.c +++ b/src/class.c @@ -328,10 +328,13 @@ mrb_define_method_vm(mrb_state *mrb, struct RClass *c, mrb_sym name, mrb_value b { khash_t(mt) *h = c->mt; khiter_t k; + struct RProc *p; if (!h) h = c->mt = kh_init(mt, mrb); k = kh_put(mt, h, name); - kh_value(h, k) = mrb_proc_ptr(body); + p = mrb_proc_ptr(body); + if (p) p->target_class = c; + kh_value(h, k) = p; } static mrb_value -- cgit v1.2.3 From 77aa261f3bcb9ab93e1ea9a9d89f8cba51b98873 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Fri, 3 Aug 2012 19:56:14 +0900 Subject: mrb_singleton_class should raise TypeError for immediate objects --- src/class.c | 7 ++++++- src/kernel.c | 14 ++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/class.c b/src/class.c index 13c2d0469..29ec18e13 100644 --- a/src/class.c +++ b/src/class.c @@ -807,11 +807,16 @@ mrb_singleton_class(mrb_state *mrb, mrb_value v) switch (mrb_type(v)) { case MRB_TT_FALSE: + if (mrb_nil_p(v)) + return mrb_obj_value(mrb->nil_class); + return mrb_obj_value(mrb->false_class); case MRB_TT_TRUE: + return mrb_obj_value(mrb->true_class); case MRB_TT_SYMBOL: case MRB_TT_FIXNUM: case MRB_TT_FLOAT: - return mrb_nil_value(); /* should raise TypeError */ + mrb_raise(mrb, E_TYPE_ERROR, "can't define singleton"); + return mrb_nil_value(); /* not reached */ default: break; } diff --git a/src/kernel.c b/src/kernel.c index 740960f80..6327f967d 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -550,12 +550,22 @@ mrb_obj_instance_eval(mrb_state *mrb, mrb_value self) { mrb_value a, b; mrb_value cv; + struct RClass *c; if (mrb_get_args(mrb, "|S&", &a, &b) == 1) { mrb_raise(mrb, E_NOTIMP_ERROR, "instance_eval with string not implemented"); } - cv = mrb_singleton_class(mrb, self); - return mrb_yield_internal(mrb, b, 0, 0, self, mrb_class_ptr(cv)); + switch (mrb_type(self)) { + case MRB_TT_SYMBOL: + case MRB_TT_FIXNUM: + case MRB_TT_FLOAT: + c = 0; + break; + default: + cv = mrb_singleton_class(mrb, self); + c = mrb_class_ptr(cv); + } + return mrb_yield_internal(mrb, b, 0, 0, self, c); } int -- cgit v1.2.3 From 730f53045eb85cf995b0b675ea2818a682810a4f Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Fri, 3 Aug 2012 20:17:04 +0900 Subject: define_method to copy block body --- include/mruby/proc.h | 1 + src/class.c | 7 +++++-- src/proc.c | 10 +++++----- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/include/mruby/proc.h b/include/mruby/proc.h index 8f178790e..f6bef23a5 100644 --- a/include/mruby/proc.h +++ b/include/mruby/proc.h @@ -49,6 +49,7 @@ struct RProc { struct RProc *mrb_proc_new(mrb_state*, mrb_irep*); struct RProc *mrb_proc_new_cfunc(mrb_state*, mrb_func_t); struct RProc *mrb_closure_new(mrb_state*, mrb_irep*); +void mrb_proc_copy(struct RProc *a, struct RProc *b); #include "mruby/khash.h" KHASH_DECLARE(mt, mrb_sym, struct RProc*, 1); diff --git a/src/class.c b/src/class.c index 29ec18e13..df42820e5 100644 --- a/src/class.c +++ b/src/class.c @@ -1364,14 +1364,17 @@ static mrb_value mod_define_method(mrb_state *mrb, mrb_value self) { struct RClass *c = mrb_class_ptr(self); + struct RProc *p; mrb_sym mid; mrb_value blk; mrb_get_args(mrb, "n&", &mid, &blk); if (mrb_nil_p(blk)) { - /* raise */ + mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given"); } - mrb_define_method_raw(mrb, c, mid, mrb_proc_ptr(blk)); + p = (struct RProc*)mrb_obj_alloc(mrb, MRB_TT_PROC, mrb->proc_class); + mrb_proc_copy(p, mrb_proc_ptr(blk)); + mrb_define_method_raw(mrb, c, mid, p); return blk; } diff --git a/src/proc.c b/src/proc.c index d223fa760..a1f8b180e 100644 --- a/src/proc.c +++ b/src/proc.c @@ -55,8 +55,8 @@ mrb_proc_new_cfunc(mrb_state *mrb, mrb_func_t func) return p; } -static inline void -proc_copy(struct RProc *a, struct RProc *b) +void +mrb_proc_copy(struct RProc *a, struct RProc *b) { a->flags = b->flags; a->body = b->body; @@ -75,7 +75,7 @@ mrb_proc_initialize(mrb_state *mrb, mrb_value self) mrb_raise(mrb, E_ARGUMENT_ERROR, "tried to create Proc object without a block"); } else { - proc_copy(mrb_proc_ptr(self), mrb_proc_ptr(blk)); + mrb_proc_copy(mrb_proc_ptr(self), mrb_proc_ptr(blk)); } return self; } @@ -89,7 +89,7 @@ mrb_proc_init_copy(mrb_state *mrb, mrb_value self) if (mrb_type(proc) != MRB_TT_PROC) { mrb_raise(mrb, E_ARGUMENT_ERROR, "not a proc"); } - proc_copy(mrb_proc_ptr(self), mrb_proc_ptr(proc)); + mrb_proc_copy(mrb_proc_ptr(self), mrb_proc_ptr(proc)); return self; } @@ -133,7 +133,7 @@ proc_lambda(mrb_state *mrb, mrb_value self) p = mrb_proc_ptr(blk); if (!MRB_PROC_STRICT_P(p)) { struct RProc *p2 = (struct RProc*)mrb_obj_alloc(mrb, MRB_TT_PROC, p->c); - proc_copy(p2, p); + mrb_proc_copy(p2, p); p2->flags |= MRB_PROC_STRICT; return mrb_obj_value(p2); } -- cgit v1.2.3 From 472d214a71f69fe25e681d9fea6a04fa12e60fb0 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sat, 4 Aug 2012 06:44:53 +0900 Subject: super look-up scheme fixed; close #415 --- src/class.c | 1 - src/proc.c | 2 +- src/vm.c | 5 ++--- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/class.c b/src/class.c index df42820e5..7802c34bd 100644 --- a/src/class.c +++ b/src/class.c @@ -333,7 +333,6 @@ mrb_define_method_vm(mrb_state *mrb, struct RClass *c, mrb_sym name, mrb_value b if (!h) h = c->mt = kh_init(mt, mrb); k = kh_put(mt, h, name); p = mrb_proc_ptr(body); - if (p) p->target_class = c; kh_value(h, k) = p; } diff --git a/src/proc.c b/src/proc.c index a1f8b180e..e5c233e1b 100644 --- a/src/proc.c +++ b/src/proc.c @@ -15,8 +15,8 @@ mrb_proc_new(mrb_state *mrb, mrb_irep *irep) struct RProc *p; p = (struct RProc*)mrb_obj_alloc(mrb, MRB_TT_PROC, mrb->proc_class); - p->body.irep = irep; p->target_class = (mrb->ci) ? mrb->ci->target_class : 0; + p->body.irep = irep; p->env = 0; return p; diff --git a/src/vm.c b/src/vm.c index c2b461fd0..be6ee3944 100644 --- a/src/vm.c +++ b/src/vm.c @@ -717,7 +717,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) ci->stackidx = mrb->stack - mrb->stbase; ci->argc = n; if (ci->argc == CALL_MAXARGS) ci->argc = -1; - ci->target_class = m->target_class; + ci->target_class = c; ci->pc = pc + 1; ci->acc = a; @@ -832,10 +832,9 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) int n = GETARG_C(i); recv = regs[0]; - c = mrb->ci->proc->target_class->super; + c = mrb->ci->target_class->super; m = mrb_method_search_vm(mrb, &c, mid); if (!m) { - c = mrb->ci->proc->target_class; mid = mrb_intern(mrb, "method_missing"); m = mrb_method_search_vm(mrb, &c, mid); if (n == CALL_MAXARGS) { -- cgit v1.2.3 From b231bcb812c586d5823ea4d5dd4df12da5a237b1 Mon Sep 17 00:00:00 2001 From: Masaki Muranaka Date: Sat, 4 Aug 2012 19:54:21 +0900 Subject: load_exec(): Fix message lenghtes in mrb_exc_new(). mrb_run(): Fix not to use a magic number but sizeof. --- src/parse.y | 6 ++++-- src/vm.c | 21 +++++++++++---------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/parse.y b/src/parse.y index a9afc5c96..50f55bf7b 100644 --- a/src/parse.y +++ b/src/parse.y @@ -4875,7 +4875,8 @@ load_exec(mrb_state *mrb, parser_state *p, mrbc_context *c) return mrb_undef_value(); } else { - mrb->exc = (struct RObject*)mrb_object(mrb_exc_new(mrb, E_SYNTAX_ERROR, "syntax error", 0)); + static const char msg[] = "syntax error"; + mrb->exc = (struct RObject*)mrb_object(mrb_exc_new(mrb, E_SYNTAX_ERROR, msg, sizeof(msg) - 1)); mrb_parser_free(p); return mrb_nil_value(); } @@ -4883,7 +4884,8 @@ load_exec(mrb_state *mrb, parser_state *p, mrbc_context *c) n = mrb_generate_code(mrb, p->tree); mrb_parser_free(p); if (n < 0) { - mrb->exc = (struct RObject*)mrb_object(mrb_exc_new(mrb, E_SCRIPT_ERROR, "codegen error", 0)); + static const char msg[] = "codegen error"; + mrb->exc = (struct RObject*)mrb_object(mrb_exc_new(mrb, E_SCRIPT_ERROR, msg, sizeof(msg) - 1)); return mrb_nil_value(); } if (c) { diff --git a/src/vm.c b/src/vm.c index be6ee3944..cbea3ee77 100644 --- a/src/vm.c +++ b/src/vm.c @@ -905,13 +905,13 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) if (lv == 0) stack = regs + 1; else { struct REnv *e = uvenv(mrb, lv-1); - if (!e) { - mrb_value exc; - static const char m[] = "super called outside of method"; - exc = mrb_exc_new(mrb, E_NOMETHOD_ERROR, m, sizeof(m) - 1); - mrb->exc = (struct RObject*)mrb_object(exc); - goto L_RAISE; - } + if (!e) { + mrb_value exc; + static const char m[] = "super called outside of method"; + exc = mrb_exc_new(mrb, E_NOMETHOD_ERROR, m, sizeof(m) - 1); + mrb->exc = (struct RObject*)mrb_object(exc); + goto L_RAISE; + } stack = e->stack + 1; } if (r == 0) { @@ -1598,9 +1598,10 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) CASE(OP_TCLASS) { /* A B R(A) := target_class */ if (!mrb->ci->target_class) { - mrb_value exc = mrb_exc_new(mrb, E_TYPE_ERROR, "no target class or module", 25); - mrb->exc = (struct RObject*)mrb_object(exc); - goto L_RAISE; + static const char msg[] = "no target class or module"; + mrb_value exc = mrb_exc_new(mrb, E_TYPE_ERROR, msg, sizeof(msg) - 1); + mrb->exc = (struct RObject*)mrb_object(exc); + goto L_RAISE; } regs[GETARG_A(i)] = mrb_obj_value(mrb->ci->target_class); NEXT; -- cgit v1.2.3 From 7c4bd7fffd66aff4e2c119421f6673323ac777a1 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 5 Aug 2012 17:07:43 +0900 Subject: remove OP_MOVE just before OP_RETURN --- src/codegen.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/codegen.c b/src/codegen.c index 8d2313314..bf6fd0b3e 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -247,8 +247,7 @@ genop_peep(codegen_scope *s, mrb_code i, int val) case OP_RETURN: switch (c0) { case OP_MOVE: - s->iseq[s->pc-1] = MKOP_AB(OP_MOVE, 0, GETARG_B(i0)); - genop(s, MKOP_AB(OP_RETURN, 0, OP_R_NORMAL)); + s->iseq[s->pc-1] = MKOP_AB(OP_RETURN, GETARG_B(i0), OP_R_NORMAL); return; case OP_LOADI: s->iseq[s->pc-1] = MKOP_AsBx(OP_LOADI, 0, GETARG_sBx(i0)); -- cgit v1.2.3 From 52ba6f5a8c79d4463167e2a3b802aa5238a52b51 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Sun, 5 Aug 2012 17:12:03 +0900 Subject: class variable resolution should be same as const resolution --- src/variable.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/variable.c b/src/variable.c index 0b4288734..8b94f5bbb 100644 --- a/src/variable.c +++ b/src/variable.c @@ -233,8 +233,9 @@ mrb_obj_instance_variables(mrb_state *mrb, mrb_value self) mrb_value mrb_vm_cv_get(mrb_state *mrb, mrb_sym sym) { - struct RClass *c = mrb->ci->target_class; + struct RClass *c = mrb->ci->proc->target_class; + if (!c) c = mrb->ci->target_class; while (c) { if (c->iv) { khash_t(iv) *h = c->iv; @@ -251,10 +252,11 @@ mrb_vm_cv_get(mrb_state *mrb, mrb_sym sym) void mrb_vm_cv_set(mrb_state *mrb, mrb_sym sym, mrb_value v) { - struct RClass *c = mrb->ci->target_class; + struct RClass *c = mrb->ci->proc->target_class; khash_t(iv) *h; khiter_t k; + if (!c) c = mrb->ci->target_class; while (c) { if (c->iv) { h = c->iv; -- cgit v1.2.3 From 193c98ae540d43d082795fd77ea81a4f6f7fd0f6 Mon Sep 17 00:00:00 2001 From: Paolo Bosetti Date: Mon, 6 Aug 2012 14:55:28 +0200 Subject: Updated Xcode project build settings in conformity with 10.8/Xcode 4.4 --- xcode/mruby.xcodeproj/project.pbxproj | 153 +++++++++++++++++++++++++++++++++- 1 file changed, 152 insertions(+), 1 deletion(-) diff --git a/xcode/mruby.xcodeproj/project.pbxproj b/xcode/mruby.xcodeproj/project.pbxproj index 97247e264..a04426232 100644 --- a/xcode/mruby.xcodeproj/project.pbxproj +++ b/xcode/mruby.xcodeproj/project.pbxproj @@ -6,6 +6,26 @@ objectVersion = 46; objects = { +/* Begin PBXAggregateTarget section */ + 88D0984E15CFF54A002E0BE8 /* build all */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 88D0985115CFF54A002E0BE8 /* Build configuration list for PBXAggregateTarget "build all" */; + buildPhases = ( + ); + dependencies = ( + 88D0985415CFF561002E0BE8 /* PBXTargetDependency */, + 88D0985615CFF561002E0BE8 /* PBXTargetDependency */, + 88D0985815CFF561002E0BE8 /* PBXTargetDependency */, + 88D0985A15CFF561002E0BE8 /* PBXTargetDependency */, + 88D0985C15CFF561002E0BE8 /* PBXTargetDependency */, + 88D0985E15CFF561002E0BE8 /* PBXTargetDependency */, + 88D0986015CFF561002E0BE8 /* PBXTargetDependency */, + ); + name = "build all"; + productName = "make all"; + }; +/* End PBXAggregateTarget section */ + /* Begin PBXBuildFile section */ 8844359B157730E1007F95A4 /* mrbtest.c in Sources */ = {isa = PBXBuildFile; fileRef = 8844359A157730DB007F95A4 /* mrbtest.c */; }; 8844359C15773120007F95A4 /* libmruby.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8844353E1576F1A3007F95A4 /* libmruby.a */; }; @@ -123,6 +143,55 @@ remoteGlobalIDString = 88760AA115759B4F00113BFB; remoteInfo = ruby_lib; }; + 88D0985315CFF561002E0BE8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 88BF3371156C992100F12AC7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 88760AE415759EFE00113BFB; + remoteInfo = mruby_core; + }; + 88D0985515CFF561002E0BE8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 88BF3371156C992100F12AC7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 88760A8A157590F000113BFB; + remoteInfo = mrbc; + }; + 88D0985715CFF561002E0BE8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 88BF3371156C992100F12AC7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 88760AA115759B4F00113BFB; + remoteInfo = ruby_lib; + }; + 88D0985915CFF561002E0BE8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 88BF3371156C992100F12AC7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 88760B2315769E6100113BFB; + remoteInfo = mruby; + }; + 88D0985B15CFF561002E0BE8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 88BF3371156C992100F12AC7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 88760B3215769F3000113BFB; + remoteInfo = mirb; + }; + 88D0985D15CFF561002E0BE8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 88BF3371156C992100F12AC7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8844358E1577301B007F95A4; + remoteInfo = mrbtest; + }; + 88D0985F15CFF561002E0BE8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 88BF3371156C992100F12AC7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 88760B731576A33100113BFB; + remoteInfo = mruby_fw; + }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ @@ -786,7 +855,7 @@ 88BF3371156C992100F12AC7 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0430; + LastUpgradeCheck = 0440; }; buildConfigurationList = 88BF3374156C992100F12AC7 /* Build configuration list for PBXProject "mruby" */; compatibilityVersion = "Xcode 3.2"; @@ -808,6 +877,7 @@ 88760B3215769F3000113BFB /* mirb */, 8844358E1577301B007F95A4 /* mrbtest */, 88760B731576A33100113BFB /* mruby_fw */, + 88D0984E15CFF54A002E0BE8 /* build all */, ); }; /* End PBXProject section */ @@ -1007,6 +1077,41 @@ target = 88760AA115759B4F00113BFB /* ruby_lib */; targetProxy = 88760B891576A35C00113BFB /* PBXContainerItemProxy */; }; + 88D0985415CFF561002E0BE8 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 88760AE415759EFE00113BFB /* mruby_core */; + targetProxy = 88D0985315CFF561002E0BE8 /* PBXContainerItemProxy */; + }; + 88D0985615CFF561002E0BE8 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 88760A8A157590F000113BFB /* mrbc */; + targetProxy = 88D0985515CFF561002E0BE8 /* PBXContainerItemProxy */; + }; + 88D0985815CFF561002E0BE8 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 88760AA115759B4F00113BFB /* ruby_lib */; + targetProxy = 88D0985715CFF561002E0BE8 /* PBXContainerItemProxy */; + }; + 88D0985A15CFF561002E0BE8 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 88760B2315769E6100113BFB /* mruby */; + targetProxy = 88D0985915CFF561002E0BE8 /* PBXContainerItemProxy */; + }; + 88D0985C15CFF561002E0BE8 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 88760B3215769F3000113BFB /* mirb */; + targetProxy = 88D0985B15CFF561002E0BE8 /* PBXContainerItemProxy */; + }; + 88D0985E15CFF561002E0BE8 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 8844358E1577301B007F95A4 /* mrbtest */; + targetProxy = 88D0985D15CFF561002E0BE8 /* PBXContainerItemProxy */; + }; + 88D0986015CFF561002E0BE8 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 88760B731576A33100113BFB /* mruby_fw */; + targetProxy = 88D0985F15CFF561002E0BE8 /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ @@ -1033,6 +1138,7 @@ ); INSTALL_PATH = /; PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = ""; }; name = Debug; }; @@ -1048,6 +1154,7 @@ ); INSTALL_PATH = /; PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = ""; }; name = Release; }; @@ -1057,6 +1164,7 @@ DEPLOYMENT_LOCATION = YES; INSTALL_PATH = /; PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = ""; }; name = Debug; }; @@ -1066,12 +1174,14 @@ DEPLOYMENT_LOCATION = YES; INSTALL_PATH = /; PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = ""; }; name = Release; }; 88760AA415759B4F00113BFB /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + COMBINE_HIDPI_IMAGES = YES; DEPLOYMENT_LOCATION = YES; EXECUTABLE_PREFIX = lib; GCC_C_LANGUAGE_STANDARD = "compiler-default"; @@ -1081,12 +1191,14 @@ ); INSTALL_PATH = /lib; PRODUCT_NAME = mruby; + SDKROOT = ""; }; name = Debug; }; 88760AA515759B4F00113BFB /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + COMBINE_HIDPI_IMAGES = YES; DEPLOYMENT_LOCATION = YES; EXECUTABLE_PREFIX = lib; GCC_C_LANGUAGE_STANDARD = "compiler-default"; @@ -1096,12 +1208,14 @@ ); INSTALL_PATH = /lib; PRODUCT_NAME = mruby; + SDKROOT = ""; }; name = Release; }; 88760AE715759EFE00113BFB /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + COMBINE_HIDPI_IMAGES = YES; DEPLOYMENT_LOCATION = YES; EXECUTABLE_PREFIX = lib; GCC_C_LANGUAGE_STANDARD = "compiler-default"; @@ -1113,6 +1227,7 @@ INSTALL_PATH = /lib; LIBRARY_STYLE = STATIC; PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = ""; USE_HEADERMAP = "$(inherited)"; }; name = Debug; @@ -1120,6 +1235,7 @@ 88760AE815759EFE00113BFB /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + COMBINE_HIDPI_IMAGES = YES; DEPLOYMENT_LOCATION = YES; EXECUTABLE_PREFIX = lib; GCC_C_LANGUAGE_STANDARD = "compiler-default"; @@ -1130,6 +1246,7 @@ INSTALL_PATH = /lib; LIBRARY_STYLE = STATIC; PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = ""; USE_HEADERMAP = "$(inherited)"; }; name = Release; @@ -1145,6 +1262,7 @@ ); INSTALL_PATH = /; PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = ""; }; name = Debug; }; @@ -1159,6 +1277,7 @@ ); INSTALL_PATH = /; PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = ""; }; name = Release; }; @@ -1169,6 +1288,7 @@ GCC_C_LANGUAGE_STANDARD = "compiler-default"; INSTALL_PATH = /; PRODUCT_NAME = mirb; + SDKROOT = ""; }; name = Debug; }; @@ -1179,12 +1299,14 @@ GCC_C_LANGUAGE_STANDARD = "compiler-default"; INSTALL_PATH = /; PRODUCT_NAME = mirb; + SDKROOT = ""; }; name = Release; }; 88760B871576A33100113BFB /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + COMBINE_HIDPI_IMAGES = YES; DEPLOYMENT_LOCATION = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; @@ -1199,6 +1321,7 @@ INFOPLIST_FILE = "mruby_fw/mruby_fw-Info.plist"; INSTALL_PATH = /; PRODUCT_NAME = mruby; + SDKROOT = ""; WRAPPER_EXTENSION = framework; }; name = Debug; @@ -1206,6 +1329,7 @@ 88760B881576A33100113BFB /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + COMBINE_HIDPI_IMAGES = YES; DEPLOYMENT_LOCATION = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; @@ -1220,6 +1344,7 @@ INFOPLIST_FILE = "mruby_fw/mruby_fw-Info.plist"; INSTALL_PATH = /; PRODUCT_NAME = mruby; + SDKROOT = ""; WRAPPER_EXTENSION = framework; }; name = Release; @@ -1285,6 +1410,7 @@ 88BF3596156CA10D00F12AC7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + COMBINE_HIDPI_IMAGES = YES; DEBUGGING_SYMBOLS = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_OPTIMIZATION_LEVEL = 0; @@ -1297,12 +1423,29 @@ 88BF3597156CA10D00F12AC7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + COMBINE_HIDPI_IMAGES = YES; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ""; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; + 88D0984F15CFF54A002E0BE8 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = ""; + }; + name = Debug; + }; + 88D0985015CFF54A002E0BE8 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = ""; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -1387,6 +1530,14 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 88D0985115CFF54A002E0BE8 /* Build configuration list for PBXAggregateTarget "build all" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 88D0984F15CFF54A002E0BE8 /* Debug */, + 88D0985015CFF54A002E0BE8 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; /* End XCConfigurationList section */ }; rootObject = 88BF3371156C992100F12AC7 /* Project object */; -- cgit v1.2.3