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