opal 0.3.31 → 0.3.32
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +1 -1
- data/README.md +1 -1
- data/core/array.rb +24 -2
- data/core/basic_object.rb +49 -0
- data/core/boolean.rb +2 -2
- data/core/class.rb +2 -2
- data/core/enumerable.rb +27 -51
- data/core/hash.rb +159 -101
- data/core/json.rb +2 -1
- data/core/kernel.rb +9 -41
- data/core/load_order +1 -0
- data/core/numeric.rb +2 -2
- data/core/proc.rb +2 -2
- data/core/range.rb +2 -2
- data/core/runtime.js +9 -5
- data/core/string.rb +5 -5
- data/lib/opal.rb +2 -2
- data/lib/opal/parser.rb +59 -40
- data/lib/opal/scope.rb +4 -3
- data/lib/opal/version.rb +1 -1
- data/spec/core/array/sort_spec.rb +22 -0
- data/spec/core/runtime/class_hierarchy_spec.rb +3 -1
- metadata +6 -3
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -47,7 +47,7 @@ to allow compilation in any javascript environment.
|
|
47
47
|
|
48
48
|
## License
|
49
49
|
|
50
|
-
Copyright (C)
|
50
|
+
Copyright (C) 2013 by Adam Beynon
|
51
51
|
|
52
52
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
53
53
|
of this software and associated documentation files (the "Software"), to deal
|
data/core/array.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
class Array < `Array`
|
2
2
|
%x{
|
3
|
-
|
3
|
+
Array.prototype._isArray = true;
|
4
4
|
}
|
5
5
|
|
6
6
|
include Enumerable
|
@@ -695,7 +695,7 @@ class Array < `Array`
|
|
695
695
|
self
|
696
696
|
end
|
697
697
|
|
698
|
-
def rindex(object, &block)
|
698
|
+
def rindex(object = undefined, &block)
|
699
699
|
%x{
|
700
700
|
if (block !== nil) {
|
701
701
|
for (var i = #{self}.length - 1, value; i >= 0; i--) {
|
@@ -911,4 +911,26 @@ class Array < `Array`
|
|
911
911
|
return result;
|
912
912
|
}
|
913
913
|
end
|
914
|
+
|
915
|
+
def sort(&block)
|
916
|
+
%x{
|
917
|
+
var copy = #{self}.slice();
|
918
|
+
|
919
|
+
if (block !== nil) {
|
920
|
+
return copy.sort(block);
|
921
|
+
}
|
922
|
+
|
923
|
+
return copy.sort();
|
924
|
+
}
|
925
|
+
end
|
926
|
+
|
927
|
+
def sort!(&block)
|
928
|
+
%x{
|
929
|
+
if (block !== nil) {
|
930
|
+
return #{self}.sort(block);
|
931
|
+
}
|
932
|
+
|
933
|
+
return #{self}.sort();
|
934
|
+
}
|
935
|
+
end
|
914
936
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
class BasicObject
|
2
|
+
def initialize(*)
|
3
|
+
end
|
4
|
+
|
5
|
+
def ==(other)
|
6
|
+
`#{self} === other`
|
7
|
+
end
|
8
|
+
|
9
|
+
def __send__(symbol, *args, &block)
|
10
|
+
%x{
|
11
|
+
return #{self}['$' + symbol].apply(#{self}, args);
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
alias eql? ==
|
16
|
+
alias equal? ==
|
17
|
+
|
18
|
+
def instance_eval(&block)
|
19
|
+
%x{
|
20
|
+
if (block === nil) {
|
21
|
+
no_block_given();
|
22
|
+
}
|
23
|
+
|
24
|
+
var block_self = block._s, result;
|
25
|
+
|
26
|
+
block._s = null;
|
27
|
+
result = block.call(#{self}, #{self});
|
28
|
+
block._s = block_self;
|
29
|
+
|
30
|
+
return result;
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
def instance_exec(*args, &block)
|
35
|
+
%x{
|
36
|
+
if (block === nil) {
|
37
|
+
no_block_given();
|
38
|
+
}
|
39
|
+
|
40
|
+
var block_self = block._s, result;
|
41
|
+
|
42
|
+
block._s = null;
|
43
|
+
result = block.apply(#{self}, args);
|
44
|
+
block._s = block_self;
|
45
|
+
|
46
|
+
return result;
|
47
|
+
}
|
48
|
+
end
|
49
|
+
end
|
data/core/boolean.rb
CHANGED
data/core/class.rb
CHANGED
@@ -178,11 +178,11 @@ class Class
|
|
178
178
|
`#{self}._name`
|
179
179
|
end
|
180
180
|
|
181
|
-
def new(
|
181
|
+
def new()
|
182
182
|
%x{
|
183
|
+
var args = __slice.call(arguments);
|
183
184
|
var obj = new #{self};
|
184
185
|
obj._id = unique_id++;
|
185
|
-
obj.$initialize._p = block;
|
186
186
|
|
187
187
|
obj.$initialize.apply(obj, args);
|
188
188
|
return obj;
|
data/core/enumerable.rb
CHANGED
@@ -30,8 +30,7 @@ module Enumerable
|
|
30
30
|
}
|
31
31
|
}
|
32
32
|
|
33
|
-
#{self}.$each
|
34
|
-
#{self}.$each();
|
33
|
+
#{self}.$each(proc);
|
35
34
|
|
36
35
|
return result;
|
37
36
|
}
|
@@ -68,8 +67,7 @@ module Enumerable
|
|
68
67
|
}
|
69
68
|
}
|
70
69
|
|
71
|
-
#{self}.$each
|
72
|
-
#{self}.$each();
|
70
|
+
#{self}.$each(proc);
|
73
71
|
|
74
72
|
return result;
|
75
73
|
}
|
@@ -89,14 +87,13 @@ module Enumerable
|
|
89
87
|
result.push(value);
|
90
88
|
};
|
91
89
|
|
92
|
-
#{self}.$each
|
93
|
-
#{self}.$each();
|
90
|
+
#{self}.$each(proc);
|
94
91
|
|
95
92
|
return result;
|
96
93
|
}
|
97
94
|
end
|
98
95
|
|
99
|
-
def reduce(object, &block)
|
96
|
+
def reduce(object = undefined, &block)
|
100
97
|
%x{
|
101
98
|
var result = #{object} == undefined ? 0 : #{object};
|
102
99
|
|
@@ -113,14 +110,13 @@ module Enumerable
|
|
113
110
|
result = value;
|
114
111
|
};
|
115
112
|
|
116
|
-
#{self}.$each
|
117
|
-
#{self}.$each();
|
113
|
+
#{self}.$each(proc);
|
118
114
|
|
119
115
|
return result;
|
120
116
|
}
|
121
117
|
end
|
122
118
|
|
123
|
-
def count(object, &block)
|
119
|
+
def count(object = undefined, &block)
|
124
120
|
%x{
|
125
121
|
var result = 0;
|
126
122
|
|
@@ -143,18 +139,17 @@ module Enumerable
|
|
143
139
|
}
|
144
140
|
}
|
145
141
|
|
146
|
-
#{self}.$each
|
147
|
-
#{self}.$each();
|
142
|
+
#{self}.$each(proc);
|
148
143
|
|
149
144
|
return result;
|
150
145
|
}
|
151
146
|
end
|
152
147
|
|
153
|
-
def detect(ifnone, &block)
|
148
|
+
def detect(ifnone = undefined, &block)
|
154
149
|
%x{
|
155
150
|
var result = nil;
|
156
151
|
|
157
|
-
#{self}.$each
|
152
|
+
#{self}.$each(function(obj) {
|
158
153
|
var value;
|
159
154
|
|
160
155
|
if ((value = block(obj)) === __breaker) {
|
@@ -167,9 +162,7 @@ module Enumerable
|
|
167
162
|
|
168
163
|
return __breaker;
|
169
164
|
}
|
170
|
-
};
|
171
|
-
|
172
|
-
#{self}.$each();
|
165
|
+
});
|
173
166
|
|
174
167
|
if (result !== nil) {
|
175
168
|
return result;
|
@@ -188,15 +181,13 @@ module Enumerable
|
|
188
181
|
var result = [],
|
189
182
|
current = 0;
|
190
183
|
|
191
|
-
#{self}.$each
|
184
|
+
#{self}.$each(function(obj) {
|
192
185
|
if (number < current) {
|
193
186
|
result.push(e);
|
194
187
|
}
|
195
188
|
|
196
189
|
current++;
|
197
|
-
};
|
198
|
-
|
199
|
-
#{self}.$each();
|
190
|
+
});
|
200
191
|
|
201
192
|
return result;
|
202
193
|
}
|
@@ -206,7 +197,7 @@ module Enumerable
|
|
206
197
|
%x{
|
207
198
|
var result = [];
|
208
199
|
|
209
|
-
#{self}.$each
|
200
|
+
#{self}.$each(function(obj) {
|
210
201
|
var value;
|
211
202
|
|
212
203
|
if ((value = block(obj)) === __breaker) {
|
@@ -218,11 +209,8 @@ module Enumerable
|
|
218
209
|
return value;
|
219
210
|
}
|
220
211
|
|
221
|
-
|
222
212
|
return __breaker;
|
223
|
-
};
|
224
|
-
|
225
|
-
#{self}.$each();
|
213
|
+
});
|
226
214
|
|
227
215
|
return result;
|
228
216
|
}
|
@@ -232,7 +220,7 @@ module Enumerable
|
|
232
220
|
%x{
|
233
221
|
var index = 0;
|
234
222
|
|
235
|
-
#{self}.$each
|
223
|
+
#{self}.$each(function(obj) {
|
236
224
|
var value;
|
237
225
|
|
238
226
|
if ((value = block(obj, index)) === __breaker) {
|
@@ -240,9 +228,7 @@ module Enumerable
|
|
240
228
|
}
|
241
229
|
|
242
230
|
index++;
|
243
|
-
};
|
244
|
-
|
245
|
-
#{self}.$each();
|
231
|
+
});
|
246
232
|
|
247
233
|
return nil;
|
248
234
|
}
|
@@ -250,15 +236,13 @@ module Enumerable
|
|
250
236
|
|
251
237
|
def each_with_object(object, &block)
|
252
238
|
%x{
|
253
|
-
#{self}.$each
|
239
|
+
#{self}.$each(function(obj) {
|
254
240
|
var value;
|
255
241
|
|
256
242
|
if ((value = block(obj, object)) === __breaker) {
|
257
243
|
return __breaker.$v;
|
258
244
|
}
|
259
|
-
};
|
260
|
-
|
261
|
-
#{self}.$each();
|
245
|
+
});
|
262
246
|
|
263
247
|
return object;
|
264
248
|
}
|
@@ -268,11 +252,9 @@ module Enumerable
|
|
268
252
|
%x{
|
269
253
|
var result = [];
|
270
254
|
|
271
|
-
#{self}.$each
|
255
|
+
#{self}.$each(function(obj) {
|
272
256
|
result.push(obj);
|
273
|
-
};
|
274
|
-
|
275
|
-
#{self}.$each();
|
257
|
+
});
|
276
258
|
|
277
259
|
return result;
|
278
260
|
}
|
@@ -284,7 +266,7 @@ module Enumerable
|
|
284
266
|
%x{
|
285
267
|
var result = [];
|
286
268
|
|
287
|
-
#{self}.$each
|
269
|
+
#{self}.$each(function(obj) {
|
288
270
|
var value;
|
289
271
|
|
290
272
|
if ((value = block(obj)) === __breaker) {
|
@@ -294,15 +276,13 @@ module Enumerable
|
|
294
276
|
if (value !== false && value !== nil) {
|
295
277
|
result.push(obj);
|
296
278
|
}
|
297
|
-
};
|
298
|
-
|
299
|
-
#{self}.$each();
|
279
|
+
});
|
300
280
|
|
301
281
|
return result;
|
302
282
|
}
|
303
283
|
end
|
304
284
|
|
305
|
-
def find_index(object, &block)
|
285
|
+
def find_index(object = undefined, &block)
|
306
286
|
%x{
|
307
287
|
var proc, result = nil, index = 0;
|
308
288
|
|
@@ -333,14 +313,13 @@ module Enumerable
|
|
333
313
|
};
|
334
314
|
}
|
335
315
|
|
336
|
-
#{self}.$each
|
337
|
-
#{self}.$each();
|
316
|
+
#{self}.$each(proc);
|
338
317
|
|
339
318
|
return result;
|
340
319
|
}
|
341
320
|
end
|
342
321
|
|
343
|
-
def first(number)
|
322
|
+
def first(number = undefined)
|
344
323
|
%x{
|
345
324
|
var result = [],
|
346
325
|
current = 0,
|
@@ -363,8 +342,7 @@ module Enumerable
|
|
363
342
|
};
|
364
343
|
}
|
365
344
|
|
366
|
-
#{self}.$each
|
367
|
-
#{self}.$each();
|
345
|
+
#{self}.$each(proc);
|
368
346
|
|
369
347
|
return result;
|
370
348
|
}
|
@@ -374,7 +352,7 @@ module Enumerable
|
|
374
352
|
%x{
|
375
353
|
var result = [];
|
376
354
|
|
377
|
-
#{self}.$each
|
355
|
+
#{self}.$each(block !== nil
|
378
356
|
? function(obj) {
|
379
357
|
var value = #{pattern === `obj`};
|
380
358
|
|
@@ -394,8 +372,6 @@ module Enumerable
|
|
394
372
|
}
|
395
373
|
});
|
396
374
|
|
397
|
-
#{self}.$each();
|
398
|
-
|
399
375
|
return result;
|
400
376
|
}
|
401
377
|
end
|
data/core/hash.rb
CHANGED
@@ -28,8 +28,9 @@ class Hash
|
|
28
28
|
// strings as keys. The map and keys array can be constructed at
|
29
29
|
// compile time, so they are just added here by the constructor
|
30
30
|
// function
|
31
|
-
__hash2 = Opal.hash2 = function(map) {
|
31
|
+
__hash2 = Opal.hash2 = function(keys, map) {
|
32
32
|
var hash = new Hash;
|
33
|
+
hash.keys = keys;
|
33
34
|
hash.map = map;
|
34
35
|
return hash;
|
35
36
|
}
|
@@ -45,9 +46,10 @@ class Hash
|
|
45
46
|
|
46
47
|
def self.from_native(obj)
|
47
48
|
%x{
|
48
|
-
var hash = __hash(), map = hash.map;
|
49
|
+
var hash = __hash(), map = hash.map, keys = hash.keys;
|
49
50
|
|
50
51
|
for (var key in obj) {
|
52
|
+
keys.push(key);
|
51
53
|
map[key] = obj[key];
|
52
54
|
}
|
53
55
|
|
@@ -55,7 +57,7 @@ class Hash
|
|
55
57
|
}
|
56
58
|
end
|
57
59
|
|
58
|
-
def self.new(defaults, &block)
|
60
|
+
def self.new(defaults = undefined, &block)
|
59
61
|
%x{
|
60
62
|
var hash = __hash();
|
61
63
|
|
@@ -76,15 +78,19 @@ class Hash
|
|
76
78
|
return true;
|
77
79
|
}
|
78
80
|
|
79
|
-
if (other.map
|
81
|
+
if (!other.map || !other.keys) {
|
82
|
+
return false;
|
83
|
+
}
|
84
|
+
|
85
|
+
if (#{self}.keys.length !== other.keys.length) {
|
80
86
|
return false;
|
81
87
|
}
|
82
88
|
|
83
89
|
var map = #{self}.map,
|
84
90
|
map2 = other.map;
|
85
91
|
|
86
|
-
for (var
|
87
|
-
var obj = map[key], obj2 = map2[key];
|
92
|
+
for (var i = 0, length = #{self}.keys.length; i < length; i++) {
|
93
|
+
var key = #{self}.keys[i], obj = map[key], obj2 = map2[key];
|
88
94
|
|
89
95
|
if (#{`obj` != `obj2`}) {
|
90
96
|
return false;
|
@@ -97,10 +103,10 @@ class Hash
|
|
97
103
|
|
98
104
|
def [](key)
|
99
105
|
%x{
|
100
|
-
var
|
106
|
+
var bucket = #{self}.map[key];
|
101
107
|
|
102
|
-
if (
|
103
|
-
return
|
108
|
+
if (bucket != null) {
|
109
|
+
return bucket;
|
104
110
|
}
|
105
111
|
|
106
112
|
var proc = #{@proc};
|
@@ -115,18 +121,27 @@ class Hash
|
|
115
121
|
|
116
122
|
def []=(key, value)
|
117
123
|
%x{
|
118
|
-
#{self}.map
|
124
|
+
var map = #{self}.map;
|
125
|
+
|
126
|
+
if (!__hasOwn.call(map, key)) {
|
127
|
+
#{self}.keys.push(key);
|
128
|
+
}
|
129
|
+
|
130
|
+
map[key] = value;
|
131
|
+
|
119
132
|
return value;
|
120
133
|
}
|
121
134
|
end
|
122
135
|
|
123
136
|
def assoc(object)
|
124
137
|
%x{
|
125
|
-
var
|
138
|
+
var keys = #{self}.keys, key;
|
139
|
+
|
140
|
+
for (var i = 0, length = keys.length; i < length; i++) {
|
141
|
+
key = keys[i];
|
126
142
|
|
127
|
-
for (var key in map) {
|
128
143
|
if (#{`key` == object}) {
|
129
|
-
return [key, map[key]];
|
144
|
+
return [key, #{self}.map[key]];
|
130
145
|
}
|
131
146
|
}
|
132
147
|
|
@@ -137,6 +152,7 @@ class Hash
|
|
137
152
|
def clear
|
138
153
|
%x{
|
139
154
|
#{self}.map = {};
|
155
|
+
#{self}.keys = [];
|
140
156
|
return #{self};
|
141
157
|
}
|
142
158
|
end
|
@@ -145,10 +161,12 @@ class Hash
|
|
145
161
|
%x{
|
146
162
|
var result = __hash(),
|
147
163
|
map = #{self}.map,
|
148
|
-
map2 = result.map
|
164
|
+
map2 = result.map,
|
165
|
+
keys2 = result.keys;
|
149
166
|
|
150
|
-
for (var
|
151
|
-
|
167
|
+
for (var i = 0, length = #{self}.keys.length; i < length; i++) {
|
168
|
+
keys2.push(#{self}.keys[i]);
|
169
|
+
map2[#{self}.keys[i]] = map[#{self}.keys[i]];
|
152
170
|
}
|
153
171
|
|
154
172
|
return result;
|
@@ -173,10 +191,12 @@ class Hash
|
|
173
191
|
|
174
192
|
def delete(key)
|
175
193
|
%x{
|
176
|
-
var map
|
194
|
+
var map = #{self}.map, result = map[key];
|
177
195
|
|
178
196
|
if (result != null) {
|
179
197
|
delete map[key];
|
198
|
+
#{self}.keys.$delete(key);
|
199
|
+
|
180
200
|
return result;
|
181
201
|
}
|
182
202
|
|
@@ -186,15 +206,21 @@ class Hash
|
|
186
206
|
|
187
207
|
def delete_if(&block)
|
188
208
|
%x{
|
189
|
-
var map = #{self}.map, value;
|
209
|
+
var map = #{self}.map, keys = #{self}.keys, value;
|
190
210
|
|
191
|
-
for (var
|
192
|
-
|
211
|
+
for (var i = 0, length = keys.length; i < length; i++) {
|
212
|
+
var key = keys[i], obj = map[key];
|
213
|
+
|
214
|
+
if ((value = block(key, obj)) === __breaker) {
|
193
215
|
return __breaker.$v;
|
194
216
|
}
|
195
217
|
|
196
218
|
if (value !== false && value !== nil) {
|
197
|
-
|
219
|
+
keys.splice(i, 1);
|
220
|
+
delete map[key];
|
221
|
+
|
222
|
+
length--;
|
223
|
+
i--;
|
198
224
|
}
|
199
225
|
}
|
200
226
|
|
@@ -206,9 +232,11 @@ class Hash
|
|
206
232
|
|
207
233
|
def each(&block)
|
208
234
|
%x{
|
209
|
-
var map = #{self}.map;
|
235
|
+
var map = #{self}.map, keys = #{self}.keys;
|
236
|
+
|
237
|
+
for (var i = 0, length = keys.length; i < length; i++) {
|
238
|
+
var key = keys[i];
|
210
239
|
|
211
|
-
for (var key in map) {
|
212
240
|
if (block(key, map[key]) === __breaker) {
|
213
241
|
return __breaker.$v;
|
214
242
|
}
|
@@ -220,9 +248,11 @@ class Hash
|
|
220
248
|
|
221
249
|
def each_key(&block)
|
222
250
|
%x{
|
223
|
-
var
|
251
|
+
var keys = #{self}.keys;
|
252
|
+
|
253
|
+
for (var i = 0, length = keys.length; i < length; i++) {
|
254
|
+
var key = keys[i];
|
224
255
|
|
225
|
-
for (var key in map) {
|
226
256
|
if (block(key) === __breaker) {
|
227
257
|
return __breaker.$v;
|
228
258
|
}
|
@@ -236,10 +266,10 @@ class Hash
|
|
236
266
|
|
237
267
|
def each_value(&block)
|
238
268
|
%x{
|
239
|
-
var map = #{self}.map;
|
269
|
+
var map = #{self}.map, keys = #{self}.keys;
|
240
270
|
|
241
|
-
for (var
|
242
|
-
if (block(map[
|
271
|
+
for (var i = 0, length = keys.length; i < length; i++) {
|
272
|
+
if (block(map[keys[i]]) === __breaker) {
|
243
273
|
return __breaker.$v;
|
244
274
|
}
|
245
275
|
}
|
@@ -250,17 +280,13 @@ class Hash
|
|
250
280
|
|
251
281
|
def empty?
|
252
282
|
%x{
|
253
|
-
|
254
|
-
return false;
|
255
|
-
}
|
256
|
-
|
257
|
-
return true;
|
283
|
+
return #{self}.keys.length === 0;
|
258
284
|
}
|
259
285
|
end
|
260
286
|
|
261
287
|
alias eql? ==
|
262
288
|
|
263
|
-
def fetch(key, defaults, &block)
|
289
|
+
def fetch(key, defaults = undefined, &block)
|
264
290
|
%x{
|
265
291
|
var value = #{self}.map[key];
|
266
292
|
|
@@ -288,10 +314,10 @@ class Hash
|
|
288
314
|
|
289
315
|
def flatten(level=undefined)
|
290
316
|
%x{
|
291
|
-
var map = #{self}.map, result = [];
|
317
|
+
var map = #{self}.map, keys = #{self}.keys, result = [];
|
292
318
|
|
293
|
-
for (var
|
294
|
-
var value = map[key];
|
319
|
+
for (var i = 0, length = keys.length; i < length; i++) {
|
320
|
+
var key = keys[i], value = map[key];
|
295
321
|
|
296
322
|
result.push(key);
|
297
323
|
|
@@ -318,10 +344,8 @@ class Hash
|
|
318
344
|
|
319
345
|
def has_value?(value)
|
320
346
|
%x{
|
321
|
-
var
|
322
|
-
|
323
|
-
for (var key in map) {
|
324
|
-
if (#{`map[key]` == value}) {
|
347
|
+
for (var assoc in #{self}.map) {
|
348
|
+
if (#{`#{self}.map[assoc]` == value}) {
|
325
349
|
return true;
|
326
350
|
}
|
327
351
|
}
|
@@ -338,9 +362,11 @@ class Hash
|
|
338
362
|
|
339
363
|
def index(object)
|
340
364
|
%x{
|
341
|
-
var map = #{self}.map;
|
365
|
+
var map = #{self}.map, keys = #{self}.keys;
|
366
|
+
|
367
|
+
for (var i = 0, length = keys.length; i < length; i++) {
|
368
|
+
var key = keys[i];
|
342
369
|
|
343
|
-
for (var key in map) {
|
344
370
|
if (#{object == `map[key]`}) {
|
345
371
|
return key;
|
346
372
|
}
|
@@ -355,13 +381,13 @@ class Hash
|
|
355
381
|
var result = [], map = #{self}.map, val;
|
356
382
|
|
357
383
|
for (var i = 0, length = keys.length; i < length; i++) {
|
358
|
-
|
384
|
+
var key = keys[i], val = map[key];
|
359
385
|
|
360
386
|
if (val != null) {
|
361
387
|
result.push(val);
|
362
388
|
}
|
363
389
|
else {
|
364
|
-
result.push(#{
|
390
|
+
result.push(#{self}.none);
|
365
391
|
}
|
366
392
|
}
|
367
393
|
|
@@ -373,9 +399,10 @@ class Hash
|
|
373
399
|
|
374
400
|
def inspect
|
375
401
|
%x{
|
376
|
-
var inspect = [], map = #{self}.map;
|
402
|
+
var inspect = [], keys = #{self}.keys, map = #{self}.map;
|
377
403
|
|
378
|
-
for (var
|
404
|
+
for (var i = 0, length = keys.length; i < length; i++) {
|
405
|
+
var key = keys[i];
|
379
406
|
inspect.push(#{`key`.inspect} + '=>' + #{`map[key]`.inspect});
|
380
407
|
}
|
381
408
|
|
@@ -385,10 +412,13 @@ class Hash
|
|
385
412
|
|
386
413
|
def invert
|
387
414
|
%x{
|
388
|
-
var result = __hash(),
|
415
|
+
var result = __hash(), keys = #{self}.keys, map = #{self}.map,
|
416
|
+
keys2 = result.keys, map2 = result.map;
|
389
417
|
|
390
|
-
for (var
|
391
|
-
var obj = map[key];
|
418
|
+
for (var i = 0, length = keys.length; i < length; i++) {
|
419
|
+
var key = keys[i], obj = map[key];
|
420
|
+
|
421
|
+
keys2.push(obj);
|
392
422
|
map2[obj] = key;
|
393
423
|
}
|
394
424
|
|
@@ -398,17 +428,21 @@ class Hash
|
|
398
428
|
|
399
429
|
def keep_if(&block)
|
400
430
|
%x{
|
401
|
-
var map = #{self}.map, value;
|
431
|
+
var map = #{self}.map, keys = #{self}.keys, value;
|
402
432
|
|
403
|
-
for (var
|
404
|
-
var obj = map[key];
|
433
|
+
for (var i = 0, length = keys.length; i < length; i++) {
|
434
|
+
var key = keys[i], obj = map[key];
|
405
435
|
|
406
436
|
if ((value = block(key, obj)) === __breaker) {
|
407
437
|
return __breaker.$v;
|
408
438
|
}
|
409
439
|
|
410
440
|
if (value === false || value === nil) {
|
441
|
+
keys.splice(i, 1);
|
411
442
|
delete map[key];
|
443
|
+
|
444
|
+
length--;
|
445
|
+
i--;
|
412
446
|
}
|
413
447
|
}
|
414
448
|
|
@@ -422,25 +456,13 @@ class Hash
|
|
422
456
|
|
423
457
|
def keys
|
424
458
|
%x{
|
425
|
-
|
426
|
-
|
427
|
-
for (var key in map) {
|
428
|
-
result.push(key);
|
429
|
-
}
|
430
|
-
|
431
|
-
return result;
|
459
|
+
return #{self}.keys.slice(0);
|
432
460
|
}
|
433
461
|
end
|
434
462
|
|
435
463
|
def length
|
436
464
|
%x{
|
437
|
-
|
438
|
-
|
439
|
-
for (var key in map) {
|
440
|
-
length++;
|
441
|
-
}
|
442
|
-
|
443
|
-
return length;
|
465
|
+
return #{self}.keys.length;
|
444
466
|
}
|
445
467
|
end
|
446
468
|
|
@@ -448,22 +470,35 @@ class Hash
|
|
448
470
|
|
449
471
|
def merge(other, &block)
|
450
472
|
%x{
|
451
|
-
var
|
473
|
+
var keys = #{self}.keys, map = #{self}.map,
|
474
|
+
result = __hash(), keys2 = result.keys, map2 = result.map;
|
452
475
|
|
453
|
-
for (var
|
476
|
+
for (var i = 0, length = keys.length; i < length; i++) {
|
477
|
+
var key = keys[i];
|
478
|
+
|
479
|
+
keys2.push(key);
|
454
480
|
map2[key] = map[key];
|
455
481
|
}
|
456
482
|
|
457
|
-
map = other.map;
|
483
|
+
var keys = other.keys, map = other.map;
|
458
484
|
|
459
485
|
if (block === nil) {
|
460
|
-
for (
|
486
|
+
for (var i = 0, length = keys.length; i < length; i++) {
|
487
|
+
var key = keys[i];
|
488
|
+
|
489
|
+
if (map2[key] == null) {
|
490
|
+
keys2.push(key);
|
491
|
+
}
|
492
|
+
|
461
493
|
map2[key] = map[key];
|
462
494
|
}
|
463
495
|
}
|
464
496
|
else {
|
465
|
-
for (
|
497
|
+
for (var i = 0, length = keys.length; i < length; i++) {
|
498
|
+
var key = keys[i];
|
499
|
+
|
466
500
|
if (map2[key] == null) {
|
501
|
+
keys2.push(key);
|
467
502
|
map2[key] = map[key];
|
468
503
|
}
|
469
504
|
else {
|
@@ -478,16 +513,26 @@ class Hash
|
|
478
513
|
|
479
514
|
def merge!(other, &block)
|
480
515
|
%x{
|
481
|
-
var
|
516
|
+
var keys = #{self}.keys, map = #{self}.map,
|
517
|
+
keys2 = other.keys, map2 = other.map;
|
482
518
|
|
483
519
|
if (block === nil) {
|
484
|
-
for (var
|
520
|
+
for (var i = 0, length = keys2.length; i < length; i++) {
|
521
|
+
var key = keys2[i];
|
522
|
+
|
523
|
+
if (map[key] == null) {
|
524
|
+
keys.push(key);
|
525
|
+
}
|
526
|
+
|
485
527
|
map[key] = map2[key];
|
486
528
|
}
|
487
529
|
}
|
488
530
|
else {
|
489
|
-
for (
|
531
|
+
for (var i = 0, length = keys2.length; i < length; i++) {
|
532
|
+
var key = keys2[i];
|
533
|
+
|
490
534
|
if (map[key] == null) {
|
535
|
+
keys.push(key);
|
491
536
|
map[key] = map2[key];
|
492
537
|
}
|
493
538
|
else {
|
@@ -502,10 +547,10 @@ class Hash
|
|
502
547
|
|
503
548
|
def rassoc(object)
|
504
549
|
%x{
|
505
|
-
var map = #{self}.map;
|
550
|
+
var keys = #{self}.keys, map = #{self}.map;
|
506
551
|
|
507
|
-
for (var
|
508
|
-
var obj = map[key];
|
552
|
+
for (var i = 0, length = keys.length; i < length; i++) {
|
553
|
+
var key = keys[i], obj = map[key];
|
509
554
|
|
510
555
|
if (#{`obj` == object}) {
|
511
556
|
return [key, obj];
|
@@ -518,16 +563,18 @@ class Hash
|
|
518
563
|
|
519
564
|
def reject(&block)
|
520
565
|
%x{
|
521
|
-
var
|
566
|
+
var keys = #{self}.keys, map = #{self}.map,
|
567
|
+
result = __hash(), map2 = result.map, keys2 = result.keys;
|
522
568
|
|
523
|
-
for (var
|
524
|
-
var obj = map[key], value;
|
569
|
+
for (var i = 0, length = keys.length; i < length; i++) {
|
570
|
+
var key = keys[i], obj = map[key], value;
|
525
571
|
|
526
572
|
if ((value = block(key, obj)) === __breaker) {
|
527
573
|
return __breaker.$v;
|
528
574
|
}
|
529
575
|
|
530
576
|
if (value === false || value === nil) {
|
577
|
+
keys2.push(key);
|
531
578
|
map2[key] = obj;
|
532
579
|
}
|
533
580
|
}
|
@@ -538,10 +585,12 @@ class Hash
|
|
538
585
|
|
539
586
|
def replace(other)
|
540
587
|
%x{
|
541
|
-
var map = #{self}.map = {},
|
588
|
+
var map = #{self}.map = {}, keys = #{self}.keys = [];
|
542
589
|
|
543
|
-
for (var
|
544
|
-
|
590
|
+
for (var i = 0, length = other.keys.length; i < length; i++) {
|
591
|
+
var key = other.keys[i];
|
592
|
+
keys.push(key);
|
593
|
+
map[key] = other.map[key];
|
545
594
|
}
|
546
595
|
|
547
596
|
return #{self};
|
@@ -550,16 +599,18 @@ class Hash
|
|
550
599
|
|
551
600
|
def select(&block)
|
552
601
|
%x{
|
553
|
-
var
|
602
|
+
var keys = #{self}.keys, map = #{self}.map,
|
603
|
+
result = __hash(), map2 = result.map, keys2 = result.keys;
|
554
604
|
|
555
|
-
for (var
|
556
|
-
var obj = map[key], value;
|
605
|
+
for (var i = 0, length = keys.length; i < length; i++) {
|
606
|
+
var key = keys[i], obj = map[key], value;
|
557
607
|
|
558
608
|
if ((value = block(key, obj)) === __breaker) {
|
559
609
|
return __breaker.$v;
|
560
610
|
}
|
561
611
|
|
562
612
|
if (value !== false && value !== nil) {
|
613
|
+
keys2.push(key);
|
563
614
|
map2[key] = obj;
|
564
615
|
}
|
565
616
|
}
|
@@ -570,18 +621,21 @@ class Hash
|
|
570
621
|
|
571
622
|
def select!(&block)
|
572
623
|
%x{
|
573
|
-
var map = #{self}.map, value, result = nil;
|
624
|
+
var map = #{self}.map, keys = #{self}.keys, value, result = nil;
|
574
625
|
|
575
|
-
for (var
|
576
|
-
var obj = map[key];
|
626
|
+
for (var i = 0, length = keys.length; i < length; i++) {
|
627
|
+
var key = keys[i], obj = map[key];
|
577
628
|
|
578
629
|
if ((value = block(key, obj)) === __breaker) {
|
579
630
|
return __breaker.$v;
|
580
631
|
}
|
581
632
|
|
582
633
|
if (value === false || value === nil) {
|
634
|
+
keys.splice(i, 1);
|
583
635
|
delete map[key];
|
584
636
|
|
637
|
+
length--;
|
638
|
+
i--;
|
585
639
|
result = #{self}
|
586
640
|
}
|
587
641
|
}
|
@@ -592,11 +646,14 @@ class Hash
|
|
592
646
|
|
593
647
|
def shift
|
594
648
|
%x{
|
595
|
-
var map = #{self}.map;
|
649
|
+
var keys = #{self}.keys, map = #{self}.map;
|
650
|
+
|
651
|
+
if (keys.length) {
|
652
|
+
var key = keys[0], obj = map[key];
|
596
653
|
|
597
|
-
for (var key in map) {
|
598
|
-
var obj = map[key];
|
599
654
|
delete map[key];
|
655
|
+
keys.splice(0, 1);
|
656
|
+
|
600
657
|
return [key, obj];
|
601
658
|
}
|
602
659
|
|
@@ -608,9 +665,10 @@ class Hash
|
|
608
665
|
|
609
666
|
def to_a
|
610
667
|
%x{
|
611
|
-
var map = #{self}.map, result = [];
|
668
|
+
var keys = #{self}.keys, map = #{self}.map, result = [];
|
612
669
|
|
613
|
-
for (var
|
670
|
+
for (var i = 0, length = keys.length; i < length; i++) {
|
671
|
+
var key = keys[i];
|
614
672
|
result.push([key, map[key]]);
|
615
673
|
}
|
616
674
|
|
@@ -624,9 +682,10 @@ class Hash
|
|
624
682
|
|
625
683
|
def to_json
|
626
684
|
%x{
|
627
|
-
var inspect = [], map = #{self}.map;
|
685
|
+
var inspect = [], keys = #{self}.keys, map = #{self}.map;
|
628
686
|
|
629
|
-
for (var
|
687
|
+
for (var i = 0, length = keys.length; i < length; i++) {
|
688
|
+
var key = keys[i];
|
630
689
|
inspect.push(#{`key`.to_json} + ': ' + #{`map[key]`.to_json});
|
631
690
|
}
|
632
691
|
|
@@ -636,10 +695,10 @@ class Hash
|
|
636
695
|
|
637
696
|
def to_native
|
638
697
|
%x{
|
639
|
-
var result = {}, map = #{self}.map;
|
698
|
+
var result = {}, keys = #{self}.keys, map = #{self}.map, bucket, value;
|
640
699
|
|
641
|
-
for (var
|
642
|
-
var obj = map[key];
|
700
|
+
for (var i = 0, length = keys.length; i < length; i++) {
|
701
|
+
var key = keys[i], obj = map[key];
|
643
702
|
|
644
703
|
if (obj.$to_native) {
|
645
704
|
result[key] = #{`obj`.to_native};
|
@@ -687,4 +746,3 @@ class Hash
|
|
687
746
|
}
|
688
747
|
end
|
689
748
|
end
|
690
|
-
|