Class: TypeProf::Core::ChangeSet

Inherits:
Object
  • Object
show all
Defined in:
lib/typeprof/core/graph/change_set.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(node, target) ⇒ ChangeSet

Returns a new instance of ChangeSet.



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/typeprof/core/graph/change_set.rb', line 3

def initialize(node, target)
  @node = node
  @target = target
  @covariant_types = {}
  @contravariant_types = {}
  @edges = []
  @new_edges = []
  @boxes = {}
  @new_boxes = {}
  @diagnostics = []
  @new_diagnostics = []
  @depended_value_entities = []
  @new_depended_value_entities = []
  @depended_method_entities = []
  @new_depended_method_entities = []
  @depended_static_reads = []
  @new_depended_static_reads = []
  @depended_superclasses = []
  @new_depended_superclasses = []
end

Instance Attribute Details

#boxesObject (readonly)

Returns the value of attribute boxes.



24
25
26
# File 'lib/typeprof/core/graph/change_set.rb', line 24

def boxes
  @boxes
end

#covariant_typesObject (readonly)

Returns the value of attribute covariant_types.



24
25
26
# File 'lib/typeprof/core/graph/change_set.rb', line 24

def covariant_types
  @covariant_types
end

#diagnosticsObject (readonly)

Returns the value of attribute diagnostics.



24
25
26
# File 'lib/typeprof/core/graph/change_set.rb', line 24

def diagnostics
  @diagnostics
end

#edgesObject (readonly)

Returns the value of attribute edges.



24
25
26
# File 'lib/typeprof/core/graph/change_set.rb', line 24

def edges
  @edges
end

#nodeObject (readonly)

Returns the value of attribute node.



24
25
26
# File 'lib/typeprof/core/graph/change_set.rb', line 24

def node
  @node
end

Instance Method Details

#add_const_read_box(genv, static_ret) ⇒ Object



114
115
116
117
118
# File 'lib/typeprof/core/graph/change_set.rb', line 114

def add_const_read_box(genv, static_ret)
  key = [:cread, static_ret]
  return if @new_boxes[key]
  @new_boxes[key] = ConstReadBox.new(@node, genv, static_ret)
end

#add_cvar_read_box(genv, cpath, name) ⇒ Object



132
133
134
135
136
# File 'lib/typeprof/core/graph/change_set.rb', line 132

def add_cvar_read_box(genv, cpath, name)
  key = [:cvar_read, cpath, name]
  return if @new_boxes[key]
  @new_boxes[key] = CVarReadBox.new(@node, genv, cpath, name)
end

#add_depended_method_entity(me) ⇒ Object



152
153
154
# File 'lib/typeprof/core/graph/change_set.rb', line 152

def add_depended_method_entity(me)
  @new_depended_method_entities << me
end

#add_depended_static_read(static_read) ⇒ Object



156
157
158
# File 'lib/typeprof/core/graph/change_set.rb', line 156

def add_depended_static_read(static_read)
  @new_depended_static_reads << static_read
end

#add_depended_superclass(mod) ⇒ Object



160
161
162
# File 'lib/typeprof/core/graph/change_set.rb', line 160

def add_depended_superclass(mod)
  @new_depended_superclasses << mod
end

#add_depended_value_entity(ve) ⇒ Object



148
149
150
# File 'lib/typeprof/core/graph/change_set.rb', line 148

def add_depended_value_entity(ve)
  @new_depended_value_entities << ve
end

#add_diagnostic(meth, msg) ⇒ Object



144
145
146
# File 'lib/typeprof/core/graph/change_set.rb', line 144

def add_diagnostic(meth, msg)
  @new_diagnostics << TypeProf::Diagnostic.new(@node, meth, msg)
end

#add_edge(genv, src, dst) ⇒ Object



58
59
60
61
62
# File 'lib/typeprof/core/graph/change_set.rb', line 58

def add_edge(genv, src, dst)
  raise src.class.to_s unless src.is_a?(BasicVertex)
  src.add_edge(genv, dst) if !@edges.include?([src, dst]) && !@new_edges.include?([src, dst])
  @new_edges << [src, dst]
end

#add_escape_box(genv, a_ret, f_ret) ⇒ Object



72
73
74
75
76
# File 'lib/typeprof/core/graph/change_set.rb', line 72

def add_escape_box(genv, a_ret, f_ret)
  key = [:return, a_ret]
  return if @new_boxes[key]
  @new_boxes[key] = EscapeBox.new(@node, genv, a_ret, f_ret)
end

#add_gvar_read_box(genv, var) ⇒ Object



120
121
122
123
124
# File 'lib/typeprof/core/graph/change_set.rb', line 120

def add_gvar_read_box(genv, var)
  key = [:gvar_read, var]
  return if @new_boxes[key]
  @new_boxes[key] = GVarReadBox.new(@node, genv, var)
end

#add_hash_splat_box(genv, arg, unified_key, unified_val) ⇒ Object



84
85
86
87
88
# File 'lib/typeprof/core/graph/change_set.rb', line 84

def add_hash_splat_box(genv, arg, unified_key, unified_val)
  key = [:hash_splat, arg, unified_key, unified_val]
  return if @new_boxes[key]
  @new_boxes[key] = HashSplatBox.new(@node, genv, arg, unified_key, unified_val)
end

#add_ivar_read_box(genv, cpath, singleton, name) ⇒ Object



126
127
128
129
130
# File 'lib/typeprof/core/graph/change_set.rb', line 126

def add_ivar_read_box(genv, cpath, singleton, name)
  key = [:ivar_read, cpath, singleton, name]
  return if @new_boxes[key]
  @new_boxes[key] = IVarReadBox.new(@node, genv, cpath, singleton, name)
end

#add_masgn_box(genv, value, lefts, rest_elem, rights) ⇒ Object



90
91
92
93
94
# File 'lib/typeprof/core/graph/change_set.rb', line 90

def add_masgn_box(genv, value, lefts, rest_elem, rights)
  key = [:masgn, value, lefts, rest_elem, rights]
  return if @new_boxes[key]
  @new_boxes[key] = MAsgnBox.new(@node, genv, value, lefts, rest_elem, rights)
end

#add_method_alias_box(genv, cpath, singleton, new_mid, old_mid) ⇒ Object



108
109
110
111
112
# File 'lib/typeprof/core/graph/change_set.rb', line 108

def add_method_alias_box(genv, cpath, singleton, new_mid, old_mid)
  key = [:mdecl, cpath, singleton, new_mid, old_mid]
  return if @new_boxes[key]
  @new_boxes[key] = MethodAliasBox.new(@node, genv, cpath, singleton, new_mid, old_mid)
end

#add_method_call_box(genv, recv, mid, a_args, subclasses) ⇒ Object

TODO: if an edge is removed during one analysis, we may need to remove sub-boxes?



66
67
68
69
70
# File 'lib/typeprof/core/graph/change_set.rb', line 66

def add_method_call_box(genv, recv, mid, a_args, subclasses)
  key = [:mcall, recv, mid, a_args, subclasses]
  return if @new_boxes[key]
  @new_boxes[key] = MethodCallBox.new(@node, genv, recv, mid, a_args, subclasses)
end

#add_method_decl_box(genv, cpath, singleton, mid, method_types, overloading) ⇒ Object



102
103
104
105
106
# File 'lib/typeprof/core/graph/change_set.rb', line 102

def add_method_decl_box(genv, cpath, singleton, mid, method_types, overloading)
  key = [:mdecl, cpath, singleton, mid, method_types, overloading]
  return if @new_boxes[key]
  @new_boxes[key] = MethodDeclBox.new(@node, genv, cpath, singleton, mid, method_types, overloading)
end

#add_method_def_box(genv, cpath, singleton, mid, f_args, ret_boxes) ⇒ Object



96
97
98
99
100
# File 'lib/typeprof/core/graph/change_set.rb', line 96

def add_method_def_box(genv, cpath, singleton, mid, f_args, ret_boxes)
  key = [:mdef, cpath, singleton, mid, f_args, ret_boxes]
  return if @new_boxes[key]
  @new_boxes[key] = MethodDefBox.new(@node, genv, cpath, singleton, mid, f_args, ret_boxes)
end

#add_splat_box(genv, arg) ⇒ Object



78
79
80
81
82
# File 'lib/typeprof/core/graph/change_set.rb', line 78

def add_splat_box(genv, arg)
  key = [:splat, arg]
  return if @new_boxes[key]
  @new_boxes[key] = SplatBox.new(@node, genv, arg)
end

#add_type_read_box(genv, type) ⇒ Object



138
139
140
141
142
# File 'lib/typeprof/core/graph/change_set.rb', line 138

def add_type_read_box(genv, type)
  key = [:type_read, type]
  return if @new_boxes[key]
  @new_boxes[key] = TypeReadBox.new(@node, genv, type)
end

#copy_from(other) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
# File 'lib/typeprof/core/graph/change_set.rb', line 36

def copy_from(other)
  @covariant_types = other.covariant_types.dup
  @edges = other.edges.dup
  @boxes = other.boxes.dup
  @diagnostics = other.diagnostics.dup

  other.covariant_types.clear
  other.edges.clear
  other.boxes.clear
  other.diagnostics.clear
end

#new_contravariant_vertex(genv, sig_type_node) ⇒ Object



53
54
55
56
# File 'lib/typeprof/core/graph/change_set.rb', line 53

def new_contravariant_vertex(genv, sig_type_node)
  # This is used to avoid duplicated vertex generation for the same sig node
  @contravariant_types[sig_type_node] ||= Vertex.new(sig_type_node)
end

#new_covariant_vertex(genv, sig_type_node) ⇒ Object



48
49
50
51
# File 'lib/typeprof/core/graph/change_set.rb', line 48

def new_covariant_vertex(genv, sig_type_node)
  # This is used to avoid duplicated vertex generation for the same sig node
  @covariant_types[sig_type_node] ||= Vertex.new(sig_type_node)
end

#reinstall(genv) ⇒ Object



164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
# File 'lib/typeprof/core/graph/change_set.rb', line 164

def reinstall(genv)
  @new_edges.uniq!
  @edges.each do |src, dst|
    src.remove_edge(genv, dst) unless @new_edges.include?([src, dst])
  end
  @edges, @new_edges = @new_edges, @edges
  @new_edges.clear

  @boxes.each do |key, box|
    box.destroy(genv)
  end
  @boxes, @new_boxes = @new_boxes, @boxes
  @new_boxes.clear

  @diagnostics, @new_diagnostics = @new_diagnostics, @diagnostics
  @new_diagnostics.clear

  @depended_value_entities.each do |ve|
    ve.read_boxes.delete(@target) || raise
  end
  @new_depended_value_entities.uniq!
  @new_depended_value_entities.each do |ve|
    ve.read_boxes << @target
  end
  @depended_value_entities, @new_depended_value_entities = @new_depended_value_entities, @depended_value_entities
  @new_depended_value_entities.clear

  @depended_method_entities.each do |me|
    me.method_call_boxes.delete(@target) || raise
  end
  @new_depended_method_entities.uniq!
  @new_depended_method_entities.each do |me|
    me.method_call_boxes << @target
  end
  @depended_method_entities, @new_depended_method_entities = @new_depended_method_entities, @depended_method_entities
  @new_depended_method_entities.clear

  @depended_static_reads.each do |static_read|
    static_read.followers.delete(@target)
  end
  @new_depended_static_reads.uniq!
  @new_depended_static_reads.each do |static_read|
    static_read.followers << @target
  end

  @depended_static_reads, @new_depended_static_reads = @new_depended_static_reads, @depended_static_reads
  @new_depended_static_reads.clear

  @depended_superclasses.each do |mod|
    mod.subclass_checks.delete(@target)
  end
  @new_depended_superclasses.uniq!
  @new_depended_superclasses.each do |mod|
    mod.subclass_checks << @target
  end

  @depended_superclasses, @new_depended_superclasses = @new_depended_superclasses, @depended_superclasses
  @new_depended_superclasses.clear
end

#reuse(new_node) ⇒ Object



26
27
28
29
30
31
32
33
34
# File 'lib/typeprof/core/graph/change_set.rb', line 26

def reuse(new_node)
  @node = new_node
  @boxes.each_value do |box|
    box.reuse(new_node)
  end
  @diagnostics.each do |diag|
    diag.reuse(new_node)
  end
end