Class: CodeTools::AST::ElementAssignment

Inherits:
SendWithArguments show all
Defined in:
lib/rubinius/code/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.



212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
# File 'lib/rubinius/code/ast/sends.rb', line 212

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



236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
# File 'lib/rubinius/code/ast/sends.rb', line 236

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



228
229
230
231
232
233
234
# File 'lib/rubinius/code/ast/sends.rb', line 228

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



267
268
269
# File 'lib/rubinius/code/ast/sends.rb', line 267

def sexp_name
  :attrasgn
end