opal 0.3.6 → 0.3.9

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.
Files changed (98) hide show
  1. data/README.md +69 -97
  2. data/bin/opal +2 -2
  3. data/{lib/core → corelib}/array.rb +85 -56
  4. data/corelib/boolean.rb +20 -0
  5. data/corelib/class.rb +58 -0
  6. data/{lib → corelib}/core.rb +2 -50
  7. data/corelib/dir.rb +22 -0
  8. data/{lib/core → corelib}/enumerable.rb +0 -0
  9. data/corelib/error.rb +19 -0
  10. data/{lib/core → corelib}/file.rb +7 -9
  11. data/{lib/core → corelib}/hash.rb +104 -144
  12. data/{lib/core → corelib}/kernel.rb +38 -44
  13. data/corelib/load_order +21 -0
  14. data/{lib/core → corelib}/match_data.rb +0 -0
  15. data/{lib/core → corelib}/module.rb +12 -8
  16. data/{lib/core → corelib}/nil_class.rb +2 -2
  17. data/{lib/core → corelib}/numeric.rb +37 -100
  18. data/corelib/object.rb +37 -0
  19. data/{lib/core → corelib}/proc.rb +3 -3
  20. data/corelib/range.rb +27 -0
  21. data/{lib/core → corelib}/regexp.rb +1 -1
  22. data/{lib/core → corelib}/string.rb +16 -107
  23. data/{lib/core → corelib}/top_self.rb +0 -0
  24. data/lib/opal.rb +7 -0
  25. data/lib/opal/browserify.rb +34 -0
  26. data/{opal_lib → lib}/opal/builder.rb +70 -24
  27. data/lib/opal/command.rb +52 -0
  28. data/lib/opal/context.rb +197 -0
  29. data/{opal_lib/opal/ruby/parser.rb → lib/opal/lexer.rb} +20 -4
  30. data/{opal_lib/opal/ruby → lib/opal}/nodes.rb +238 -127
  31. data/lib/opal/parser.rb +4894 -0
  32. data/{opal_lib/opal/ruby/ruby_parser.y → lib/opal/parser.y} +38 -18
  33. data/lib/rbp.rb +2 -0
  34. data/lib/rbp/package.rb +49 -0
  35. data/runtime/class.js +216 -189
  36. data/runtime/fs.js +2 -2
  37. data/runtime/init.js +242 -244
  38. data/runtime/loader.js +78 -99
  39. data/runtime/module.js +34 -40
  40. data/runtime/post.js +2 -2
  41. data/runtime/pre.js +1 -1
  42. data/runtime/runtime.js +129 -135
  43. data/{lib → stdlib}/dev.rb +10 -10
  44. data/{lib → stdlib}/racc/parser.rb +0 -6
  45. data/{lib → stdlib}/strscan.rb +4 -4
  46. metadata +57 -105
  47. data/lib/core/basic_object.rb +0 -51
  48. data/lib/core/class.rb +0 -38
  49. data/lib/core/dir.rb +0 -26
  50. data/lib/core/error.rb +0 -75
  51. data/lib/core/false_class.rb +0 -81
  52. data/lib/core/object.rb +0 -6
  53. data/lib/core/range.rb +0 -27
  54. data/lib/core/symbol.rb +0 -42
  55. data/lib/core/true_class.rb +0 -41
  56. data/lib/ospec.rb +0 -7
  57. data/lib/ospec/autorun.rb +0 -8
  58. data/lib/ospec/dsl.rb +0 -15
  59. data/lib/ospec/example.rb +0 -11
  60. data/lib/ospec/example/before_and_after_hooks.rb +0 -56
  61. data/lib/ospec/example/errors.rb +0 -17
  62. data/lib/ospec/example/example_group.rb +0 -12
  63. data/lib/ospec/example/example_group_factory.rb +0 -18
  64. data/lib/ospec/example/example_group_hierarchy.rb +0 -21
  65. data/lib/ospec/example/example_group_methods.rb +0 -100
  66. data/lib/ospec/example/example_group_proxy.rb +0 -15
  67. data/lib/ospec/example/example_methods.rb +0 -46
  68. data/lib/ospec/example/example_proxy.rb +0 -18
  69. data/lib/ospec/expectations.rb +0 -19
  70. data/lib/ospec/expectations/errors.rb +0 -8
  71. data/lib/ospec/expectations/fail_with.rb +0 -9
  72. data/lib/ospec/expectations/handler.rb +0 -33
  73. data/lib/ospec/helpers/scratch.rb +0 -18
  74. data/lib/ospec/matchers.rb +0 -24
  75. data/lib/ospec/matchers/be.rb +0 -1
  76. data/lib/ospec/matchers/generated_descriptions.rb +0 -20
  77. data/lib/ospec/matchers/operator_matcher.rb +0 -54
  78. data/lib/ospec/matchers/raise_error.rb +0 -38
  79. data/lib/ospec/runner.rb +0 -90
  80. data/lib/ospec/runner/example_group_runner.rb +0 -41
  81. data/lib/ospec/runner/formatter/html_formatter.rb +0 -139
  82. data/lib/ospec/runner/formatter/terminal_formatter.rb +0 -48
  83. data/lib/ospec/runner/options.rb +0 -34
  84. data/lib/ospec/runner/reporter.rb +0 -82
  85. data/opal_lib/opal.rb +0 -16
  86. data/opal_lib/opal/build_methods.rb +0 -51
  87. data/opal_lib/opal/bundle.rb +0 -70
  88. data/opal_lib/opal/command.rb +0 -68
  89. data/opal_lib/opal/context.rb +0 -81
  90. data/opal_lib/opal/context/console.rb +0 -10
  91. data/opal_lib/opal/context/file_system.rb +0 -34
  92. data/opal_lib/opal/context/loader.rb +0 -135
  93. data/opal_lib/opal/gem.rb +0 -84
  94. data/opal_lib/opal/rake/builder_task.rb +0 -44
  95. data/opal_lib/opal/rake/spec_task.rb +0 -32
  96. data/opal_lib/opal/ruby/ruby_parser.rb +0 -4862
  97. data/opal_lib/opal/version.rb +0 -4
  98. data/runtime/debug.js +0 -84
@@ -0,0 +1,20 @@
1
+ class Boolean
2
+
3
+ def to_s
4
+ # Yeah, this is another one for the wtf? collection. As the receiver
5
+ # is a true or false literal, it is coerced into a Boolean object,
6
+ # therefore it is always truthy. Therefore we comapre ourself with
7
+ # true to see if we are actually true or false. We could instead do
8
+ # `return self.valueOf() ? "true" : "false", but this way seems a
9
+ # little faster..
10
+ `return self == true ? "true" : "false";`
11
+ end
12
+
13
+ def ==(other)
14
+ `return self.valueOf() === other.valueOf();`
15
+ end
16
+ end
17
+
18
+ TRUE = true
19
+ FALSE = false
20
+
data/corelib/class.rb ADDED
@@ -0,0 +1,58 @@
1
+ class Class < Module
2
+
3
+ def self.new(sup = Object)
4
+ `var res = rb_define_class_id('AnonClass', sup);
5
+
6
+ if (sup.m$inherited) {
7
+ sup.m$inherited(res);
8
+ }
9
+
10
+ return res;`
11
+ end
12
+
13
+ def allocate
14
+ `return new self.$a();`
15
+ end
16
+
17
+ def new(*args)
18
+ obj = allocate
19
+
20
+ `if ($B.f == arguments.callee) {
21
+ $B.f = obj.$m.initialize;
22
+ }`
23
+
24
+ obj.initialize *args
25
+ obj
26
+ end
27
+
28
+ def inherited(cls)
29
+ nil
30
+ end
31
+
32
+ def superclass
33
+ `var sup = self.$s;
34
+
35
+ if (!sup) {
36
+ if (self == rb_cObject) return nil;
37
+ throw new Error('RuntimeError: uninitialized class');
38
+ }
39
+
40
+ return sup;`
41
+ end
42
+
43
+ def native_prototype(proto)
44
+ `rb_native_prototype(self, proto);`
45
+ self
46
+ end
47
+
48
+ # Make the given object an instance of this class. This takes
49
+ # an **existing** object and adds the correct class, method
50
+ # table and id to the receiver.
51
+ #
52
+ # @param [NativeJSObject] obj
53
+ # @return [instance]
54
+ def from_native(obj)
55
+ `return rb_obj_from_native(obj, self);`
56
+ end
57
+ end
58
+
@@ -1,15 +1,5 @@
1
1
  class Module
2
2
 
3
- def private(*args)
4
- `$rb.private_methods(self, args);`
5
- self
6
- end
7
-
8
- def public(*args)
9
- `$rb.public_methods(self, args);`
10
- self
11
- end
12
-
13
3
  def include(*mods)
14
4
  `var i = mods.length - 1, mod;
15
5
  while (i >= 0) {
@@ -22,7 +12,7 @@ class Module
22
12
  end
23
13
 
24
14
  def append_features(mod)
25
- `$rb.include_module(mod, self);`
15
+ `rb_include_module(mod, self);`
26
16
  self
27
17
  end
28
18
 
@@ -32,7 +22,6 @@ class Module
32
22
  end
33
23
 
34
24
  module Kernel
35
- private
36
25
 
37
26
  # Try to load the library or file named `path`. An error is thrown if the
38
27
  # path cannot be resolved.
@@ -40,8 +29,7 @@ module Kernel
40
29
  # @param [String] path The path to load
41
30
  # @return [true, false]
42
31
  def require(path)
43
- `$rb.require(path) ? Qtrue : Qfalse;`
44
- true
32
+ `return rb_require(path);`
45
33
  end
46
34
 
47
35
  # Prints the message to `STDOUT`.
@@ -70,45 +58,9 @@ class Object
70
58
  include Kernel
71
59
  end
72
60
 
73
- class Symbol
74
- def to_s
75
- `return self.toString();`
76
- end
77
- end
78
-
79
61
  class String
80
62
  def to_s
81
63
  `return self.toString();`
82
64
  end
83
65
  end
84
66
 
85
- require 'core/basic_object'
86
- require 'core/object'
87
- require 'core/module'
88
- require 'core/class'
89
- require 'core/kernel'
90
- require 'core/top_self'
91
- require 'core/nil_class'
92
- require 'core/true_class'
93
- require 'core/false_class'
94
- require 'core/enumerable'
95
- require 'core/array'
96
- require 'core/numeric'
97
- require 'core/hash'
98
- require 'core/error'
99
- require 'core/string'
100
- require 'core/symbol'
101
- require 'core/proc'
102
- require 'core/range'
103
- require 'core/regexp'
104
- require 'core/match_data'
105
- require 'core/file'
106
- require 'core/dir'
107
-
108
- `var platform = opal.platform;`
109
- RUBY_PLATFORM = `platform.platform`
110
- RUBY_ENGINE = `platform.engine`
111
- RUBY_VERSION = `platform.version`
112
-
113
- ARGV = `platform.argv`
114
-
data/corelib/dir.rb ADDED
@@ -0,0 +1,22 @@
1
+
2
+ class Dir
3
+
4
+ # Returns a string that is the current working directory for this process.
5
+ #
6
+ # @return [String]
7
+ def self.getwd
8
+ `return Op.fs.cwd;`
9
+ end
10
+
11
+ # Returns a string that is the current working directory for this process.
12
+ #
13
+ # @return [String]
14
+ def self.pwd
15
+ `return Op.fs.cwd;`
16
+ end
17
+
18
+ def self.[](*a)
19
+ `return Op.fs.glob.apply(Op.fs, a);`
20
+ end
21
+ end
22
+
File without changes
data/corelib/error.rb ADDED
@@ -0,0 +1,19 @@
1
+ class Exception
2
+
3
+ def initialize(message = '')
4
+ @message = message
5
+ end
6
+
7
+ def message
8
+ @message
9
+ end
10
+
11
+ def inspect
12
+ `return "#<" + self.$k.__classid__ + ": '" + #{message} + "'>";`
13
+ end
14
+
15
+ def to_s
16
+ message
17
+ end
18
+ end
19
+
@@ -1,7 +1,5 @@
1
1
 
2
2
  class File
3
- # Use either the browser fs namespace or overriden gem interface.
4
- `var OPAL_FS = $rb.opal.fs;`
5
3
 
6
4
  # Converts the given `file_name` into its absolute path. The current working
7
5
  # directory is used as the reference unless the `dir_string` is given, in
@@ -12,9 +10,9 @@ class File
12
10
  # @return [String]
13
11
  def self.expand_path(file_name, dir_string = nil)
14
12
  if dir_string
15
- `return OPAL_FS.expand_path(file_name, dir_string);`
13
+ `return Op.fs.expand_path(file_name, dir_string);`
16
14
  else
17
- `return OPAL_FS.expand_path(file_name);`
15
+ `return Op.fs.expand_path(file_name);`
18
16
  end
19
17
  end
20
18
 
@@ -24,7 +22,7 @@ class File
24
22
  # @param [String] str
25
23
  # @return [String]
26
24
  def self.join(*str)
27
- `return OPAL_FS.join.apply(OPAL_FS, str);`
25
+ `return Op.fs.join.apply(Op.fs, str);`
28
26
  end
29
27
 
30
28
  # Returns all the components of the given `file_name` except for the last
@@ -33,7 +31,7 @@ class File
33
31
  # @param [String] file_name
34
32
  # @return [String]
35
33
  def self.dirname(file_name)
36
- `return OPAL_FS.dirname(file_name);`
34
+ `return Op.fs.dirname(file_name);`
37
35
  end
38
36
 
39
37
  # Returns the extension of the given filename.
@@ -41,7 +39,7 @@ class File
41
39
  # @param [String] file_name
42
40
  # @return [String]
43
41
  def self.extname(file_name)
44
- `return OPAL_FS.extname(file_name);`
42
+ `return Op.fs.extname(file_name);`
45
43
  end
46
44
 
47
45
  # Returns the last path component of the given `file_name`. If a suffix is
@@ -52,11 +50,11 @@ class File
52
50
  # @param [String] suffix
53
51
  # @return [String]
54
52
  def self.basename(file_name, suffix)
55
- `return OPAL_FS.basename(file_name, suffix);`
53
+ `return Op.fs.basename(file_name, suffix);`
56
54
  end
57
55
 
58
56
  def self.exist?(path)
59
- `return OPAL_FS.exist_p(path) ? Qtrue : Qfalse;`
57
+ `return Op.fs.exist_p(path);`
60
58
  end
61
59
  end
62
60
 
@@ -59,10 +59,10 @@ class Hash
59
59
  #
60
60
  # @return [Array]
61
61
  def values
62
- `var result = [], length = self.$keys.length;
62
+ `var result = [], length = self.k.length;
63
63
 
64
64
  for (var i = 0; i < length; i++) {
65
- result.push(self.$assocs[self.$keys[i].$hash()]);
65
+ result.push(self.a[self.k[i].$h()]);
66
66
  }
67
67
 
68
68
  return result;`
@@ -79,9 +79,9 @@ class Hash
79
79
  def inspect
80
80
  `var description = [], key, value;
81
81
 
82
- for (var i = 0; i < self.$keys.length; i++) {
83
- key = self.$keys[i];
84
- value = self.$assocs[key.$hash()];
82
+ for (var i = 0, ii = self.k.length; i < ii; i++) {
83
+ key = self.k[i];
84
+ value = self.a[key.$h()];
85
85
  description.push(#{`key`.inspect} + '=>' + #{`value`.inspect});
86
86
  }
87
87
 
@@ -94,9 +94,9 @@ class Hash
94
94
  def to_s
95
95
  `var description = [], key, value;
96
96
 
97
- for (var i = 0; i < self.$keys.length; i++) {
98
- key = self.$keys[i];
99
- value = self.$assocs[key.$hash()];
97
+ for (var i = 0, ii = self.k.length; i < ii; i++) {
98
+ key = self.k[i];
99
+ value = self.a[key.$h()];
100
100
  description.push(#{`key`.inspect} + #{`value`.inspect});
101
101
  }
102
102
 
@@ -114,20 +114,11 @@ class Hash
114
114
  #
115
115
  # @return [Hash] returns the receiver
116
116
  def each
117
- `var keys = self.$keys, values = self.$assocs, length = keys.length, key;
117
+ `var keys = self.k, values = self.a, length = keys.length, key;
118
118
 
119
119
  for (var i = 0; i < length; i++) {
120
- try {
121
- key = keys[i];
122
- #{yield `key`, `values[key.$hash()]`};
123
- } catch (e) {
124
- switch (e.$keyword) {
125
- case 2:
126
- return e['@exit_value'];
127
- default:
128
- throw e;
129
- }
130
- }
120
+ key = keys[i];
121
+ #{yield `key`, `values[key.$h()]`};
131
122
  }
132
123
 
133
124
  return self;`
@@ -147,12 +138,12 @@ class Hash
147
138
  # @param [Object] obj key to search for
148
139
  # @return [Array<Object, Object>, nil] result or nil
149
140
  def assoc(obj)
150
- `var key, keys = self.$keys, length = keys.length;
141
+ `var key, keys = self.k, length = keys.length;
151
142
 
152
143
  for (var i = 0; i < length; i++) {
153
144
  key = keys[i];
154
145
  if (#{`key` == obj}.$r) {
155
- return [key, self.$assocs[key.$hash()]];
146
+ return [key, self.a[key.$h()]];
156
147
  }
157
148
  }
158
149
 
@@ -177,23 +168,23 @@ class Hash
177
168
  # @param [Hash] other the hash to compare with
178
169
  # @return [true, false]
179
170
  def ==(other)
180
- `if (self === other) return Qtrue;
181
- if (!other.$keys || !other.$assocs) return Qfalse;
182
- if (self.$keys.length != other.$keys.length) return Qfalse;
171
+ `if (self === other) return true;
172
+ if (!other.k || !other.a) return false;
173
+ if (self.k.length != other.k.length) return false;
183
174
 
184
- for (var i = 0; i < self.$keys.length; i++) {
185
- var key1 = self.$keys[i], assoc1 = key1.$hash();
175
+ for (var i = 0; i < self.k.length; i++) {
176
+ var key1 = self.k[i], assoc1 = key1.$h();
186
177
 
187
- if (!other.$assocs.hasOwnProperty(assoc1))
188
- return Qfalse;
178
+ if (!hasOwnProperty.call(other.a, assoc1))
179
+ return false;
189
180
 
190
- var assoc2 = other.$assocs[assoc1];
181
+ var assoc2 = other.a[assoc1];
191
182
 
192
- if (!#{`self.$assocs[assoc1]` == `assoc2`}.$r)
193
- return Qfalse;
183
+ if (!#{`self.a[assoc1]` == `assoc2`}.$r)
184
+ return false;
194
185
  }
195
186
 
196
- return Qtrue;`
187
+ return true;`
197
188
  end
198
189
 
199
190
  # Element reference - retrieves the `value` object corresponding to the `key`
@@ -210,12 +201,12 @@ class Hash
210
201
  # @param [Object] key the key to look for
211
202
  # @return [Object] result or default value
212
203
  def [](key)
213
- `var assoc = key.$hash();
204
+ `var assoc = key.$h();
214
205
 
215
- if (self.$assocs.hasOwnProperty(assoc))
216
- return self.$assocs[assoc];
206
+ if (hasOwnProperty.call(self.a, assoc))
207
+ return self.a[assoc];
217
208
 
218
- return self.$default;`
209
+ return self.d;`
219
210
  end
220
211
 
221
212
  # Element assignment - Associates the value given by 'value' with the key
@@ -234,12 +225,12 @@ class Hash
234
225
  # @param [Object] value the value for the key
235
226
  # @return [Object] returns the set value
236
227
  def []=(key, value)
237
- `var assoc = key.$hash();
228
+ `var assoc = key.$h();
238
229
 
239
- if (!self.$assocs.hasOwnProperty(assoc))
240
- self.$keys.push(key);
230
+ if (!hasOwnProperty.call(self.a, assoc))
231
+ self.k.push(key);
241
232
 
242
- return self.$assocs[assoc] = value;`
233
+ return self.a[assoc] = value;`
243
234
  end
244
235
 
245
236
  # Remove all key-value pairs from `self`.
@@ -252,15 +243,15 @@ class Hash
252
243
  #
253
244
  # @return [Hash]
254
245
  def clear
255
- `self.$keys = [];
256
- self.$assocs = {};
246
+ `self.k = [];
247
+ self.a = {};
257
248
 
258
249
  return self;`
259
250
  end
260
251
 
261
252
  # Returns the default value for the hash.
262
253
  def default
263
- `return self.$default;`
254
+ `return self.d;`
264
255
  end
265
256
 
266
257
  # Sets the default value - the value returned when a key does not exist.
@@ -268,7 +259,7 @@ class Hash
268
259
  # @param [Object] obj the new default
269
260
  # @return [Object] returns the new default
270
261
  def default=(obj)
271
- `return self.$default = obj;`
262
+ `return self.d = obj;`
272
263
  end
273
264
 
274
265
  # Deletes and returns a key-value pair from self whose key is equal to `key`.
@@ -287,16 +278,16 @@ class Hash
287
278
  # @param [Object] key the key to delete
288
279
  # #return [Object] returns value or default value
289
280
  def delete(key)
290
- `var assoc = key.$hash();
281
+ `var assoc = key.$h();
291
282
 
292
- if (self.$assocs.hasOwnProperty(assoc)) {
293
- var ret = self.$assocs[assoc];
294
- delete self.$assocs[assoc];
295
- self.$keys.splice(self.$keys.indexOf(key), 1);
283
+ if (hasOwnProperty.call(self.a, assoc)) {
284
+ var ret = self.a[assoc];
285
+ delete self.a[assoc];
286
+ self.k.splice(self.$keys.indexOf(key), 1);
296
287
  return ret;
297
288
  }
298
289
 
299
- return self.$default;`
290
+ return self.d;`
300
291
  end
301
292
 
302
293
  # Deletes every key-value pair from `self` for which the block evaluates to
@@ -312,23 +303,14 @@ class Hash
312
303
  def delete_if
313
304
  `var key, value;
314
305
 
315
- for (var i = 0; i < self.$keys.length; i++) {
316
- try {
317
- key = self.$keys[i];
318
- value = self.$assocs[key.$hash()];
306
+ for (var i = 0; i < self.k.length; i++) {
307
+ key = self.k[i];
308
+ value = self.a[key.$h()];
319
309
 
320
- if (#{yield `key`, `value`}.$r) {
321
- delete self.$assocs[key.$hash()];
322
- self.$keys.splice(i, 1);
323
- i--;
324
- }
325
- } catch (e) {
326
- switch (e.$keyword) {
327
- case 2:
328
- return e['@exit_value'];
329
- default:
330
- throw e;
331
- }
310
+ if (#{yield `key`, `value`}.$r) {
311
+ delete self.a[key.$h()];
312
+ self.k.splice(i, 1);
313
+ i--;
332
314
  }
333
315
  }
334
316
 
@@ -347,20 +329,8 @@ class Hash
347
329
  #
348
330
  # @return [Hash] returns receiver
349
331
  def each_key
350
- `var key;
351
-
352
- for (var i = 0; i < self.$keys.length; i++) {
353
- try {
354
- key = self.$keys[i];
355
- #{yield `key`};
356
- } catch (e) {
357
- switch (e.$keyword) {
358
- case 2:
359
- return e['@exit_value'];
360
- default:
361
- throw e;
362
- }
363
- }
332
+ `for (var i = 0, ii = self.k.length; i < ii; i++) {
333
+ #{yield `self.k[i]`};
364
334
  }
365
335
 
366
336
  return self;`
@@ -380,18 +350,8 @@ class Hash
380
350
  def each_value
381
351
  `var val;
382
352
 
383
- for (var i = 0; i < self.$keys.length; i++) {
384
- try {
385
- val = self.$assocs[self.$keys[i].$hash()];
386
- #{yield `val`};
387
- } catch (e) {
388
- switch (e.$keyword) {
389
- case 2:
390
- return e['@exit_value'];
391
- default:
392
- throw e;
393
- }
394
- }
353
+ for (var i = 0, ii = self.k.length; i < ii; i++) {
354
+ #{yield `self.a[self.k[i].$h()]`};
395
355
  }
396
356
 
397
357
  return self;`
@@ -406,7 +366,7 @@ class Hash
406
366
  #
407
367
  # @return [true, false]
408
368
  def empty?
409
- `return self.$keys.length == 0 ? Qtrue : Qfalse;`
369
+ `return self.k.length == 0;`
410
370
  end
411
371
 
412
372
  # Returns a value from the hash for the given key. If the key can't be found,
@@ -426,7 +386,7 @@ class Hash
426
386
  # @param [Object] defaults the default value to return
427
387
  # @return [Object] value from hash
428
388
  def fetch(key, defaults = `undefined`)
429
- `var value = self.$assocs[key.$hash()];
389
+ `var value = self.a[key.$h()];
430
390
 
431
391
  if (value != undefined)
432
392
  return value;
@@ -455,9 +415,9 @@ class Hash
455
415
  def flatten(level = 1)
456
416
  `var result = [], key, value;
457
417
 
458
- for (var i = 0; i < self.$keys.length; i++) {
459
- key = self.$keys[i];
460
- value = self.$assocs[key.$hash()];
418
+ for (var i = 0; i < self.k.length; i++) {
419
+ key = self.k[i];
420
+ value = self.a[key.$h()];
461
421
  result.push(key);
462
422
 
463
423
  if (value instanceof Array) {
@@ -488,10 +448,10 @@ class Hash
488
448
  # @param [Object] key the key to check
489
449
  # @return [true, false]
490
450
  def has_key?(key)
491
- `if (self.$assocs.hasOwnProperty(key.$hash()))
492
- return Qtrue;
451
+ `if (hasOwnProperty.call(self.a, key.$h()))
452
+ return true;
493
453
 
494
- return Qfalse;`
454
+ return false;`
495
455
  end
496
456
 
497
457
  # Returns `true` if the given `value` is present for some key in `self`.
@@ -509,15 +469,15 @@ class Hash
509
469
  def has_value?(value)
510
470
  `var key, value;
511
471
 
512
- for (var i = 0; i < self.$keys.length; i++) {
513
- key = self.$keys[i];
514
- val = self.$assocs[key.$hash()];
472
+ for (var i = 0; i < self.k.length; i++) {
473
+ key = self.k[i];
474
+ val = self.a[key.$h()];
515
475
 
516
476
  if (#{`value` == `val`}.$r)
517
- return Qtrue;
477
+ return true;
518
478
  }
519
479
 
520
- return Qfalse;`
480
+ return false;`
521
481
  end
522
482
 
523
483
  # Replaces the contents of `self` with the contents of `other`.
@@ -531,13 +491,13 @@ class Hash
531
491
  # @param [Hash] other hash to replace with
532
492
  # @return [Hash] returns receiver
533
493
  def replace(other)
534
- `self.$keys = []; self.$assocs = {};
494
+ `self.k = []; self.a = {};
535
495
 
536
- for (var i = 0; i < other.$keys.length; i++) {
537
- var key = other.$keys[i];
538
- var val = other.$assocs[key.$hash()];
539
- self.$keys.push(key);
540
- self.$assocs[key.$hash()] = val;
496
+ for (var i = 0; i < other.k.length; i++) {
497
+ var key = other.k[i];
498
+ var val = other.a[key.$h()];
499
+ self.k.push(key);
500
+ self.a[key.$h()] = val;
541
501
  }
542
502
 
543
503
  return self;`
@@ -572,9 +532,9 @@ class Hash
572
532
  def key(value)
573
533
  `var key, val;
574
534
 
575
- for (var i = 0; i < self.$keys.length; i++) {
576
- key = self.$keys[i];
577
- val = self.$assocs[key.$hash()];
535
+ for (var i = 0; i < self.k.length; i++) {
536
+ key = self.k[i];
537
+ val = self.a[key.$h()];
578
538
 
579
539
  if (#{`value` == `val`}.$r) {
580
540
  return key;
@@ -595,7 +555,7 @@ class Hash
595
555
  #
596
556
  # @return [Array]
597
557
  def keys
598
- `return self.$keys.slice(0);`
558
+ `return self.k.slice(0);`
599
559
  end
600
560
 
601
561
  # Returns the number of key-value pairs in the hash.
@@ -608,7 +568,7 @@ class Hash
608
568
  #
609
569
  # @return [Numeric]
610
570
  def length
611
- `return self.$keys.length;`
571
+ `return self.k.length;`
612
572
  end
613
573
 
614
574
  # Returns a new hash containing the contents of `other` and `self`. If no
@@ -631,21 +591,21 @@ class Hash
631
591
  def merge(other)
632
592
  `var result = $opal.H() , key, val;
633
593
 
634
- for (var i = 0; i < self.$keys.length; i++) {
635
- key = self.$keys[i], val = self.$assocs[key.$hash()];
594
+ for (var i = 0; i < self.k.length; i++) {
595
+ key = self.k[i], val = self.a[key.$h()];
636
596
 
637
- result.$keys.push(key);
638
- result.$assocs[key.$hash()] = val;
597
+ result.k.push(key);
598
+ result.a[key.$h()] = val;
639
599
  }
640
600
 
641
- for (var i = 0; i < other.$keys.length; i++) {
642
- key = other.$keys[i], val = other.$assocs[key.$hash()];
601
+ for (var i = 0; i < other.k.length; i++) {
602
+ key = other.k[i], val = other.a[key.$h()];
643
603
 
644
- if (!result.$assocs.hasOwnProperty(key.$hash())) {
645
- result.$keys.push(key);
604
+ if (!hasOwnProperty.call(result.a, key.$h())) {
605
+ result.k.push(key);
646
606
  }
647
607
 
648
- result.$assocs[key.$hash()] = val;
608
+ result.a[key.$h()] = val;
649
609
  }
650
610
 
651
611
  return result;`
@@ -668,15 +628,15 @@ class Hash
668
628
  def merge!(other)
669
629
  `var key, val;
670
630
 
671
- for (var i = 0; i < other.$keys.length; i++) {
672
- key = other.$keys[i];
673
- val = other.$assocs[key.$hash()];
631
+ for (var i = 0; i < other.k.length; i++) {
632
+ key = other.k[i];
633
+ val = other.a[key.$h()];
674
634
 
675
- if (!self.$assocs.hasOwnProperty(key.$hash())) {
676
- self.$keys.push(key);
635
+ if (!hasOwnProperty.call(self.a, key.$h())) {
636
+ self.k.push(key);
677
637
  }
678
638
 
679
- self.$assocs[key.$hash()] = val;
639
+ self.a[key.$h()] = val;
680
640
  }
681
641
 
682
642
  return self;`
@@ -698,9 +658,9 @@ class Hash
698
658
  def rassoc(obj)
699
659
  `var key, val;
700
660
 
701
- for (var i = 0; i < self.$keys.length; i++) {
702
- key = self.$keys[i];
703
- val = self.$assocs[key.$hash()];
661
+ for (var i = 0; i < self.k.length; i++) {
662
+ key = self.k[i];
663
+ val = self.a[key.$h()];
704
664
 
705
665
  if (#{`val` == obj}.$r)
706
666
  return [key, val];
@@ -726,16 +686,16 @@ class Hash
726
686
  def shift
727
687
  `var key, val;
728
688
 
729
- if (self.$keys.length > 0) {
730
- key = self.$keys[0];
731
- val = self.$assocs[key.$hash()];
689
+ if (self.k.length > 0) {
690
+ key = self.k[0];
691
+ val = self.a[key.$h()];
732
692
 
733
- self.$keys.shift();
734
- delete self.$assocs[key.$hash()];
693
+ self.k.shift();
694
+ delete self.a[key.$h()];
735
695
  return [key, val];
736
696
  }
737
697
 
738
- return self.$default;`
698
+ return self.d;`
739
699
  end
740
700
 
741
701
  # Convert self into a nested array of `[key, value]` arrays.
@@ -750,9 +710,9 @@ class Hash
750
710
  def to_a
751
711
  `var result = [], key, value;
752
712
 
753
- for (var i = 0; i < self.$keys.length; i++) {
754
- key = self.$keys[i];
755
- value = self.$assocs[key.$hash()];
713
+ for (var i = 0; i < self.k.length; i++) {
714
+ key = self.k[i];
715
+ value = self.a[key.$h()];
756
716
  result.push([key, value]);
757
717
  }
758
718