opal 1.3.2 → 1.4.0.alpha1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (222) hide show
  1. checksums.yaml +4 -4
  2. data/.eslintrc.js +1 -0
  3. data/.github/workflows/build.yml +0 -3
  4. data/.rubocop.yml +5 -1
  5. data/UNRELEASED.md +66 -2
  6. data/benchmark-ips/bm_truthy.rb +30 -0
  7. data/bin/opal-mspec +1 -3
  8. data/bin/opal-repl +1 -2
  9. data/bin/remove-filters +1 -4
  10. data/docs/compiled_ruby.md +10 -6
  11. data/exe/opal-repl +1 -3
  12. data/lib/opal/ast/builder.rb +1 -1
  13. data/lib/opal/cli.rb +2 -2
  14. data/lib/opal/cli_runners/nodejs.rb +9 -2
  15. data/lib/opal/cli_runners/source-map-support-browser.js +80 -216
  16. data/lib/opal/cli_runners/source-map-support-node.js +80 -216
  17. data/lib/opal/cli_runners/source-map-support.js +5 -1
  18. data/lib/opal/cli_runners/system_runner.rb +10 -4
  19. data/lib/opal/compiler.rb +3 -5
  20. data/lib/opal/fragment.rb +5 -1
  21. data/lib/opal/nodes/args/extract_block_arg.rb +1 -8
  22. data/lib/opal/nodes/args/extract_kwoptarg.rb +1 -3
  23. data/lib/opal/nodes/args/extract_optarg.rb +1 -3
  24. data/lib/opal/nodes/args/extract_post_arg.rb +2 -5
  25. data/lib/opal/nodes/args/extract_post_optarg.rb +2 -7
  26. data/lib/opal/nodes/args/initialize_iterarg.rb +1 -3
  27. data/lib/opal/nodes/args/prepare_post_args.rb +5 -1
  28. data/lib/opal/nodes/base.rb +3 -2
  29. data/lib/opal/nodes/call.rb +20 -9
  30. data/lib/opal/nodes/call_special.rb +50 -0
  31. data/lib/opal/nodes/class.rb +24 -15
  32. data/lib/opal/nodes/constants.rb +23 -5
  33. data/lib/opal/nodes/def.rb +20 -23
  34. data/lib/opal/nodes/defined.rb +5 -5
  35. data/lib/opal/nodes/definitions.rb +2 -2
  36. data/lib/opal/nodes/defs.rb +2 -5
  37. data/lib/opal/nodes/helpers.rb +48 -18
  38. data/lib/opal/nodes/if.rb +109 -8
  39. data/lib/opal/nodes/iter.rb +23 -16
  40. data/lib/opal/nodes/literal.rb +18 -4
  41. data/lib/opal/nodes/logic.rb +2 -1
  42. data/lib/opal/nodes/masgn.rb +4 -9
  43. data/lib/opal/nodes/module.rb +29 -19
  44. data/lib/opal/nodes/node_with_args.rb +1 -7
  45. data/lib/opal/nodes/scope.rb +54 -15
  46. data/lib/opal/nodes/singleton_class.rb +5 -3
  47. data/lib/opal/nodes/super.rb +3 -3
  48. data/lib/opal/nodes/top.rb +34 -31
  49. data/lib/opal/nodes/variables.rb +2 -2
  50. data/lib/opal/nodes/x_string.rb +3 -0
  51. data/lib/opal/nodes.rb +0 -1
  52. data/lib/opal/parser/patch.rb +75 -0
  53. data/lib/opal/parser/with_ruby_lexer.rb +1 -1
  54. data/lib/opal/regexp_anchors.rb +7 -7
  55. data/lib/opal/requires.rb +19 -0
  56. data/lib/opal/rewriters/pattern_matching.rb +1 -1
  57. data/lib/opal/rewriters/returnable_logic.rb +102 -4
  58. data/lib/opal/util.rb +2 -2
  59. data/lib/opal/version.rb +1 -1
  60. data/lib/opal.rb +1 -17
  61. data/opal/corelib/array/pack.rb +11 -11
  62. data/opal/corelib/array.rb +193 -152
  63. data/opal/corelib/basic_object.rb +14 -14
  64. data/opal/corelib/binding.rb +7 -7
  65. data/opal/corelib/boolean.rb +12 -15
  66. data/opal/corelib/class.rb +23 -1
  67. data/opal/corelib/comparable.rb +8 -8
  68. data/opal/corelib/complex/base.rb +2 -2
  69. data/opal/corelib/complex.rb +79 -88
  70. data/opal/corelib/constants.rb +9 -9
  71. data/opal/corelib/dir.rb +4 -3
  72. data/opal/corelib/enumerable.rb +140 -127
  73. data/opal/corelib/enumerator/arithmetic_sequence.rb +177 -0
  74. data/opal/corelib/enumerator/chain.rb +42 -0
  75. data/opal/corelib/enumerator/generator.rb +35 -0
  76. data/opal/corelib/enumerator/lazy.rb +243 -0
  77. data/opal/corelib/enumerator/yielder.rb +36 -0
  78. data/opal/corelib/enumerator.rb +45 -300
  79. data/opal/corelib/error/errno.rb +47 -0
  80. data/opal/corelib/error.rb +62 -60
  81. data/opal/corelib/file.rb +26 -12
  82. data/opal/corelib/hash.rb +98 -107
  83. data/opal/corelib/helpers.rb +62 -13
  84. data/opal/corelib/io.rb +47 -34
  85. data/opal/corelib/kernel/format.rb +29 -29
  86. data/opal/corelib/kernel.rb +86 -83
  87. data/opal/corelib/main.rb +14 -12
  88. data/opal/corelib/marshal/read_buffer.rb +15 -15
  89. data/opal/corelib/marshal/write_buffer.rb +45 -44
  90. data/opal/corelib/marshal.rb +3 -3
  91. data/opal/corelib/math.rb +50 -50
  92. data/opal/corelib/method.rb +12 -8
  93. data/opal/corelib/module.rb +96 -79
  94. data/opal/corelib/nil.rb +9 -11
  95. data/opal/corelib/number.rb +113 -118
  96. data/opal/corelib/numeric.rb +37 -33
  97. data/opal/corelib/object_space.rb +11 -10
  98. data/opal/corelib/pack_unpack/format_string_parser.rb +3 -3
  99. data/opal/corelib/pattern_matching/base.rb +7 -7
  100. data/opal/corelib/pattern_matching.rb +1 -1
  101. data/opal/corelib/proc.rb +15 -16
  102. data/opal/corelib/process/base.rb +2 -2
  103. data/opal/corelib/process/status.rb +21 -0
  104. data/opal/corelib/process.rb +5 -5
  105. data/opal/corelib/random/formatter.rb +11 -11
  106. data/opal/corelib/random/math_random.js.rb +1 -1
  107. data/opal/corelib/random/mersenne_twister.rb +3 -3
  108. data/opal/corelib/random/seedrandom.js.rb +3 -3
  109. data/opal/corelib/random.rb +17 -17
  110. data/opal/corelib/range.rb +51 -35
  111. data/opal/corelib/rational/base.rb +4 -4
  112. data/opal/corelib/rational.rb +61 -62
  113. data/opal/corelib/regexp.rb +47 -38
  114. data/opal/corelib/runtime.js +245 -139
  115. data/opal/corelib/string/encoding.rb +21 -21
  116. data/opal/corelib/string/unpack.rb +19 -14
  117. data/opal/corelib/string.rb +135 -128
  118. data/opal/corelib/struct.rb +59 -46
  119. data/opal/corelib/time.rb +47 -57
  120. data/opal/corelib/trace_point.rb +2 -2
  121. data/opal/corelib/unsupported.rb +31 -120
  122. data/opal/corelib/variables.rb +3 -3
  123. data/opal/opal/base.rb +9 -8
  124. data/opal/opal/full.rb +8 -8
  125. data/opal/opal/mini.rb +17 -17
  126. data/opal/opal.rb +17 -18
  127. data/opal.gemspec +1 -1
  128. data/spec/filters/bugs/array.rb +4 -24
  129. data/spec/filters/bugs/bigdecimal.rb +0 -23
  130. data/spec/filters/bugs/binding.rb +0 -1
  131. data/spec/filters/bugs/boolean.rb +3 -0
  132. data/spec/filters/bugs/class.rb +2 -0
  133. data/spec/filters/bugs/date.rb +0 -5
  134. data/spec/filters/bugs/encoding.rb +8 -50
  135. data/spec/filters/bugs/enumerable.rb +4 -1
  136. data/spec/filters/bugs/enumerator.rb +3 -36
  137. data/spec/filters/bugs/exception.rb +0 -2
  138. data/spec/filters/bugs/file.rb +0 -2
  139. data/spec/filters/bugs/float.rb +0 -3
  140. data/spec/filters/bugs/hash.rb +5 -3
  141. data/spec/filters/bugs/integer.rb +2 -3
  142. data/spec/filters/bugs/kernel.rb +2 -31
  143. data/spec/filters/bugs/language.rb +29 -49
  144. data/spec/filters/bugs/main.rb +0 -2
  145. data/spec/filters/bugs/marshal.rb +2 -3
  146. data/spec/filters/bugs/matrix.rb +0 -36
  147. data/spec/filters/bugs/module.rb +7 -61
  148. data/spec/filters/bugs/numeric.rb +0 -7
  149. data/spec/filters/bugs/objectspace.rb +1 -1
  150. data/spec/filters/bugs/pack_unpack.rb +0 -4
  151. data/spec/filters/bugs/proc.rb +0 -9
  152. data/spec/filters/bugs/random.rb +0 -5
  153. data/spec/filters/bugs/range.rb +1 -6
  154. data/spec/filters/bugs/regexp.rb +0 -3
  155. data/spec/filters/bugs/set.rb +8 -1
  156. data/spec/filters/bugs/string.rb +9 -34
  157. data/spec/filters/bugs/stringscanner.rb +8 -7
  158. data/spec/filters/bugs/struct.rb +2 -3
  159. data/spec/filters/bugs/symbol.rb +0 -1
  160. data/spec/filters/bugs/time.rb +0 -8
  161. data/spec/filters/bugs/unboundmethod.rb +0 -8
  162. data/spec/filters/bugs/warnings.rb +1 -7
  163. data/spec/filters/unsupported/freeze.rb +24 -0
  164. data/spec/filters/unsupported/integer.rb +1 -0
  165. data/spec/filters/unsupported/kernel.rb +12 -0
  166. data/spec/filters/unsupported/privacy.rb +3 -0
  167. data/spec/filters/unsupported/string.rb +2 -0
  168. data/spec/lib/builder_spec.rb +2 -2
  169. data/spec/lib/cli_spec.rb +1 -1
  170. data/spec/lib/compiler_spec.rb +37 -37
  171. data/spec/lib/simple_server_spec.rb +2 -2
  172. data/spec/lib/source_map/file_spec.rb +1 -1
  173. data/spec/opal/compiler/irb_spec.rb +2 -2
  174. data/spec/opal/core/kernel/puts_spec.rb +90 -0
  175. data/spec/opal/core/language/super_spec.rb +24 -0
  176. data/spec/ruby_specs +4 -2
  177. data/spec/support/rewriters_helper.rb +1 -1
  178. data/stdlib/bigdecimal.rb +7 -11
  179. data/stdlib/buffer/view.rb +2 -2
  180. data/stdlib/buffer.rb +2 -2
  181. data/stdlib/date.rb +5 -6
  182. data/stdlib/erb.rb +1 -0
  183. data/stdlib/js.rb +2 -1
  184. data/stdlib/native.rb +7 -8
  185. data/stdlib/nodejs/argf.rb +4 -4
  186. data/stdlib/nodejs/base.rb +29 -0
  187. data/stdlib/nodejs/dir.rb +1 -1
  188. data/stdlib/nodejs/env.rb +6 -9
  189. data/stdlib/nodejs/file.rb +23 -17
  190. data/stdlib/nodejs/fileutils.rb +3 -3
  191. data/stdlib/nodejs/io.rb +2 -20
  192. data/stdlib/nodejs/irb.rb +0 -0
  193. data/stdlib/nodejs/kernel.rb +2 -37
  194. data/stdlib/nodejs.rb +1 -3
  195. data/stdlib/opal/miniracer.rb +2 -0
  196. data/stdlib/opal/platform.rb +6 -13
  197. data/stdlib/opal/replutils.rb +16 -5
  198. data/stdlib/opal-parser.rb +2 -2
  199. data/stdlib/optparse/ac.rb +54 -0
  200. data/stdlib/optparse/date.rb +14 -0
  201. data/stdlib/optparse/kwargs.rb +22 -0
  202. data/stdlib/optparse/shellwords.rb +7 -0
  203. data/stdlib/optparse/time.rb +15 -0
  204. data/stdlib/optparse/uri.rb +7 -0
  205. data/stdlib/optparse/version.rb +69 -0
  206. data/stdlib/optparse.rb +2279 -0
  207. data/stdlib/pathname.rb +5 -6
  208. data/stdlib/pp.rb +18 -2
  209. data/stdlib/promise/v2.rb +18 -22
  210. data/stdlib/promise.rb +15 -21
  211. data/stdlib/set.rb +32 -32
  212. data/stdlib/shellwords.rb +240 -0
  213. data/stdlib/stringio.rb +3 -6
  214. data/stdlib/strscan.rb +5 -8
  215. data/stdlib/template.rb +2 -2
  216. data/stdlib/thread.rb +7 -9
  217. data/tasks/performance.rake +5 -2
  218. data/tasks/testing/mspec_special_calls.rb +0 -12
  219. data/tasks/testing.rake +55 -37
  220. data/test/nodejs/test_file.rb +11 -0
  221. metadata +55 -10
  222. data/lib/opal/nodes/case.rb +0 -114
@@ -1,6 +1,6 @@
1
- # helpers: truthy, coerce_to
1
+ # helpers: truthy, coerce_to, const_set, Object
2
2
 
3
- class Module
3
+ class ::Module
4
4
  def self.allocate
5
5
  %x{
6
6
  var module = Opal.allocate_module(nil, function(){});
@@ -21,8 +21,8 @@ class Module
21
21
  end
22
22
 
23
23
  def <(other)
24
- unless Module === other
25
- raise TypeError, 'compared with non class/module'
24
+ unless ::Module === other
25
+ ::Kernel.raise ::TypeError, 'compared with non class/module'
26
26
  end
27
27
 
28
28
  # class cannot be a descendant of itself
@@ -56,8 +56,8 @@ class Module
56
56
  end
57
57
 
58
58
  def >(other)
59
- unless Module === other
60
- raise TypeError, 'compared with non class/module'
59
+ unless ::Module === other
60
+ ::Kernel.raise ::TypeError, 'compared with non class/module'
61
61
  end
62
62
 
63
63
  other < self
@@ -74,7 +74,7 @@ class Module
74
74
  }
75
75
  }
76
76
 
77
- unless Module === other
77
+ unless ::Module === other
78
78
  return nil
79
79
  end
80
80
 
@@ -84,8 +84,8 @@ class Module
84
84
  end
85
85
 
86
86
  def alias_method(newname, oldname)
87
- newname = `$coerce_to(newname, #{String}, 'to_str')`
88
- oldname = `$coerce_to(oldname, #{String}, 'to_str')`
87
+ newname = `$coerce_to(newname, #{::String}, 'to_str')`
88
+ oldname = `$coerce_to(oldname, #{::String}, 'to_str')`
89
89
  `Opal.alias(self, newname, oldname)`
90
90
 
91
91
  self
@@ -147,7 +147,7 @@ class Module
147
147
  })(ivar);
148
148
 
149
149
  // initialize the instance variable as nil
150
- Opal.defineProperty(proto, ivar, nil);
150
+ Opal.prop(proto, ivar, nil);
151
151
 
152
152
  body.$$parameters = [];
153
153
  body.$$arity = 0;
@@ -180,7 +180,7 @@ class Module
180
180
  body.$$arity = 1;
181
181
 
182
182
  // initialize the instance variable as nil
183
- Opal.defineProperty(proto, ivar, nil);
183
+ Opal.prop(proto, ivar, nil);
184
184
 
185
185
  Opal.defn(self, id, body);
186
186
  }
@@ -192,11 +192,11 @@ class Module
192
192
  def autoload(const, path)
193
193
  %x{
194
194
  if (!#{Opal.const_name?(const)}) {
195
- #{raise NameError, "autoload must be constant name: #{const}"}
195
+ #{::Kernel.raise ::NameError, "autoload must be constant name: #{const}"}
196
196
  }
197
197
 
198
198
  if (path == "") {
199
- #{raise ArgumentError, 'empty file name'}
199
+ #{::Kernel.raise ::ArgumentError, 'empty file name'}
200
200
  }
201
201
 
202
202
  if (!self.$$const.hasOwnProperty(#{const})) {
@@ -232,25 +232,25 @@ class Module
232
232
  end
233
233
 
234
234
  def class_variable_get(name)
235
- name = Opal.class_variable_name!(name)
235
+ name = ::Opal.class_variable_name!(name)
236
236
 
237
237
  `Opal.class_variable_get(self, name, false)`
238
238
  end
239
239
 
240
240
  def class_variable_set(name, value)
241
- name = Opal.class_variable_name!(name)
241
+ name = ::Opal.class_variable_name!(name)
242
242
 
243
243
  `Opal.class_variable_set(self, name, value)`
244
244
  end
245
245
 
246
246
  def class_variable_defined?(name)
247
- name = Opal.class_variable_name!(name)
247
+ name = ::Opal.class_variable_name!(name)
248
248
 
249
249
  `Opal.class_variables(self).hasOwnProperty(name)`
250
250
  end
251
251
 
252
252
  def remove_class_variable(name)
253
- name = Opal.class_variable_name!(name)
253
+ name = ::Opal.class_variable_name!(name)
254
254
 
255
255
  %x{
256
256
  if (Opal.hasOwnProperty.call(self.$$cvars, name)) {
@@ -258,7 +258,7 @@ class Module
258
258
  delete self.$$cvars[name];
259
259
  return value;
260
260
  } else {
261
- #{raise NameError, "cannot remove #{name} for #{self}"}
261
+ #{::Kernel.raise ::NameError, "cannot remove #{name} for #{self}"}
262
262
  }
263
263
  }
264
264
  end
@@ -270,7 +270,7 @@ class Module
270
270
  def self.constants(inherit = undefined)
271
271
  %x{
272
272
  if (inherit == null) {
273
- var nesting = (self.$$nesting || []).concat(Opal.Object),
273
+ var nesting = (self.$$nesting || []).concat($Object),
274
274
  constant, constants = {},
275
275
  i, ii;
276
276
 
@@ -295,7 +295,7 @@ class Module
295
295
  def const_defined?(name, inherit = true)
296
296
  name = Opal.const_name!(name)
297
297
 
298
- raise NameError.new("wrong constant name #{name}", name) unless name =~ Opal::CONST_NAME_REGEXP
298
+ ::Kernel.raise ::NameError.new("wrong constant name #{name}", name) unless name =~ ::Opal::CONST_NAME_REGEXP
299
299
 
300
300
  %x{
301
301
  var module, modules = [self], module_constants, i, ii;
@@ -306,7 +306,7 @@ class Module
306
306
 
307
307
  // Add Object's ancestors if it's a module – modules have no ancestors otherwise
308
308
  if (self.$$is_module) {
309
- modules = modules.concat([Opal.Object]).concat(Opal.ancestors(Opal.Object));
309
+ modules = modules.concat([$Object]).concat(Opal.ancestors($Object));
310
310
  }
311
311
  }
312
312
 
@@ -340,11 +340,11 @@ class Module
340
340
  return name.split('::').inject(self) { |o, c| o.const_get(c) }
341
341
  end
342
342
 
343
- raise NameError.new("wrong constant name #{name}", name) unless name =~ Opal::CONST_NAME_REGEXP
343
+ ::Kernel.raise ::NameError.new("wrong constant name #{name}", name) unless name =~ ::Opal::CONST_NAME_REGEXP
344
344
 
345
345
  %x{
346
346
  if (inherit) {
347
- return $$([self], name);
347
+ return Opal.$$([self], name);
348
348
  } else {
349
349
  return Opal.const_get_local(self, name);
350
350
  }
@@ -352,19 +352,19 @@ class Module
352
352
  end
353
353
 
354
354
  def const_missing(name)
355
- full_const_name = self == Object ? name : "#{self}::#{name}"
355
+ full_const_name = self == ::Object ? name : "#{self}::#{name}"
356
356
 
357
- raise NameError.new("uninitialized constant #{full_const_name}", name)
357
+ ::Kernel.raise ::NameError.new("uninitialized constant #{full_const_name}", name)
358
358
  end
359
359
 
360
360
  def const_set(name, value)
361
- name = Opal.const_name!(name)
361
+ name = ::Opal.const_name!(name)
362
362
 
363
- if name !~ Opal::CONST_NAME_REGEXP || name.start_with?('::')
364
- raise NameError.new("wrong constant name #{name}", name)
363
+ if name !~ ::Opal::CONST_NAME_REGEXP || name.start_with?('::')
364
+ ::Kernel.raise ::NameError.new("wrong constant name #{name}", name)
365
365
  end
366
366
 
367
- `Opal.const_set(self, name, value)`
367
+ `$const_set(self, name, value)`
368
368
 
369
369
  value
370
370
  end
@@ -373,38 +373,50 @@ class Module
373
373
  end
374
374
 
375
375
  def define_method(name, method = undefined, &block)
376
- if `method === undefined && block === nil`
377
- raise ArgumentError, 'tried to create a Proc object without a block'
378
- end
376
+ %x{
377
+ if (method === undefined && block === nil)
378
+ #{::Kernel.raise ::ArgumentError, 'tried to create a Proc object without a block'}
379
+ }
379
380
 
380
381
  block ||= case method
381
- when Proc
382
+ when ::Proc
382
383
  method
383
384
 
384
- when Method
385
+ when ::Method
385
386
  `#{method.to_proc}.$$unbound`
386
387
 
387
- when UnboundMethod
388
+ when ::UnboundMethod
388
389
  ->(*args) {
389
390
  bound = method.bind(self)
390
391
  bound.call(*args)
391
392
  }
392
393
 
393
394
  else
394
- raise TypeError, "wrong argument type #{block.class} (expected Proc/Method)"
395
+ ::Kernel.raise ::TypeError, "wrong argument type #{block.class} (expected Proc/Method)"
395
396
  end
396
397
 
397
398
  %x{
398
- var id = '$' + name;
399
+ // Wrapping and forwarding is required to make super work, as the
400
+ // same block can be used to define multiple methods.
401
+ var wrapper = function() {
402
+ block.$$jsid = name
403
+ block.$$p = wrapper.$$p
404
+ block.$$s = null;
405
+ block.$$def = wrapper;
406
+ block.$$define_meth = true;
399
407
 
400
- block.$$jsid = name;
401
- block.$$s = null;
402
- block.$$def = block;
403
- block.$$define_meth = true;
408
+ return block.apply(this, arguments)
409
+ }
404
410
 
405
- Opal.defn(self, id, block);
411
+ var id = '$' + name;
412
+ wrapper.$$jsid = name
413
+ wrapper.$$s = null;
414
+ wrapper.$$def = wrapper;
415
+ wrapper.$$define_meth = true;
406
416
 
407
- return name;
417
+ Object.assign(wrapper, block)
418
+
419
+ return Opal.defn(self, id, wrapper);
408
420
  }
409
421
  end
410
422
 
@@ -428,7 +440,7 @@ class Module
428
440
  var mod = mods[i];
429
441
 
430
442
  if (!mod.$$is_module) {
431
- #{raise TypeError, "wrong argument type #{`mod`.class} (expected Module)"};
443
+ #{::Kernel.raise ::TypeError, "wrong argument type #{`mod`.class} (expected Module)"};
432
444
  }
433
445
 
434
446
  #{`mod`.append_features self};
@@ -446,7 +458,7 @@ class Module
446
458
  def include?(mod)
447
459
  %x{
448
460
  if (!mod.$$is_module) {
449
- #{raise TypeError, "wrong argument type #{`mod`.class} (expected Module)"};
461
+ #{::Kernel.raise ::TypeError, "wrong argument type #{`mod`.class} (expected Module)"};
450
462
  }
451
463
 
452
464
  var i, ii, mod2, ancestors = Opal.ancestors(self);
@@ -467,10 +479,10 @@ class Module
467
479
  var meth = self.$$prototype['$' + name];
468
480
 
469
481
  if (!meth || meth.$$stub) {
470
- #{raise NameError.new("undefined method `#{name}' for class `#{self.name}'", name)};
482
+ #{::Kernel.raise ::NameError.new("undefined method `#{name}' for class `#{self.name}'", name)};
471
483
  }
472
484
 
473
- return #{UnboundMethod.new(self, `meth.$$owner || #{self}`, `meth`, name)};
485
+ return #{::UnboundMethod.new(self, `meth.$$owner || #{self}`, `meth`, name)};
474
486
  }
475
487
  end
476
488
 
@@ -504,22 +516,18 @@ class Module
504
516
 
505
517
  def module_eval(*args, &block)
506
518
  if block.nil? && `!!Opal.compile`
507
- Kernel.raise ArgumentError, 'wrong number of arguments (0 for 1..3)' unless (1..3).cover? args.size
519
+ ::Kernel.raise ::ArgumentError, 'wrong number of arguments (0 for 1..3)' unless (1..3).cover? args.size
508
520
 
509
521
  string, file, _lineno = *args
510
522
  default_eval_options = { file: (file || '(eval)'), eval: true }
511
523
  compiling_options = __OPAL_COMPILER_CONFIG__.merge(default_eval_options)
512
- compiled = Opal.compile string, compiling_options
513
- block = Kernel.proc do
514
- %x{
515
- return (function(self) {
516
- return eval(compiled);
517
- })(self)
518
- }
524
+ compiled = ::Opal.compile string, compiling_options
525
+ block = ::Kernel.proc do
526
+ %x{new Function("Opal,self", "return " + compiled)(Opal, self)}
519
527
  end
520
528
  elsif args.any?
521
- Kernel.raise ArgumentError, "wrong number of arguments (#{args.size} for 0)" \
522
- "\n\n NOTE:If you want to enable passing a String argument please add \"require 'opal-parser'\" to your script\n"
529
+ ::Kernel.raise ::ArgumentError, "wrong number of arguments (#{args.size} for 0)" \
530
+ "\n\n NOTE:If you want to enable passing a String argument please add \"require 'opal-parser'\" to your script\n"
523
531
  end
524
532
 
525
533
  %x{
@@ -534,12 +542,10 @@ class Module
534
542
  }
535
543
  end
536
544
 
537
- alias class_eval module_eval
538
-
539
545
  def module_exec(*args, &block)
540
546
  %x{
541
547
  if (block === nil) {
542
- #{raise LocalJumpError, 'no block given'}
548
+ #{::Kernel.raise ::LocalJumpError, 'no block given'}
543
549
  }
544
550
 
545
551
  var block_self = block.$$s, result;
@@ -552,8 +558,6 @@ class Module
552
558
  }
553
559
  end
554
560
 
555
- alias class_exec module_exec
556
-
557
561
  def method_defined?(method)
558
562
  %x{
559
563
  var body = self.$$prototype['$' + method];
@@ -565,6 +569,7 @@ class Module
565
569
  %x{
566
570
  if (methods.length === 0) {
567
571
  self.$$module_function = true;
572
+ return nil;
568
573
  }
569
574
  else {
570
575
  for (var i = 0, length = methods.length; i < length; i++) {
@@ -574,6 +579,7 @@ class Module
574
579
 
575
580
  Opal.defs(self, id, func);
576
581
  }
582
+ return methods.length === 1 ? methods[0] : methods;
577
583
  }
578
584
 
579
585
  return self;
@@ -596,7 +602,7 @@ class Module
596
602
 
597
603
  base = base.$$base_module;
598
604
 
599
- if (base === Opal.Object) {
605
+ if (base === $Object) {
600
606
  break;
601
607
  }
602
608
  }
@@ -612,14 +618,14 @@ class Module
612
618
  def prepend(*mods)
613
619
  %x{
614
620
  if (mods.length === 0) {
615
- #{raise ArgumentError, 'wrong number of arguments (given 0, expected 1+)'}
621
+ #{::Kernel.raise ::ArgumentError, 'wrong number of arguments (given 0, expected 1+)'}
616
622
  }
617
623
 
618
624
  for (var i = mods.length - 1; i >= 0; i--) {
619
625
  var mod = mods[i];
620
626
 
621
627
  if (!mod.$$is_module) {
622
- #{raise TypeError, "wrong argument type #{`mod`.class} (expected Module)"};
628
+ #{::Kernel.raise ::TypeError, "wrong argument type #{`mod`.class} (expected Module)"};
623
629
  }
624
630
 
625
631
  #{`mod`.prepend_features self};
@@ -633,7 +639,7 @@ class Module
633
639
  def prepend_features(prepender)
634
640
  %x{
635
641
  if (!self.$$is_module) {
636
- #{raise TypeError, "wrong argument type #{self.class} (expected Module)"};
642
+ #{::Kernel.raise ::TypeError, "wrong argument type #{self.class} (expected Module)"};
637
643
  }
638
644
 
639
645
  Opal.prepend_features(self, prepender)
@@ -652,8 +658,6 @@ class Module
652
658
  `Opal.Module.$name.call(self)` || "#<#{`self.$$is_module ? 'Module' : 'Class'`}:0x#{__id__.to_s(16)}>"
653
659
  end
654
660
 
655
- alias inspect to_s
656
-
657
661
  def undef_method(*names)
658
662
  %x{
659
663
  for (var i = 0, length = names.length; i < length; i++) {
@@ -699,34 +703,47 @@ class Module
699
703
  var name, other_constants = other.$$const;
700
704
 
701
705
  for (name in other_constants) {
702
- Opal.const_set(self, name, other_constants[name]);
706
+ $const_set(self, name, other_constants[name]);
703
707
  }
704
708
  }
705
709
  end
706
710
 
707
- def refine(mod, &block)
708
- s, m, mod_id = self, nil, nil
711
+ def refine(klass, &block)
712
+ refinement_module, m, klass_id = self, nil, nil
709
713
  %x{
710
- mod_id = Opal.id(mod);
714
+ klass_id = Opal.id(klass);
711
715
  if (typeof self.$$refine_modules === "undefined") {
712
716
  self.$$refine_modules = {};
713
717
  }
714
- if (typeof self.$$refine_modules[mod_id] === "undefined") {
715
- m = self.$$refine_modules[mod_id] = #{::Module.new};
718
+ if (typeof self.$$refine_modules[klass_id] === "undefined") {
719
+ m = self.$$refine_modules[klass_id] = #{::Refinement.new};
716
720
  }
717
721
  else {
718
- m = self.$$refine_modules[mod_id];
722
+ m = self.$$refine_modules[klass_id];
719
723
  }
724
+ m.refinement_module = refinement_module
725
+ m.refined_class = klass
720
726
  }
721
- m.define_singleton_method :inspect do
722
- "#<refinement:#{mod.inspect}@#{s.inspect}>"
723
- end
724
727
  m.class_exec(&block)
725
728
  m
726
729
  end
727
730
 
728
731
  # Compiler overrides this method
729
732
  def using(mod)
730
- raise 'Module#using is not permitted in methods'
733
+ ::Kernel.raise 'Module#using is not permitted in methods'
734
+ end
735
+
736
+ alias class_eval module_eval
737
+ alias class_exec module_exec
738
+ alias inspect to_s
739
+ end
740
+
741
+ class ::Refinement < ::Module
742
+ def inspect
743
+ if @refinement_module
744
+ "#<refinement:#{@refined_class.inspect}@#{@refinement_module.inspect}>"
745
+ else
746
+ super
747
+ end
731
748
  end
732
749
  end
data/opal/corelib/nil.rb CHANGED
@@ -1,9 +1,9 @@
1
- class NilClass
1
+ class ::NilClass
2
2
  `self.$$prototype.$$meta = #{self}`
3
3
 
4
4
  class << self
5
5
  def allocate
6
- raise TypeError, "allocator undefined for #{name}"
6
+ ::Kernel.raise ::TypeError, "allocator undefined for #{name}"
7
7
  end
8
8
 
9
9
  undef :new
@@ -46,7 +46,7 @@ class NilClass
46
46
  end
47
47
 
48
48
  def singleton_class
49
- NilClass
49
+ ::NilClass
50
50
  end
51
51
 
52
52
  def to_a
@@ -61,28 +61,26 @@ class NilClass
61
61
  0
62
62
  end
63
63
 
64
- alias to_f to_i
65
-
66
64
  def to_s
67
65
  ''
68
66
  end
69
67
 
70
68
  def to_c
71
- Complex.new(0, 0)
69
+ ::Complex.new(0, 0)
72
70
  end
73
71
 
74
72
  def rationalize(*args)
75
- raise ArgumentError if args.length > 1
76
- Rational(0, 1)
73
+ ::Kernel.raise ::ArgumentError if args.length > 1
74
+ ::Kernel.Rational(0, 1)
77
75
  end
78
76
 
79
77
  def to_r
80
- Rational(0, 1)
78
+ ::Kernel.Rational(0, 1)
81
79
  end
82
80
 
83
81
  def instance_variables
84
82
  []
85
83
  end
86
- end
87
84
 
88
- NIL = nil
85
+ alias to_f to_i
86
+ end