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 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
-