aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/debrew.rb
diff options
context:
space:
mode:
authorJack Nagel2013-02-06 11:22:10 -0600
committerJack Nagel2013-02-06 11:35:41 -0600
commit46e49c4889cd4948fb18cefb075dd65b7800cf5c (patch)
tree233e2508cc17f6f680a2a632321ce0c40b888016 /Library/Homebrew/debrew.rb
parenta79721e59d87e808b400fb913a7ff6d9851a94ae (diff)
downloadbrew-46e49c4889cd4948fb18cefb075dd65b7800cf5c.tar.bz2
Don't discard exception instance data in debug mode
If the debugger's monkey-patched raise was passed an instantiated exception, the #exception method was called with a potentially nil argument, causing its instance data to be thrown away. This hides potentially useful information from the user. Fix it by allowing instantiated exceptions to be reraised unharmed. Fixes Homebrew/homebrew#17622.
Diffstat (limited to 'Library/Homebrew/debrew.rb')
-rw-r--r--Library/Homebrew/debrew.rb16
1 files changed, 12 insertions, 4 deletions
diff --git a/Library/Homebrew/debrew.rb b/Library/Homebrew/debrew.rb
index 54f01a234..4ec2b8270 100644
--- a/Library/Homebrew/debrew.rb
+++ b/Library/Homebrew/debrew.rb
@@ -137,10 +137,18 @@ module RaisePlus
def raise(*args)
exception = case
- when args.size == 0 then ($!.nil? ? RuntimeError.exception : $!)
- when (args.size == 1 and args[0].is_a?(String)) then RuntimeError.exception(args[0])
- else args[0].exception(args[1]) # this does the right thing if args[1] is missing
- end
+ when args.size == 0
+ $!.nil? ? RuntimeError.exception : $!
+ when args.size == 1 && args[0].is_a?(String)
+ RuntimeError.exception(args[0])
+ when args.size == 2 && args[0].is_a?(Exception)
+ args[0].exception(args[1])
+ when args[0].is_a?(Class) && args[0].ancestors.include?(Exception)
+ args[0].exception(args[1])
+ else
+ args[0]
+ end
+
# passing something other than a String or Exception is illegal, but if someone does it anyway,
# that object won't have backtrace or continuation methods. in that case, let's pass it on to
# the original raise, which will reject it