Class: Opal::Nodes::RescueNode
Instance Attribute Summary
Attributes inherited from Base
Attributes included from Closure::NodeSupport
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.
- #has_retry? ⇒ Boolean
- #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_empty, #expr_or_nil, #fragment, handle, handlers, #has_rescue_else?, #helper, #in_ensure, #in_ensure?, #in_resbody, #in_resbody?, #in_rescue, #in_while?, #initialize, #process, #push, #recv, #recv?, #s, #scope, #source_location, #stmt, #stmt?, #top_scope, truthy_optimize?, #unshift, #while_loop, #with_temp, #wrap
Methods included from Closure::NodeSupport
#closure_is?, #compile_catcher, #generate_thrower, #generate_thrower_without_catcher, #in_closure, #pop_closure, #push_closure, #select_closure, #thrower
Methods included from Helpers
#current_indent, #empty_line, #indent, #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
171 172 173 174 175 |
# File 'lib/opal/nodes/rescue.rb', line 171 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
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 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 |
# File 'lib/opal/nodes/rescue.rb', line 97 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 closure_type = Closure::NONE closure_type |= Closure::JS_FUNCTION if expr? || recv? if has_retry? closure_type |= Closure::JS_LOOP \ | Closure::JS_LOOP_INSIDE \ | Closure::RESCUE_RETRIER end push_closure(closure_type) if closure_type != Closure::NONE in_rescue(self) do 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 end pop_closure if closure_type != Closure::NONE wrap 'do { ', ' break; } while(1)' if has_retry? # Wrap a try{} catch{} into a function # when it's an expression # or when there's a method call after begin;rescue;end if expr? || recv? if scope.await_encountered wrap '(await (async function() { ', '})())' else wrap '(function() { ', '})()' end end end |
#handle_rescue_else_manually? ⇒ Boolean
Returns true when there's no 'ensure' statement wrapping current rescue.
186 187 188 |
# File 'lib/opal/nodes/rescue.rb', line 186 def handle_rescue_else_manually? !in_ensure? && has_rescue_else? end |
#has_retry? ⇒ Boolean
190 191 192 |
# File 'lib/opal/nodes/rescue.rb', line 190 def has_retry? @sexp.[:has_retry] end |
#rescue_else_code ⇒ Object
177 178 179 180 181 |
# File 'lib/opal/nodes/rescue.rb', line 177 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 |