class AdLint::Cc1::Variable

DESCRIPTION

Variable class hierarchy

Variable
  <-- ScopedVariable
        <-- OuterVariable
              <-- NamedVariable --------> Nameable <<module>>
                    <-- AliasVariable        ^
              <-- TemporaryVariable          |
              <-- InnerVariable -------------+
                    <-- ArrayElementVariable
                    <-- CompositeMemberVariable

Public Class Methods

new(mem, dcl_or_def, type) click to toggle source
Calls superclass method AdLint::Cc1::TypedObject::new
# File lib/adlint/cc1/object.rb, line 212
def initialize(mem, dcl_or_def, type)
  super(type, dcl_or_def)
  relate_to_memory(mem)
end

Public Instance Methods

assign!(val, src = nil, br = nil) click to toggle source
# File lib/adlint/cc1/object.rb, line 245
def assign!(val, src = nil, br = nil)
  # NOTE: Length of the incomplete array type should be deducted while
  #       initializer evaluation.  So, adjustment of the assigning value
  #       can be done at this point by Value#coerce_to(type).
  # NOTE: Domain of the assigning value must be narrowed before writing to
  #       the memory by Value#coerce_to(type).
  binding.memory.write(val.coerce_to(type), src, br)
end
begin_value_versioning() click to toggle source
# File lib/adlint/cc1/object.rb, line 288
def begin_value_versioning
  value.begin_versioning
end
end_value_versioning() click to toggle source
# File lib/adlint/cc1/object.rb, line 292
def end_value_versioning
  value.end_versioning
end
enter_value_versioning_group() click to toggle source
# File lib/adlint/cc1/object.rb, line 280
def enter_value_versioning_group
  value.enter_versioning_group
end
function?() click to toggle source
# File lib/adlint/cc1/object.rb, line 217
def function?
  false
end
inner?() click to toggle source
# File lib/adlint/cc1/object.rb, line 233
def inner?
  subclass_responsibility
end
leave_value_versioning_group(raise_complement) click to toggle source
# File lib/adlint/cc1/object.rb, line 284
def leave_value_versioning_group(raise_complement)
  value.leave_versioning_group(raise_complement)
end
name() click to toggle source
# File lib/adlint/cc1/object.rb, line 225
def name
  subclass_responsibility
end
named?() click to toggle source
# File lib/adlint/cc1/object.rb, line 229
def named?
  false
end
narrow_value_domain!(op, val) click to toggle source
# File lib/adlint/cc1/object.rb, line 258
def narrow_value_domain!(op, val)
  assign!(type.arbitrary_value) unless self.value

  self.value.narrow_domain!(op, val.coerce_to(type))
  # NOTE: Write via memory to correctly propagate inner variable's
  #       mutation to its outer variable.
  binding.memory._cascade_update(nil, nil)

  self.value.exist?
end
outer?() click to toggle source
# File lib/adlint/cc1/object.rb, line 237
def outer?
  !inner?
end
rollback_all_value_versions!() click to toggle source
# File lib/adlint/cc1/object.rb, line 300
def rollback_all_value_versions!
  value.rollback_all_versions!
end
thin_latest_value_version!(with_rollback) click to toggle source
# File lib/adlint/cc1/object.rb, line 296
def thin_latest_value_version!(with_rollback)
  value.thin_latest_version!(with_rollback)
end
uninitialize!() click to toggle source
# File lib/adlint/cc1/object.rb, line 254
def uninitialize!
  assign!(self.type.undefined_value)
end
value() click to toggle source
# File lib/adlint/cc1/object.rb, line 241
def value
  binding.memory.read
end
variable?() click to toggle source
# File lib/adlint/cc1/object.rb, line 221
def variable?
  true
end
widen_value_domain!(op, val) click to toggle source
# File lib/adlint/cc1/object.rb, line 269
def widen_value_domain!(op, val)
  assign!(type.nil_value) unless self.value

  self.value.widen_domain!(op, val.coerce_to(type))
  # NOTE: Write via memory to correctly propagate inner variable's
  #       mutation to its outer variable.
  binding.memory._cascade_update(nil, nil)

  self.value.exist?
end

Private Instance Methods

relate_to_memory(mem) click to toggle source
# File lib/adlint/cc1/object.rb, line 305
def relate_to_memory(mem)
  bind_to(mem)
end