@@ -46,7 +46,7 @@ def ==(other)
46
46
map2 = other.map;
47
47
48
48
for (var i = 0, length = self.keys.length; i < length; i++) {
49
- var key = self.keys[i], obj = map[key], obj2 = map2[key];
49
+ var key = self.keys[i], obj = map[key.$hash() ], obj2 = map2[key.$hash() ];
50
50
if (obj2 === undefined || #{ `obj` != `obj2` } ) {
51
51
return false;
52
52
}
@@ -58,10 +58,10 @@ def ==(other)
58
58
59
59
def []( key )
60
60
%x{
61
- var map = self.map;
61
+ var map = self.map, hash = key.$hash() ;
62
62
63
- if ($opal.hasOwnProperty.call(map, key )) {
64
- return map[key ];
63
+ if ($opal.hasOwnProperty.call(map, hash )) {
64
+ return map[hash ];
65
65
}
66
66
67
67
var proc = #@proc ;
@@ -76,27 +76,27 @@ def [](key)
76
76
77
77
def []=( key , value )
78
78
%x{
79
- var map = self.map;
79
+ var map = self.map, hash = key.$hash() ;
80
80
81
- if (!$opal.hasOwnProperty.call(map, key )) {
81
+ if (!$opal.hasOwnProperty.call(map, hash )) {
82
82
self.keys.push(key);
83
83
}
84
84
85
- map[key ] = value;
85
+ map[hash ] = value;
86
86
87
87
return value;
88
88
}
89
89
end
90
90
91
91
def assoc ( object )
92
92
%x{
93
- var keys = self.keys, key;
93
+ var keys = self.keys, key, hash ;
94
94
95
95
for (var i = 0, length = keys.length; i < length; i++) {
96
96
key = keys[i];
97
97
98
98
if (#{ `key` == object } ) {
99
- return [key, self.map[key]];
99
+ return [key, self.map[key.$hash() ]];
100
100
}
101
101
}
102
102
@@ -115,24 +115,26 @@ def clear
115
115
def clone
116
116
%x{
117
117
var map = {},
118
- keys = [];
118
+ keys = [],
119
+ hash, key, value;
119
120
120
121
for (var i = 0, length = self.keys.length; i < length; i++) {
121
- var key = self.keys[i],
122
- value = self.map[key];
122
+ key = self.keys[i];
123
+ hash = key.$hash();
124
+ value = self.map[hash];
123
125
124
126
keys.push(key);
125
- map[key ] = value;
127
+ map[hash ] = value;
126
128
}
127
129
128
- var hash = new self.$$class.$$alloc();
130
+ var clone = new self.$$class.$$alloc();
129
131
130
- hash .map = map;
131
- hash .keys = keys;
132
- hash .none = self.none;
133
- hash .proc = self.proc;
132
+ clone .map = map;
133
+ clone .keys = keys;
134
+ clone .none = self.none;
135
+ clone .proc = self.proc;
134
136
135
- return hash ;
137
+ return clone ;
136
138
}
137
139
end
138
140
@@ -172,10 +174,12 @@ def default_proc=(proc)
172
174
173
175
def delete ( key , &block )
174
176
%x{
175
- var map = self.map, result = map[key];
177
+ var map = self.map,
178
+ hash = key.$hash(),
179
+ result = map[hash];
176
180
177
181
if (result != null) {
178
- delete map[key ];
182
+ delete map[hash ];
179
183
self.keys.$delete(key);
180
184
181
185
return result;
@@ -192,18 +196,22 @@ def delete_if(&block)
192
196
return enum_for :delete_if unless block
193
197
194
198
%x{
195
- var map = self.map, keys = self.keys, value;
199
+ var map = self.map,
200
+ keys = self.keys,
201
+ key, value, obj, hash;
196
202
197
203
for (var i = 0, length = keys.length; i < length; i++) {
198
- var key = keys[i], obj = map[key];
204
+ key = keys[i];
205
+ hash = key.$hash();
206
+ obj = map[hash];
199
207
200
208
if ((value = block(key, obj)) === $breaker) {
201
209
return $breaker.$v;
202
210
}
203
211
204
212
if (value !== false && value !== nil) {
205
213
keys.splice(i, 1);
206
- delete map[key ];
214
+ delete map[hash ];
207
215
208
216
length--;
209
217
i--;
@@ -221,11 +229,13 @@ def each(&block)
221
229
222
230
%x{
223
231
var map = self.map,
224
- keys = self.keys;
232
+ keys = self.keys,
233
+ key, value, hash;
225
234
226
235
for (var i = 0, length = keys.length; i < length; i++) {
227
- var key = keys[i],
228
- value = $opal.$yield1(block, [key, map[key]]);
236
+ key = keys[i];
237
+ hash = key.$hash();
238
+ value = $opal.$yield1(block, [key, map[hash]]);
229
239
230
240
if (value === $breaker) {
231
241
return $breaker.$v;
@@ -240,10 +250,10 @@ def each_key(&block)
240
250
return enum_for :each_key unless block
241
251
242
252
%x{
243
- var keys = self.keys;
253
+ var keys = self.keys, key ;
244
254
245
255
for (var i = 0, length = keys.length; i < length; i++) {
246
- var key = keys[i];
256
+ key = keys[i];
247
257
248
258
if (block(key) === $breaker) {
249
259
return $breaker.$v;
@@ -280,7 +290,7 @@ def empty?
280
290
281
291
def fetch ( key , defaults = undefined , &block )
282
292
%x{
283
- var value = self.map[key ];
293
+ var hash = key.$hash(), value = self.map[hash ];
284
294
285
295
if (value != null) {
286
296
return value;
@@ -306,10 +316,15 @@ def fetch(key, defaults = undefined, &block)
306
316
307
317
def flatten ( level = undefined )
308
318
%x{
309
- var map = self.map, keys = self.keys, result = [];
319
+ var map = self.map,
320
+ keys = self.keys,
321
+ result = [],
322
+ key, hash, value;
310
323
311
324
for (var i = 0, length = keys.length; i < length; i++) {
312
- var key = keys[i], value = map[key];
325
+ key = keys[i];
326
+ hash = key.$hash();
327
+ value = map[hash];
313
328
314
329
result.push(key);
315
330
@@ -336,8 +351,8 @@ def has_key?(key)
336
351
337
352
def has_value? ( value )
338
353
%x{
339
- for (var assoc in self.map) {
340
- if (#{ `self.map[assoc ]` == value } ) {
354
+ for (var key in self.map) {
355
+ if (#{ `self.map[key.$hash() ]` == value } ) {
341
356
return true;
342
357
}
343
358
}
@@ -354,12 +369,15 @@ def hash
354
369
355
370
def index ( object )
356
371
%x{
357
- var map = self.map, keys = self.keys;
372
+ var map = self.map,
373
+ keys = self.keys,
374
+ key, hash;
358
375
359
376
for (var i = 0, length = keys.length; i < length; i++) {
360
- var key = keys[i];
377
+ key = keys[i];
378
+ hash = key.$hash();
361
379
362
- if (#{ `map[key ]` == object } ) {
380
+ if (#{ `map[hash ]` == object } ) {
363
381
return key;
364
382
}
365
383
}
@@ -370,10 +388,14 @@ def index(object)
370
388
371
389
def indexes ( *keys )
372
390
%x{
373
- var result = [], map = self.map, val;
391
+ var result = [],
392
+ map = self.map,
393
+ key, hash, value;
374
394
375
395
for (var i = 0, length = keys.length; i < length; i++) {
376
- var key = keys[i], val = map[key];
396
+ key = keys[i];
397
+ hash = key.$hash();
398
+ value = map[hash];
377
399
378
400
if (val != null) {
379
401
result.push(val);
@@ -395,12 +417,9 @@ def inspect
395
417
396
418
for (var i = 0, length = keys.length; i < length; i++) {
397
419
var key = keys[i], val = map[key];
398
-
399
- if (val === self) {
400
- inspect.push(#{ `key` . inspect } + '=>' + '{...}');
401
- } else {
402
- inspect.push(#{ `key` . inspect } + '=>' + #{ `map[key]` . inspect } );
403
- }
420
+ val = (val === self) ? '{...}' : val.$inspect()
421
+ key = (key === self) ? '{...}' : key.$inspect()
422
+ inspect.push(key + '=>' + val);
404
423
}
405
424
406
425
return '{' + inspect.join(', ') + '}';
0 commit comments