class SyntaxTree::YARV::ExpandArray
### Summary
‘expandarray` looks at the top of the stack, and if the value is an array it replaces it on the stack with `number` elements of the array, or `nil` if the elements are missing.
### Usage
~~~ruby x, = [true, false, nil] ~~~
Attributes
Public Class Methods
Source
# File lib/syntax_tree/yarv/instructions.rb, line 1448 def initialize(number, flags) @number = number @flags = flags end
Public Instance Methods
Source
# File lib/syntax_tree/yarv/instructions.rb, line 1465 def ==(other) other.is_a?(ExpandArray) && other.number == number && other.flags == flags end
Source
# File lib/syntax_tree/yarv/instructions.rb, line 1482 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
Source
# File lib/syntax_tree/yarv/instructions.rb, line 1461 def deconstruct_keys(_keys) { number: number, flags: flags } end
Source
# File lib/syntax_tree/yarv/instructions.rb, line 1453 def disasm(fmt) fmt.instruction("expandarray", [fmt.object(number), fmt.object(flags)]) end
Source
# File lib/syntax_tree/yarv/instructions.rb, line 1457 def to_a(_iseq) [:expandarray, number, flags] end