Class: AdLint::Cc1::TypeResolver

Inherits:
SyntaxTreeVisitor show all
Extended by:
Forwardable
Includes:
MonitorUtil
Defined in:
lib/adlint/cc1/resolver.rb

Direct Known Subclasses

DynamicTypeResolver, StaticTypeResolver

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from MonitorUtil

#checkpoint, #monitored_region

Methods inherited from SyntaxTreeVisitor

#visit_abbreviated_function_declarator, #visit_additive_expression, #visit_address_expression, #visit_alignof_expression, #visit_alignof_type_expression, #visit_and_expression, #visit_ansi_function_declarator, #visit_array_abstract_declarator, #visit_array_declarator, #visit_array_subscript_expression, #visit_bit_access_by_pointer_expression, #visit_bit_access_by_value_expression, #visit_break_statement, #visit_c99_for_statement, #visit_case_labeled_statement, #visit_cast_expression, #visit_comma_separated_expression, #visit_compound_assignment_expression, #visit_compound_literal_expression, #visit_conditional_expression, #visit_constant_specifier, #visit_continue_statement, #visit_declaration, #visit_declaration_specifiers, #visit_default_labeled_statement, #visit_do_statement, #visit_enum_specifier, #visit_enumerator, #visit_equality_expression, #visit_error_expression, #visit_error_statement, #visit_exclusive_or_expression, #visit_expression_statement, #visit_for_statement, #visit_function_abstract_declarator, #visit_function_call_expression, #visit_generic_labeled_statement, #visit_goto_statement, #visit_grouped_abstract_declarator, #visit_grouped_declarator, #visit_grouped_expression, #visit_identifier_declarator, #visit_if_else_statement, #visit_if_statement, #visit_inclusive_or_expression, #visit_indirection_expression, #visit_init_declarator, #visit_initializer, #visit_kandr_function_declarator, #visit_logical_and_expression, #visit_logical_or_expression, #visit_member_access_by_pointer_expression, #visit_member_access_by_value_expression, #visit_multiplicative_expression, #visit_null_constant_specifier, #visit_object_specifier, #visit_parameter_type_list, #visit_pointer_abstract_declarator, #visit_postfix_decrement_expression, #visit_postfix_increment_expression, #visit_prefix_decrement_expression, #visit_prefix_increment_expression, #visit_relational_expression, #visit_return_statement, #visit_shift_expression, #visit_simple_assignment_expression, #visit_sizeof_expression, #visit_sizeof_type_expression, #visit_specifier_qualifier_list, #visit_standard_type_specifier, #visit_string_literal_specifier, #visit_struct_declarator, #visit_struct_specifier, #visit_switch_statement, #visit_translation_unit, #visit_typedef_type_specifier, #visit_typeof_type_specifier, #visit_unary_arithmetic_expression, #visit_union_specifier, #visit_while_statement

Constructor Details

#initialize(type_tbl) ⇒ TypeResolver

Returns a new instance of TypeResolver.



42
43
44
# File 'lib/adlint/cc1/resolver.rb', line 42

def initialize(type_tbl)
  @type_table = type_tbl
end

Instance Attribute Details

#type_tableObject (readonly)

Returns the value of attribute type_table.



46
47
48
# File 'lib/adlint/cc1/resolver.rb', line 46

def type_table
  @type_table
end

Instance Method Details

#resolve(ast) ⇒ Object



48
49
50
51
# File 'lib/adlint/cc1/resolver.rb', line 48

def resolve(ast)
  ast.accept(self)
  @type_table
end

#visit_ansi_function_definition(node) ⇒ Object



190
191
192
193
194
# File 'lib/adlint/cc1/resolver.rb', line 190

def visit_ansi_function_definition(node)
  checkpoint(node.location)
  super
  node.type = lookup_function_type(node)
end

#visit_compound_statement(node) ⇒ Object



221
222
223
224
225
# File 'lib/adlint/cc1/resolver.rb', line 221

def visit_compound_statement(node)
  @type_table.enter_scope
  super
  @type_table.leave_scope
end

#visit_enum_type_declaration(node) ⇒ Object



93
94
95
96
97
# File 'lib/adlint/cc1/resolver.rb', line 93

def visit_enum_type_declaration(node)
  checkpoint(node.location)
  node.type = @type_table.install_enum_type(node)
  node.enumerators.each { |enum| enum.type = node.type }
end

#visit_function_declaration(node) ⇒ Object



106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# File 'lib/adlint/cc1/resolver.rb', line 106

def visit_function_declaration(node)
  checkpoint(node.location)
  node.declaration_specifiers.accept(self) if node.declaration_specifiers
  node.init_declarator.accept(self)

  if dcl_specs = node.declaration_specifiers
    type_quals = dcl_specs.type_qualifiers
    type_specs = dcl_specs.type_specifiers
  else
    type_quals = []
    type_specs = []
  end

  node.type = lookup_variable_type(type_quals, type_specs,
                                   node.init_declarator.declarator)
end

#visit_kandr_function_definition(node) ⇒ Object



196
197
198
199
200
# File 'lib/adlint/cc1/resolver.rb', line 196

def visit_kandr_function_definition(node)
  checkpoint(node.location)
  super
  node.type = lookup_function_type(node)
end

#visit_member_declaration(node) ⇒ Object



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/adlint/cc1/resolver.rb', line 69

def visit_member_declaration(node)
  checkpoint(node.location)
  node.specifier_qualifier_list.accept(self)
  node.struct_declarator.accept(self) if node.struct_declarator

  type_quals = node.specifier_qualifier_list.type_qualifiers
  type_specs = node.specifier_qualifier_list.type_specifiers
  struct_dcr = node.struct_declarator

  type = lookup_variable_type(type_quals, type_specs,
                              struct_dcr ? struct_dcr.declarator : nil)
  type = @type_table.pointer_type(type) if type.function?

  if struct_dcr and struct_dcr.bitfield?
    if bit_width = compute_bitfield_width(struct_dcr)
      type = @type_table.bitfield_type(type, bit_width)
    else
      type = fallback_type
    end
  end

  node.type = type
end

#visit_parameter_declaration(node) ⇒ Object



123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# File 'lib/adlint/cc1/resolver.rb', line 123

def visit_parameter_declaration(node)
  checkpoint(node.location)
  node.declaration_specifiers.accept(self) if node.declaration_specifiers
  node.declarator.accept(self) if node.declarator

  if dcl_specs = node.declaration_specifiers
    type_quals = dcl_specs.type_qualifiers
    type_specs = dcl_specs.type_specifiers
  else
    type_quals = []
    type_specs = []
  end

  type = lookup_variable_type(type_quals, type_specs, node.declarator)

  if type.function?
    node.type = @type_table.pointer_type(type)
  else
    node.type = type
  end
end

#visit_parameter_definition(node) ⇒ Object



202
203
204
205
206
207
208
209
210
# File 'lib/adlint/cc1/resolver.rb', line 202

def visit_parameter_definition(node)
  checkpoint(node.location)
  node.declaration_specifiers.accept(self) if node.declaration_specifiers
  node.declarator.accept(self) if node.declarator

  type = @type_table.lookup_parameter_type(node, interpreter)
  type = @type_table.pointer_type(type) if type.function?
  node.type = type
end

#visit_struct_declaration(node) ⇒ Object



65
66
67
# File 'lib/adlint/cc1/resolver.rb', line 65

def visit_struct_declaration(node)
  node.items.each { |item| item.accept(self) }
end

#visit_struct_type_declaration(node) ⇒ Object



53
54
55
56
57
# File 'lib/adlint/cc1/resolver.rb', line 53

def visit_struct_type_declaration(node)
  checkpoint(node.location)
  node.struct_declarations.each { |dcl| dcl.accept(self) }
  node.type = @type_table.install_struct_type(node)
end

#visit_type_name(node) ⇒ Object



212
213
214
215
216
217
218
219
# File 'lib/adlint/cc1/resolver.rb', line 212

def visit_type_name(node)
  checkpoint(node.location)
  super
  type_quals = node.specifier_qualifier_list.type_qualifiers
  type_specs = node.specifier_qualifier_list.type_specifiers
  node.type = lookup_variable_type(type_quals, type_specs,
                                   node.abstract_declarator)
end

#visit_typedef_declaration(node) ⇒ Object



99
100
101
102
103
104
# File 'lib/adlint/cc1/resolver.rb', line 99

def visit_typedef_declaration(node)
  checkpoint(node.location)
  node.declaration_specifiers.accept(self)
  node.init_declarator.accept(self)
  node.type = @type_table.install_user_type(node)
end

#visit_union_type_declaration(node) ⇒ Object



59
60
61
62
63
# File 'lib/adlint/cc1/resolver.rb', line 59

def visit_union_type_declaration(node)
  checkpoint(node.location)
  node.struct_declarations.each { |dcl| dcl.accept(self) }
  node.type = @type_table.install_union_type(node)
end

#visit_variable_declaration(node) ⇒ Object



145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
# File 'lib/adlint/cc1/resolver.rb', line 145

def visit_variable_declaration(node)
  checkpoint(node.location)
  node.declaration_specifiers.accept(self) if node.declaration_specifiers
  node.declarator.accept(self)

  if dcl_specs = node.declaration_specifiers
    type_quals = dcl_specs.type_qualifiers
    type_specs = dcl_specs.type_specifiers
  else
    type_quals = []
    type_specs = []
  end

  type = lookup_variable_type(type_quals, type_specs, node.declarator)

  if type.function?
    node.type = @type_table.pointer_type(type)
  else
    node.type = type
  end
end

#visit_variable_definition(node) ⇒ Object



167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
# File 'lib/adlint/cc1/resolver.rb', line 167

def visit_variable_definition(node)
  checkpoint(node.location)
  node.declaration_specifiers.accept(self) if node.declaration_specifiers
  node.init_declarator.accept(self)

  if dcl_specs = node.declaration_specifiers
    type_quals = dcl_specs.type_qualifiers
    type_specs = dcl_specs.type_specifiers
  else
    type_quals = []
    type_specs = []
  end

  type = lookup_variable_type(type_quals, type_specs,
                              node.init_declarator.declarator)

  if type.function?
    node.type = @type_table.pointer_type(type)
  else
    node.type = type
  end
end