Module: Postsvg::Visitors::PsVisitor::Stack

Included in:
Postsvg::Visitors::PsVisitor
Defined in:
lib/postsvg/visitors/ps_visitor/stack.rb

Overview

Stack manipulation operator handlers.

Instance Method Summary collapse

Instance Method Details

#visit_clear(_op, _ctx) ⇒ Object



37
38
39
# File 'lib/postsvg/visitors/ps_visitor/stack.rb', line 37

def visit_clear(_op, _ctx)
  @stack = []
end

#visit_count(_op, _ctx) ⇒ Object



41
42
43
# File 'lib/postsvg/visitors/ps_visitor/stack.rb', line 41

def visit_count(_op, _ctx)
  @stack << @stack.length
end

#visit_dup(_op, _ctx) ⇒ Object



19
20
21
# File 'lib/postsvg/visitors/ps_visitor/stack.rb', line 19

def visit_dup(_op, _ctx)
  @stack << @stack.last
end

#visit_exch(_op, _ctx) ⇒ Object



12
13
14
15
16
17
# File 'lib/postsvg/visitors/ps_visitor/stack.rb', line 12

def visit_exch(_op, _ctx)
  b = pop_value
  a = pop_value
  @stack << b
  @stack << a
end

#visit_index(op, _ctx) ⇒ Object



23
24
25
# File 'lib/postsvg/visitors/ps_visitor/stack.rb', line 23

def visit_index(op, _ctx)
  @stack << @stack[-1 - op.index]
end

#visit_pop(_op, _ctx) ⇒ Object



8
9
10
# File 'lib/postsvg/visitors/ps_visitor/stack.rb', line 8

def visit_pop(_op, _ctx)
  pop_value
end

#visit_roll(op, _ctx) ⇒ Object



27
28
29
30
31
32
33
34
35
# File 'lib/postsvg/visitors/ps_visitor/stack.rb', line 27

def visit_roll(op, _ctx)
  count = op.count
  positions = op.positions
  return if count.abs > @stack.length

  slice = @stack.pop(count)
  rotated = positions.negative? ? slice.rotate(positions) : slice.rotate(-positions)
  rotated.each { |v| @stack << v }
end