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