From c6d56ccf261a23ef1be3577047200495fe44850a Mon Sep 17 00:00:00 2001 From: Dirkjan Bussink Date: Sat, 28 Jul 2012 18:59:10 +0200 Subject: [PATCH] Add constructors for SignalExceptions --- kernel/common/exception.rb | 4 ++++ kernel/common/exception18.rb | 36 ++++++++++++++++++++++++++++++++++++ kernel/common/exception19.rb | 36 ++++++++++++++++++++++++++++++++++++ kernel/common/signal.rb | 4 ++++ kernel/delta/signal.rb | 5 ++++- 5 files changed, 84 insertions(+), 1 deletion(-) diff --git a/kernel/common/exception.rb b/kernel/common/exception.rb index 03073b9d86..2fc351de5e 100644 --- a/kernel/common/exception.rb +++ b/kernel/common/exception.rb @@ -249,6 +249,10 @@ class NotImplementedError < ScriptError end class Interrupt < SignalException + def initialize(*args) + super(args.shift) + @name = args.shift + end end class IOError < StandardError diff --git a/kernel/common/exception18.rb b/kernel/common/exception18.rb index 9ff0ced8a5..5922ce1b65 100644 --- a/kernel/common/exception18.rb +++ b/kernel/common/exception18.rb @@ -7,3 +7,39 @@ def to_s @reason_message || self.class.to_s end end + +class SignalException < Exception + + attr_reader :signo + attr_reader :signm + + def initialize(signo = nil, signm = nil) + # MRI overrides this behavior just for SignalException itself + # but not for anything that inherits from it, therefore we + # need this ugly check to make sure it works as intented. + return super(signo) unless self.class == SignalException + if signo.is_a? Integer + unless @signm = Signal::Numbers[signo] + raise ArgumentError, "invalid signal number #{signo}" + end + @signo = signo + @signm = signm || "SIG#{@signm}" + elsif signo + if signm + raise ArgumentError, "wrong number of arguments (2 for 1)" + end + signm = signo + if sym_sig = signo.kind_of?(Symbol) + signm = signm.to_s + else + signm = StringValue(signm) + end + signm = signm[3..-1] if signm.prefix? "SIG" + unless @signo = Signal::Names[signm] + raise ArgumentError, "invalid signal name #{signm}" + end + @signm = sym_sig ? signm : signo + end + super(@signm) + end +end diff --git a/kernel/common/exception19.rb b/kernel/common/exception19.rb index 7b3a752454..9b941e338c 100644 --- a/kernel/common/exception19.rb +++ b/kernel/common/exception19.rb @@ -18,3 +18,39 @@ def to_s class KeyError < IndexError end + +class SignalException < Exception + + attr_reader :signo + attr_reader :signm + + def initialize(signo = nil, signm = nil) + # MRI overrides this behavior just for SignalException itself + # but not for anything that inherits from it, therefore we + # need this ugly check to make sure it works as intented. + return super(signo) unless self.class == SignalException + if signo.is_a? Integer + unless @signm = Signal::Numbers[signo] + raise ArgumentError, "invalid signal number #{signo}" + end + @signo = signo + @signm = signm || "SIG#{@signm}" + elsif signo + if signm + raise ArgumentError, "wrong number of arguments (2 for 1)" + end + signm = signo + if signo.kind_of?(Symbol) + signm = signm.to_s + else + signm = StringValue(signm) + end + signm = signm[3..-1] if signm.prefix? "SIG" + unless @signo = Signal::Names[signm] + raise ArgumentError, "invalid signal name #{signm}" + end + @signm = "SIG#{signm}" + end + super(@signm) + end +end diff --git a/kernel/common/signal.rb b/kernel/common/signal.rb index d843951717..a9cc76ff8b 100644 --- a/kernel/common/signal.rb +++ b/kernel/common/signal.rb @@ -5,6 +5,10 @@ module Signal "EXIT" => 0 } + Numbers = { + 0 => "EXIT" + } + @threads = {} @handlers = {} diff --git a/kernel/delta/signal.rb b/kernel/delta/signal.rb index 85bb2e5106..cca4729c01 100644 --- a/kernel/delta/signal.rb +++ b/kernel/delta/signal.rb @@ -2,7 +2,10 @@ module Signal Rubinius::Config.section 'rbx.platform.signal.' do |key, value| - Names[key[23, key.length]] = value.to_i + name = key[23, key.length] + number = value.to_i + Names[name] = number + Numbers[number] = name end # special case of signal.c