class SyntaxTree::YARV::ExpandArray


~~~
x, = [true, false, nil]
~~~ruby
### Usage
if the elements are missing.
it replaces it on the stack with ‘number` elements of the array, or `nil`
`expandarray` looks at the top of the stack, and if the value is an array
### Summary

def ==(other)

def ==(other)
  other.is_a?(ExpandArray) && other.number == number &&
    other.flags == flags
end

def call(vm)

def call(vm)
  object = vm.pop
  object =
    if Array === object
      object.dup
    elsif object.respond_to?(:to_ary, true)
      object.to_ary
    else
      [object]
    end
  splat_flag = flags & 0x01 > 0
  postarg_flag = flags & 0x02 > 0
  if number == 0 && splat_flag == 0
    # no space left on stack
  elsif postarg_flag
    values = []
    if number > object.size
      (number - object.size).times { values.push(nil) }
    end
    [number, object.size].min.times { values.push(object.pop) }
    values.push(object.to_a) if splat_flag
    values.each { |item| vm.push(item) }
  else
    values = []
    [number, object.size].min.times { values.push(object.shift) }
    if number > values.size
      (number - values.size).times { values.push(nil) }
    end
    values.push(object.to_a) if splat_flag
    values.reverse_each { |item| vm.push(item) }
  end
end

def deconstruct_keys(_keys)

def deconstruct_keys(_keys)
  { number: number, flags: flags }
end

def disasm(fmt)

def disasm(fmt)
  fmt.instruction("expandarray", [fmt.object(number), fmt.object(flags)])
end

def initialize(number, flags)

def initialize(number, flags)
  @number = number
  @flags = flags
end

def length

def length
  3
end

def pops

def pops
  1
end

def pushes

def pushes
  number
end

def to_a(_iseq)

def to_a(_iseq)
  [:expandarray, number, flags]
end