public
Description: Rubinius, the Ruby VM
Homepage: http://rubini.us
Clone URL: git://github.com/evanphx/rubinius.git
rubinius / lib / heap.rb
100644 75 lines (61 sloc) 1.301 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
require 'memory'
require 'object'
 
class Heap
  def initialize(size)
    @size = size
    allocate_memory
  end
  
  def deallocate
    return unless allocated?
    Memory.release_memory @address
    @address = 0
  end
  
  def allocate_memory
    @address = Memory.allocate_memory @size
    Memory.clear_memory @address, @size
    @current = 0
  end
  
  def reset!
    @current = 0
  end
  
  attr_accessor :current
  
  def contains?(addr)
    return false if addr < @address
    return false if addr >= @address + @size
    return true
  end
  
  def allocated?
    @address > 0
  end
  
  attr_reader :address, :size, :current
  
  def allocate(size)
    return nil unless enough_space?(size)
    addr = @address + @current
    @current += size
    return addr
  end
  
  def enough_space?(size)
    if @size - current < size
      return false
    end
    
    return true
  end
  
  true
  
  def copy_object(obj)
    return obj if contains?(obj.address)
    sz = obj.memory_size
    d2 = allocate(sz)
    return nil unless d2
    Memory.transfer_memory obj.address, sz, d2
    return RObject.new(d2)
  end
  
  def each_object
    addr = @address
    last = @address + @current
    while addr < last
      obj = RObject.new(addr)
      yield obj
      addr += obj.memory_size
    end
  end
end