Module: Postsvg::Visitors::PsVisitor::Boolean

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

Overview

Boolean / comparison operator handlers. Pop from RUNTIME stack so chained comparisons behave correctly.

Instance Method Summary collapse

Instance Method Details

#visit_and(_op, _ctx) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
# File 'lib/postsvg/visitors/ps_visitor/boolean.rb', line 53

def visit_and(_op, _ctx)
  b = @stack.pop
  a = @stack.pop
  result =
    if a.is_a?(Integer) && b.is_a?(Integer)
      a & b
    else
      truthy?(a) && truthy?(b)
    end
  @stack << result
end

#visit_bitshift(_op, _ctx) ⇒ Object



95
96
97
98
99
# File 'lib/postsvg/visitors/ps_visitor/boolean.rb', line 95

def visit_bitshift(_op, _ctx)
  shift = pop_runtime_number.to_i
  v = pop_runtime_number.to_i
  @stack << (shift.negative? ? (v >> -shift) : (v << shift))
end

#visit_eq(_op, _ctx) ⇒ Object



17
18
19
20
21
# File 'lib/postsvg/visitors/ps_visitor/boolean.rb', line 17

def visit_eq(_op, _ctx)
  b = @stack.pop
  a = @stack.pop
  @stack << (a == b)
end

#visit_false(_op, _ctx) ⇒ Object



13
14
15
# File 'lib/postsvg/visitors/ps_visitor/boolean.rb', line 13

def visit_false(_op, _ctx)
  @stack << false
end

#visit_ge(_op, _ctx) ⇒ Object



35
36
37
38
39
# File 'lib/postsvg/visitors/ps_visitor/boolean.rb', line 35

def visit_ge(_op, _ctx)
  b = pop_runtime_number
  a = pop_runtime_number
  @stack << (a >= b)
end

#visit_gt(_op, _ctx) ⇒ Object



29
30
31
32
33
# File 'lib/postsvg/visitors/ps_visitor/boolean.rb', line 29

def visit_gt(_op, _ctx)
  b = pop_runtime_number
  a = pop_runtime_number
  @stack << (a > b)
end

#visit_le(_op, _ctx) ⇒ Object



47
48
49
50
51
# File 'lib/postsvg/visitors/ps_visitor/boolean.rb', line 47

def visit_le(_op, _ctx)
  b = pop_runtime_number
  a = pop_runtime_number
  @stack << (a <= b)
end

#visit_lt(_op, _ctx) ⇒ Object



41
42
43
44
45
# File 'lib/postsvg/visitors/ps_visitor/boolean.rb', line 41

def visit_lt(_op, _ctx)
  b = pop_runtime_number
  a = pop_runtime_number
  @stack << (a < b)
end

#visit_ne(_op, _ctx) ⇒ Object



23
24
25
26
27
# File 'lib/postsvg/visitors/ps_visitor/boolean.rb', line 23

def visit_ne(_op, _ctx)
  b = @stack.pop
  a = @stack.pop
  @stack << (a != b)
end

#visit_not(_op, _ctx) ⇒ Object



89
90
91
92
93
# File 'lib/postsvg/visitors/ps_visitor/boolean.rb', line 89

def visit_not(_op, _ctx)
  v = @stack.pop
  result = v.is_a?(Integer) ? ~v : !truthy?(v)
  @stack << result
end

#visit_or(_op, _ctx) ⇒ Object



65
66
67
68
69
70
71
72
73
74
75
# File 'lib/postsvg/visitors/ps_visitor/boolean.rb', line 65

def visit_or(_op, _ctx)
  b = @stack.pop
  a = @stack.pop
  result =
    if a.is_a?(Integer) && b.is_a?(Integer)
      a | b
    else
      truthy?(a) || truthy?(b)
    end
  @stack << result
end

#visit_true(_op, _ctx) ⇒ Object



9
10
11
# File 'lib/postsvg/visitors/ps_visitor/boolean.rb', line 9

def visit_true(_op, _ctx)
  @stack << true
end

#visit_xor(_op, _ctx) ⇒ Object



77
78
79
80
81
82
83
84
85
86
87
# File 'lib/postsvg/visitors/ps_visitor/boolean.rb', line 77

def visit_xor(_op, _ctx)
  b = @stack.pop
  a = @stack.pop
  result =
    if a.is_a?(Integer) && b.is_a?(Integer)
      a ^ b
    else
      truthy?(a) != truthy?(b)
    end
  @stack << result
end