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
- #visit_and(_op, _ctx) ⇒ Object
- #visit_bitshift(_op, _ctx) ⇒ Object
- #visit_eq(_op, _ctx) ⇒ Object
- #visit_false(_op, _ctx) ⇒ Object
- #visit_ge(_op, _ctx) ⇒ Object
- #visit_gt(_op, _ctx) ⇒ Object
- #visit_le(_op, _ctx) ⇒ Object
- #visit_lt(_op, _ctx) ⇒ Object
- #visit_ne(_op, _ctx) ⇒ Object
- #visit_not(_op, _ctx) ⇒ Object
- #visit_or(_op, _ctx) ⇒ Object
- #visit_true(_op, _ctx) ⇒ Object
- #visit_xor(_op, _ctx) ⇒ Object
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 |