Class: CodeTools::AST::ElementAssignment

Inherits:
SendWithArguments show all
Defined in:
lib/rubinius/ast/sends.rb

Instance Attribute Summary

Attributes inherited from SendWithArguments

#arguments

Attributes inherited from Send

#block, #name, #privately, #receiver, #variable, #vcall_style

Attributes inherited from Node

#line

Instance Method Summary collapse

Methods inherited from SendWithArguments

#arguments_sexp

Methods inherited from Send

#arguments_sexp, #check_local_reference, #defined, #receiver_sexp, #to_sexp, #value_defined

Methods inherited from Node

#ascii_graph, #attributes, #children, #defined, match_arguments?, match_send?, #new_block_generator, #new_generator, #node_name, #or_bytecode, #pos, #set_child, #to_sexp, #transform, transform, transform_comment, transform_kind, transform_kind=, transform_name, #value_defined, #visit, #walk

Constructor Details

#initialize(line, receiver, arguments) ⇒ ElementAssignment

Returns a new instance of ElementAssignment.



202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
# File 'lib/rubinius/ast/sends.rb', line 202

def initialize(line, receiver, arguments)
  @line = line

  @receiver = receiver
  @privately = receiver.kind_of?(Self) ? true : false

  @name = :[]=

  case arguments
  when PushArgs
    @arguments = PushArguments.new line, arguments
  else
    @arguments = Arguments.new line, arguments
  end
end

Instance Method Details

#bytecode(g) ⇒ Object



226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
# File 'lib/rubinius/ast/sends.rb', line 226

def bytecode(g)
  return masgn_bytecode(g) if g.state.masgn?

  @receiver.bytecode(g)
  @arguments.bytecode(g)

  g.dup

  if @arguments.splat?
    case @arguments
    when PushArguments
      g.move_down @arguments.size + 2
      g.swap
      flag = true
    when Arguments
      # TODO: Optimize bytecode for x[a, *b, c, d] = e
      g.send :last, 0, true
      g.move_down @arguments.size + 2
      flag = false
    end

    g.push :nil
    g.send_with_splat @name, @arguments.size, @privately, flag
  else
    g.move_down @arguments.size + 1
    g.send @name, @arguments.size, @privately
  end

  g.pop
end

#masgn_bytecode(g) ⇒ Object



218
219
220
221
222
223
224
# File 'lib/rubinius/ast/sends.rb', line 218

def masgn_bytecode(g)
  @receiver.bytecode(g)
  g.swap
  @arguments.masgn_bytecode(g)
  g.send @name, @arguments.size + 1, @privately
  # TODO: splat
end

#sexp_nameObject



257
258
259
# File 'lib/rubinius/ast/sends.rb', line 257

def sexp_name
  :attrasgn
end