opal 0.3.31 → 0.3.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
-
|