class AdLint::Cc1::ValueDomainManipulator

Attributes

affected_variables[R]
interpreter[R]

Public Class Methods

new(interp, target_expr) click to toggle source
# File lib/adlint/cc1/ctrlexpr.rb, line 152
def initialize(interp, target_expr)
  @interpreter        = interp
  @target_expr        = target_expr
  @affected_variables = []
  @narrowing          = nil
  @value_memory       = nil
end

Private Class Methods

def_strict_object_derivation(method_name) click to toggle source
# File lib/adlint/cc1/ctrlexpr.rb, line 203
    def self.def_strict_object_derivation(method_name)
      class_eval <<-EOS
        define_method("#{method_name}") do |*args|
          StrictObjectDerivation.new(self, args.first)
        end
      EOS
    end

Public Instance Methods

commit!() click to toggle source
# File lib/adlint/cc1/ctrlexpr.rb, line 170
def commit!
  if @narrowing
    @narrowing.ensure_result_equal_to(scalar_value_of_true)
  end

  commit_changes(@narrowing)

  if @narrowing
    @affected_variables = @narrowing.narrowed_values.keys
    @narrowing = nil
  end
end
prepare!() click to toggle source
# File lib/adlint/cc1/ctrlexpr.rb, line 163
def prepare!
  if @target_expr
    @narrowing = @target_expr.accept(self)
    @narrowing.execute!
  end
end
restore!() click to toggle source
# File lib/adlint/cc1/ctrlexpr.rb, line 196
def restore!
  if @value_memory
    @value_memory.each { |var, saved_val| var.assign!(saved_val) }
    @value_memory = nil
  end
end
rollback!() click to toggle source
# File lib/adlint/cc1/ctrlexpr.rb, line 183
def rollback!
  # NOTE: Rollback narrowed version to cut out the value-domain to enter
  #       the current branch.
  @affected_variables.each { |var| var.value.rollback! }
end
save!() click to toggle source
# File lib/adlint/cc1/ctrlexpr.rb, line 189
def save!
  @value_memory = {}
  @affected_variables.each do |var|
    @value_memory[var] = var.value.to_single_value.dup
  end
end
visit_additive_expression(node) click to toggle source
# File lib/adlint/cc1/ctrlexpr.rb, line 368
def visit_additive_expression(node)
  checkpoint(node.location)
  lhs_manip = node.lhs_operand.accept(self)
  rhs_manip = node.rhs_operand.accept(self)

  DelayedObjectDerivation.new(self, node, lhs_manip, rhs_manip) do
    checkpoint(node.location)
    lhs_manip.execute!
    rhs_manip.execute!
    eval_additive_expr(node, lhs_manip.result, rhs_manip.result)
  end
end
visit_and_expression(node) click to toggle source
# File lib/adlint/cc1/ctrlexpr.rb, line 406
def visit_and_expression(node)
  checkpoint(node.location)
  lhs_manip = node.lhs_operand.accept(self)
  rhs_manip = node.rhs_operand.accept(self)

  DelayedObjectDerivation.new(self, node, lhs_manip, rhs_manip) do
    checkpoint(node.location)
    lhs_manip.execute!
    rhs_manip.execute!
    eval_and_expr(node, lhs_manip.result, rhs_manip.result)
  end
end
visit_array_subscript_expression(node) click to toggle source
# File lib/adlint/cc1/ctrlexpr.rb, line 218
def visit_array_subscript_expression(node)
  checkpoint(node.location)
  obj_manip  = node.expression.accept(self)
  subs_manip = node.array_subscript.accept(self)

  DelayedObjectDerivation.new(self, node, obj_manip, subs_manip) do
    checkpoint(node.location)
    obj_manip.execute!
    subs_manip.execute!
    eval_array_subscript_expr(node, obj_manip.result, subs_manip.result)
  end
end
visit_cast_expression(node) click to toggle source
# File lib/adlint/cc1/ctrlexpr.rb, line 344
def visit_cast_expression(node)
  checkpoint(node.location)
  obj_manip = node.operand.accept(self)

  DelayedObjectDerivation.new(self, node, obj_manip) do
    checkpoint(node.location)
    obj_manip.execute!
    eval_cast_expr(node, obj_manip.result)
  end
end
visit_comma_separated_expression(node) click to toggle source
# File lib/adlint/cc1/ctrlexpr.rb, line 485
def visit_comma_separated_expression(node)
  checkpoint(node.location)
  obj_manips = node.expressions.map { |expr| expr.accept(self) }

  DelayedObjectDerivation.new(self, node, *obj_manips) do
    checkpoint(node.location)
    obj_manips.map { |manip| manip.execute!; manip.result }.last
  end
end
visit_compound_assignment_expression(node) click to toggle source
# File lib/adlint/cc1/ctrlexpr.rb, line 472
def visit_compound_assignment_expression(node)
  checkpoint(node.location)
  lhs_manip = node.lhs_operand.accept(self)
  rhs_manip = node.rhs_operand.accept(self)

  DelayedObjectDerivation.new(self, node, lhs_manip, rhs_manip) do
    checkpoint(node.location)
    lhs_manip.execute!
    rhs_manip.execute!
    eval_compound_assignment_expr(node, lhs_manip.result, rhs_manip.result)
  end
end
visit_equality_expression(node) click to toggle source
# File lib/adlint/cc1/ctrlexpr.rb, line 400
def visit_equality_expression(node)
  checkpoint(node.location)
  ValueComparison.new(self, node, node.lhs_operand.accept(self),
                      node.rhs_operand.accept(self))
end
visit_exclusive_or_expression(node) click to toggle source
# File lib/adlint/cc1/ctrlexpr.rb, line 419
def visit_exclusive_or_expression(node)
  checkpoint(node.location)
  lhs_manip = node.lhs_operand.accept(self)
  rhs_manip = node.rhs_operand.accept(self)

  DelayedObjectDerivation.new(self, node, lhs_manip, rhs_manip) do
    checkpoint(node.location)
    lhs_manip.execute!
    rhs_manip.execute!
    eval_exclusive_or_expr(node, lhs_manip.result, rhs_manip.result)
  end
end
visit_function_call_expression(node) click to toggle source
# File lib/adlint/cc1/ctrlexpr.rb, line 231
def visit_function_call_expression(node)
  checkpoint(node.location)
  obj_manip  = node.expression.accept(self)
  arg_manips = node.argument_expressions.map { |expr| expr.accept(self) }

  DelayedObjectDerivation.new(self, node, obj_manip, *arg_manips) do
    checkpoint(node.location)
    obj_manip.execute!
    args = arg_manips.map { |m| m.execute!; [m.result, m.node] }
    eval_function_call_expr(node, obj_manip.result, args)
  end
end
visit_inclusive_or_expression(node) click to toggle source
# File lib/adlint/cc1/ctrlexpr.rb, line 432
def visit_inclusive_or_expression(node)
  checkpoint(node.location)
  lhs_manip = node.lhs_operand.accept(self)
  rhs_manip = node.rhs_operand.accept(self)

  DelayedObjectDerivation.new(self, node, lhs_manip, rhs_manip) do
    checkpoint(node.location)
    lhs_manip.execute!
    rhs_manip.execute!
    eval_inclusive_or_expr(node, lhs_manip.result, rhs_manip.result)
  end
end
visit_indirection_expression(node) click to toggle source
# File lib/adlint/cc1/ctrlexpr.rb, line 317
def visit_indirection_expression(node)
  checkpoint(node.location)
  obj_manip = node.operand.accept(self)

  DelayedObjectDerivation.new(self, node, obj_manip) do
    checkpoint(node.location)
    obj_manip.execute!
    eval_indirection_expr(node, obj_manip.result)
  end
end
visit_logical_and_expression(node) click to toggle source
# File lib/adlint/cc1/ctrlexpr.rb, line 445
def visit_logical_and_expression(node)
  checkpoint(node.location)
  LogicalAnd.new(self, node, node.lhs_operand.accept(self),
                 node.rhs_operand.accept(self))
end
visit_logical_or_expression(node) click to toggle source
# File lib/adlint/cc1/ctrlexpr.rb, line 451
def visit_logical_or_expression(node)
  checkpoint(node.location)
  LogicalOr.new(self, node, node.lhs_operand.accept(self),
                node.rhs_operand.accept(self))
end
visit_member_access_by_pointer_expression(node) click to toggle source
# File lib/adlint/cc1/ctrlexpr.rb, line 255
def visit_member_access_by_pointer_expression(node)
  checkpoint(node.location)
  obj_manip = node.expression.accept(self)

  DelayedObjectDerivation.new(self, node, obj_manip) do
    checkpoint(node.location)
    obj_manip.execute!
    eval_member_access_by_pointer_expr(node, obj_manip.result)
  end
end
visit_member_access_by_value_expression(node) click to toggle source
# File lib/adlint/cc1/ctrlexpr.rb, line 244
def visit_member_access_by_value_expression(node)
  checkpoint(node.location)
  obj_manip = node.expression.accept(self)

  DelayedObjectDerivation.new(self, node, obj_manip) do
    checkpoint(node.location)
    obj_manip.execute!
    eval_member_access_by_value_expr(node, obj_manip.result)
  end
end
visit_multiplicative_expression(node) click to toggle source
# File lib/adlint/cc1/ctrlexpr.rb, line 355
def visit_multiplicative_expression(node)
  checkpoint(node.location)
  lhs_manip = node.lhs_operand.accept(self)
  rhs_manip = node.rhs_operand.accept(self)

  DelayedObjectDerivation.new(self, node, lhs_manip, rhs_manip) do
    checkpoint(node.location)
    lhs_manip.execute!
    rhs_manip.execute!
    eval_multiplicative_expr(node, lhs_manip.result, rhs_manip.result)
  end
end
visit_postfix_decrement_expression(node) click to toggle source
# File lib/adlint/cc1/ctrlexpr.rb, line 280
def visit_postfix_decrement_expression(node)
  checkpoint(node.location)
  obj_manip = node.operand.accept(self)

  DelayedObjectDerivation.new(self, node, obj_manip) do
    checkpoint(node.location)
    obj_manip.execute!
    eval_postfix_decrement_expr(node, obj_manip.result)
  end
end
visit_postfix_increment_expression(node) click to toggle source
# File lib/adlint/cc1/ctrlexpr.rb, line 269
def visit_postfix_increment_expression(node)
  checkpoint(node.location)
  obj_manip = node.operand.accept(self)

  DelayedObjectDerivation.new(self, node, obj_manip) do
    checkpoint(node.location)
    obj_manip.execute!
    eval_postfix_increment_expr(node, obj_manip.result)
  end
end
visit_prefix_decrement_expression(node) click to toggle source
# File lib/adlint/cc1/ctrlexpr.rb, line 304
def visit_prefix_decrement_expression(node)
  checkpoint(node.location)
  obj_manip = node.operand.accept(self)

  DelayedObjectDerivation.new(self, node, obj_manip) do
    checkpoint(node.location)
    obj_manip.execute!
    eval_prefix_decrement_expr(node, obj_manip.result)
  end
end
visit_prefix_increment_expression(node) click to toggle source
# File lib/adlint/cc1/ctrlexpr.rb, line 293
def visit_prefix_increment_expression(node)
  checkpoint(node.location)
  obj_manip = node.operand.accept(self)

  DelayedObjectDerivation.new(self, node, obj_manip) do
    checkpoint(node.location)
    obj_manip.execute!
    eval_prefix_increment_expr(node, obj_manip.result)
  end
end
visit_relational_expression(node) click to toggle source
# File lib/adlint/cc1/ctrlexpr.rb, line 394
def visit_relational_expression(node)
  checkpoint(node.location)
  ValueComparison.new(self, node, node.lhs_operand.accept(self),
                      node.rhs_operand.accept(self))
end
visit_shift_expression(node) click to toggle source
# File lib/adlint/cc1/ctrlexpr.rb, line 381
def visit_shift_expression(node)
  checkpoint(node.location)
  lhs_manip = node.lhs_operand.accept(self)
  rhs_manip = node.rhs_operand.accept(self)

  DelayedObjectDerivation.new(self, node, lhs_manip, rhs_manip) do
    checkpoint(node.location)
    lhs_manip.execute!
    rhs_manip.execute!
    eval_shift_expr(node, lhs_manip.result, rhs_manip.result)
  end
end
visit_simple_assignment_expression(node) click to toggle source
# File lib/adlint/cc1/ctrlexpr.rb, line 459
def visit_simple_assignment_expression(node)
  checkpoint(node.location)
  lhs_manip = node.lhs_operand.accept(self)
  rhs_manip = node.rhs_operand.accept(self)

  DelayedObjectDerivation.new(self, node, lhs_manip, rhs_manip) do
    checkpoint(node.location)
    lhs_manip.execute!
    rhs_manip.execute!
    eval_simple_assignment_expr(node, lhs_manip.result, rhs_manip.result)
  end
end
visit_unary_arithmetic_expression(node) click to toggle source
# File lib/adlint/cc1/ctrlexpr.rb, line 328
def visit_unary_arithmetic_expression(node)
  checkpoint(node.location)
  obj_manip = node.operand.accept(self)

  DelayedObjectDerivation.new(self, node, obj_manip) do
    checkpoint(node.location)
    obj_manip.execute!
    eval_unary_arithmetic_expr(node, obj_manip.result)
  end
end

Private Instance Methods

commit_changes(manip) click to toggle source
# File lib/adlint/cc1/ctrlexpr.rb, line 496
def commit_changes(manip)
  subclass_responsibility
end