Skip to content

Commit

Permalink
Keep the current exception from being trampled on
Browse files Browse the repository at this point in the history
  • Loading branch information
Evan Phoenix committed May 7, 2010
1 parent f653ab9 commit a3f6a6b
Show file tree
Hide file tree
Showing 3 changed files with 95 additions and 0 deletions.
24 changes: 24 additions & 0 deletions lib/compiler/ast/constants.rb
Expand Up @@ -48,6 +48,12 @@ def defined(g)
end

def value_defined(g, f, const_missing=true)
# Save the current exception into a stack local
g.push_exception_state
outer_exc_state = g.new_stack_local
g.set_stack_local outer_exc_state
g.pop

ex = g.new_label
ok = g.new_label
g.setup_unwind ex, RescueType
Expand All @@ -62,6 +68,8 @@ def value_defined(g, f, const_missing=true)

ex.set!
g.clear_exception
g.push_stack_local outer_exc_state
g.restore_exception_state
g.goto f

ok.set!
Expand Down Expand Up @@ -121,6 +129,12 @@ def defined(g)
end

def value_defined(g, f)
# Save the current exception into a stack local
g.push_exception_state
outer_exc_state = g.new_stack_local
g.set_stack_local outer_exc_state
g.pop

ex = g.new_label
ok = g.new_label
g.setup_unwind ex, RescueType
Expand All @@ -135,6 +149,8 @@ def value_defined(g, f)

ex.set!
g.clear_exception
g.push_stack_local outer_exc_state
g.restore_exception_state
g.goto f

ok.set!
Expand Down Expand Up @@ -193,6 +209,12 @@ def defined(g)
end

def value_defined(g, f)
# Save the current exception into a stack local
g.push_exception_state
outer_exc_state = g.new_stack_local
g.set_stack_local outer_exc_state
g.pop

ex = g.new_label
ok = g.new_label
g.setup_unwind ex, RescueType
Expand All @@ -205,6 +227,8 @@ def value_defined(g, f)

ex.set!
g.clear_exception
g.push_stack_local outer_exc_state
g.restore_exception_state
g.goto f

ok.set!
Expand Down
8 changes: 8 additions & 0 deletions lib/compiler/ast/sends.rb
Expand Up @@ -38,6 +38,12 @@ def bytecode(g)
end

def value_defined(g, f)
# Save the current exception into a stack local
g.push_exception_state
outer_exc_state = g.new_stack_local
g.set_stack_local outer_exc_state
g.pop

ok = g.new_label
ex = g.new_label
g.setup_unwind ex, RescueType
Expand All @@ -49,6 +55,8 @@ def value_defined(g, f)

ex.set!
g.clear_exception
g.push_stack_local outer_exc_state
g.restore_exception_state
g.goto f

ok.set!
Expand Down
63 changes: 63 additions & 0 deletions spec/compiler/defined_spec.rb
Expand Up @@ -81,6 +81,11 @@

relates "defined? X" do
compile do |g|
g.push_exception_state
outer_exc_state = g.new_stack_local
g.set_stack_local outer_exc_state
g.pop

f = g.new_label
done = g.new_label

Expand All @@ -95,6 +100,8 @@

ex.set!
g.clear_exception
g.push_stack_local outer_exc_state
g.restore_exception_state
g.goto f

ok.set!
Expand All @@ -111,6 +118,11 @@

relates "defined? ::X" do
compile do |g|
g.push_exception_state
outer_exc_state = g.new_stack_local
g.set_stack_local outer_exc_state
g.pop

f = g.new_label
done = g.new_label

Expand All @@ -127,6 +139,8 @@

ex.set!
g.clear_exception
g.push_stack_local outer_exc_state
g.restore_exception_state
g.goto f

ok.set!
Expand All @@ -143,6 +157,11 @@

relates "defined? X::Y" do
compile do |g|
g.push_exception_state
outer_exc_state = g.new_stack_local
g.set_stack_local outer_exc_state
g.pop

f = g.new_label
done = g.new_label

Expand All @@ -159,6 +178,8 @@

ex.set!
g.clear_exception
g.push_stack_local outer_exc_state
g.restore_exception_state
g.goto f

ok.set!
Expand All @@ -175,6 +196,11 @@

relates "defined? X::Y::Z" do
compile do |g|
g.push_exception_state
outer_exc_state = g.new_stack_local
g.set_stack_local outer_exc_state
g.pop

f = g.new_label
done = g.new_label

Expand All @@ -192,6 +218,8 @@

ex.set!
g.clear_exception
g.push_stack_local outer_exc_state
g.restore_exception_state
g.goto f

ok.set!
Expand All @@ -208,6 +236,11 @@

relates "defined? self::A" do
compile do |g|
g.push_exception_state
outer_exc_state = g.new_stack_local
g.set_stack_local outer_exc_state
g.pop

f = g.new_label
done = g.new_label

Expand All @@ -224,6 +257,8 @@

ex.set!
g.clear_exception
g.push_stack_local outer_exc_state
g.restore_exception_state
g.goto f

ok.set!
Expand Down Expand Up @@ -337,6 +372,11 @@

relates "defined? A.m" do
compile do |g|
g.push_exception_state
outer_exc_state = g.new_stack_local
g.set_stack_local outer_exc_state
g.pop

f = g.new_label
done = g.new_label

Expand All @@ -352,6 +392,8 @@

ex.set!
g.clear_exception
g.push_stack_local outer_exc_state
g.restore_exception_state
g.goto f

ok.set!
Expand All @@ -371,6 +413,11 @@

relates "defined? ::A.m" do
compile do |g|
g.push_exception_state
outer_exc_state = g.new_stack_local
g.set_stack_local outer_exc_state
g.pop

f = g.new_label
done = g.new_label

Expand All @@ -388,6 +435,8 @@

ex.set!
g.clear_exception
g.push_stack_local outer_exc_state
g.restore_exception_state
g.goto f

ok.set!
Expand All @@ -407,6 +456,11 @@

relates "defined? A::B.m" do
compile do |g|
g.push_exception_state
outer_exc_state = g.new_stack_local
g.set_stack_local outer_exc_state
g.pop

f = g.new_label
done = g.new_label

Expand All @@ -424,6 +478,8 @@

ex.set!
g.clear_exception
g.push_stack_local outer_exc_state
g.restore_exception_state
g.goto f

ok.set!
Expand All @@ -443,6 +499,11 @@

relates "defined? a.b" do
compile do |g|
g.push_exception_state
outer_exc_state = g.new_stack_local
g.set_stack_local outer_exc_state
g.pop

f = g.new_label
done = g.new_label

Expand All @@ -458,6 +519,8 @@

ex.set!
g.clear_exception
g.push_stack_local outer_exc_state
g.restore_exception_state
g.goto f

ok.set!
Expand Down

0 comments on commit a3f6a6b

Please sign in to comment.