Updated RubySpec submodule to 9f66d0b1.
[rbx.git] / kernel / bootstrap / hash.rb
blob60d55efc029cf597bd96cf69f5ea50ed1bfe4115
1 # Requires: Object#hash
3 class Hash
4   ivar_as_index :__ivars__ => 0, :keys => 1, :values => 2, :bins => 3, :entries => 4, :default => 5, :default_proc => 6
6   def self.allocate
7     Ruby.primitive :allocate_hash
8     raise PrimitiveFailure, "Hash.allocate primitive failed"
9   end
11   def self.[](*args)
12     hsh = new()
13     i = 0
15     while i < args.size
16       k = args[i]
17       i += 1
19       v = args[i]
20       i += 1
22       hsh[k] = v
23     end
24     hsh
25   end
27   def initialize
28     @bins = 16
29     @values = Tuple.new(@bins)
30     @entries = 0
31   end
33   def set_by_hash(hsh, key, val)
34     Ruby.primitive :hash_set
35     if hsh.kind_of? Integer
36       # This magic value is the fixnum max.
37       return get_by_hash(hsh % 536870911, key)
38     end
40     raise PrimitiveFailure, "Hash#set_by_hash failed."
41   end
43   def get_by_hash(hsh, key)
44     Ruby.primitive :hash_get
45     if hsh.kind_of? Integer
46       # This magic value is the fixnum max.
47       return get_by_hash(hsh % 536870911, key)
48     end
50     raise PrimitiveFailure, "Hash#get_by_hash failed."
51   end
53   def [](key)
54     code, hk, val, nxt = get_by_hash(key.hash, key)
55     return nil unless code
56     return val
57   end
59   def []=(key, val)
60     set_by_hash key.hash, key, val
61   end
63   def redistribute
64     Ruby.primitive :hash_redistribute
65     raise PrimitiveFailure, "Hash#redistribute failed"
66   end
68   def delete_by_hash(hsh, key)
69     Ruby.primitive :hash_delete
70     raise PrimitiveFailure, "Hash#delete_by_hash failed"
71   end
73   def each
74     i = 0
75     while i < @values.fields
76       tup = @values[i]
77       while tup
78         yield tup.at(1), tup.at(2)
79         tup = tup.at(3)
80       end
81       i += 1
82     end
83     self
84   end
85 end