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