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.



1316
1317
1318
1319
1320
1321
# File 'lib/adlint/cc1/object.rb', line 1316

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



1331
1332
1333
1334
1335
1336
1337
# File 'lib/adlint/cc1/object.rb', line 1331

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



1323
1324
1325
1326
1327
1328
1329
# File 'lib/adlint/cc1/object.rb', line 1323

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



1339
1340
1341
1342
# File 'lib/adlint/cc1/object.rb', line 1339

def free(mem_block)
  @memory_blocks.delete(mem_block.address)
  @address_ranges.reject! { |range| range.include?(mem_block.address) }
end

#lookup(addr) ⇒ Object



1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
# File 'lib/adlint/cc1/object.rb', line 1344

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