summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--build_config/cross-32bit.rb2
-rw-r--r--build_config/no-float.rb3
-rw-r--r--include/mruby/boxing_word.h6
-rw-r--r--include/mruby/numeric.h7
-rw-r--r--include/mruby/presym/enable.h6
-rw-r--r--include/mruby/proc.h4
-rw-r--r--include/mruby/value.h2
-rw-r--r--lib/mruby/build.rb10
-rw-r--r--mrbgems/full-core.gembox5
-rw-r--r--mrbgems/mruby-bin-config/mrbgem.rake51
-rw-r--r--mrbgems/mruby-bin-mruby/tools/mruby/mruby.c2
-rw-r--r--mrbgems/mruby-compiler/core/codegen.c4
-rw-r--r--mrbgems/mruby-io/src/io.c114
-rw-r--r--mrbgems/mruby-rational/src/rational.c8
-rw-r--r--mrbgems/mruby-symbol-ext/test/symbol.rb2
-rw-r--r--src/class.c22
-rw-r--r--src/hash.c2
-rw-r--r--src/load.c157
-rw-r--r--src/proc.c4
-rw-r--r--src/symbol.c43
-rw-r--r--tasks/presym.rake7
-rw-r--r--tasks/test.rake16
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