class Opal::Nodes::WhileNode

Public Instance Methods

compile() click to toggle source
# File lib/opal/nodes/while.rb, line 12
def compile
  test_code = js_truthy(test)

  @redo_var = scope.new_temp if uses_redo?

  compiler.in_while do
    while_loop[:closure] = true if wrap_in_closure?
    while_loop[:redo_var] = @redo_var

    in_closure(Closure::LOOP | Closure::JS_LOOP | (wrap_in_closure? ? Closure::JS_FUNCTION : 0)) do
      in_closure(Closure::LOOP_INSIDE | Closure::JS_LOOP_INSIDE) do
        line(indent { stmt(body) })
      end

      if uses_redo?
        compile_with_redo(test_code)
      else
        compile_without_redo(test_code)
      end
    end
  end

  scope.queue_temp(@redo_var) if uses_redo?

  if wrap_in_closure?
    if scope.await_encountered
      wrap '(await (async function() {', '; return nil; })())'
    else
      wrap '(function() {', '; return nil; })()'
    end
  end
end

Private Instance Methods

compile_while(test_code, redo_code = nil) click to toggle source
# File lib/opal/nodes/while.rb, line 55
def compile_while(test_code, redo_code = nil)
  unshift redo_code if redo_code
  unshift while_open, test_code, while_close
  unshift redo_code if redo_code
  line '}'
end
compile_with_redo(test_code) click to toggle source
# File lib/opal/nodes/while.rb, line 47
def compile_with_redo(test_code)
  compile_while(test_code, "#{@redo_var} = false;")
end
compile_without_redo(test_code) click to toggle source
# File lib/opal/nodes/while.rb, line 51
def compile_without_redo(test_code)
  compile_while(test_code)
end
uses_redo?() click to toggle source
# File lib/opal/nodes/while.rb, line 74
def uses_redo?
  @sexp.meta[:has_redo]
end
while_close() click to toggle source
# File lib/opal/nodes/while.rb, line 70
def while_close
  ') {'
end
while_open() click to toggle source
# File lib/opal/nodes/while.rb, line 62
def while_open
  if uses_redo?
    redo_part = "#{@redo_var} || "
  end

  "while (#{redo_part}"
end
wrap_in_closure?() click to toggle source
# File lib/opal/nodes/while.rb, line 78
def wrap_in_closure?
  expr? || recv?
end