Skip to content

Commit 9959a28

Browse files
committed
Lazily allocate @diagnostics Set in AST nodes
Initialize @diagnostics as the frozen empty set instance to avoid allocating a Hash for every AST node. Most nodes never receive diagnostics, so the Set is only created on first use via add_diagnostic.
1 parent 2375d7a commit 9959a28

2 files changed

Lines changed: 6 additions & 2 deletions

File tree

lib/typeprof/core/ast/base.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ def initialize(raw_node, lenv)
99
@ret = nil
1010

1111
@changes = ChangeSet.new(self, nil)
12-
@diagnostics = Set.empty
12+
@diagnostics = Set::EMPTY
1313
end
1414

1515
attr_reader :lenv
@@ -104,6 +104,7 @@ def install_copy(genv)
104104
@changes.reuse(self)
105105
(@prev_node || raise).diagnostics.each do |diag|
106106
diag.reuse(self)
107+
@diagnostics = Set.empty if @diagnostics.equal?(Set::EMPTY)
107108
@diagnostics << diag
108109
end
109110
each_subnode do |subnode|
@@ -129,11 +130,12 @@ def narrowings
129130
end
130131

131132
def add_diagnostic(diag)
133+
@diagnostics = Set.empty if @diagnostics.equal?(Set::EMPTY)
132134
@diagnostics << diag
133135
end
134136

135137
def remove_diagnostic(diag)
136-
@diagnostics.delete(diag)
138+
@diagnostics.delete(diag) unless @diagnostics.equal?(Set::EMPTY)
137139
end
138140

139141
def diff(prev_node)

lib/typeprof/core/util.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,5 +81,7 @@ def pretty_print(q)
8181
end
8282
q.text "]"
8383
end
84+
85+
EMPTY = empty.freeze
8486
end
8587
end

0 commit comments

Comments
 (0)