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