Class: Audition::Static::Checks::RactorIsolation::CaptureScanner
- Inherits:
-
Prism::Visitor
- Object
- Prism::Visitor
- Audition::Static::Checks::RactorIsolation::CaptureScanner
- Defined in:
- lib/audition/static/checks/ractor_isolation.rb
Overview
Walks the Ractor block's body tracking how many block scopes deep we are; a local reference with depth greater than that resolves outside the Ractor block.
Instance Attribute Summary collapse
-
#names ⇒ Object
readonly
Returns the value of attribute names.
Class Method Summary collapse
Instance Method Summary collapse
-
#initialize ⇒ CaptureScanner
constructor
A new instance of CaptureScanner.
- #visit_block_node(node) ⇒ Object
-
#visit_def_node(node) ⇒ Object
Method definitions open fresh scopes; nothing inside them can capture the surrounding locals.
- #visit_lambda_node(node) ⇒ Object
- #visit_local_variable_and_write_node(node) ⇒ Object
- #visit_local_variable_operator_write_node(node) ⇒ Object
- #visit_local_variable_or_write_node(node) ⇒ Object
-
#visit_local_variable_read_node(node) ⇒ Object
Plain defs, not a define_method loop: the parallel scan calls these from worker Ractors, and a method born from define_method carries an un-shareable Proc that raises when dispatched from another Ractor.
- #visit_local_variable_target_node(node) ⇒ Object
- #visit_local_variable_write_node(node) ⇒ Object
Constructor Details
#initialize ⇒ CaptureScanner
Returns a new instance of CaptureScanner.
63 64 65 66 67 |
# File 'lib/audition/static/checks/ractor_isolation.rb', line 63 def initialize @names = [] @level = 0 super end |
Instance Attribute Details
#names ⇒ Object (readonly)
Returns the value of attribute names.
61 62 63 |
# File 'lib/audition/static/checks/ractor_isolation.rb', line 61 def names @names end |
Class Method Details
.scan(body) ⇒ Object
55 56 57 58 59 |
# File 'lib/audition/static/checks/ractor_isolation.rb', line 55 def self.scan(body) scanner = new scanner.visit(body) scanner.names.uniq end |
Instance Method Details
#visit_block_node(node) ⇒ Object
69 70 71 72 73 74 |
# File 'lib/audition/static/checks/ractor_isolation.rb', line 69 def visit_block_node(node) @level += 1 super ensure @level -= 1 end |
#visit_def_node(node) ⇒ Object
Method definitions open fresh scopes; nothing inside
them can capture the surrounding locals.
A def opens a fresh scope, but its receiver
expression (def x.foo) evaluates in the enclosing
one and can capture an outer local.
88 89 90 |
# File 'lib/audition/static/checks/ractor_isolation.rb', line 88 def visit_def_node(node) visit(node.receiver) if node.receiver end |
#visit_lambda_node(node) ⇒ Object
76 77 78 79 80 81 |
# File 'lib/audition/static/checks/ractor_isolation.rb', line 76 def visit_lambda_node(node) @level += 1 super ensure @level -= 1 end |
#visit_local_variable_and_write_node(node) ⇒ Object
116 117 118 119 |
# File 'lib/audition/static/checks/ractor_isolation.rb', line 116 def visit_local_variable_and_write_node(node) note(node) super end |
#visit_local_variable_operator_write_node(node) ⇒ Object
106 107 108 109 |
# File 'lib/audition/static/checks/ractor_isolation.rb', line 106 def visit_local_variable_operator_write_node(node) note(node) super end |
#visit_local_variable_or_write_node(node) ⇒ Object
111 112 113 114 |
# File 'lib/audition/static/checks/ractor_isolation.rb', line 111 def visit_local_variable_or_write_node(node) note(node) super end |
#visit_local_variable_read_node(node) ⇒ Object
Plain defs, not a define_method loop: the parallel scan calls these from worker Ractors, and a method born from define_method carries an un-shareable Proc that raises when dispatched from another Ractor.
96 97 98 99 |
# File 'lib/audition/static/checks/ractor_isolation.rb', line 96 def visit_local_variable_read_node(node) note(node) super end |
#visit_local_variable_target_node(node) ⇒ Object
121 122 123 124 |
# File 'lib/audition/static/checks/ractor_isolation.rb', line 121 def visit_local_variable_target_node(node) note(node) super end |
#visit_local_variable_write_node(node) ⇒ Object
101 102 103 104 |
# File 'lib/audition/static/checks/ractor_isolation.rb', line 101 def visit_local_variable_write_node(node) note(node) super end |