summaryrefslogtreecommitdiffhomepage
path: root/test
diff options
context:
space:
mode:
authorKouhei Sutou <[email protected]>2015-12-29 20:36:12 +0900
committerKouhei Sutou <[email protected]>2015-12-29 20:36:12 +0900
commita561bdb25ff51809c5de63ab7083ebf25d37cda9 (patch)
tree7c19c9a51246879dc01b1b112f483352c6f4480c /test
parente132de9e8eaf095f6f8b826e34a1c145403c3311 (diff)
downloadmruby-a561bdb25ff51809c5de63ab7083ebf25d37cda9.tar.gz
mruby-a561bdb25ff51809c5de63ab7083ebf25d37cda9.zip
Support backtrace after method calls
GitHub: fix #2902, #2917 The current implementation traverses stack to retrieve backtrace. But stack will be changed when some operations are occurred. It means that backtrace may be broken after some operations. This change (1) saves the minimum information to retrieve backtrace when exception is raised and (2) restores backtrace from the minimum information when backtrace is needed. It reduces overhead for creating backtrace Ruby objects. The space for the minimum information is reused by multiple exceptions. So memory allocation isn't occurred for each exception.
Diffstat (limited to 'test')
-rw-r--r--test/t/exception.rb35
1 files changed, 29 insertions, 6 deletions
diff --git a/test/t/exception.rb b/test/t/exception.rb
index d27813028..b54d01c46 100644
--- a/test/t/exception.rb
+++ b/test/t/exception.rb
@@ -373,12 +373,35 @@ assert('Raise in ensure') do
end
end
-assert('Raise in rescue') do
- assert_raise(ArgumentError) do
- begin
- raise "" # RuntimeError
- rescue
- raise ArgumentError
+assert('GC in rescue') do
+ line = nil
+ begin
+ [1].each do
+ [2].each do
+ [3].each do
+ line = __LINE__; raise "XXX"
+ end
+ end
+ end
+ rescue => exception
+ GC.start
+ assert_equal("#{__FILE__}:#{line}:in Object.call",
+ exception.backtrace.first)
+ end
+end
+
+assert('Method call in rescue') do
+ line = nil
+ begin
+ [1].each do
+ [2].each do
+ line = __LINE__; raise "XXX"
+ end
+ end
+ rescue => exception
+ [3].each do
end
+ assert_equal("#{__FILE__}:#{line}:in Object.call",
+ exception.backtrace.first)
end
end