Skip to content

Commit

Permalink
Add constructors for SignalExceptions
Browse files Browse the repository at this point in the history
  • Loading branch information
dbussink committed Jul 28, 2012
1 parent d3224e5 commit c6d56cc
Show file tree
Hide file tree
Showing 5 changed files with 84 additions and 1 deletion.
4 changes: 4 additions & 0 deletions kernel/common/exception.rb
Expand Up @@ -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
Expand Down
36 changes: 36 additions & 0 deletions kernel/common/exception18.rb
Expand Up @@ -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
36 changes: 36 additions & 0 deletions kernel/common/exception19.rb
Expand Up @@ -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
4 changes: 4 additions & 0 deletions kernel/common/signal.rb
Expand Up @@ -5,6 +5,10 @@ module Signal
"EXIT" => 0
}

Numbers = {
0 => "EXIT"
}

@threads = {}
@handlers = {}

Expand Down
5 changes: 4 additions & 1 deletion kernel/delta/signal.rb
Expand Up @@ -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
Expand Down

0 comments on commit c6d56cc

Please sign in to comment.