class Opal::Rewriters::LogicalOperatorAssignment::SendHandler

Takes ‘recvr.meth ||= rhs` Produces `recvr.meth || recvr.meth = rhs` (lhs is a recvr.meth)

Public Class Methods

call(lhs, rhs, root_type) click to toggle source
# File lib/opal/rewriters/logical_operator_assignment.rb, line 64
def self.call(lhs, rhs, root_type)
  recvr, reader_method, *args = *lhs

  # If recvr is a complex expression it must be cached.
  # MRI calls recvr in `recvr.meth ||= rhs` only once.
  if recvr && recvr.type == :send
    recvr_tmp = new_temp
    cache_recvr = s(:lvasgn, recvr_tmp, recvr)                         # $tmp = recvr
    recvr = s(:js_tmp, recvr_tmp)
  end

  writer_method = :"#{reader_method}="

  call_reader = lhs.updated(:send, [recvr, reader_method, *args])      # $tmp.meth
  call_writer = lhs.updated(:send, [recvr, writer_method, *args, rhs]) # $tmp.meth = rhs
  get_or_set = s(root_type, call_reader, call_writer)

  if cache_recvr
    s(:begin, cache_recvr, get_or_set)
  else
    get_or_set
  end
end