From 26c82a38dd1e02c1ea4dfe4cdae18774fcb0935f Mon Sep 17 00:00:00 2001 From: Evan Phoenix Date: Mon, 5 Apr 2010 11:53:14 -0700 Subject: [PATCH] Fix Process.exit[!]. Fixes #247. Fixes #248. --- kernel/alpha.rb | 27 ++++++++++++++++++++++++--- kernel/common/kernel.rb | 14 +++----------- kernel/common/process.rb | 3 --- kernel/loader.rb | 8 ++++---- 4 files changed, 31 insertions(+), 21 deletions(-) diff --git a/kernel/alpha.rb b/kernel/alpha.rb index 2d7c3a6dc8..c4629f266a 100644 --- a/kernel/alpha.rb +++ b/kernel/alpha.rb @@ -165,7 +165,7 @@ def raise(cls, str, junk=nil) Rubinius::VM.write_error str Rubinius::VM.write_error "\n" Rubinius::VM.show_backtrace - Process.exit 1 + Process.exit! 1 end # Returns true if the given Class is either the class or superclass of the @@ -423,9 +423,30 @@ def to_s class Process # Terminate with given status code. # - def self.exit(code) + def self.exit(code=0) + case code + when true + code = 0 + when false + code = 1 + else + code = Type.coerce_to code, Integer, :to_int + end + + raise SystemExit.new(code) + end + + def self.exit!(code=1) Ruby.primitive :vm_exit - raise PrimitiveFailure, "exit() failed. Wow, something is screwed." + + case code + when true + exit! 0 + when false + exit! 1 + else + exit! Type.coerce_to(code, Integer, :to_int) + end end end diff --git a/kernel/common/kernel.rb b/kernel/common/kernel.rb index bf88bb80d8..63bff7e8e6 100644 --- a/kernel/common/kernel.rb +++ b/kernel/common/kernel.rb @@ -148,20 +148,12 @@ def warning(message) module_function :warning def exit(code=0) - if code.equal? true - code = 0 - elsif code.equal? false - code = 1 - else - code = Type.coerce_to code, Integer, :to_int - end - - raise SystemExit.new(code) + Process.exit(code) end module_function :exit - def exit!(code=0) - Process.exit(code) + def exit!(code=1) + Process.exit!(code) end module_function :exit! diff --git a/kernel/common/process.rb b/kernel/common/process.rb index c576f06a09..32200980ec 100644 --- a/kernel/common/process.rb +++ b/kernel/common/process.rb @@ -102,9 +102,6 @@ def self.abort(msg=nil) $stderr.puts(msg) if(msg) exit 1 end - def self.exit!(code=0) - exit(code) - end def self.getpgid(pid) ret = FFI::Platform::POSIX.getpgid(pid) diff --git a/kernel/loader.rb b/kernel/loader.rb index d00971549a..1e32a4c080 100644 --- a/kernel/loader.rb +++ b/kernel/loader.rb @@ -418,7 +418,7 @@ def script else if @script.suffix?(".rb") puts "Unable to find '#{@script}'" - exit! 1 + exit 1 else prog = File.join @main_lib, "bin", "#{@script}.rb" if File.exist? prog @@ -491,7 +491,7 @@ def epilogue # Exit. def done - Process.exit @exit_code + Process.exit! @exit_code end # Orchestrate everything. @@ -522,6 +522,7 @@ def main rescue Object => e e.render "An exception occurred #{@stage}" @exit_code = 1 + ensure epilogue done @@ -535,7 +536,6 @@ def main puts "\n=====================================" puts "Exception occurred during top-level exception output! (THIS IS BAD)" puts - puts "Original Exception: #{e.inspect} (#{e.class})" - puts "New Exception: #{e2.inspect} (#{e.class})" + puts "Exception: #{exc.inspect} (#{exc.class})" @exit_code = 128 end