opal 0.3.16 → 0.3.17

Sign up to get free protection for your applications and to get access to all the features.
Files changed (251) hide show
  1. data/.gitignore +2 -0
  2. data/CHANGELOG.md +12 -0
  3. data/Gemfile +8 -7
  4. data/README.md +21 -13
  5. data/Rakefile +64 -78
  6. data/bin/opal +18 -29
  7. data/core/alpha.rb +2 -9
  8. data/core/array.rb +106 -50
  9. data/core/basic_object.rb +10 -8
  10. data/core/boolean.rb +2 -0
  11. data/core/class.rb +25 -13
  12. data/core/comparable.rb +6 -6
  13. data/core/enumerable.rb +90 -94
  14. data/core/enumerator.rb +3 -3
  15. data/core/hash.rb +86 -46
  16. data/core/kernel.rb +55 -39
  17. data/core/load_order +2 -5
  18. data/core/match_data.rb +1 -1
  19. data/core/module.rb +45 -20
  20. data/core/nil_class.rb +6 -2
  21. data/core/numeric.rb +20 -10
  22. data/core/proc.rb +2 -2
  23. data/core/range.rb +72 -13
  24. data/core/regexp.rb +5 -3
  25. data/core/runtime.js +228 -287
  26. data/core/string.rb +345 -37
  27. data/core/top_self.rb +1 -1
  28. data/lib/opal.rb +13 -91
  29. data/lib/opal/builder.rb +47 -120
  30. data/lib/opal/builder_task.rb +74 -0
  31. data/lib/opal/{parser/grammar.rb → grammar.rb} +1094 -1083
  32. data/lib/opal/{parser/grammar.y → grammar.y} +7 -0
  33. data/lib/opal/{parser/lexer.rb → lexer.rb} +32 -11
  34. data/lib/opal/{parser/parser.rb → parser.rb} +232 -238
  35. data/lib/opal/{parser/scope.rb → scope.rb} +72 -9
  36. data/lib/opal/version.rb +2 -3
  37. data/opal.gemspec +1 -2
  38. data/{core_spec → spec}/core/array/allocate_spec.rb +1 -3
  39. data/{core_spec → spec}/core/array/append_spec.rb +1 -4
  40. data/{core_spec → spec}/core/array/assoc_spec.rb +1 -4
  41. data/{core_spec → spec}/core/array/at_spec.rb +1 -3
  42. data/{core_spec → spec}/core/array/clear_spec.rb +1 -3
  43. data/spec/core/array/clone_spec.rb +15 -0
  44. data/{core_spec/core/array/shared/collect.rb → spec/core/array/collect_spec.rb} +1 -1
  45. data/{core_spec → spec}/core/array/compact_spec.rb +1 -3
  46. data/{core_spec → spec}/core/array/concat_spec.rb +1 -3
  47. data/{core_spec → spec}/core/array/constructor_spec.rb +9 -3
  48. data/{core_spec → spec}/core/array/count_spec.rb +1 -3
  49. data/{core_spec → spec}/core/array/delete_at_spec.rb +1 -4
  50. data/{core_spec → spec}/core/array/delete_if_spec.rb +1 -4
  51. data/{core_spec → spec}/core/array/delete_spec.rb +1 -4
  52. data/{core_spec → spec}/core/array/each_index_spec.rb +1 -4
  53. data/{core_spec → spec}/core/array/each_spec.rb +1 -4
  54. data/{core_spec → spec}/core/array/element_reference_spec.rb +74 -4
  55. data/{core_spec → spec}/core/array/empty_spec.rb +1 -4
  56. data/{core_spec/core/array/shared/eql.rb → spec/core/array/eql_spec.rb} +1 -1
  57. data/{core_spec → spec}/core/array/fetch_spec.rb +1 -4
  58. data/{core_spec → spec}/core/array/first_spec.rb +1 -3
  59. data/{core_spec → spec}/core/array/flatten_spec.rb +1 -3
  60. data/{core_spec → spec}/core/array/include_spec.rb +1 -3
  61. data/{core_spec → spec}/core/array/insert_spec.rb +1 -4
  62. data/{core_spec → spec}/core/array/last_spec.rb +1 -4
  63. data/{core_spec/core/array/shared/length.rb → spec/core/array/length_spec.rb} +1 -1
  64. data/spec/core/array/map_spec.rb +53 -0
  65. data/{core_spec → spec}/core/array/plus_spec.rb +1 -4
  66. data/{core_spec → spec}/core/array/pop_spec.rb +1 -4
  67. data/{core_spec → spec}/core/array/push_spec.rb +1 -4
  68. data/{core_spec → spec}/core/array/rassoc_spec.rb +1 -4
  69. data/{core_spec → spec}/core/array/reject_spec.rb +1 -4
  70. data/{core_spec/core/array/shared/replace.rb → spec/core/array/replace_spec.rb} +1 -1
  71. data/{core_spec → spec}/core/array/reverse_each_spec.rb +1 -4
  72. data/{core_spec → spec}/core/array/reverse_spec.rb +1 -4
  73. data/spec/core/array/size_spec.rb +6 -0
  74. data/spec/core/array/to_ary_spec.rb +6 -0
  75. data/spec/core/array/uniq_spec.rb +22 -0
  76. data/spec/core/array/zip_spec.rb +20 -0
  77. data/{core_spec → spec}/core/class/new_spec.rb +1 -4
  78. data/{core_spec → spec}/core/enumerable/all_spec.rb +1 -4
  79. data/{core_spec → spec}/core/enumerable/any_spec.rb +1 -4
  80. data/{core_spec/core/enumerable/shared/collect.rb → spec/core/enumerable/collect_spec.rb} +1 -1
  81. data/{core_spec → spec}/core/enumerable/count_spec.rb +2 -5
  82. data/{core_spec → spec}/core/enumerable/fixtures/classes.rb +1 -2
  83. data/{core_spec → spec}/core/false/and_spec.rb +1 -3
  84. data/{core_spec → spec}/core/false/inspect_spec.rb +1 -3
  85. data/{core_spec → spec}/core/false/or_spec.rb +1 -3
  86. data/{core_spec → spec}/core/false/to_s_spec.rb +1 -3
  87. data/{core_spec → spec}/core/false/xor_spec.rb +1 -3
  88. data/{core_spec → spec}/core/hash/allocate_spec.rb +1 -3
  89. data/spec/core/hash/assoc_spec.rb +25 -0
  90. data/{core_spec → spec}/core/hash/clear_spec.rb +1 -3
  91. data/{core_spec → spec}/core/hash/clone_spec.rb +1 -3
  92. data/{core_spec → spec}/core/hash/default_spec.rb +1 -3
  93. data/{core_spec → spec}/core/hash/delete_if_spec.rb +1 -3
  94. data/{core_spec → spec}/core/hash/element_reference_spec.rb +1 -3
  95. data/{core_spec → spec}/core/hash/element_set_spec.rb +1 -3
  96. data/spec/core/hash/merge_spec.rb +37 -0
  97. data/{core_spec → spec}/core/hash/new_spec.rb +1 -3
  98. data/{core_spec → spec}/core/matchdata/to_a_spec.rb +1 -3
  99. data/{core_spec → spec}/core/nil/and_spec.rb +1 -4
  100. data/{core_spec → spec}/core/nil/inspect_spec.rb +1 -4
  101. data/{core_spec → spec}/core/nil/nil_spec.rb +1 -4
  102. data/{core_spec → spec}/core/nil/or_spec.rb +1 -4
  103. data/{core_spec → spec}/core/nil/to_a_spec.rb +1 -4
  104. data/{core_spec → spec}/core/nil/to_f_spec.rb +1 -4
  105. data/{core_spec → spec}/core/nil/to_i_spec.rb +1 -4
  106. data/{core_spec → spec}/core/nil/to_s_spec.rb +1 -4
  107. data/{core_spec → spec}/core/nil/xor_spec.rb +1 -4
  108. data/{core_spec → spec}/core/numeric/equal_value_spec.rb +1 -3
  109. data/{core_spec → spec}/core/regexp/match_spec.rb +10 -3
  110. data/{core_spec → spec}/core/symbol/to_proc_spec.rb +1 -3
  111. data/{core_spec → spec}/core/true/and_spec.rb +1 -3
  112. data/{core_spec → spec}/core/true/inspect_spec.rb +1 -3
  113. data/{core_spec → spec}/core/true/or_spec.rb +1 -3
  114. data/{core_spec → spec}/core/true/to_s_spec.rb +1 -3
  115. data/{core_spec → spec}/core/true/xor_spec.rb +1 -3
  116. data/spec/index.html +11 -0
  117. data/{core_spec → spec}/language/alias_spec.rb +1 -3
  118. data/{core_spec → spec}/language/and_spec.rb +1 -4
  119. data/{core_spec → spec}/language/array_spec.rb +1 -4
  120. data/{core_spec → spec}/language/block_spec.rb +20 -3
  121. data/{core_spec → spec}/language/break_spec.rb +40 -3
  122. data/{core_spec → spec}/language/case_spec.rb +1 -4
  123. data/{core_spec → spec}/language/defined_spec.rb +9 -3
  124. data/{core_spec → spec}/language/ensure_spec.rb +38 -3
  125. data/{core_spec → spec}/language/hash_spec.rb +1 -3
  126. data/{core_spec → spec}/language/if_spec.rb +1 -4
  127. data/{core_spec → spec}/language/loop_spec.rb +1 -3
  128. data/spec/language/metaclass_spec.rb +13 -0
  129. data/{core_spec → spec}/language/next_spec.rb +47 -3
  130. data/{core_spec → spec}/language/or_spec.rb +1 -4
  131. data/{core_spec → spec}/language/predefined_spec.rb +1 -3
  132. data/{core_spec/language/regexp/interpolation_spec.rb → spec/language/regexp_spec.rb} +6 -3
  133. data/{core_spec → spec}/language/send_spec.rb +38 -4
  134. data/spec/language/singleton_class_spec.rb +31 -0
  135. data/spec/language/super_spec.rb +188 -0
  136. data/{core_spec → spec}/language/symbol_spec.rb +1 -3
  137. data/{core_spec → spec}/language/undef_spec.rb +1 -3
  138. data/{core_spec → spec}/language/unless_spec.rb +1 -4
  139. data/{core_spec → spec}/language/until_spec.rb +1 -3
  140. data/{core_spec → spec}/language/variables_spec.rb +1 -3
  141. data/{core_spec → spec}/language/while_spec.rb +1 -3
  142. data/{spec → test}/builder/build_source_spec.rb +0 -0
  143. data/{spec → test}/builder/fixtures/build_source/adam.rb +0 -0
  144. data/{spec → test}/builder/fixtures/build_source/bar/a.rb +0 -0
  145. data/{spec → test}/builder/fixtures/build_source/bar/wow/b.rb +0 -0
  146. data/{spec → test}/builder/fixtures/build_source/bar/wow/cow/c.rb +0 -0
  147. data/{spec → test}/builder/fixtures/build_source/beynon.rb +0 -0
  148. data/{spec → test}/builder/fixtures/build_source/charles.js +0 -0
  149. data/{spec → test}/builder/fixtures/build_source/foo/a.rb +0 -0
  150. data/{spec → test}/builder/fixtures/build_source/foo/b.rb +0 -0
  151. data/{spec → test}/builder/fixtures/build_source/foo/x.js +0 -0
  152. data/{spec → test}/builder/fixtures/build_source/foo/y.js +0 -0
  153. data/{spec → test}/grammar/alias_spec.rb +0 -0
  154. data/{spec → test}/grammar/and_spec.rb +0 -0
  155. data/{spec → test}/grammar/array_spec.rb +0 -0
  156. data/{spec → test}/grammar/attrasgn_spec.rb +0 -0
  157. data/{spec → test}/grammar/begin_spec.rb +0 -0
  158. data/{spec → test}/grammar/block_spec.rb +0 -0
  159. data/{spec → test}/grammar/break_spec.rb +0 -0
  160. data/{spec → test}/grammar/call_spec.rb +0 -0
  161. data/{spec → test}/grammar/class_spec.rb +0 -0
  162. data/{spec → test}/grammar/const_spec.rb +0 -0
  163. data/{spec → test}/grammar/cvar_spec.rb +0 -0
  164. data/{spec → test}/grammar/def_spec.rb +0 -0
  165. data/{spec → test}/grammar/false_spec.rb +0 -0
  166. data/{spec → test}/grammar/file_spec.rb +0 -0
  167. data/{spec → test}/grammar/gvar_spec.rb +0 -0
  168. data/{spec → test}/grammar/hash_spec.rb +0 -0
  169. data/{spec → test}/grammar/iasgn_spec.rb +0 -0
  170. data/{spec → test}/grammar/if_spec.rb +0 -0
  171. data/{spec → test}/grammar/iter_spec.rb +0 -0
  172. data/{spec → test}/grammar/ivar_spec.rb +0 -0
  173. data/{spec → test}/grammar/lasgn_spec.rb +0 -0
  174. data/{spec → test}/grammar/line_spec.rb +0 -0
  175. data/{spec → test}/grammar/lvar_spec.rb +0 -0
  176. data/{spec → test}/grammar/masgn_spec.rb +0 -0
  177. data/{spec → test}/grammar/module_spec.rb +0 -0
  178. data/{spec → test}/grammar/nil_spec.rb +0 -0
  179. data/{spec → test}/grammar/not_spec.rb +0 -0
  180. data/{spec → test}/grammar/op_asgn1_spec.rb +0 -0
  181. data/{spec → test}/grammar/op_asgn2_spec.rb +0 -0
  182. data/{spec → test}/grammar/or_spec.rb +0 -0
  183. data/{spec → test}/grammar/return_spec.rb +0 -0
  184. data/{spec → test}/grammar/sclass_spec.rb +0 -0
  185. data/{spec → test}/grammar/self_spec.rb +0 -0
  186. data/{spec → test}/grammar/str_spec.rb +0 -0
  187. data/{spec → test}/grammar/super_spec.rb +0 -0
  188. data/{spec → test}/grammar/true_spec.rb +0 -0
  189. data/{spec → test}/grammar/undef_spec.rb +0 -0
  190. data/{spec → test}/grammar/unless_spec.rb +0 -0
  191. data/{spec → test}/grammar/while_spec.rb +0 -0
  192. data/{spec → test}/grammar/xstr_spec.rb +0 -0
  193. data/{spec → test}/grammar/yield_spec.rb +0 -0
  194. data/{spec → test}/spec_helper.rb +0 -0
  195. metadata +330 -264
  196. data/core/debug.js +0 -59
  197. data/core/debug.rb +0 -35
  198. data/core/dir.rb +0 -90
  199. data/core/file.rb +0 -83
  200. data/core/gemlib.rb +0 -30
  201. data/core/io.rb +0 -44
  202. data/core_spec/README.md +0 -34
  203. data/core_spec/core/array/collect_spec.rb +0 -3
  204. data/core_spec/core/array/element_set_spec.rb +0 -7
  205. data/core_spec/core/array/eql_spec.rb +0 -3
  206. data/core_spec/core/array/equal_value_spec.rb +0 -3
  207. data/core_spec/core/array/fixtures/classes.rb +0 -8
  208. data/core_spec/core/array/length_spec.rb +0 -3
  209. data/core_spec/core/array/map_spec.rb +0 -3
  210. data/core_spec/core/array/replace_spec.rb +0 -3
  211. data/core_spec/core/enumerable/collect_spec.rb +0 -3
  212. data/core_spec/core/enumerable/detect_spec.rb +0 -3
  213. data/core_spec/core/enumerable/find_spec.rb +0 -3
  214. data/core_spec/core/enumerable/first_spec.rb +0 -3
  215. data/core_spec/core/enumerable/shared/entries.rb +0 -7
  216. data/core_spec/core/enumerable/shared/find.rb +0 -49
  217. data/core_spec/core/enumerable/shared/take.rb +0 -31
  218. data/core_spec/core/enumerable/to_a_spec.rb +0 -7
  219. data/core_spec/core/hash/assoc_spec.rb +0 -29
  220. data/core_spec/core/object/is_a_spec.rb +0 -2
  221. data/core_spec/core/object/shared/kind_of.rb +0 -0
  222. data/core_spec/core/regexp/shared/match.rb +0 -11
  223. data/core_spec/language/fixtures/block.rb +0 -19
  224. data/core_spec/language/fixtures/break.rb +0 -39
  225. data/core_spec/language/fixtures/defined.rb +0 -9
  226. data/core_spec/language/fixtures/ensure.rb +0 -37
  227. data/core_spec/language/fixtures/next.rb +0 -46
  228. data/core_spec/language/fixtures/send.rb +0 -36
  229. data/core_spec/language/fixtures/super.rb +0 -43
  230. data/core_spec/language/regexp_spec.rb +0 -7
  231. data/core_spec/language/string_spec.rb +0 -4
  232. data/core_spec/language/super_spec.rb +0 -18
  233. data/core_spec/language/versions/hash_1.9.rb +0 -20
  234. data/core_spec/opal/opal/defined_spec.rb +0 -15
  235. data/core_spec/opal/opal/function_spec.rb +0 -11
  236. data/core_spec/opal/opal/native_spec.rb +0 -16
  237. data/core_spec/opal/opal/null_spec.rb +0 -10
  238. data/core_spec/opal/opal/number_spec.rb +0 -11
  239. data/core_spec/opal/opal/object_spec.rb +0 -16
  240. data/core_spec/opal/opal/string_spec.rb +0 -11
  241. data/core_spec/opal/opal/typeof_spec.rb +0 -9
  242. data/core_spec/opal/opal/undefined_spec.rb +0 -10
  243. data/core_spec/opal/true/case_compare_spec.rb +0 -12
  244. data/core_spec/opal/true/class_spec.rb +0 -10
  245. data/core_spec/release_runner.html +0 -17
  246. data/core_spec/runner.html +0 -16
  247. data/core_spec/spec_helper.rb +0 -23
  248. data/lib/opal/context.rb +0 -269
  249. data/lib/opal/dependency_builder.rb +0 -133
  250. data/lib/opal/environment.rb +0 -87
  251. data/lib/opal/parser/sexp.rb +0 -17
data/core/enumerator.rb CHANGED
@@ -77,7 +77,7 @@ class Enumerator
77
77
  def each(&block)
78
78
  return self unless block
79
79
 
80
- @object.__send__ @method, *args, &block
80
+ @object.__send__ @method, *@args, &block
81
81
  end
82
82
 
83
83
  def each_with_index(&block)
@@ -85,7 +85,7 @@ class Enumerator
85
85
  end
86
86
 
87
87
  def with_index(offset = 0)
88
- return Enumerator.new(self, :with_index, offset) unless block_given?
88
+ return enum_for :with_index, offset unless block_given?
89
89
 
90
90
  current = 0
91
91
 
@@ -99,7 +99,7 @@ class Enumerator
99
99
  end
100
100
 
101
101
  def with_object(object)
102
- return Enumerator.new(self, :with_object, object) unless block_given?
102
+ return enum_for :with_object, object unless block_given?
103
103
 
104
104
  each {|*args|
105
105
  yield *args, object
data/core/hash.rb CHANGED
@@ -4,19 +4,33 @@ class Hash
4
4
  %x{
5
5
  var hash_class = this;
6
6
 
7
- $opal.hash = function() {
8
- var hash = new hash_class.$allocator(),
9
- args = $slice.call(arguments),
10
- assocs = {},
11
- key;
7
+ Opal.hash = function() {
8
+ var hash = new hash_class._alloc(),
9
+ args = __slice.call(arguments),
10
+ assocs = {};
12
11
 
13
12
  hash.map = assocs;
14
13
  hash.none = nil;
15
14
  hash.proc = nil;
16
15
 
17
- for (var i = 0, length = args.length; i < length; i++) {
18
- key = args[i];
19
- assocs[key.$hash()] = [key, args[++i]];
16
+ if (args.length == 1 && args[0]._flags & T_ARRAY) {
17
+ args = args[0];
18
+
19
+ for (var i = 0, length = args.length, key; i < length; i++) {
20
+ key = args[i][0];
21
+
22
+ assocs[key] = [key, args[i][1]];
23
+ }
24
+ }
25
+ else if (arguments.length % 2 == 0) {
26
+ for (var i = 0, length = args.length, key; i < length; i++) {
27
+ key = args[i];
28
+
29
+ assocs[key] = [key, args[++i]];
30
+ }
31
+ }
32
+ else {
33
+ throw RubyArgError.$new('odd number of arguments for Hash');
20
34
  }
21
35
 
22
36
  return hash;
@@ -27,14 +41,18 @@ class Hash
27
41
  `$opal.hash.apply(null, objs)`
28
42
  end
29
43
 
44
+ def self.allocate
45
+ `Opal.hash()`
46
+ end
47
+
30
48
  def self.new(defaults = undefined, &block)
31
49
  %x{
32
- var hash = $opal.hash();
50
+ var hash = Opal.hash();
33
51
 
34
- if (defaults !== undefined) {
52
+ if (defaults != undefined) {
35
53
  hash.none = defaults;
36
54
  }
37
- else if (block !== nil) {
55
+ else if (block != null) {
38
56
  hash.proc = block;
39
57
  }
40
58
 
@@ -74,10 +92,9 @@ class Hash
74
92
 
75
93
  def [](key)
76
94
  %x{
77
- var hash = #{key.hash},
78
- bucket;
95
+ var bucket;
79
96
 
80
- if (bucket = this.map[hash]) {
97
+ if (bucket = this.map[key]) {
81
98
  return bucket[1];
82
99
  }
83
100
 
@@ -87,8 +104,7 @@ class Hash
87
104
 
88
105
  def []=(key, value)
89
106
  %x{
90
- var hash = #{key.hash};
91
- this.map[hash] = [key, value];
107
+ this.map[key] = [key, value];
92
108
 
93
109
  return value;
94
110
  }
@@ -118,7 +134,7 @@ class Hash
118
134
 
119
135
  def clone
120
136
  %x{
121
- var result = $opal.hash(),
137
+ var result = Opal.hash(),
122
138
  map = this.map,
123
139
  map2 = result.map;
124
140
 
@@ -148,14 +164,12 @@ class Hash
148
164
 
149
165
  def delete(key)
150
166
  %x{
151
- var map = this.map,
152
- hash = #{key.hash},
153
- result;
167
+ var map = this.map, result;
154
168
 
155
- if (result = map[hash]) {
169
+ if (result = map[key]) {
156
170
  result = bucket[1];
157
171
 
158
- delete map[hash];
172
+ delete map[key];
159
173
  }
160
174
 
161
175
  return result;
@@ -172,11 +186,11 @@ class Hash
172
186
  var bucket = map[assoc],
173
187
  value;
174
188
 
175
- if ((value = $yield.call($context, bucket[0], bucket[1])) === $breaker) {
189
+ if ((value = block.call($context, null, bucket[0], bucket[1])) === $breaker) {
176
190
  return $breaker.$v;
177
191
  }
178
192
 
179
- if (value !== false && value !== nil) {
193
+ if (value !== false && value !== null) {
180
194
  delete map[assoc];
181
195
  }
182
196
  }
@@ -194,7 +208,7 @@ class Hash
194
208
  for (var assoc in map) {
195
209
  var bucket = map[assoc];
196
210
 
197
- if ($yield.call($context, bucket[0], bucket[1]) === $breaker) {
211
+ if (block.call($context, null, bucket[0], bucket[1]) === $breaker) {
198
212
  return $breaker.$v;
199
213
  }
200
214
  }
@@ -212,7 +226,7 @@ class Hash
212
226
  for (var assoc in map) {
213
227
  var bucket = map[assoc];
214
228
 
215
- if ($yield.call($context, bucket[0]) === $breaker) {
229
+ if (block.call($context, null, bucket[0]) === $breaker) {
216
230
  return $breaker.$v;
217
231
  }
218
232
  }
@@ -232,7 +246,7 @@ class Hash
232
246
  for (var assoc in map) {
233
247
  var bucket = map[assoc];
234
248
 
235
- if ($yield.call($context, bucket[1]) === $breaker) {
249
+ if (block.call($context, null, bucket[1]) === $breaker) {
236
250
  return $breaker.$v;
237
251
  }
238
252
  }
@@ -255,12 +269,12 @@ class Hash
255
269
 
256
270
  def fetch(key, defaults = undefined, &block)
257
271
  %x{
258
- var bucket = this.map[#{key.hash}];
272
+ var bucket = this.map[key];
259
273
 
260
- if (block !== nil) {
274
+ if (block !== null) {
261
275
  var value;
262
276
 
263
- if ((value = $yield.call($context, key)) === $breaker) {
277
+ if ((value = block.call($context, null, key)) === $breaker) {
264
278
  return $breaker.$v;
265
279
  }
266
280
 
@@ -271,7 +285,7 @@ class Hash
271
285
  return defaults;
272
286
  }
273
287
 
274
- raise(RubyKeyError, 'key not found');
288
+ throw RubyKeyError.$new('key not found');
275
289
  }
276
290
  end
277
291
 
@@ -287,7 +301,7 @@ class Hash
287
301
 
288
302
  result.push(key);
289
303
 
290
- if (value.$flags & T_ARRAY) {
304
+ if (value._flags & T_ARRAY) {
291
305
  if (level === undefined || level === 1) {
292
306
  result.push(value);
293
307
  }
@@ -305,7 +319,7 @@ class Hash
305
319
  end
306
320
 
307
321
  def has_key?(key)
308
- `!!this.map[#{key.hash}]`
322
+ `!!this.map[key]`
309
323
  end
310
324
 
311
325
  def has_value?(value)
@@ -321,7 +335,7 @@ class Hash
321
335
  end
322
336
 
323
337
  def hash
324
- `this.$id`
338
+ `this._id`
325
339
  end
326
340
 
327
341
  def inspect
@@ -347,7 +361,7 @@ class Hash
347
361
  for (var assoc in map) {
348
362
  var bucket = map[assoc];
349
363
 
350
- map2[#{`bucket[1]`.hash}] = [bucket[0], bucket[1]];
364
+ map2[bucket[1]] = [bucket[0], bucket[1]];
351
365
  }
352
366
 
353
367
  return result;
@@ -364,7 +378,7 @@ class Hash
364
378
  }
365
379
  }
366
380
 
367
- return nil;
381
+ return null;
368
382
  }
369
383
  end
370
384
 
@@ -396,9 +410,9 @@ class Hash
396
410
 
397
411
  alias member? has_key?
398
412
 
399
- def merge(other)
413
+ def merge(other, &block)
400
414
  %x{
401
- var result = $opal.hash(),
415
+ var result = Opal.hash(),
402
416
  map = this.map,
403
417
  map2 = result.map;
404
418
 
@@ -410,25 +424,51 @@ class Hash
410
424
 
411
425
  map = other.map;
412
426
 
413
- for (var assoc in map) {
414
- var bucket = map[assoc];
427
+ if (block === null) {
428
+ for (var assoc in map) {
429
+ var bucket = map[assoc];
415
430
 
416
- map2[assoc] = [bucket[0], bucket[1]];
431
+ map2[assoc] = [bucket[0], bucket[1]];
432
+ }
433
+ }
434
+ else {
435
+ for (var assoc in map) {
436
+ var bucket = map[assoc], key = bucket[0], val = bucket[1];
437
+
438
+ if (map2.hasOwnProperty(assoc)) {
439
+ val = block.call(__context, key, map2[assoc][1], val);
440
+ }
441
+
442
+ map2[assoc] = [key, val];
443
+ }
417
444
  }
418
445
 
419
446
  return result;
420
447
  }
421
448
  end
422
449
 
423
- def merge!(other)
450
+ def merge!(other, &block)
424
451
  %x{
425
452
  var map = this.map,
426
453
  map2 = other.map;
427
454
 
428
- for (var assoc in map2) {
429
- var bucket = map2[assoc];
455
+ if (block === null) {
456
+ for (var assoc in map2) {
457
+ var bucket = map2[assoc];
430
458
 
431
- map[assoc] = [bucket[0], bucket[1]];
459
+ map[assoc] = [bucket[0], bucket[1]];
460
+ }
461
+ }
462
+ else {
463
+ for (var assoc in map2) {
464
+ var bucket = map2[assoc], key = bucket[0], val = bucket[1];
465
+
466
+ if (map.hasOwnProperty(assoc)) {
467
+ val = block.call($context, null, key, map[assoc][1], val);
468
+ }
469
+
470
+ map[assoc] = [key, val];
471
+ }
432
472
  }
433
473
 
434
474
  return this;
@@ -447,7 +487,7 @@ class Hash
447
487
  }
448
488
  }
449
489
 
450
- return nil;
490
+ return null;
451
491
  }
452
492
  end
453
493
 
data/core/kernel.rb CHANGED
@@ -31,8 +31,8 @@ module Kernel
31
31
 
32
32
  def at_exit(&block)
33
33
  %x{
34
- if (block === nil) {
35
- raise(RubyArgError, 'called without a block');
34
+ if (block === null) {
35
+ throw RubyArgError.$new('called without a block');
36
36
  }
37
37
 
38
38
  end_procs.push(block);
@@ -42,16 +42,16 @@ module Kernel
42
42
  end
43
43
 
44
44
  def class
45
- `class_real(this.$klass)`
45
+ `class_real(this._klass)`
46
46
  end
47
47
 
48
- def define_singleton_method(&body)
48
+ def define_singleton_method(name, &body)
49
49
  %x{
50
- if (body === nil) {
51
- raise(RubyLocalJumpError, 'no block given');
50
+ if (body === null) {
51
+ throw RubyLocalJumpError.$new('no block given');
52
52
  }
53
53
 
54
- $opal.ds(this, name, body);
54
+ opal.defs(this, mid_to_jsid(name), body);
55
55
 
56
56
  return this;
57
57
  }
@@ -71,8 +71,12 @@ module Kernel
71
71
  }
72
72
  end
73
73
 
74
+ def format(string, *arguments)
75
+ raise NotImplementedError
76
+ end
77
+
74
78
  def hash
75
- `this.$id`
79
+ `this._id`
76
80
  end
77
81
 
78
82
  def inspect
@@ -80,7 +84,7 @@ module Kernel
80
84
  end
81
85
 
82
86
  def instance_of?(klass)
83
- `this.$klass === klass`
87
+ `this._klass === klass`
84
88
  end
85
89
 
86
90
  def instance_variable_defined?(name)
@@ -91,7 +95,7 @@ module Kernel
91
95
  %x{
92
96
  var ivar = this[name.substr(1)];
93
97
 
94
- return ivar == undefined ? nil : ivar;
98
+ return ivar == undefined ? null : ivar;
95
99
  }
96
100
  end
97
101
 
@@ -113,14 +117,14 @@ module Kernel
113
117
 
114
118
  def is_a?(klass)
115
119
  %x{
116
- var search = this.$klass;
120
+ var search = this._klass;
117
121
 
118
122
  while (search) {
119
123
  if (search === klass) {
120
124
  return true;
121
125
  }
122
126
 
123
- search = search.$s;
127
+ search = search._super;
124
128
  }
125
129
 
126
130
  return false;
@@ -138,7 +142,7 @@ module Kernel
138
142
 
139
143
  %x{
140
144
  while (true) {
141
- if ($yield.call($context) === breaker) {
145
+ if (block.call(__context) === breaker) {
142
146
  return breaker.$v;
143
147
  }
144
148
  }
@@ -152,14 +156,15 @@ module Kernel
152
156
  end
153
157
 
154
158
  def object_id
155
- `this.$id || (this.$id = unique_id++)`
159
+ `this._id || (this._id = unique_id++)`
156
160
  end
157
161
 
158
162
  def print(*strs)
159
- $stdout.print *strs
163
+ puts *strs
160
164
  end
161
165
 
162
166
  def private(*)
167
+ # does nothing. here for documenting code
163
168
  end
164
169
 
165
170
  def proc(&block)
@@ -167,15 +172,24 @@ module Kernel
167
172
  end
168
173
 
169
174
  def protected(*)
175
+ # does nothing. here for documenting code
170
176
  end
171
177
 
172
178
  def public(*)
179
+ # does nothing. here for documenting code
173
180
  end
174
181
 
175
182
  def puts(*strs)
176
- $stdout.puts *strs
183
+ %x{
184
+ for (var i = 0; i < strs.length; i++) {
185
+ var obj = strs[i];
186
+ console.log(obj == null ? "nil" : obj.$to_s());
187
+ }
188
+ }
177
189
  end
178
190
 
191
+ alias sprintf format
192
+
179
193
  def raise(exception, string = undefined)
180
194
  %x{
181
195
  if (typeof(exception) === 'string') {
@@ -194,42 +208,44 @@ module Kernel
194
208
  end
195
209
 
196
210
  def require(path)
211
+ `require_handler(path);`
212
+ end
213
+
214
+ def respond_to?(name)
215
+ `!!this[mid_to_jsid(name)]`
216
+ end
217
+
218
+ def singleton_class
197
219
  %x{
198
- var resolved = find_lib(path);
220
+ var obj = this, klass;
199
221
 
200
- if (!resolved) {
201
- raise(RubyLoadError, 'no such file to load -- ' + path);
222
+ if (obj._flags & T_OBJECT) {
223
+ if ((obj._flags & T_NUMBER) || (obj._flags & T_STRING)) {
224
+ throw RubyTypeError.$new("can't define singleton");
225
+ }
202
226
  }
203
227
 
204
- if (LOADER_CACHE[resolved]) {
205
- return false;
228
+ if ((obj._klass._flags & FL_SINGLETON) && obj._klass.__attached__ == obj) {
229
+ klass = obj._klass;
206
230
  }
231
+ else {
232
+ var class_id = obj._klass._name;
207
233
 
208
- LOADER_CACHE[resolved] = true;
209
- FEATURES.push(resolved);
210
- $opal.FILE = resolved;
211
- FACTORIES[resolved]();
234
+ klass = make_metaclass(obj, obj._klass);
235
+ }
212
236
 
213
- return true;
237
+ return klass;
214
238
  }
215
239
  end
216
240
 
217
- def respond_to?(name)
218
- `!!this[mid_to_jsid(name)]`
219
- end
220
-
221
- def singleton_class
222
- `singleton_class(this)`
223
- end
224
-
225
241
  def tap(&block)
226
242
  %x{
227
- if (block === nil) {
228
- raise(RubyLocalJumpError, 'no block given');
243
+ if (block === null) {
244
+ throw RubyLocalJumpError.$new('no block given');
229
245
  }
230
246
 
231
- if ($yield.call($context, this) === breaker) {
232
- return breaker.$v;
247
+ if (block.call(__context, this) === __breaker) {
248
+ return __breaker.$v;
233
249
  }
234
250
 
235
251
  return this;
@@ -237,6 +253,6 @@ module Kernel
237
253
  end
238
254
 
239
255
  def to_s
240
- `return "#<" + class_real(this.$klass).$name + ":0x" + (this.$id * 400487).toString(16) + ">";`
256
+ `return "#<" + class_real(this._klass)._name + ":0x" + (this._id * 400487).toString(16) + ">";`
241
257
  end
242
258
  end