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 CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (C) 2012 by Adam Beynon
1
+ Copyright (C) 2013 by Adam Beynon
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  of this software and associated documentation files (the "Software"), to deal
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) 2012 by Adam Beynon
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
@@ -1,6 +1,6 @@
1
1
  class Array < `Array`
2
2
  %x{
3
- Array_prototype._isArray = true;
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
@@ -1,6 +1,6 @@
1
1
  class Boolean < `Boolean`
2
2
  %x{
3
- Boolean_prototype._isBoolean = true;
3
+ Boolean.prototype._isBoolean = true;
4
4
  }
5
5
 
6
6
  def &(other)
@@ -28,4 +28,4 @@ class Boolean < `Boolean`
28
28
  def to_s
29
29
  `(#{self} == true) ? 'true' : 'false'`
30
30
  end
31
- end
31
+ end
@@ -178,11 +178,11 @@ class Class
178
178
  `#{self}._name`
179
179
  end
180
180
 
181
- def new(*args, &block)
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;
@@ -30,8 +30,7 @@ module Enumerable
30
30
  }
31
31
  }
32
32
 
33
- #{self}.$each._p = proc;
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._p = proc;
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._p = proc;
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._p = proc;
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._p = proc;
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._p = function(obj) {
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._p = function(obj) {
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._p = function(obj) {
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._p = function(obj) {
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._p = function(obj) {
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._p = function(obj) {
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._p = function(obj) {
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._p = proc;
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._p = proc;
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._p = (block !== nil
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
@@ -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 == null) {
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 key in map) {
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 obj = #{self}.map[key];
106
+ var bucket = #{self}.map[key];
101
107
 
102
- if (obj != null) {
103
- return obj;
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[key] = value;
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 map = #{self}.map;
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 key in map) {
151
- map2[key] = map[key];
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 = #{self}.map, result = map[key];
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 key in map) {
192
- if ((value = block(key, map[key])) === __breaker) {
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
- delete map[key]
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 map = #{self}.map;
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 key in map) {
242
- if (block(map[key]) === __breaker) {
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
- for (var key in #{self}.map) {
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 key in map) {
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 map = #{self}.map;
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
- val = map[keys[i]];
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(#{@none});
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 key in map) {
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(), map = #{self}.map, map2 = result.map;
415
+ var result = __hash(), keys = #{self}.keys, map = #{self}.map,
416
+ keys2 = result.keys, map2 = result.map;
389
417
 
390
- for (var key in map) {
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 key in map) {
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
- var result = [], map = #{self}.map;
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
- var length = 0, map = #{self}.map;
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 map = #{self}.map, result = __hash(), map2 = result.map;
473
+ var keys = #{self}.keys, map = #{self}.map,
474
+ result = __hash(), keys2 = result.keys, map2 = result.map;
452
475
 
453
- for (var key in map) {
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 (key in map) {
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 (key in map) {
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 map = #{self}.map, map2 = other.map;
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 key in map2) {
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 (key in map2) {
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 key in map) {
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 map = #{self}.map, result = __hash(), map2 = result.map;
566
+ var keys = #{self}.keys, map = #{self}.map,
567
+ result = __hash(), map2 = result.map, keys2 = result.keys;
522
568
 
523
- for (var key in map) {
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 = {}, map2 = other.map;
588
+ var map = #{self}.map = {}, keys = #{self}.keys = [];
542
589
 
543
- for (var key in map2) {
544
- map[key] = map2[key];
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 map = #{self}.map, result = __hash(), map2 = result.map;
602
+ var keys = #{self}.keys, map = #{self}.map,
603
+ result = __hash(), map2 = result.map, keys2 = result.keys;
554
604
 
555
- for (var key in map) {
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 key in map) {
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 key in map) {
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 key in map) {
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 key in map) {
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
-