Class: AdLint::Cc1::MemoryPool

Inherits:
Object
  • Object
show all
Defined in:
lib/adlint/cc1/object.rb

Instance Method Summary collapse

Constructor Details

#initializeMemoryPool

Returns a new instance of MemoryPool.



1325
1326
1327
1328
1329
1330
# 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

Instance Method Details

#allocate_dynamic(byte_size) ⇒ Object



1340
1341
1342
1343
1344
1345
1346
# 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) ⇒ Object



1332
1333
1334
1335
1336
1337
1338
# 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) ⇒ Object



1348
1349
1350
1351
# 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) ⇒ Object



1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
# 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