diff options
| -rw-r--r-- | include/mrbconf.h | 8 | ||||
| -rw-r--r-- | include/mruby/proc.h | 4 | ||||
| -rw-r--r-- | lib/mruby/build.rb | 22 | ||||
| -rw-r--r-- | mrbgems/mruby-io/src/io.c | 24 | ||||
| -rw-r--r-- | mrbgems/mruby-io/test/io.rb | 4 | ||||
| -rw-r--r-- | mrbgems/mruby-time/test/time.rb | 4 | ||||
| -rw-r--r-- | src/error.c | 3 |
7 files changed, 49 insertions, 20 deletions
diff --git a/include/mrbconf.h b/include/mrbconf.h index 96ab6b77f..cc28acfaa 100644 --- a/include/mrbconf.h +++ b/include/mrbconf.h @@ -36,12 +36,10 @@ /* size of the method cache (need to be the power of 2) */ //#define MRB_METHOD_CACHE_SIZE (1<<7) -/* add -DMRB_METHOD_TABLE_INLINE unless platform uses MSB of pointers */ +/* add -DMRB_METHOD_TABLE_INLINE to reduce the size of method table */ +/* MRB_METHOD_TABLE_INLINE requires LSB of function pointers to be zero */ +/* you might need to specify --falign-functions=n (where n>1) */ //#define MRB_METHOD_TABLE_INLINE -/* turn MRB_METHOD_TABLE_INLINE on for linux by default */ -#if !defined(MRB_METHOD_TABLE_INLINE) && defined(__linux__) -# define MRB_METHOD_TABLE_INLINE -#endif /* add -DMRB_INT16 to use 16bit integer for mrb_int; conflict with MRB_INT64 */ //#define MRB_INT16 diff --git a/include/mruby/proc.h b/include/mruby/proc.h index 3f246314b..aa281b6dd 100644 --- a/include/mruby/proc.h +++ b/include/mruby/proc.h @@ -98,8 +98,8 @@ MRB_API mrb_value mrb_proc_cfunc_env_get(mrb_state*, mrb_int); #ifdef MRB_METHOD_TABLE_INLINE -#define MRB_METHOD_FUNC_FL ((uintptr_t)1U<<(sizeof(uintptr_t)*8-1)) -#define MRB_METHOD_FUNC_P(m) ((uintptr_t)(m)&MRB_METHOD_FUNC_FL) +#define MRB_METHOD_FUNC_FL ((uintptr_t)1) +#define MRB_METHOD_FUNC_P(m) (((uintptr_t)(m))&MRB_METHOD_FUNC_FL) #define MRB_METHOD_FUNC(m) ((mrb_func_t)((uintptr_t)(m)&(~MRB_METHOD_FUNC_FL))) #define MRB_METHOD_FROM_FUNC(m,fn) m=(mrb_method_t)((struct RProc*)((uintptr_t)(fn)|MRB_METHOD_FUNC_FL)) #define MRB_METHOD_FROM_PROC(m,pr) m=(mrb_method_t)(struct RProc*)(pr) diff --git a/lib/mruby/build.rb b/lib/mruby/build.rb index 7d6aa49e1..c06a62282 100644 --- a/lib/mruby/build.rb +++ b/lib/mruby/build.rb @@ -334,6 +334,7 @@ EOS attr_accessor :host_target, :build_target def initialize(name, build_dir=nil, &block) + @endian = nil @test_runner = Command::CrossTestRunner.new(self) super end @@ -351,5 +352,26 @@ EOS @test_runner.run(mrbtest) end end + + def big_endian + if @endian + puts "Endian has already specified as #{@endian}." + return + end + @endian = :big + @mrbc.compile_options += ' -E' + compilers.each do |c| + c.defines += %w(MRB_ENDIAN_BIG) + end + end + + def little_endian + if @endian + puts "Endian has already specified as #{@endian}." + return + end + @endian = :little + @mrbc.compile_options += ' -e' + end end # CrossBuild end # MRuby diff --git a/mrbgems/mruby-io/src/io.c b/mrbgems/mruby-io/src/io.c index 21a733b00..58bcdd1ee 100644 --- a/mrbgems/mruby-io/src/io.c +++ b/mrbgems/mruby-io/src/io.c @@ -180,7 +180,7 @@ mrb_io_flags_to_modenum(mrb_state *mrb, int flags) return modenum; } -void +static void mrb_fd_cloexec(mrb_state *mrb, int fd) { #if defined(F_GETFD) && defined(F_SETFD) && defined(FD_CLOEXEC) @@ -188,7 +188,8 @@ mrb_fd_cloexec(mrb_state *mrb, int fd) flags = fcntl(fd, F_GETFD); if (flags == -1) { - mrb_sys_fail(mrb, "fcntl"); + mrb_bug(mrb, "mrb_fd_cloexec: fcntl(%S, F_GETFD) failed: %S", + mrb_fixnum_value(fd), mrb_fixnum_value(errno)); } if (fd <= 2) { flags2 = flags & ~FD_CLOEXEC; /* Clear CLOEXEC for standard file descriptors: 0, 1, 2. */ @@ -198,7 +199,8 @@ mrb_fd_cloexec(mrb_state *mrb, int fd) } if (flags != flags2) { if (fcntl(fd, F_SETFD, flags2) == -1) { - mrb_sys_fail(mrb, "fcntl"); + mrb_bug(mrb, "mrb_fd_cloexec: fcntl(%S, F_SETFD, %S) failed: %S", + mrb_fixnum_value(fd), mrb_fixnum_value(flags2), mrb_fixnum_value(errno)); } } #endif @@ -577,11 +579,17 @@ mrb_io_initialize_copy(mrb_state *mrb, mrb_value copy) if (failed) { mrb_sys_fail(mrb, 0); } - fptr_copy->fd2 = mrb_dup(mrb, fptr_orig->fd2, &failed); - if (failed) { - close(fptr_copy->fd); - mrb_sys_fail(mrb, 0); + mrb_fd_cloexec(mrb, fptr_copy->fd); + + if (fptr_orig->fd2 != -1) { + fptr_copy->fd2 = mrb_dup(mrb, fptr_orig->fd2, &failed); + if (failed) { + close(fptr_copy->fd); + mrb_sys_fail(mrb, 0); + } + mrb_fd_cloexec(mrb, fptr_copy->fd2); } + fptr_copy->pid = fptr_orig->pid; fptr_copy->readable = fptr_orig->readable; fptr_copy->writable = fptr_orig->writable; @@ -676,7 +684,7 @@ fptr_finalize(mrb_state *mrb, struct mrb_io *fptr, int quiet) io_set_process_status(mrb, pid, status); } #else - HANDLE h = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, fptr->pid); + HANDLE h = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, fptr->pid); DWORD status; if (WaitForSingleObject(h, INFINITE) && GetExitCodeProcess(h, &status)) if (!quiet) diff --git a/mrbgems/mruby-io/test/io.rb b/mrbgems/mruby-io/test/io.rb index 96c3495d0..e06b14996 100644 --- a/mrbgems/mruby-io/test/io.rb +++ b/mrbgems/mruby-io/test/io.rb @@ -216,6 +216,10 @@ assert('IO#dup for readable') do dup = io.dup assert_true io != dup assert_true io.fileno != dup.fileno + begin + assert_true dup.close_on_exec? + rescue NotImplementedError + end assert_equal 'm', dup.sysread(1) assert_equal 'r', io.sysread(1) assert_equal 'u', dup.sysread(1) diff --git a/mrbgems/mruby-time/test/time.rb b/mrbgems/mruby-time/test/time.rb index 314a7560e..54c446ca3 100644 --- a/mrbgems/mruby-time/test/time.rb +++ b/mrbgems/mruby-time/test/time.rb @@ -227,10 +227,6 @@ assert('2000 times 500us make a second') do t.usec == 0 end -assert('Time.new with Dec 31 23:59:59 1969 raise ArgumentError') do - assert_raise(ArgumentError) {Time.new(1969, 12, 31, 23, 59, 59)} -end - assert('Time.gm with Dec 31 23:59:59 1969 raise ArgumentError') do assert_raise(ArgumentError) {Time.gm(1969, 12, 31, 23, 59, 59)} end diff --git a/src/error.c b/src/error.c index 1b24f3065..5445b51bf 100644 --- a/src/error.c +++ b/src/error.c @@ -229,7 +229,8 @@ mrb_exc_set(mrb_state *mrb, mrb_value exc) } else { mrb->exc = mrb_obj_ptr(exc); - if ((struct RBasic*)mrb->exc == mrb->gc.arena[mrb->gc.arena_idx-1]) { + if (mrb->gc.arena_idx > 0 && + (struct RBasic*)mrb->exc == mrb->gc.arena[mrb->gc.arena_idx-1]) { mrb->gc.arena_idx--; } if (!mrb->gc.out_of_memory) { |
