class Opal::Nodes::EnsureNode
Public Instance Methods
body_sexp()
click to toggle source
# File lib/opal/nodes/rescue.rb, line 65 def body_sexp if wrap_in_closure? compiler.returns(begn) else begn end end
compile()
click to toggle source
# File lib/opal/nodes/rescue.rb, line 12 def compile push_closure if wrap_in_closure? push 'try {' in_ensure do line stmt(body_sexp) end line '} finally {' indent do if has_rescue_else? # $no_errors indicates thate there were no error raised unshift 'var $no_errors = true; ' # when there's a begin;rescue;else;ensure;end statement, # ruby returns a result of the 'else' branch # but invokes it before 'ensure'. # so, here we # 1. save the result of calling else to $rescue_else_result # 2. call ensure # 2. return $rescue_else_result line 'var $rescue_else_result;' line 'if ($no_errors) { ' indent do line '$rescue_else_result = (function() {' indent do line stmt(rescue_else_code) end line '})();' end line '}' line compiler.process(ensr_sexp, @level) line 'if ($no_errors) { return $rescue_else_result; }' else line compiler.process(ensr_sexp, @level) end end line '}' pop_closure if wrap_in_closure? if wrap_in_closure? if scope.await_encountered wrap '(await (async function() { ', '; })())' else wrap '(function() { ', '; })()' end end end
ensr_sexp()
click to toggle source
# File lib/opal/nodes/rescue.rb, line 73 def ensr_sexp ensr || s(:nil) end
has_rescue_else?()
click to toggle source
# File lib/opal/nodes/rescue.rb, line 87 def has_rescue_else? @sexp.meta[:has_rescue_else] end
rescue_else_code()
click to toggle source
# File lib/opal/nodes/rescue.rb, line 81 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
wrap_in_closure?()
click to toggle source
# File lib/opal/nodes/rescue.rb, line 77 def wrap_in_closure? recv? || expr? || has_rescue_else? end