Class: Opal::Nodes::RescueNode
- Defined in:
- opal/lib/opal/nodes/rescue.rb
Instance Attribute Summary
Attributes inherited from Base
Instance Method Summary collapse
- #body_code ⇒ Object
- #compile ⇒ Object
-
#handle_rescue_else_manually? ⇒ Boolean
Returns true when there's no 'ensure' statement wrapping current rescue.
- #rescue_else_code ⇒ Object
Methods inherited from Base
#add_gvar, #add_ivar, #add_local, #add_temp, #children, children, #class_variable_owner, #class_variable_owner_nesting_level, #comments, #compile_to_fragments, #error, #expr, #expr?, #expr_or_nil, #fragment, handle, handlers, #has_rescue_else?, #helper, #in_ensure, #in_ensure?, #in_while?, #initialize, #process, #push, #recv, #recv?, #s, #scope, #stmt, #stmt?, truthy_optimize?, #unshift, #while_loop, #with_temp, #wrap
Methods included from Helpers
#conditional_send, #current_indent, #empty_line, #indent, #js_falsy, #js_truthy, #js_truthy_optimize, #line, #mid_to_jsid, #property, #valid_name?
Constructor Details
This class inherits a constructor from Opal::Nodes::Base
Instance Method Details
#body_code ⇒ Object
136 137 138 139 140 |
# File 'opal/lib/opal/nodes/rescue.rb', line 136 def body_code body_code = (body.nil? || body.type == :resbody ? s(:nil) : body) body_code = compiler.returns(body_code) unless stmt? body_code end |
#compile ⇒ Object
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
# File 'opal/lib/opal/nodes/rescue.rb', line 83 def compile scope.rescue_else_sexp = children[1..-1].detect { |sexp| sexp && sexp.type != :resbody } _has_rescue_handlers = false if handle_rescue_else_manually? line 'var $no_errors = true;' end push 'try {' indent do line stmt(body_code) end line '} catch ($err) {' indent do if has_rescue_else? line '$no_errors = false;' end children[1..-1].each_with_index do |child, idx| # counting only rescue, ignoring rescue-else statement next unless child && child.type == :resbody _has_rescue_handlers = true push ' else ' unless idx == 0 line process(child, @level) end # if no resbodys capture our error, then rethrow push ' else { throw $err; }' end line '}' if handle_rescue_else_manually? # here we must add 'finally' explicitly push 'finally {' indent do line 'if ($no_errors) { ' indent do line stmt(rescue_else_code) end line '}' end push '}' end # Wrap a try{} catch{} into a function # when it's an expression # or when there's a method call after begin;rescue;end wrap '(function() { ', '})()' if expr? || recv? end |
#handle_rescue_else_manually? ⇒ Boolean
Returns true when there's no 'ensure' statement wrapping current rescue.
151 152 153 |
# File 'opal/lib/opal/nodes/rescue.rb', line 151 def handle_rescue_else_manually? !scope.in_ensure? && scope.has_rescue_else? end |
#rescue_else_code ⇒ Object
142 143 144 145 146 |
# File 'opal/lib/opal/nodes/rescue.rb', line 142 def rescue_else_code rescue_else_code = scope.rescue_else_sexp rescue_else_code = compiler.returns(rescue_else_code) unless stmt? rescue_else_code end |