Class: Opal::Nodes::RescueNode
- Defined in:
- opal/lib/opal/nodes/rescue.rb
Constant Summary
Constants included from Helpers
Helpers::BASIC_IDENTIFIER_RULES, Helpers::ES3_RESERVED_WORD_EXCLUSIVE, Helpers::ES51_RESERVED_WORD, Helpers::IMMUTABLE_PROPS, Helpers::PROTO_SPECIAL_METHODS, Helpers::PROTO_SPECIAL_PROPS, Helpers::RESERVED_FUNCTION_NAMES
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.
Methods inherited from Base
#add_gvar, #add_ivar, #add_local, #add_temp, #children, children, #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
#current_indent, #empty_line, #indent, #ivar, #js_falsy, #js_truthy, #js_truthy_optimize, #line, #lvar_to_js, #mid_to_jsid, #property, #valid_ivar_name?, #valid_name?, #variable
Constructor Details
This class inherits a constructor from Opal::Nodes::Base
Instance Method Details
#body_code ⇒ Object
162 163 164 165 166 |
# File 'opal/lib/opal/nodes/rescue.rb', line 162 def body_code body_code = (body.type == :resbody ? s(:nil) : body) body_code = compiler.returns body_code unless stmt? body_code end |
#compile ⇒ Object
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 |
# File 'opal/lib/opal/nodes/rescue.rb', line 104 def compile scope.rescue_else_sexp = children[1..-1].detect { |sexp| sexp.type != :resbody } has_rescue_handlers = false if handle_rescue_else_manually? line "var $no_errors = true;" end push "try {" indent do line process(body_code, @level) 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 if child.type == :resbody has_rescue_handlers = true push " else " unless idx == 0 line process(child, @level) end 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 "return (function() {" indent do line compiler.process(compiler.returns(scope.rescue_else_sexp), @level) end line "})();" 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? or recv? end |
#handle_rescue_else_manually? ⇒ Boolean
Returns true when there's no 'ensure' statement wrapping current rescue.
171 172 173 |
# File 'opal/lib/opal/nodes/rescue.rb', line 171 def handle_rescue_else_manually? !scope.in_ensure? && scope.has_rescue_else? end |