class AdLint::Cc1::MemoryPool

Public Class Methods

new() click to toggle source
# File lib/adlint/cc1/object.rb, line 1325
def initialize
  @memory_blocks  = {}
  @address_ranges = []
  # NOTE: To make room for NULL and controlling expressions.
  @free_address = 10
end

Public Instance Methods

allocate_dynamic(byte_size) click to toggle source
# File lib/adlint/cc1/object.rb, line 1340
def allocate_dynamic(byte_size)
  mem_block = DynamicMemoryBlock.new(@free_address, byte_size)
  @free_address += allocating_byte_size(byte_size)
  @memory_blocks[mem_block.address] = mem_block
  @address_ranges.push(mem_block.address...@free_address)
  mem_block
end
allocate_static(byte_size) click to toggle source
# File lib/adlint/cc1/object.rb, line 1332
def allocate_static(byte_size)
  mem_block = StaticMemoryBlock.new(@free_address, byte_size)
  @free_address += allocating_byte_size(byte_size)
  @memory_blocks[mem_block.address] = mem_block
  @address_ranges.push(mem_block.address...@free_address)
  mem_block
end
free(mem_block) click to toggle source
# File lib/adlint/cc1/object.rb, line 1348
def free(mem_block)
  @memory_blocks.delete(mem_block.address)
  @address_ranges.reject! { |range| range.include?(mem_block.address) }
end
lookup(addr) click to toggle source
# File lib/adlint/cc1/object.rb, line 1353
def lookup(addr)
  if mem_block = @memory_blocks[addr]
    return mem_block
  else
    if addr_range = @address_ranges.find { |r| r.include?(addr) }
      mem_block = @memory_blocks[addr_range.first]
      return mem_block.windows.find { |w| w.address == addr }
    end
  end
  nil
end

Private Instance Methods

allocating_byte_size(byte_size) click to toggle source
# File lib/adlint/cc1/object.rb, line 1366
def allocating_byte_size(byte_size)
  byte_size == 0 ? 1 : byte_size
end