Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 549cfa8

Browse files
committedOct 16, 2014
WIP
1 parent 711af2c commit 549cfa8

File tree

2 files changed

+77
-55
lines changed

2 files changed

+77
-55
lines changed
 

‎opal/corelib/hash.rb

+64-45
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ def ==(other)
4646
map2 = other.map;
4747
4848
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()];
5050
if (obj2 === undefined || #{`obj` != `obj2`}) {
5151
return false;
5252
}
@@ -58,10 +58,10 @@ def ==(other)
5858

5959
def [](key)
6060
%x{
61-
var map = self.map;
61+
var map = self.map, hash = key.$hash();
6262
63-
if ($opal.hasOwnProperty.call(map, key)) {
64-
return map[key];
63+
if ($opal.hasOwnProperty.call(map, hash)) {
64+
return map[hash];
6565
}
6666
6767
var proc = #@proc;
@@ -76,27 +76,27 @@ def [](key)
7676

7777
def []=(key, value)
7878
%x{
79-
var map = self.map;
79+
var map = self.map, hash = key.$hash();
8080
81-
if (!$opal.hasOwnProperty.call(map, key)) {
81+
if (!$opal.hasOwnProperty.call(map, hash)) {
8282
self.keys.push(key);
8383
}
8484
85-
map[key] = value;
85+
map[hash] = value;
8686
8787
return value;
8888
}
8989
end
9090

9191
def assoc(object)
9292
%x{
93-
var keys = self.keys, key;
93+
var keys = self.keys, key, hash;
9494
9595
for (var i = 0, length = keys.length; i < length; i++) {
9696
key = keys[i];
9797
9898
if (#{`key` == object}) {
99-
return [key, self.map[key]];
99+
return [key, self.map[key.$hash()]];
100100
}
101101
}
102102
@@ -115,24 +115,26 @@ def clear
115115
def clone
116116
%x{
117117
var map = {},
118-
keys = [];
118+
keys = [],
119+
hash, key, value;
119120
120121
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];
123125
124126
keys.push(key);
125-
map[key] = value;
127+
map[hash] = value;
126128
}
127129
128-
var hash = new self.$$class.$$alloc();
130+
var clone = new self.$$class.$$alloc();
129131
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;
134136
135-
return hash;
137+
return clone;
136138
}
137139
end
138140

@@ -172,10 +174,12 @@ def default_proc=(proc)
172174

173175
def delete(key, &block)
174176
%x{
175-
var map = self.map, result = map[key];
177+
var map = self.map,
178+
hash = key.$hash(),
179+
result = map[hash];
176180
177181
if (result != null) {
178-
delete map[key];
182+
delete map[hash];
179183
self.keys.$delete(key);
180184
181185
return result;
@@ -192,18 +196,22 @@ def delete_if(&block)
192196
return enum_for :delete_if unless block
193197

194198
%x{
195-
var map = self.map, keys = self.keys, value;
199+
var map = self.map,
200+
keys = self.keys,
201+
key, value, obj, hash;
196202
197203
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];
199207
200208
if ((value = block(key, obj)) === $breaker) {
201209
return $breaker.$v;
202210
}
203211
204212
if (value !== false && value !== nil) {
205213
keys.splice(i, 1);
206-
delete map[key];
214+
delete map[hash];
207215
208216
length--;
209217
i--;
@@ -221,11 +229,13 @@ def each(&block)
221229

222230
%x{
223231
var map = self.map,
224-
keys = self.keys;
232+
keys = self.keys,
233+
key, value, hash;
225234
226235
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]]);
229239
230240
if (value === $breaker) {
231241
return $breaker.$v;
@@ -240,10 +250,10 @@ def each_key(&block)
240250
return enum_for :each_key unless block
241251

242252
%x{
243-
var keys = self.keys;
253+
var keys = self.keys, key;
244254
245255
for (var i = 0, length = keys.length; i < length; i++) {
246-
var key = keys[i];
256+
key = keys[i];
247257
248258
if (block(key) === $breaker) {
249259
return $breaker.$v;
@@ -280,7 +290,7 @@ def empty?
280290

281291
def fetch(key, defaults = undefined, &block)
282292
%x{
283-
var value = self.map[key];
293+
var hash = key.$hash(), value = self.map[hash];
284294
285295
if (value != null) {
286296
return value;
@@ -306,10 +316,15 @@ def fetch(key, defaults = undefined, &block)
306316

307317
def flatten(level=undefined)
308318
%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;
310323
311324
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];
313328
314329
result.push(key);
315330
@@ -336,8 +351,8 @@ def has_key?(key)
336351

337352
def has_value?(value)
338353
%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}) {
341356
return true;
342357
}
343358
}
@@ -354,12 +369,15 @@ def hash
354369

355370
def index(object)
356371
%x{
357-
var map = self.map, keys = self.keys;
372+
var map = self.map,
373+
keys = self.keys,
374+
key, hash;
358375
359376
for (var i = 0, length = keys.length; i < length; i++) {
360-
var key = keys[i];
377+
key = keys[i];
378+
hash = key.$hash();
361379
362-
if (#{`map[key]` == object}) {
380+
if (#{`map[hash]` == object}) {
363381
return key;
364382
}
365383
}
@@ -370,10 +388,14 @@ def index(object)
370388

371389
def indexes(*keys)
372390
%x{
373-
var result = [], map = self.map, val;
391+
var result = [],
392+
map = self.map,
393+
key, hash, value;
374394
375395
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];
377399
378400
if (val != null) {
379401
result.push(val);
@@ -395,12 +417,9 @@ def inspect
395417
396418
for (var i = 0, length = keys.length; i < length; i++) {
397419
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);
404423
}
405424
406425
return '{' + inspect.join(', ') + '}';

‎opal/corelib/runtime.js

+13-10
Original file line numberDiff line numberDiff line change
@@ -955,12 +955,12 @@
955955
return arguments[0];
956956
}
957957

958-
var hash = new Opal.Hash.$$alloc(),
959-
keys = [],
960-
assocs = {},
961-
key, obj, length;
958+
var hash = new Opal.Hash.$$alloc(),
959+
keys = [],
960+
map = {},
961+
key, obj, length, hash;
962962

963-
hash.map = assocs;
963+
hash.map = map;
964964
hash.keys = keys;
965965

966966
if (arguments.length == 1) {
@@ -976,18 +976,20 @@
976976

977977
key = pair[0];
978978
obj = pair[1];
979+
hash = key.$hash();
979980

980-
if (assocs[key] == null) {
981+
if (map[hash] == null) {
981982
keys.push(key);
982983
}
983984

984-
assocs[key] = obj;
985+
map[hash] = obj;
985986
}
986987
}
987988
else {
988989
obj = arguments[0];
989990
for (key in obj) {
990-
assocs[key] = obj[key];
991+
hash = key.$hash();
992+
map[hash] = obj[key];
991993
keys.push(key);
992994
}
993995
}
@@ -1001,12 +1003,13 @@
10011003
for (var j = 0; j < length; j++) {
10021004
key = arguments[j];
10031005
obj = arguments[++j];
1006+
hash = key.$hash();
10041007

1005-
if (assocs[key] == null) {
1008+
if (map[hash] == null) {
10061009
keys.push(key);
10071010
}
10081011

1009-
assocs[key] = obj;
1012+
map[hash] = obj;
10101013
}
10111014
}
10121015

0 commit comments

Comments
 (0)
Please sign in to comment.