@@ -28,16 +28,21 @@ namespace rubinius {
28
28
return tbl;
29
29
}
30
30
31
- void ConstantTable::setup (STATE, native_int sz = 0 ) {
32
- if (!sz) sz = CONSTANT_TABLE_MIN_SIZE;
33
- values (state, Tuple::create (state, sz));
34
- bins (state, Fixnum::from (sz));
31
+ void ConstantTable::setup (STATE, native_int size) {
32
+ if (size == 0 ) {
33
+ values (state, nil<Tuple>());
34
+ bins (state, Fixnum::from (0 ));
35
+ } else {
36
+ values (state, Tuple::create (state, size));
37
+ bins (state, Fixnum::from (size));
38
+ }
39
+
35
40
entries (state, Fixnum::from (0 ));
36
41
}
37
42
38
43
/* The ConstantTable.allocate primitive. */
39
44
ConstantTable* ConstantTable::allocate (STATE, Object* self) {
40
- ConstantTable* tbl = create (state, CONSTANT_TABLE_MIN_SIZE );
45
+ ConstantTable* tbl = create (state);
41
46
tbl->klass (state, as<Class>(self));
42
47
tbl->lock_ .init ();
43
48
return tbl;
@@ -55,7 +60,8 @@ namespace rubinius {
55
60
native_int num = bins_->to_native ();
56
61
57
62
for (native_int i = 0 ; i < num; i++) {
58
- ConstantTableBucket* entry = try_as<ConstantTableBucket>(values_->at (state, i));
63
+ ConstantTableBucket* entry = try_as<ConstantTableBucket>(
64
+ values (state)->at (state, i));
59
65
60
66
while (entry) {
61
67
dup ->store (state, entry->name (), entry->constant (), entry->visibility ());
@@ -71,7 +77,8 @@ namespace rubinius {
71
77
Tuple* new_values = Tuple::create (state, size);
72
78
73
79
for (native_int i = 0 ; i < num; i++) {
74
- ConstantTableBucket* entry = try_as<ConstantTableBucket>(values_->at (state, i));
80
+ ConstantTableBucket* entry = try_as<ConstantTableBucket>(
81
+ values (state)->at (state, i));
75
82
76
83
while (entry) {
77
84
ConstantTableBucket* link = try_as<ConstantTableBucket>(entry->next ());
@@ -94,21 +101,33 @@ namespace rubinius {
94
101
bins (state, Fixnum::from (size));
95
102
}
96
103
104
+ Tuple* ConstantTable::values (STATE) {
105
+ if (values_->nil_p ()) {
106
+ values (state, Tuple::create (state, CONSTANT_TABLE_MIN_SIZE));
107
+ bins (state, Fixnum::from (CONSTANT_TABLE_MIN_SIZE));
108
+ }
109
+
110
+ return values_;
111
+ }
112
+
97
113
Object* ConstantTable::store (STATE, Symbol* name, Object* constant, Symbol* vis) {
98
114
check_frozen (state);
99
115
100
116
utilities::thread::SpinLock::LockGuard lg (lock_);
101
117
118
+ Tuple* values = this ->values (state);
119
+
102
120
native_int num_entries = entries_->to_native ();
103
121
native_int num_bins = bins_->to_native ();
104
122
105
123
if (max_density_p (num_entries, num_bins)) {
106
124
redistribute (state, num_bins <<= 1 );
125
+ values = this ->values (state);
107
126
}
108
127
109
128
native_int bin = find_bin (key_hash (name), num_bins);
110
129
111
- ConstantTableBucket* entry = try_as<ConstantTableBucket>(values_ ->at (state, bin));
130
+ ConstantTableBucket* entry = try_as<ConstantTableBucket>(values ->at (state, bin));
112
131
ConstantTableBucket* last = NULL ;
113
132
114
133
while (entry) {
@@ -129,8 +148,7 @@ namespace rubinius {
129
148
if (last) {
130
149
last->next (state, ConstantTableBucket::create (state, name, constant, vis));
131
150
} else {
132
- values_->put (state, bin,
133
- ConstantTableBucket::create (state, name, constant, vis));
151
+ values->put (state, bin, ConstantTableBucket::create (state, name, constant, vis));
134
152
}
135
153
136
154
entries (state, Fixnum::from (num_entries + 1 ));
@@ -141,8 +159,11 @@ namespace rubinius {
141
159
ConstantTableBucket* ConstantTable::find_entry (STATE, Symbol* name) {
142
160
utilities::thread::SpinLock::LockGuard lg (lock_);
143
161
162
+ if (bins_->to_native () == 0 ) return 0 ;
163
+
144
164
native_int bin = find_bin (key_hash (name), bins_->to_native ());
145
- ConstantTableBucket *entry = try_as<ConstantTableBucket>(values_->at (state, bin));
165
+ ConstantTableBucket *entry = try_as<ConstantTableBucket>(
166
+ values (state)->at (state, bin));
146
167
147
168
while (entry) {
148
169
if (entry->name () == name) {
@@ -176,7 +197,8 @@ namespace rubinius {
176
197
}
177
198
178
199
native_int bin = find_bin (key_hash (name), num_bins);
179
- ConstantTableBucket* entry = try_as<ConstantTableBucket>(values_->at (state, bin));
200
+ ConstantTableBucket* entry = try_as<ConstantTableBucket>(
201
+ values (state)->at (state, bin));
180
202
ConstantTableBucket* last = NULL ;
181
203
182
204
while (entry) {
@@ -185,7 +207,7 @@ namespace rubinius {
185
207
if (last) {
186
208
last->next (state, entry->next ());
187
209
} else {
188
- values_ ->put (state, bin, entry->next ());
210
+ values (state) ->put (state, bin, entry->next ());
189
211
}
190
212
191
213
entries (state, Fixnum::from (entries_->to_native () - 1 ));
@@ -214,7 +236,8 @@ namespace rubinius {
214
236
native_int num_bins = bins_->to_native ();
215
237
216
238
for (native_int i = 0 ; i < num_bins; i++) {
217
- ConstantTableBucket* entry = try_as<ConstantTableBucket>(values_->at (state, i));
239
+ ConstantTableBucket* entry = try_as<ConstantTableBucket>(
240
+ values (state)->at (state, i));
218
241
219
242
while (entry) {
220
243
ary->append (state, entry->name ());
0 commit comments