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