Class: AdLint::Cc1::TypeResolver
Instance Attribute Summary collapse
Instance Method Summary
collapse
#checkpoint, #monitored_region
#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
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_table ⇒ Object
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
|