class AdLint::Cc1::DeclarationInterpreter
Public Class Methods
new(owner)
click to toggle source
Calls superclass method
AdLint::Cc1::SubInterpreter::new
# File lib/adlint/cc1/interp.rb, line 566 def initialize(owner) super(owner, Declaration) end
Public Instance Methods
visit_enum_type_declaration(node)
click to toggle source
# File lib/adlint/cc1/interp.rb, line 645 def visit_enum_type_declaration(node) checkpoint(node) if enums = node.enum_specifier.enumerators seq = 0 enums.each do |enum| if expr = enum.expression obj = interpret(expr) if obj.variable? && obj.value.scalar? enum.value = obj.value.unique_sample end end enum.value ||= seq define_enumerator(enum) seq = enum.value + 1 end end notify_enum_declared(node) end
visit_function_declaration(node)
click to toggle source
# File lib/adlint/cc1/interp.rb, line 570 def visit_function_declaration(node) checkpoint(node.location) resolve_unresolved_type(node) node.type.declarations.each do |dcl| dcl.mark_as_referred_by(node.identifier) end fun = declare_explicit_function(node) notify_explicit_function_declared(node, fun) evaluate_sequence_point(node.init_declarator.declarator) end
visit_struct_type_declaration(node)
click to toggle source
# File lib/adlint/cc1/interp.rb, line 631 def visit_struct_type_declaration(node) checkpoint(node.location) resolve_unresolved_type(node) notify_struct_declared(node) end
visit_typedef_declaration(node)
click to toggle source
# File lib/adlint/cc1/interp.rb, line 666 def visit_typedef_declaration(node) checkpoint(node.location) resolve_unresolved_type(node) node.type.real_type.declarations.each do |dcl| dcl.mark_as_referred_by(node.identifier) end notify_typedef_declared(node) evaluate_sequence_point(node.init_declarator.declarator) LOG_I("user-type `#{node.identifier.value}' " + "defined at #{node.location.to_s}.") end
visit_union_type_declaration(node)
click to toggle source
# File lib/adlint/cc1/interp.rb, line 638 def visit_union_type_declaration(node) checkpoint(node.location) resolve_unresolved_type(node) notify_union_declared(node) end
visit_variable_declaration(node)
click to toggle source
# File lib/adlint/cc1/interp.rb, line 583 def visit_variable_declaration(node) checkpoint(node.location) resolve_unresolved_type(node) node.type.declarations.each do |dcl| dcl.mark_as_referred_by(node.identifier) end var = declare_variable(node, current_branch) notify_variable_declared(node, var) evaluate_sequence_point(node.declarator) end
visit_variable_definition(node)
click to toggle source
# File lib/adlint/cc1/interp.rb, line 596 def visit_variable_definition(node) checkpoint(node.location) resolve_unresolved_type(node) node.type.declarations.each do |dcl| dcl.mark_as_referred_by(node.identifier) end if node.initializer if node.type.incomplete? # NOTE: Unable to define variable of incomplete type such as an array # without length. init_var, init_conved = evaluate_initializer(node) var = define_variable(node, current_branch, init_conved.value.to_defined_value) else # NOTE: Declare variable first in order to correctly evaluate # sizeof-expression that refers to the defining variable in the # initializer. declare_variable(node, current_branch) init_var, init_conved = evaluate_initializer(node) var = define_variable(node, current_branch, init_conved.value.to_defined_value) end notify_variable_value_referred(node, init_var) notify_variable_defined(node, var) notify_variable_initialized(node, var, init_var) else notify_variable_defined(node, define_variable(node, current_branch)) end evaluate_sequence_point(node.init_declarator.declarator) end
Private Instance Methods
deduct_array_length_from_array_variable(var_def, ary)
click to toggle source
# File lib/adlint/cc1/interp.rb, line 702 def deduct_array_length_from_array_variable(var_def, ary) unless var_def.type.length if var_def.type.user? var_def.type = var_def.type.dup end var_def.type.length = ary.type.length end end
evaluate_initializer(var_def)
click to toggle source
# File lib/adlint/cc1/interp.rb, line 682 def evaluate_initializer(var_def) init_interp = InitializerInterpreter.new(interpreter) var, conved = init_interp.execute(var_def) # NOTE: An implicit conversion and size deduction of an incomplete array # have been done by InitializerInterpreter. # NOTE: For the case of array variable definition with a # string-literal-specifier as the initializer. if var_def.type.array? && var.type.pointer? unless ary = pointee_of(var) and ary.type.array? ary = create_tmpvar(var_def.type) end deduct_array_length_from_array_variable(var_def, ary) var = conved = ary end return var, conved end
evaluate_sequence_point(full_dcr)
click to toggle source
# File lib/adlint/cc1/interp.rb, line 711 def evaluate_sequence_point(full_dcr) if seqp = full_dcr.subsequent_sequence_point notify_sequence_point_reached(seqp) end end