class Opal::Rewriters::LogicalOperatorAssignment::SendHandler
(lhs is a recvr.meth)
Produces ‘recvr.meth || recvr.meth = rhs`
Takes `recvr.meth ||= rhs`
def self.call(lhs, rhs, root_type)
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