diff options
| -rw-r--r-- | build_config/cross-32bit.rb | 2 | ||||
| -rw-r--r-- | build_config/no-float.rb | 3 | ||||
| -rw-r--r-- | include/mruby/boxing_word.h | 6 | ||||
| -rw-r--r-- | include/mruby/numeric.h | 7 | ||||
| -rw-r--r-- | include/mruby/presym/enable.h | 6 | ||||
| -rw-r--r-- | include/mruby/proc.h | 4 | ||||
| -rw-r--r-- | include/mruby/value.h | 2 | ||||
| -rw-r--r-- | lib/mruby/build.rb | 10 | ||||
| -rw-r--r-- | mrbgems/full-core.gembox | 5 | ||||
| -rw-r--r-- | mrbgems/mruby-bin-config/mrbgem.rake | 51 | ||||
| -rw-r--r-- | mrbgems/mruby-bin-mruby/tools/mruby/mruby.c | 2 | ||||
| -rw-r--r-- | mrbgems/mruby-compiler/core/codegen.c | 4 | ||||
| -rw-r--r-- | mrbgems/mruby-io/src/io.c | 114 | ||||
| -rw-r--r-- | mrbgems/mruby-rational/src/rational.c | 8 | ||||
| -rw-r--r-- | mrbgems/mruby-symbol-ext/test/symbol.rb | 2 | ||||
| -rw-r--r-- | src/class.c | 22 | ||||
| -rw-r--r-- | src/hash.c | 2 | ||||
| -rw-r--r-- | src/load.c | 157 | ||||
| -rw-r--r-- | src/proc.c | 4 | ||||
| -rw-r--r-- | src/symbol.c | 43 | ||||
| -rw-r--r-- | tasks/presym.rake | 7 | ||||
| -rw-r--r-- | tasks/test.rake | 16 |
22 files changed, 230 insertions, 247 deletions
diff --git a/build_config/cross-32bit.rb b/build_config/cross-32bit.rb index 82d5d023f..b3feb21f6 100644 --- a/build_config/cross-32bit.rb +++ b/build_config/cross-32bit.rb @@ -1,6 +1,6 @@ # Define cross build settings MRuby::CrossBuild.new('cross-32bit') do |conf| - toolchain :gcc + conf.toolchain :gcc conf.cc.flags << "-m32" conf.linker.flags << "-m32" diff --git a/build_config/no-float.rb b/build_config/no-float.rb index 7df7c2e46..e0738cac4 100644 --- a/build_config/no-float.rb +++ b/build_config/no-float.rb @@ -2,13 +2,12 @@ MRuby::CrossBuild.new('no-float') do |conf| conf.toolchain - # include the GEM box + # Add configuration conf.compilers.each do |c| c.defines << "MRB_NO_FLOAT" end conf.gem :core => "mruby-bin-mruby" - conf.gem :core => "mruby-test" conf.test_runner.command = 'env' diff --git a/include/mruby/boxing_word.h b/include/mruby/boxing_word.h index 9e01de4ed..86a04368f 100644 --- a/include/mruby/boxing_word.h +++ b/include/mruby/boxing_word.h @@ -55,8 +55,6 @@ enum mrb_special_consts { #define BOXWORD_SYMBOL_MASK ((1 << BOXWORD_SYMBOL_BIT_POS) - 1) #define BOXWORD_IMMEDIATE_MASK 0x07 -#define BOXWORD_SHIFT_VALUE(o,n,t) \ - (t)(((intptr_t)(o).w) >> BOXWORD_##n##_SHIFT) #define BOXWORD_SET_SHIFT_VALUE(o,n,v) \ ((o).w = (((uintptr_t)(v)) << BOXWORD_##n##_SHIFT) | BOXWORD_##n##_FLAG) #define BOXWORD_SHIFT_VALUE_P(o,n) \ @@ -123,7 +121,7 @@ MRB_API mrb_value mrb_word_boxing_int_value(struct mrb_state*, mrb_int); #ifndef MRB_NO_FLOAT #define mrb_float(o) mrb_val_union(o).fp->f #endif -#define mrb_fixnum(o) BOXWORD_SHIFT_VALUE(o, FIXNUM, mrb_int) +#define mrb_fixnum(o) (mrb_int)(((intptr_t)(o).w) >> BOXWORD_FIXNUM_SHIFT) MRB_INLINE mrb_int mrb_integer_func(mrb_value o) { if (mrb_immediate_p(o)) return mrb_fixnum(o); @@ -133,7 +131,7 @@ mrb_integer_func(mrb_value o) { #ifdef MRB_64BIT #define mrb_symbol(o) mrb_val_union(o).sym #else -#define mrb_symbol(o) BOXWORD_SHIFT_VALUE(o, SYMBOL, mrb_sym) +#define mrb_symbol(o) (mrb_sym)(((o).w) >> BOXWORD_SYMBOL_SHIFT) #endif #define mrb_bool(o) (((o).w & ~(uintptr_t)MRB_Qfalse) != 0) diff --git a/include/mruby/numeric.h b/include/mruby/numeric.h index 683a5b41c..fc6cacfda 100644 --- a/include/mruby/numeric.h +++ b/include/mruby/numeric.h @@ -90,10 +90,6 @@ mrb_int_mul_overflow(mrb_int multiplier, mrb_int multiplicand, mrb_int *product) #else -#define MRB_UINT_MAKE2(n) uint ## n ## _t -#define MRB_UINT_MAKE(n) MRB_UINT_MAKE2(n) -#define mrb_uint MRB_UINT_MAKE(MRB_INT_BIT) - #define MRB_INT_OVERFLOW_MASK ((mrb_uint)1 << (MRB_INT_BIT - 1)) static inline mrb_bool @@ -135,9 +131,6 @@ mrb_int_mul_overflow(mrb_int a, mrb_int b, mrb_int *c) } #undef MRB_INT_OVERFLOW_MASK -#undef mrb_uint -#undef MRB_UINT_MAKE -#undef MRB_UINT_MAKE2 #endif diff --git a/include/mruby/presym/enable.h b/include/mruby/presym/enable.h index 0aec7274d..ddeb17e32 100644 --- a/include/mruby/presym/enable.h +++ b/include/mruby/presym/enable.h @@ -8,11 +8,7 @@ #define MRUBY_PRESYM_ENABLE_H #undef MRB_PRESYM_MAX -#ifdef MRB_USE_ALL_SYMBOLS -# define MRB_PRESYM_NAMED(lit, num, type, name) MRB_##type##__##name = (num), -#else -# define MRB_PRESYM_NAMED(lit, num, type, name) MRB_##type##__##name = (num<<1), -#endif +#define MRB_PRESYM_NAMED(lit, num, type, name) MRB_##type##__##name = (num), #define MRB_PRESYM_UNNAMED(lit, num) enum mruby_presym { diff --git a/include/mruby/proc.h b/include/mruby/proc.h index be45a06d8..0edd3e1f1 100644 --- a/include/mruby/proc.h +++ b/include/mruby/proc.h @@ -105,7 +105,7 @@ MRB_API mrb_value mrb_proc_cfunc_env_get(mrb_state *mrb, mrb_int idx); #ifndef MRB_USE_METHOD_T_STRUCT #define MRB_METHOD_FUNC_P(m) (((uintptr_t)(m))&MRB_METHOD_FUNC_FL) -#define MRB_METHOD_NOARG_P(m) (((uintptr_t)(m))&MRB_METHOD_NOARG_FL) +#define MRB_METHOD_NOARG_P(m) ((((uintptr_t)(m))&MRB_METHOD_NOARG_FL)?1:0) #define MRB_METHOD_NOARG_SET(m) ((m)=(mrb_method_t)(((uintptr_t)(m))|MRB_METHOD_NOARG_FL)) #define MRB_METHOD_FUNC(m) ((mrb_func_t)((uintptr_t)(m)>>2)) #define MRB_METHOD_FROM_FUNC(m,fn) ((m)=(mrb_method_t)((((uintptr_t)(fn))<<2)|MRB_METHOD_FUNC_FL)) @@ -117,7 +117,7 @@ MRB_API mrb_value mrb_proc_cfunc_env_get(mrb_state *mrb, mrb_int idx); #else #define MRB_METHOD_FUNC_P(m) ((m).flags&MRB_METHOD_FUNC_FL) -#define MRB_METHOD_NOARG_P(m) ((m).flags&MRB_METHOD_NOARG_FL) +#define MRB_METHOD_NOARG_P(m) (((m).flags&MRB_METHOD_NOARG_FL)?1:0) #define MRB_METHOD_FUNC(m) ((m).func) #define MRB_METHOD_NOARG_SET(m) do{(m).flags|=MRB_METHOD_NOARG_FL;}while(0) #define MRB_METHOD_FROM_FUNC(m,fn) do{(m).flags=MRB_METHOD_FUNC_FL;(m).func=(fn);}while(0) diff --git a/include/mruby/value.h b/include/mruby/value.h index 2b1fbd7a6..293ef90a7 100644 --- a/include/mruby/value.h +++ b/include/mruby/value.h @@ -168,8 +168,6 @@ struct RCptr { #include "boxing_no.h" #endif -#define MRB_SYMBOL_BIT (sizeof(mrb_sym) * CHAR_BIT - MRB_SYMBOL_SHIFT) - #if INTPTR_MAX < MRB_INT_MAX typedef intptr_t mrb_ssize; # define MRB_SSIZE_MAX INTPTR_MAX diff --git a/lib/mruby/build.rb b/lib/mruby/build.rb index ca2b28457..601c72b12 100644 --- a/lib/mruby/build.rb +++ b/lib/mruby/build.rb @@ -515,11 +515,7 @@ EOS unless mrbcfile_external? || MRuby.targets['host'] # add minimal 'host' MRuby::Build.new('host') do |conf| - if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] - toolchain :visualcpp - else - toolchain :gcc - end + conf.toolchain conf.build_mrbc_exec conf.disable_libmruby conf.disable_presym @@ -527,6 +523,10 @@ EOS end end + def mrbcfile + mrbcfile_external? ? super : MRuby::targets['host'].mrbcfile + end + def run_test @test_runner.runner_options << verbose_flag mrbtest = exefile("#{build_dir}/bin/mrbtest") diff --git a/mrbgems/full-core.gembox b/mrbgems/full-core.gembox index 9a5b7081b..e0d008f06 100644 --- a/mrbgems/full-core.gembox +++ b/mrbgems/full-core.gembox @@ -1,9 +1,6 @@ MRuby::GemBox.new do |conf| - conf.gem :core => "mruby-sprintf" - conf.gem :core => "mruby-print" - Dir.glob("#{root}/mrbgems/mruby-*/mrbgem.rake") do |x| g = File.basename File.dirname x - conf.gem :core => g unless g =~ /^mruby-(print|sprintf|bin-debugger|test)$/ + conf.gem :core => g unless g =~ /^mruby-(?:bin-debugger|test)$/ end end diff --git a/mrbgems/mruby-bin-config/mrbgem.rake b/mrbgems/mruby-bin-config/mrbgem.rake index 57096c8c9..b4c437640 100644 --- a/mrbgems/mruby-bin-config/mrbgem.rake +++ b/mrbgems/mruby-bin-config/mrbgem.rake @@ -1,30 +1,35 @@ -if MRuby::Build.current.kind_of?(MRuby::CrossBuild) - gemname = File.basename File.dirname __FILE__ - buildname = MRuby::Build.current.name - $stderr.puts "WARN #{gemname} - This mrbgem is ignored within #{buildname}" -else - MRuby::Gem::Specification.new('mruby-bin-config') do |spec| - name = 'mruby-config' - spec.license = 'MIT' - spec.author = 'mruby developers' - spec.summary = "#{name} command" +iscross = MRuby::Build.current.kind_of?(MRuby::CrossBuild) +MRuby::Gem::Specification.new('mruby-bin-config') do |spec| + name = 'mruby-config' + spec.license = 'MIT' + spec.author = 'mruby developers' + spec.summary = "#{name} command" + + if iscross + mruby_config_dir = "#{build.build_dir}/host-bin" + else mruby_config_dir = "#{build.build_dir}/bin" - mruby_config = name + (ENV['OS'] == 'Windows_NT' ? '.bat' : '') - mruby_config_path = "#{mruby_config_dir}/#{mruby_config}" - make_cfg = "#{build.build_dir}/lib/libmruby.flags.mak" - tmplt_path = "#{__dir__}/#{mruby_config}" + end + mruby_config = name + (ENV['OS'] == 'Windows_NT' ? '.bat' : '') + mruby_config_path = "#{mruby_config_dir}/#{mruby_config}" + make_cfg = "#{build.build_dir}/lib/libmruby.flags.mak" + tmplt_path = "#{__dir__}/#{mruby_config}" + + if iscross + build.products << mruby_config_path + else build.bins << mruby_config + end - directory mruby_config_dir + directory mruby_config_dir - file mruby_config_path => [mruby_config_dir, make_cfg, tmplt_path] do |t| - config = Hash[File.readlines(make_cfg).map!(&:chomp).map! {|l| - l.gsub('\\"', '"').split(' = ', 2).map! {|s| s.sub(/^(?=.)/, 'echo ')} - }] - tmplt = File.read(tmplt_path) - File.write(t.name, tmplt.gsub(/(#{Regexp.union(*config.keys)})\b/, config)) - chmod(0755, t.name) - end + file mruby_config_path => [mruby_config_dir, make_cfg, tmplt_path] do |t| + config = Hash[File.readlines(make_cfg).map!(&:chomp).map! {|l| + l.gsub('\\"', '"').split(' = ', 2).map! {|s| s.sub(/^(?=.)/, 'echo ')} + }] + tmplt = File.read(tmplt_path) + File.write(t.name, tmplt.gsub(/(#{Regexp.union(*config.keys)})\b/, config)) + chmod(0755, t.name) end end diff --git a/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c b/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c index 5c8b631a4..5c49b6d94 100644 --- a/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +++ b/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c @@ -235,7 +235,7 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args) } #if defined(_WIN32) || defined(_WIN64) if (args->rfp == stdin) { - setmode(_fileno(stdin), O_BINARY); + _setmode(_fileno(stdin), O_BINARY); } #endif args->argv = (char **)mrb_realloc(mrb, args->argv, sizeof(char*) * (argc + 1)); diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index 00a33021f..a2ac46d40 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -110,8 +110,6 @@ static void raise_error(codegen_scope *s, const char *msg); static void codegen_error(codegen_scope *s, const char *message) { - int i; - if (!s) return; while (s->prev) { codegen_scope *tmp = s->prev; @@ -128,7 +126,7 @@ codegen_error(codegen_scope *s, const char *message) mrb_free(s->mrb, s->catch_table); if (s->reps) { /* copied from mrb_irep_free() in state.c */ - for (i=0; i<s->irep->rlen; i++) { + for (int i=0; i<s->irep->rlen; i++) { if (s->reps[i]) mrb_irep_decref(s->mrb, (mrb_irep*)s->reps[i]); } diff --git a/mrbgems/mruby-io/src/io.c b/mrbgems/mruby-io/src/io.c index 05eda4ad5..31ea572a4 100644 --- a/mrbgems/mruby-io/src/io.c +++ b/mrbgems/mruby-io/src/io.c @@ -326,6 +326,9 @@ mrb_io_alloc(mrb_state *mrb) #define NOFILE 64 #endif +#if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE +# define mrb_io_s_popen mrb_notimplement_m +#else static int option_to_fd(mrb_state *mrb, mrb_value v) { @@ -344,22 +347,42 @@ option_to_fd(mrb_state *mrb, mrb_value v) return -1; /* never reached */ } -#ifdef _WIN32 static mrb_value -mrb_io_s_popen(mrb_state *mrb, mrb_value klass) +mrb_io_s_popen_args(mrb_state *mrb, mrb_value klass, + const char **cmd, int *flags, int *doexec, + int *opt_in, int *opt_out, int *opt_err) { - mrb_value cmd, io; - mrb_value mode = mrb_str_new_cstr(mrb, "r"); - mrb_value kv[3]; + mrb_value mode = mrb_nil_value(); + struct { mrb_value opt_in, opt_out, opt_err; } kv; mrb_sym knames[3] = {MRB_SYM(in), MRB_SYM(out), MRB_SYM(err)}; const mrb_kwargs kw = { 3, 0, knames, - kv, + &kv.opt_in, NULL, }; + + mrb_get_args(mrb, "z|o:", cmd, &mode, &kw); + + *flags = mrb_io_mode_to_flags(mrb, mode); + *doexec = (strcmp("-", *cmd) != 0); + *opt_in = option_to_fd(mrb, kv.opt_in); + *opt_out = option_to_fd(mrb, kv.opt_out); + *opt_err = option_to_fd(mrb, kv.opt_err); + + return mrb_obj_value(mrb_data_object_alloc(mrb, mrb_class_ptr(klass), NULL, &mrb_io_type)); +} + +#ifdef _WIN32 +static mrb_value +mrb_io_s_popen(mrb_state *mrb, mrb_value klass) +{ + mrb_value io; + int doexec; + int opt_in, opt_out, opt_err; + const char *cmd; + struct mrb_io *fptr; - const char *pname; int pid = 0, flags; STARTUPINFO si; PROCESS_INFORMATION pi; @@ -368,23 +391,13 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass) HANDLE ifd[2]; HANDLE ofd[2]; - int doexec; - ifd[0] = INVALID_HANDLE_VALUE; ifd[1] = INVALID_HANDLE_VALUE; ofd[0] = INVALID_HANDLE_VALUE; ofd[1] = INVALID_HANDLE_VALUE; - mrb_get_args(mrb, "S|o:", &cmd, &mode, &kw, &kv); - io = mrb_obj_value(mrb_data_object_alloc(mrb, mrb_class_ptr(klass), NULL, &mrb_io_type)); - - pname = RSTRING_CSTR(mrb, cmd); - flags = mrb_io_mode_to_flags(mrb, mode); - - doexec = (strcmp("-", pname) != 0); - option_to_fd(mrb, kv[0]); - option_to_fd(mrb, kv[1]); - option_to_fd(mrb, kv[2]); + io = mrb_io_s_popen_args(mrb, klass, &cmd, &flags, &doexec, + &opt_in, &opt_out, &opt_err); saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); saAttr.bInheritHandle = TRUE; @@ -419,13 +432,13 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass) si.hStdInput = ifd[0]; } if (!CreateProcess( - NULL, (char*)pname, NULL, NULL, + NULL, (char*)cmd, NULL, NULL, TRUE, CREATE_NEW_PROCESS_GROUP, NULL, NULL, &si, &pi)) { CloseHandle(ifd[0]); CloseHandle(ifd[1]); CloseHandle(ofd[0]); CloseHandle(ofd[1]); - mrb_raisef(mrb, E_IO_ERROR, "command not found: %v", cmd); + mrb_raisef(mrb, E_IO_ERROR, "command not found: %s", cmd); } CloseHandle(pi.hThread); CloseHandle(ifd[0]); @@ -447,46 +460,23 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass) DATA_PTR(io) = fptr; return io; } -#elif defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE -static mrb_value -mrb_io_s_popen(mrb_state *mrb, mrb_value klass) -{ - mrb_raise(mrb, E_NOTIMP_ERROR, "IO#popen is not supported on the platform"); - return mrb_false_value(); -} #else static mrb_value mrb_io_s_popen(mrb_state *mrb, mrb_value klass) { - mrb_value cmd, io, result; - mrb_value mode = mrb_str_new_cstr(mrb, "r"); - mrb_value kv[3]; - mrb_sym knames[3] = {MRB_SYM(in), MRB_SYM(out), MRB_SYM(err)}; - const mrb_kwargs kw = { - 3, 0, - knames, - kv, - NULL, - }; + mrb_value io, result; + int doexec; + int opt_in, opt_out, opt_err; + const char *cmd; + struct mrb_io *fptr; - const char *pname; int pid, flags, fd, write_fd = -1; int pr[2] = { -1, -1 }; int pw[2] = { -1, -1 }; - int doexec; int saved_errno; - int opt_in, opt_out, opt_err; - - mrb_get_args(mrb, "S|o:", &cmd, &mode, &kw); - io = mrb_obj_value(mrb_data_object_alloc(mrb, mrb_class_ptr(klass), NULL, &mrb_io_type)); - - pname = RSTRING_CSTR(mrb, cmd); - flags = mrb_io_mode_to_flags(mrb, mode); - doexec = (strcmp("-", pname) != 0); - opt_in = option_to_fd(mrb, kv[0]); - opt_out = option_to_fd(mrb, kv[1]); - opt_err = option_to_fd(mrb, kv[2]); + io = mrb_io_s_popen_args(mrb, klass, &cmd, &flags, &doexec, + &opt_in, &opt_out, &opt_err); if (OPEN_READABLE_P(flags)) { if (pipe(pr) == -1) { @@ -543,8 +533,8 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass) for (fd = 3; fd < NOFILE; fd++) { close(fd); } - mrb_proc_exec(pname); - mrb_raisef(mrb, E_IO_ERROR, "command not found: %v", cmd); + mrb_proc_exec(cmd); + mrb_raisef(mrb, E_IO_ERROR, "command not found: %s", cmd); _exit(127); } result = mrb_nil_value(); @@ -595,7 +585,8 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass) } return result; } -#endif +#endif /* _WIN32 */ +#endif /* TARGET_OS_IPHONE */ static int mrb_dup(mrb_state *mrb, int fd, mrb_bool *failed) @@ -1339,10 +1330,10 @@ mrb_io_fileno_m(mrb_state *mrb, mrb_value io) return mrb_fixnum_value(fd); } +#if defined(F_GETFD) && defined(F_SETFD) && defined(FD_CLOEXEC) static mrb_value mrb_io_close_on_exec_p(mrb_state *mrb, mrb_value self) { -#if defined(F_GETFD) && defined(F_SETFD) && defined(FD_CLOEXEC) struct mrb_io *fptr; int ret; @@ -1356,17 +1347,15 @@ mrb_io_close_on_exec_p(mrb_state *mrb, mrb_value self) if ((ret = fcntl(fptr->fd, F_GETFD)) == -1) mrb_sys_fail(mrb, "F_GETFD failed"); if (!(ret & FD_CLOEXEC)) return mrb_false_value(); return mrb_true_value(); - +} #else - mrb_raise(mrb, E_NOTIMP_ERROR, "IO#close_on_exec? is not supported on the platform"); - return mrb_false_value(); +# define mrb_io_close_on_exec_p mrb_notimplement_m #endif -} +#if defined(F_GETFD) && defined(F_SETFD) && defined(FD_CLOEXEC) static mrb_value mrb_io_set_close_on_exec(mrb_state *mrb, mrb_value self) { -#if defined(F_GETFD) && defined(F_SETFD) && defined(FD_CLOEXEC) struct mrb_io *fptr; int flag, ret; mrb_bool b; @@ -1393,11 +1382,10 @@ mrb_io_set_close_on_exec(mrb_state *mrb, mrb_value self) } return mrb_bool_value(b); +} #else - mrb_raise(mrb, E_NOTIMP_ERROR, "IO#close_on_exec= is not supported on the platform"); - return mrb_nil_value(); +# define mrb_io_set_close_on_exec mrb_notimplement_m #endif -} static mrb_value mrb_io_set_sync(mrb_state *mrb, mrb_value self) diff --git a/mrbgems/mruby-rational/src/rational.c b/mrbgems/mruby-rational/src/rational.c index 4093f1b13..5e25bfb99 100644 --- a/mrbgems/mruby-rational/src/rational.c +++ b/mrbgems/mruby-rational/src/rational.c @@ -160,8 +160,8 @@ rational_new_i(mrb_state *mrb, mrb_int n, mrb_int d) static void float_decode_internal(mrb_state *mrb, mrb_float f, mrb_float *rf, int *n) { - f = frexp_rat(f, n); - f = ldexp_rat(f, RAT_MANT_DIG); + f = (mrb_float)frexp_rat(f, n); + f = (mrb_float)ldexp_rat(f, RAT_MANT_DIG); *n -= RAT_MANT_DIG; *rf = f; } @@ -188,7 +188,7 @@ rational_new_f(mrb_state *mrb, mrb_float f0) else { n = -n; } - return rational_new_i(mrb, f, 1L<<n); + return rational_new_i(mrb, (mrb_int)f, ((mrb_int)1)<<n); #else mrb_int pow = 1; if (n < 0) { @@ -206,7 +206,7 @@ rational_new_f(mrb_state *mrb, mrb_float f0) while (n--) { pow *= FLT_RADIX; } - return rational_new(mrb, f*pow, 1); + return rational_new(mrb, (mrb_int)f*pow, 1); } #endif } diff --git a/mrbgems/mruby-symbol-ext/test/symbol.rb b/mrbgems/mruby-symbol-ext/test/symbol.rb index db686e5f4..a4fb27733 100644 --- a/mrbgems/mruby-symbol-ext/test/symbol.rb +++ b/mrbgems/mruby-symbol-ext/test/symbol.rb @@ -48,7 +48,7 @@ assert("Symbol#casecmp") do end assert("Symbol#empty?") do - assert_true :''.empty? + assert_false :'a'.empty? end assert('Symbol#intern') do diff --git a/src/class.c b/src/class.c index 1c0c0b1a4..287d63da3 100644 --- a/src/class.c +++ b/src/class.c @@ -26,7 +26,8 @@ union mt_ptr { struct mt_elem { union mt_ptr ptr; size_t func_p:1; - mrb_sym key:sizeof(mrb_sym)*8-1; + size_t noarg_p:1; + mrb_sym key:sizeof(mrb_sym)*8-2; }; /* method table structure */ @@ -50,7 +51,7 @@ mt_new(mrb_state *mrb) return t; } -static struct mt_elem *mt_put(mrb_state *mrb, mt_tbl *t, mrb_sym sym, size_t func_p, union mt_ptr ptr); +static struct mt_elem *mt_put(mrb_state *mrb, mt_tbl *t, mrb_sym sym, size_t func_p, size_t noarg_p, union mt_ptr ptr); static void mt_rehash(mrb_state *mrb, mt_tbl *t) @@ -71,7 +72,7 @@ mt_rehash(mrb_state *mrb, mt_tbl *t) /* key = 0 means empty or deleted */ if (slot->key != 0) { - mt_put(mrb, t, slot->key, slot->func_p, slot->ptr); + mt_put(mrb, t, slot->key, slot->func_p, slot->noarg_p, slot->ptr); } } mrb_free(mrb, old_table); @@ -81,7 +82,7 @@ mt_rehash(mrb_state *mrb, mt_tbl *t) /* Set the value for the symbol in the method table. */ static struct mt_elem* -mt_put(mrb_state *mrb, mt_tbl *t, mrb_sym sym, size_t func_p, union mt_ptr ptr) +mt_put(mrb_state *mrb, mt_tbl *t, mrb_sym sym, size_t func_p, size_t noarg_p, union mt_ptr ptr) { size_t hash, pos, start; struct mt_elem *dslot = NULL; @@ -96,6 +97,7 @@ mt_put(mrb_state *mrb, mt_tbl *t, mrb_sym sym, size_t func_p, union mt_ptr ptr) if (slot->key == sym) { slot->func_p = func_p; + slot->noarg_p = noarg_p; slot->ptr = ptr; return slot; } @@ -104,6 +106,7 @@ mt_put(mrb_state *mrb, mt_tbl *t, mrb_sym sym, size_t func_p, union mt_ptr ptr) t->size++; slot->key = sym; slot->func_p = func_p; + slot->noarg_p = noarg_p; slot->ptr = ptr; return slot; } @@ -117,6 +120,7 @@ mt_put(mrb_state *mrb, mt_tbl *t, mrb_sym sym, size_t func_p, union mt_ptr ptr) t->size++; dslot->key = sym; dslot->func_p = func_p; + dslot->noarg_p = noarg_p; dslot->ptr = ptr; return dslot; } @@ -202,7 +206,7 @@ mt_copy(mrb_state *mrb, mt_tbl *t) struct mt_elem *slot = &t->table[i]; if (slot->key) { - mt_put(mrb, t2, slot->key, slot->func_p, slot->ptr); + mt_put(mrb, t2, slot->key, slot->func_p, slot->noarg_p, slot->ptr); } } return t2; @@ -238,6 +242,9 @@ mrb_mt_foreach(mrb_state *mrb, struct RClass *c, mrb_mt_foreach_func *fn, void * else { MRB_METHOD_FROM_PROC(m, slot->ptr.proc); } + if (slot->noarg_p) { + MRB_METHOD_NOARG_SET(m); + } if (fn(mrb, slot->key, m, p) != 0) return; @@ -739,7 +746,7 @@ mrb_define_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, mrb_method_ else { ptr.func = MRB_METHOD_FUNC(m); } - mt_put(mrb, h, mid, MRB_METHOD_FUNC_P(m), ptr); + mt_put(mrb, h, mid, MRB_METHOD_FUNC_P(m), MRB_METHOD_NOARG_P(m), ptr); mc_clear(mrb); } @@ -1747,6 +1754,9 @@ mrb_method_search_vm(mrb_state *mrb, struct RClass **cp, mrb_sym mid) else { MRB_METHOD_FROM_PROC(m, e->ptr.proc); } + if (e->noarg_p) { + MRB_METHOD_NOARG_SET(m); + } #ifndef MRB_NO_METHOD_CACHE mc->c = oc; mc->c0 = c; diff --git a/src/hash.c b/src/hash.c index fe14865cf..8ca2f666e 100644 --- a/src/hash.c +++ b/src/hash.c @@ -365,7 +365,7 @@ ea_next_capa_for(uint32_t size, uint32_t max_capa) * `EA_INCREASE_RATIO` is the current value, 32-bit range will not be * exceeded during the calculation of `capa`, so `size_t` is used. */ - size_t capa = size * EA_INCREASE_RATIO, inc = capa - size; + size_t capa = (size_t)size * EA_INCREASE_RATIO, inc = capa - size; if (EA_MAX_INCREASE < inc) capa = size + EA_MAX_INCREASE; return capa <= max_capa ? U32(capa) : max_capa; } diff --git a/src/load.c b/src/load.c index 48496ba48..0b98fba66 100644 --- a/src/load.c +++ b/src/load.c @@ -26,6 +26,17 @@ #define SIZE_ERROR_MUL(nmemb, size) ((size_t)(nmemb) > SIZE_MAX / (size)) +#define DEFINE_READ_IREP_FUNC(funcdecl, basecall) \ + funcdecl \ + { \ + int ai = mrb_gc_arena_save(mrb); \ + struct RProc *proc = basecall; \ + struct mrb_irep *irep = (mrb_irep*)(proc ? proc->body.irep : NULL); \ + if (irep) proc->body.irep = NULL; \ + mrb_gc_arena_restore(mrb, ai); \ + return irep; \ + } + static size_t offset_crc_body(void) { @@ -58,29 +69,20 @@ str_to_double(mrb_state *mrb, const char *p) mrb_value mrb_str_len_to_inum(mrb_state *mrb, const char *str, size_t len, mrb_int base, int badcheck); -static void -tempirep_free(mrb_state *mrb, void *p) -{ - if (p) mrb_irep_decref(mrb, (mrb_irep *)p); -} - -static const mrb_data_type tempirep_type = { "temporary irep", tempirep_free }; - -static mrb_irep* -read_irep_record_1(mrb_state *mrb, const uint8_t *bin, size_t *len, uint8_t flags) +static mrb_bool +read_irep_record_1(mrb_state *mrb, const uint8_t *bin, size_t *len, uint8_t flags, mrb_irep **irepp) { int i; const uint8_t *src = bin; ptrdiff_t diff; uint16_t tt, pool_data_len, snl; int plen; - struct RData *irep_obj = mrb_data_object_alloc(mrb, mrb->object_class, NULL, &tempirep_type); mrb_pool_value *pool; mrb_sym *syms; int ai = mrb_gc_arena_save(mrb); mrb_irep *irep = mrb_add_irep(mrb); - irep_obj->data = irep; + *irepp = irep; /* skip record size */ src += sizeof(uint32_t); @@ -94,7 +96,7 @@ read_irep_record_1(mrb_state *mrb, const uint8_t *bin, size_t *len, uint8_t flag src += sizeof(uint16_t); /* number of child irep */ - irep->rlen = (size_t)bin_to_uint16(src); + irep->rlen = (uint8_t)bin_to_uint16(src); src += sizeof(uint16_t); /* Binary Data Section */ @@ -109,7 +111,7 @@ read_irep_record_1(mrb_state *mrb, const uint8_t *bin, size_t *len, uint8_t flag sizeof(struct mrb_irep_catch_handler) * irep->clen; mrb_static_assert1(sizeof(struct mrb_irep_catch_handler) == 13); if (SIZE_ERROR_MUL(irep->ilen, sizeof(mrb_code))) { - return NULL; + return FALSE; } if ((flags & FLAG_SRC_MALLOC) == 0) { irep->iseq = (mrb_code*)src; @@ -128,7 +130,7 @@ read_irep_record_1(mrb_state *mrb, const uint8_t *bin, size_t *len, uint8_t flag src += sizeof(uint16_t); if (plen > 0) { if (SIZE_ERROR_MUL(plen, sizeof(mrb_value))) { - return NULL; + return FALSE; } irep->pool = pool = (mrb_pool_value*)mrb_calloc(mrb, sizeof(mrb_pool_value), plen); @@ -162,7 +164,7 @@ read_irep_record_1(mrb_state *mrb, const uint8_t *bin, size_t *len, uint8_t flag } break; #else - return NULL; /* INT64 not supported on MRB_32BIT */ + return FALSE; /* INT64 not supported on MRB_32BIT */ #endif case IREP_TT_FLOAT: @@ -172,7 +174,7 @@ read_irep_record_1(mrb_state *mrb, const uint8_t *bin, size_t *len, uint8_t flag src += sizeof(double); break; #else - return NULL; /* MRB_NO_FLOAT */ + return FALSE; /* MRB_NO_FLOAT */ #endif case IREP_TT_STR: @@ -194,7 +196,7 @@ read_irep_record_1(mrb_state *mrb, const uint8_t *bin, size_t *len, uint8_t flag default: /* should not happen */ - return NULL; + return FALSE; } irep->plen = i+1; } @@ -205,7 +207,7 @@ read_irep_record_1(mrb_state *mrb, const uint8_t *bin, size_t *len, uint8_t flag src += sizeof(uint16_t); if (irep->slen > 0) { if (SIZE_ERROR_MUL(irep->slen, sizeof(mrb_sym))) { - return NULL; + return FALSE; } irep->syms = syms = (mrb_sym *)mrb_malloc(mrb, sizeof(mrb_sym) * irep->slen); @@ -233,54 +235,60 @@ read_irep_record_1(mrb_state *mrb, const uint8_t *bin, size_t *len, uint8_t flag mrb_assert_int_fit(ptrdiff_t, diff, size_t, SIZE_MAX); *len = (size_t)diff; - irep_obj->data = NULL; - - return irep; + return TRUE; } -static mrb_irep* -read_irep_record(mrb_state *mrb, const uint8_t *bin, size_t *len, uint8_t flags) +static mrb_bool +read_irep_record(mrb_state *mrb, const uint8_t *bin, size_t *len, uint8_t flags, mrb_irep **irepp) { - struct RData *irep_obj = mrb_data_object_alloc(mrb, mrb->object_class, NULL, &tempirep_type); int ai = mrb_gc_arena_save(mrb); - mrb_irep *irep = read_irep_record_1(mrb, bin, len, flags); + mrb_bool readsuccess = read_irep_record_1(mrb, bin, len, flags, irepp); mrb_irep **reps; int i; mrb_gc_arena_restore(mrb, ai); - if (irep == NULL) { - return NULL; + if (!readsuccess) { + return FALSE; } - reps = (mrb_irep**)mrb_calloc(mrb, irep->rlen, sizeof(mrb_irep*)); - irep->reps = (const mrb_irep**)reps; - irep_obj->data = irep; + reps = (mrb_irep**)mrb_calloc(mrb, (*irepp)->rlen, sizeof(mrb_irep*)); + (*irepp)->reps = (const mrb_irep**)reps; bin += *len; - for (i=0; i<irep->rlen; i++) { + for (i=0; i<(*irepp)->rlen; i++) { size_t rlen; - reps[i] = read_irep_record(mrb, bin, &rlen, flags); + readsuccess = read_irep_record(mrb, bin, &rlen, flags, &reps[i]); mrb_gc_arena_restore(mrb, ai); - if (reps[i] == NULL) { - return NULL; + if (!readsuccess) { + return FALSE; } bin += rlen; *len += rlen; } - irep_obj->data = NULL; - - return irep; + return TRUE; } static mrb_irep* -read_section_irep(mrb_state *mrb, const uint8_t *bin, uint8_t flags) +read_section_irep(mrb_state *mrb, const uint8_t *bin, uint8_t flags, struct RProc **proc) { size_t len; + /* + * This proc object keeps all the data in progress to avoid memory leaks + * if something goes wrong while reading irep. + */ + *proc = mrb_proc_new(mrb, NULL); + + mrb_irep **irepp = (mrb_irep**)&(*proc)->body.irep; bin += sizeof(struct rite_section_irep_header); - return read_irep_record(mrb, bin, &len, flags); + if (read_irep_record(mrb, bin, &len, flags, irepp)) { + return *irepp; + } + else { + return NULL; + } } static int @@ -544,11 +552,11 @@ read_binary_header(const uint8_t *bin, size_t bufsize, size_t *bin_size, uint16_ return MRB_DUMP_OK; } -static mrb_irep* +static struct RProc* read_irep(mrb_state *mrb, const uint8_t *bin, size_t bufsize, uint8_t flags) { int result; - struct RData *irep_obj = NULL; + struct RProc *proc = NULL; mrb_irep *irep = NULL; const struct rite_section_header *section_header; uint16_t crc; @@ -569,15 +577,12 @@ read_irep(mrb_state *mrb, const uint8_t *bin, size_t bufsize, uint8_t flags) return NULL; } - irep_obj = mrb_data_object_alloc(mrb, mrb->object_class, NULL, &tempirep_type); - bin += sizeof(struct rite_binary_header); do { section_header = (const struct rite_section_header *)bin; if (memcmp(section_header->section_ident, RITE_SECTION_IREP_IDENT, sizeof(section_header->section_ident)) == 0) { - irep = read_section_irep(mrb, bin, flags); + irep = read_section_irep(mrb, bin, flags, &proc); if (!irep) return NULL; - irep_obj->data = irep; } else if (memcmp(section_header->section_ident, RITE_SECTION_DEBUG_IDENT, sizeof(section_header->section_ident)) == 0) { if (!irep) return NULL; /* corrupted data */ @@ -596,13 +601,11 @@ read_irep(mrb_state *mrb, const uint8_t *bin, size_t bufsize, uint8_t flags) bin += bin_to_uint32(section_header->section_size); } while (memcmp(section_header->section_ident, RITE_BINARY_EOF, sizeof(section_header->section_ident)) != 0); - irep_obj->data = NULL; - - return irep; + return proc; } -mrb_irep* -mrb_read_irep(mrb_state *mrb, const uint8_t *bin) +static struct RProc* +mrb_proc_read_irep(mrb_state *mrb, const uint8_t *bin) { #if defined(MRB_USE_LINK_TIME_RO_DATA_P) || defined(MRB_USE_CUSTOM_RO_DATA_P) uint8_t flags = mrb_ro_data_p((char*)bin) ? FLAG_SRC_STATIC : FLAG_SRC_MALLOC; @@ -613,12 +616,20 @@ mrb_read_irep(mrb_state *mrb, const uint8_t *bin) return read_irep(mrb, bin, (size_t)-1, flags); } -MRB_API mrb_irep* -mrb_read_irep_buf(mrb_state *mrb, const void *buf, size_t bufsize) +DEFINE_READ_IREP_FUNC( + mrb_irep *mrb_read_irep(mrb_state *mrb, const uint8_t *bin), + mrb_proc_read_irep(mrb, bin)) + +static struct RProc* +mrb_proc_read_irep_buf(mrb_state *mrb, const void *buf, size_t bufsize) { return read_irep(mrb, (const uint8_t *)buf, bufsize, FLAG_SRC_MALLOC); } +DEFINE_READ_IREP_FUNC( + MRB_API mrb_irep *mrb_read_irep_buf(mrb_state *mrb, const void *buf, size_t bufsize), + mrb_proc_read_irep_buf(mrb, buf, bufsize)) + void mrb_exc_set(mrb_state *mrb, mrb_value exc); static void @@ -630,17 +641,13 @@ irep_error(mrb_state *mrb) void mrb_codedump_all(mrb_state*, struct RProc*); static mrb_value -load_irep(mrb_state *mrb, mrb_irep *irep, mrbc_context *c) +load_irep(mrb_state *mrb, struct RProc *proc, mrbc_context *c) { - struct RProc *proc; - - if (!irep) { + if (!proc || !proc->body.irep) { irep_error(mrb); return mrb_nil_value(); } - proc = mrb_proc_new(mrb, irep); proc->c = NULL; - mrb_irep_decref(mrb, irep); if (c && c->dump_result) mrb_codedump_all(mrb, proc); if (c && c->no_exec) return mrb_obj_value(proc); return mrb_top_run(mrb, proc, mrb_top_self(mrb), 0); @@ -649,23 +656,15 @@ load_irep(mrb_state *mrb, mrb_irep *irep, mrbc_context *c) MRB_API mrb_value mrb_load_irep_cxt(mrb_state *mrb, const uint8_t *bin, mrbc_context *c) { - struct RData *irep_obj = mrb_data_object_alloc(mrb, mrb->object_class, NULL, &tempirep_type); - mrb_irep *irep = mrb_read_irep(mrb, bin); - mrb_value ret; - - if (!irep) return mrb_undef_value(); - irep_obj->data = irep; - mrb_irep_incref(mrb, irep); - ret = load_irep(mrb, irep, c); - irep_obj->data = NULL; - mrb_irep_decref(mrb, irep); - return ret; + struct RProc *proc = mrb_proc_read_irep(mrb, bin); + if (!proc) return mrb_undef_value(); + return load_irep(mrb, proc, c); } MRB_API mrb_value mrb_load_irep_buf_cxt(mrb_state *mrb, const void *buf, size_t bufsize, mrbc_context *c) { - return load_irep(mrb, mrb_read_irep_buf(mrb, buf, bufsize), c); + return load_irep(mrb, mrb_proc_read_irep_buf(mrb, buf, bufsize), c); } MRB_API mrb_value @@ -688,10 +687,10 @@ mrb_load_proc(mrb_state *mrb, const struct RProc *proc) #ifndef MRB_NO_STDIO -mrb_irep* -mrb_read_irep_file(mrb_state *mrb, FILE* fp) +static struct RProc* +mrb_proc_read_irep_file(mrb_state *mrb, FILE *fp) { - mrb_irep *irep = NULL; + struct RProc *proc = NULL; uint8_t *buf; const size_t header_size = sizeof(struct rite_binary_header); size_t buf_size = 0; @@ -715,17 +714,21 @@ mrb_read_irep_file(mrb_state *mrb, FILE* fp) if (fread(buf+header_size, buf_size-header_size, 1, fp) == 0) { goto irep_exit; } - irep = read_irep(mrb, buf, (size_t)-1, FLAG_SRC_MALLOC); + proc = read_irep(mrb, buf, (size_t)-1, FLAG_SRC_MALLOC); irep_exit: mrb_free(mrb, buf); - return irep; + return proc; } +DEFINE_READ_IREP_FUNC( + mrb_irep *mrb_read_irep_file(mrb_state *mrb, FILE *fp), + mrb_proc_read_irep_file(mrb, fp)) + MRB_API mrb_value mrb_load_irep_file_cxt(mrb_state *mrb, FILE* fp, mrbc_context *c) { - return load_irep(mrb, mrb_read_irep_file(mrb, fp), c); + return load_irep(mrb, mrb_proc_read_irep_file(mrb, fp), c); } MRB_API mrb_value diff --git a/src/proc.c b/src/proc.c index 2b07003be..72d7ad120 100644 --- a/src/proc.c +++ b/src/proc.c @@ -52,7 +52,9 @@ mrb_proc_new(mrb_state *mrb, const mrb_irep *irep) p->e.target_class = tc; } p->body.irep = irep; - mrb_irep_incref(mrb, (mrb_irep*)irep); + if (irep) { + mrb_irep_incref(mrb, (mrb_irep*)irep); + } return p; } diff --git a/src/symbol.c b/src/symbol.c index 58decc1f1..773e980e5 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -65,17 +65,6 @@ typedef struct symbol_name { const char *name; } symbol_name; -#ifdef MRB_USE_ALL_SYMBOLS -#define SYMBOL_SHIFT 0 -# define SYMBOL_INLINE_P(sym) FALSE -# define sym_inline_pack(name, len) 0 -# define sym_inline_unpack(sym, buf, lenp) NULL -#else -#define SYMBOL_INLINE 1 -#define SYMBOL_SHIFT 1 -# define SYMBOL_INLINE_P(sym) ((sym) & SYMBOL_INLINE) -#endif - static void sym_validate_len(mrb_state *mrb, size_t len) { @@ -84,13 +73,19 @@ sym_validate_len(mrb_state *mrb, size_t len) } } -#ifndef MRB_USE_ALL_SYMBOLS +#ifdef MRB_USE_ALL_SYMBOLS +# define SYMBOL_INLINE_P(sym) FALSE +# define sym_inline_pack(name, len) 0 +# define sym_inline_unpack(sym, buf, lenp) NULL +#else +# define SYMBOL_INLINE_P(sym) ((sym) >= (1<<24)) + static const char pack_table[] = "_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; static mrb_sym sym_inline_pack(const char *name, size_t len) { - const size_t pack_length_max = (MRB_SYMBOL_BIT - 2) / 6; + const size_t pack_length_max = 5; char c; const char *p; @@ -98,6 +93,7 @@ sym_inline_pack(const char *name, size_t len) mrb_sym sym = 0; if (len > pack_length_max) return 0; /* too long */ + if (len == 0) return 0; /* empty string */ for (i=0; i<len; i++) { uint32_t bits; @@ -106,10 +102,10 @@ sym_inline_pack(const char *name, size_t len) p = strchr(pack_table, (int)c); if (p == 0) return 0; /* non alnum char */ bits = (uint32_t)(p - pack_table)+1; - if (i >= pack_length_max) break; - sym |= bits<<(i*6+SYMBOL_SHIFT); + sym |= bits<<(24-i*6); } - return sym | SYMBOL_INLINE; + mrb_assert(SYMBOL_INLINE_P(sym)); + return sym; } static const char* @@ -120,7 +116,7 @@ sym_inline_unpack(mrb_sym sym, char *buf, mrb_int *lenp) mrb_assert(SYMBOL_INLINE_P(sym)); for (i=0; i<5; i++) { - uint32_t bits = sym>>(i*6+SYMBOL_SHIFT) & ((1<<6)-1); + uint32_t bits = sym>>(24-i*6) & 0x3f; if (bits == 0) break; buf[i] = pack_table[bits-1];; } @@ -156,7 +152,7 @@ find_symbol(mrb_state *mrb, const char *name, size_t len, uint8_t *hashp) #ifndef MRB_NO_PRESYM /* presym */ i = presym_find(name, len); - if (i > 0) return i<<SYMBOL_SHIFT; + if (i > 0) return i; #endif /* inline symbol */ @@ -171,14 +167,14 @@ find_symbol(mrb_state *mrb, const char *name, size_t len, uint8_t *hashp) do { sname = &mrb->symtbl[i]; if (sname->len == len && memcmp(sname->name, name, len) == 0) { - return (i+MRB_PRESYM_MAX)<<SYMBOL_SHIFT; + return (i+MRB_PRESYM_MAX); } if (sname->prev == 0xff) { i -= 0xff; sname = &mrb->symtbl[i]; while (mrb->symtbl < sname) { if (sname->len == len && memcmp(sname->name, name, len) == 0) { - return (mrb_sym)((sname - mrb->symtbl)+MRB_PRESYM_MAX)<<SYMBOL_SHIFT; + return (mrb_sym)((sname - mrb->symtbl)+MRB_PRESYM_MAX); } sname--; } @@ -234,7 +230,7 @@ sym_intern(mrb_state *mrb, const char *name, size_t len, mrb_bool lit) } mrb->symhash[hash] = mrb->symidx = sym; - return (sym+MRB_PRESYM_MAX)<<SYMBOL_SHIFT; + return (sym+MRB_PRESYM_MAX); } MRB_API mrb_sym @@ -313,7 +309,6 @@ sym2name_len(mrb_state *mrb, mrb_sym sym, char *buf, mrb_int *lenp) { if (SYMBOL_INLINE_P(sym)) return sym_inline_unpack(sym, buf, lenp); - sym >>= SYMBOL_SHIFT; #ifndef MRB_NO_PRESYM { const char *name = presym_sym2name(sym, lenp); @@ -345,7 +340,6 @@ mrb_bool mrb_sym_static_p(mrb_state *mrb, mrb_sym sym) { if (SYMBOL_INLINE_P(sym)) return TRUE; - sym >>= SYMBOL_SHIFT; if (sym > MRB_PRESYM_MAX) return FALSE; return TRUE; } @@ -614,8 +608,7 @@ sym_name(mrb_state *mrb, mrb_sym sym, mrb_bool dump) return name; } else { - mrb_value str = SYMBOL_INLINE_P(sym) ? - mrb_str_new(mrb, name, len) : mrb_str_new_static(mrb, name, len); + mrb_value str = mrb_str_new_static(mrb, name, len); str = mrb_str_dump(mrb, str); return RSTRING_PTR(str); } diff --git a/tasks/presym.rake b/tasks/presym.rake index f3a076ac6..537d42487 100644 --- a/tasks/presym.rake +++ b/tasks/presym.rake @@ -18,13 +18,12 @@ MRuby.each_target do |build| prereqs = {} pps = [] - mrbtest = "#{build.class.install_dir}/mrbtest" + build_dir = "#{build.build_dir}/" mrbc_build_dir = "#{build.mrbc_build.build_dir}/" if build.mrbc_build - build.products.each do |product| - all_prerequisites.(product, prereqs) unless product == mrbtest - end + build.products.each{|product| all_prerequisites.(product, prereqs)} prereqs.each_key do |prereq| next unless File.extname(prereq) == build.exts.object + next unless prereq.start_with?(build_dir) next if mrbc_build_dir && prereq.start_with?(mrbc_build_dir) pps << prereq.ext(build.exts.preprocessed) end diff --git a/tasks/test.rake b/tasks/test.rake index 80f7670af..a18635cc6 100644 --- a/tasks/test.rake +++ b/tasks/test.rake @@ -17,9 +17,12 @@ namespace :test do |test_ns| desc "build all mruby tests" task :build => "build:lib" - namespace :build do + namespace :build do |test_build_ns| desc "build library tests" - task :lib + task :lib => :all do + MRuby.each_target{|build| build.gem(core: 'mruby-test')} + test_build_ns["lib_without_loading_gem"].invoke + end end desc "run all mruby tests" @@ -36,13 +39,13 @@ end MRuby.each_target do |build| if build.test_enabled? - t = task "test:build:lib:#{build.name}" => :all do - gem = build.gem(core: 'mruby-test') + t = task "test:build:lib_without_loading_gem:#{build.name}" do + gem = build.gems["mruby-test"] gem.setup gem.setup_compilers Rake::Task[build.define_installer_if_needed("mrbtest")].invoke end - task "test:build:lib" => t + task "test:build:lib_without_loading_gem" => t t = task "test:run:lib:#{build.name}" do build.run_test @@ -60,5 +63,6 @@ MRuby.each_target do |build| end task :clean do - rm_f "#{MRuby::Build.install_dir}/mrbtest" + host = MRuby.targets["host"] + rm_f host.exefile("#{host.class.install_dir}/mrbtest") if host && host.test_enabled? end |
