class AdLint::Cc1::OuterVariable

Attributes

representative_element[R]

Public Class Methods

new(mem, dcl_or_def, type, scope) click to toggle source
Calls superclass method AdLint::Cc1::ScopedVariable::new
# File lib/adlint/cc1/object.rb, line 337
def initialize(mem, dcl_or_def, type, scope)
  super(mem, dcl_or_def, type, scope)
  # TODO: If too slow, make an index of inner variables.
  @inner_variables = create_inner_variables(type.unqualify, scope)
  @representative_element = create_representative_element(type.unqualify)
end

Public Instance Methods

assign!(val, src = nil, br = nil) click to toggle source
Calls superclass method AdLint::Cc1::Variable#assign!
# File lib/adlint/cc1/object.rb, line 346
def assign!(val, src = nil, br = nil)
  super
  if @representative_element
    if val.undefined?
      repr_val = @representative_element.type.undefined_value
    else
      repr_val = @representative_element.type.arbitrary_value
    end
    @representative_element.assign!(repr_val, src, br)
  end
end
begin_value_versioning() click to toggle source
# File lib/adlint/cc1/object.rb, line 382
def begin_value_versioning
  if @inner_variables
    @inner_variables.each do |inner|
      inner.begin_value_versioning
    end
  end
  super
  if @representative_element
    @representative_element.begin_value_versioning
  end
end
end_value_versioning() click to toggle source
# File lib/adlint/cc1/object.rb, line 394
def end_value_versioning
  if @inner_variables
    @inner_variables.each do |inner|
      inner.end_value_versioning
    end
  end
  super
  if @representative_element
    @representative_element.end_value_versioning
  end
end
enter_value_versioning_group() click to toggle source
# File lib/adlint/cc1/object.rb, line 358
def enter_value_versioning_group
  if @inner_variables
    @inner_variables.each do |inner|
      inner.enter_value_versioning_group
    end
  end
  super
  if @representative_element
    @representative_element.enter_value_versioning_group
  end
end
inner?() click to toggle source
# File lib/adlint/cc1/object.rb, line 430
def inner?
  false
end
inner_variable_at(idx) click to toggle source
# File lib/adlint/cc1/object.rb, line 434
def inner_variable_at(idx)
  if @type.array?
    # TODO: If linear searching is too slow, use an index of inner
    #       variables.
    target_name = ArrayElementVariable.component_name_of(idx)
    @inner_variables.find { |inner| inner.component_name == target_name }
  else
    nil
  end
end
inner_variable_named(name) click to toggle source
# File lib/adlint/cc1/object.rb, line 445
def inner_variable_named(name)
  if @type.composite?
    # TODO: If linear searching is too slow, use an index of inner
    #       variables.
    target_name = CompositeMemberVariable.component_name_of(name)
    @inner_variables.each do |inner|
      case
      when inner.component_name.nil?
        if var = inner.inner_variable_named(name)
          return var
        end
      when inner.component_name == target_name
        return inner
      end
    end
  end
  nil
end
leave_value_versioning_group(raise_complement) click to toggle source
# File lib/adlint/cc1/object.rb, line 370
def leave_value_versioning_group(raise_complement)
  if @inner_variables
    @inner_variables.each do |inner|
      inner.leave_value_versioning_group(raise_complement)
    end
  end
  super
  if @representative_element
    @representative_element.leave_value_versioning_group(raise_complement)
  end
end
rollback_all_value_versions!() click to toggle source
# File lib/adlint/cc1/object.rb, line 418
def rollback_all_value_versions!
  if @inner_variables
    @inner_variables.each do |inner|
      inner.rollback_all_value_versions!
    end
  end
  super
  if @representative_element
    @representative_element.rollback_all_value_versions!
  end
end
thin_latest_value_version!(with_rollback) click to toggle source
# File lib/adlint/cc1/object.rb, line 406
def thin_latest_value_version!(with_rollback)
  if @inner_variables
    @inner_variables.each do |inner|
      inner.thin_latest_value_version!(with_rollback)
    end
  end
  super
  if @representative_element
    @representative_element.thin_latest_value_version!(with_rollback)
  end
end

Private Instance Methods

create_array_elements(type, scope, mem) click to toggle source
# File lib/adlint/cc1/object.rb, line 476
def create_array_elements(type, scope, mem)
  offset = 0
  type.impl_length.times.map do |idx|
    win = mem.create_window(offset, type.base_type.aligned_byte_size)
    offset += win.byte_size
    ArrayElementVariable.new(win, self, type.base_type, idx)
  end
end
create_composite_members(type, scope, mem) click to toggle source
# File lib/adlint/cc1/object.rb, line 485
def create_composite_members(type, scope, mem)
  offset = 0
  type.members.map do |memb|
    win = mem.create_window(offset, memb.type.aligned_byte_size)
    offset += win.byte_size
    CompositeMemberVariable.new(win, self, memb.type, memb.name)
  end
end
create_inner_variables(type, scope) click to toggle source
# File lib/adlint/cc1/object.rb, line 465
def create_inner_variables(type, scope)
  case
  when type.array?
    create_array_elements(type, scope, binding.memory)
  when type.composite?
    create_composite_members(type, scope, binding.memory)
  else
    nil
  end
end
create_representative_element(type) click to toggle source
# File lib/adlint/cc1/object.rb, line 494
def create_representative_element(type)
  if type.array?
    mem = binding.memory.create_unmapped_window
    ArrayElementVariable.new(mem, self, type.base_type, 0).tap do |var|
      var.assign!(type.base_type.undefined_value)
    end
  else
    nil
  end
end