opal 1.7.4 → 1.8.0.alpha1

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 (211) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/build.yml +9 -9
  3. data/.rubocop/todo.yml +2 -2
  4. data/.rubocop.yml +17 -10
  5. data/.rubocop_todo.yml +311 -0
  6. data/CHANGELOG.md +1 -15
  7. data/UNRELEASED.md +78 -1
  8. data/benchmark-ips/bm_block_vs_yield.rb +3 -0
  9. data/benchmark-ips/bm_slice_or_not.rb +53 -0
  10. data/docs/bridging.md +112 -0
  11. data/docs/compiled_ruby.md +10 -10
  12. data/docs/getting_started.md +18 -22
  13. data/lib/opal/cli_runners/chrome.rb +1 -5
  14. data/lib/opal/cli_runners/chrome_cdp_interface.rb +1 -0
  15. data/lib/opal/cli_runners/firefox_cdp_interface.rb +1 -0
  16. data/lib/opal/compiler.rb +33 -1
  17. data/lib/opal/nodes/args/extract_kwoptarg.rb +2 -1
  18. data/lib/opal/nodes/call.rb +1 -1
  19. data/lib/opal/nodes/call_special.rb +71 -47
  20. data/lib/opal/nodes/hash.rb +14 -30
  21. data/lib/opal/nodes/if.rb +37 -29
  22. data/lib/opal/nodes/literal.rb +5 -1
  23. data/lib/opal/nodes/x_string.rb +13 -0
  24. data/lib/opal/parser/patch.rb +1 -0
  25. data/lib/opal/rewriters/for_rewriter.rb +36 -24
  26. data/lib/opal/simple_server.rb +2 -2
  27. data/lib/opal/source_map/file.rb +1 -1
  28. data/lib/opal/version.rb +1 -1
  29. data/opal/corelib/array/pack.rb +1 -0
  30. data/opal/corelib/array.rb +71 -43
  31. data/opal/corelib/basic_object.rb +1 -0
  32. data/opal/corelib/binding.rb +2 -0
  33. data/opal/corelib/boolean.rb +1 -0
  34. data/opal/corelib/class.rb +2 -0
  35. data/opal/corelib/comparable.rb +1 -0
  36. data/opal/corelib/complex.rb +2 -0
  37. data/opal/corelib/constants.rb +2 -2
  38. data/opal/corelib/dir.rb +2 -0
  39. data/opal/corelib/enumerable.rb +3 -2
  40. data/opal/corelib/enumerator/arithmetic_sequence.rb +2 -0
  41. data/opal/corelib/enumerator/chain.rb +1 -0
  42. data/opal/corelib/enumerator/generator.rb +1 -0
  43. data/opal/corelib/enumerator/lazy.rb +1 -0
  44. data/opal/corelib/enumerator/yielder.rb +2 -0
  45. data/opal/corelib/enumerator.rb +1 -0
  46. data/opal/corelib/error/errno.rb +2 -0
  47. data/opal/corelib/error.rb +12 -0
  48. data/opal/corelib/file.rb +1 -0
  49. data/opal/corelib/hash.rb +197 -504
  50. data/opal/corelib/helpers.rb +1 -0
  51. data/opal/corelib/io.rb +2 -0
  52. data/opal/corelib/irb.rb +2 -0
  53. data/opal/corelib/kernel/format.rb +1 -0
  54. data/opal/corelib/kernel.rb +70 -14
  55. data/opal/corelib/main.rb +2 -0
  56. data/opal/corelib/marshal/read_buffer.rb +2 -0
  57. data/opal/corelib/marshal/write_buffer.rb +2 -0
  58. data/opal/corelib/math/polyfills.rb +2 -0
  59. data/opal/corelib/math.rb +1 -0
  60. data/opal/corelib/method.rb +2 -0
  61. data/opal/corelib/module.rb +1 -0
  62. data/opal/corelib/nil.rb +3 -1
  63. data/opal/corelib/number.rb +2 -0
  64. data/opal/corelib/numeric.rb +2 -0
  65. data/opal/corelib/object_space.rb +1 -0
  66. data/opal/corelib/pack_unpack/format_string_parser.rb +2 -0
  67. data/opal/corelib/proc.rb +30 -28
  68. data/opal/corelib/process.rb +2 -0
  69. data/opal/corelib/random/formatter.rb +2 -0
  70. data/opal/corelib/random/math_random.js.rb +2 -0
  71. data/opal/corelib/random/mersenne_twister.rb +2 -0
  72. data/opal/corelib/random/seedrandom.js.rb +2 -0
  73. data/opal/corelib/random.rb +1 -0
  74. data/opal/corelib/range.rb +34 -12
  75. data/opal/corelib/rational.rb +2 -0
  76. data/opal/corelib/regexp.rb +1 -0
  77. data/opal/corelib/runtime.js +187 -231
  78. data/opal/corelib/set.rb +2 -0
  79. data/opal/corelib/string/encoding.rb +3 -0
  80. data/opal/corelib/string/unpack.rb +2 -0
  81. data/opal/corelib/string.rb +20 -12
  82. data/opal/corelib/struct.rb +3 -1
  83. data/opal/corelib/time.rb +1 -0
  84. data/opal/corelib/trace_point.rb +2 -0
  85. data/opal/corelib/unsupported.rb +2 -0
  86. data/opal/corelib/variables.rb +2 -0
  87. data/opal.gemspec +2 -2
  88. data/spec/filters/bugs/array.rb +0 -2
  89. data/spec/filters/bugs/enumerable.rb +0 -3
  90. data/spec/filters/bugs/hash.rb +0 -13
  91. data/spec/filters/bugs/kernel.rb +0 -38
  92. data/spec/filters/bugs/range.rb +0 -1
  93. data/spec/filters/bugs/ruby-32.rb +0 -2
  94. data/spec/filters/bugs/string.rb +0 -1
  95. data/spec/filters/bugs/struct.rb +1 -5
  96. data/spec/filters/unsupported/hash.rb +1 -0
  97. data/spec/lib/compiler_spec.rb +24 -17
  98. data/spec/mspec-opal/formatters.rb +2 -0
  99. data/spec/mspec-opal/runner.rb +2 -0
  100. data/spec/opal/core/array/dup_spec.rb +2 -0
  101. data/spec/opal/core/exception_spec.rb +2 -0
  102. data/spec/opal/core/hash/internals_spec.rb +154 -206
  103. data/spec/opal/core/hash_spec.rb +2 -0
  104. data/spec/opal/core/iterable_props_spec.rb +2 -0
  105. data/spec/opal/core/kernel/at_exit_spec.rb +2 -0
  106. data/spec/opal/core/kernel/respond_to_spec.rb +2 -0
  107. data/spec/opal/core/language/arguments/mlhs_arg_spec.rb +2 -0
  108. data/spec/opal/core/language/safe_navigator_spec.rb +2 -0
  109. data/spec/opal/core/language/xstring_send_spec.rb +15 -0
  110. data/spec/opal/core/language/xstring_spec.rb +2 -0
  111. data/spec/opal/core/language_spec.rb +2 -0
  112. data/spec/opal/core/module_spec.rb +44 -0
  113. data/spec/opal/core/number/to_i_spec.rb +2 -0
  114. data/spec/opal/core/object_id_spec.rb +2 -0
  115. data/spec/opal/core/regexp/match_spec.rb +2 -0
  116. data/spec/opal/core/runtime/bridged_classes_spec.rb +38 -0
  117. data/spec/opal/core/runtime/constants_spec.rb +2 -0
  118. data/spec/opal/core/runtime/eval_spec.rb +2 -0
  119. data/spec/opal/core/runtime/exit_spec.rb +2 -0
  120. data/spec/opal/core/runtime/is_a_spec.rb +2 -0
  121. data/spec/opal/core/runtime/loaded_spec.rb +2 -0
  122. data/spec/opal/core/runtime/method_missing_spec.rb +2 -0
  123. data/spec/opal/core/runtime/rescue_spec.rb +2 -0
  124. data/spec/opal/core/runtime/string_spec.rb +2 -0
  125. data/spec/opal/core/runtime/truthy_spec.rb +2 -0
  126. data/spec/opal/core/runtime_spec.rb +2 -6
  127. data/spec/opal/core/string/to_sym_spec.rb +2 -0
  128. data/spec/opal/stdlib/js_spec.rb +2 -0
  129. data/spec/opal/stdlib/native/alias_native_spec.rb +2 -0
  130. data/spec/opal/stdlib/native/array_spec.rb +2 -0
  131. data/spec/opal/stdlib/native/date_spec.rb +2 -0
  132. data/spec/opal/stdlib/native/each_spec.rb +2 -0
  133. data/spec/opal/stdlib/native/element_reference_spec.rb +2 -0
  134. data/spec/opal/stdlib/native/exposure_spec.rb +2 -0
  135. data/spec/opal/stdlib/native/ext_spec.rb +2 -0
  136. data/spec/opal/stdlib/native/hash_spec.rb +30 -2
  137. data/spec/opal/stdlib/native/initialize_spec.rb +2 -0
  138. data/spec/opal/stdlib/native/method_missing_spec.rb +2 -0
  139. data/spec/opal/stdlib/native/native_alias_spec.rb +2 -0
  140. data/spec/opal/stdlib/native/native_class_spec.rb +2 -0
  141. data/spec/opal/stdlib/native/native_module_spec.rb +2 -0
  142. data/spec/opal/stdlib/native/native_reader_spec.rb +2 -0
  143. data/spec/opal/stdlib/native/native_writer_spec.rb +2 -0
  144. data/spec/opal/stdlib/native/new_spec.rb +2 -0
  145. data/spec/opal/stdlib/native/struct_spec.rb +2 -0
  146. data/spec/spec_helper.rb +2 -0
  147. data/stdlib/await.rb +1 -0
  148. data/stdlib/base64.rb +2 -0
  149. data/stdlib/bigdecimal/bignumber.js.rb +2 -0
  150. data/stdlib/bigdecimal/util.rb +1 -0
  151. data/stdlib/bigdecimal.rb +2 -0
  152. data/stdlib/buffer/array.rb +2 -0
  153. data/stdlib/buffer/view.rb +2 -0
  154. data/stdlib/buffer.rb +2 -0
  155. data/stdlib/cgi.rb +14 -0
  156. data/stdlib/console.rb +2 -0
  157. data/stdlib/date/date_time.rb +2 -0
  158. data/stdlib/date.rb +2 -0
  159. data/stdlib/delegate.rb +2 -0
  160. data/stdlib/deno/base.rb +2 -0
  161. data/stdlib/deno/file.rb +2 -0
  162. data/stdlib/erb.rb +2 -0
  163. data/stdlib/gjs/io.rb +2 -0
  164. data/stdlib/gjs/kernel.rb +2 -0
  165. data/stdlib/headless_browser/base.rb +2 -0
  166. data/stdlib/headless_browser/file.rb +1 -0
  167. data/stdlib/headless_browser.rb +1 -0
  168. data/stdlib/js.rb +2 -0
  169. data/stdlib/json.rb +9 -15
  170. data/stdlib/logger.rb +2 -0
  171. data/stdlib/nashorn/file.rb +2 -0
  172. data/stdlib/nashorn/io.rb +2 -0
  173. data/stdlib/native.rb +48 -48
  174. data/stdlib/nodejs/base.rb +2 -0
  175. data/stdlib/nodejs/dir.rb +2 -0
  176. data/stdlib/nodejs/env.rb +2 -0
  177. data/stdlib/nodejs/file.rb +2 -0
  178. data/stdlib/nodejs/fileutils.rb +2 -0
  179. data/stdlib/nodejs/io.rb +2 -0
  180. data/stdlib/nodejs/js-yaml-3-6-1.js +1 -1
  181. data/stdlib/nodejs/kernel.rb +2 -0
  182. data/stdlib/nodejs/open-uri.rb +2 -0
  183. data/stdlib/nodejs/pathname.rb +2 -0
  184. data/stdlib/nodejs/require.rb +2 -0
  185. data/stdlib/nodejs/yaml.rb +9 -3
  186. data/stdlib/opal/miniracer.rb +2 -0
  187. data/stdlib/opal-parser.rb +8 -1
  188. data/stdlib/opal-platform.rb +2 -0
  189. data/stdlib/opal-replutils.rb +2 -0
  190. data/stdlib/open-uri.rb +4 -1
  191. data/stdlib/ostruct.rb +4 -2
  192. data/stdlib/pathname.rb +2 -0
  193. data/stdlib/pp.rb +1 -0
  194. data/stdlib/promise/v2.rb +2 -0
  195. data/stdlib/quickjs/io.rb +2 -0
  196. data/stdlib/quickjs/kernel.rb +2 -0
  197. data/stdlib/quickjs.rb +2 -0
  198. data/stdlib/securerandom.rb +2 -0
  199. data/stdlib/strscan.rb +2 -0
  200. data/stdlib/time.rb +2 -0
  201. data/stdlib/uri.rb +1 -0
  202. data/tasks/performance/optimization_status.rb +2 -0
  203. data/tasks/testing.rake +1 -0
  204. data/test/nodejs/test_await.rb +1 -0
  205. data/test/nodejs/test_dir.rb +2 -0
  206. data/test/nodejs/test_error.rb +2 -0
  207. data/test/nodejs/test_file.rb +2 -0
  208. data/test/nodejs/test_string.rb +2 -0
  209. data/test/nodejs/test_yaml.rb +20 -0
  210. metadata +22 -13
  211. data/spec/filters/bugs/openstruct.rb +0 -8
@@ -1,4 +1,5 @@
1
1
  # helpers: type_error, coerce_to
2
+ # backtick_javascript: true
2
3
 
3
4
  module ::Opal
4
5
  def self.bridge(constructor, klass)
data/opal/corelib/io.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  class ::IO
2
4
  self::SEEK_SET = 0
3
5
  self::SEEK_CUR = 1
data/opal/corelib/irb.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  # Debug is a helper module that allows us to conduct some debugging on
2
4
  # a live codebase. It goes with an assumption, that opal-parser or
3
5
  # opal-replutils will not be loaded, in which case we will do what we can
@@ -1,4 +1,5 @@
1
1
  # helpers: coerce_to
2
+ # backtick_javascript: true
2
3
 
3
4
  module ::Kernel
4
5
  def format(format_string, *args)
@@ -1,5 +1,6 @@
1
1
  # helpers: truthy, coerce_to, respond_to, Opal, deny_frozen_access, freeze, freeze_props, jsid
2
2
  # use_strict: true
3
+ # backtick_javascript: true
3
4
 
4
5
  module ::Kernel
5
6
  def =~(obj)
@@ -385,30 +386,55 @@ module ::Kernel
385
386
  }
386
387
  end
387
388
 
388
- def Integer(value, base = undefined)
389
+ def Integer(value, base = undefined, exception: true)
389
390
  %x{
390
391
  var i, str, base_digits;
391
392
 
393
+ exception = $truthy(#{exception});
394
+
392
395
  if (!value.$$is_string) {
393
396
  if (base !== undefined) {
394
- #{::Kernel.raise ::ArgumentError, 'base specified for non string value'}
397
+ if (exception) {
398
+ #{::Kernel.raise ::ArgumentError, 'base specified for non string value'}
399
+ } else {
400
+ return nil;
401
+ }
395
402
  }
396
403
  if (value === nil) {
397
- #{::Kernel.raise ::TypeError, "can't convert nil into Integer"}
404
+ if (exception) {
405
+ #{::Kernel.raise ::TypeError, "can't convert nil into Integer"}
406
+ } else {
407
+ return nil;
408
+ }
398
409
  }
399
410
  if (value.$$is_number) {
400
411
  if (value === Infinity || value === -Infinity || isNaN(value)) {
401
- #{::Kernel.raise ::FloatDomainError, value}
412
+ if (exception) {
413
+ #{::Kernel.raise ::FloatDomainError, value}
414
+ } else {
415
+ return nil;
416
+ }
402
417
  }
403
418
  return Math.floor(value);
404
419
  }
405
420
  if (#{value.respond_to?(:to_int)}) {
406
421
  i = #{value.to_int};
407
- if (i !== nil) {
422
+ if (Opal.is_a(i, #{::Integer})) {
408
423
  return i;
409
424
  }
410
425
  }
411
- return #{::Opal.coerce_to!(value, ::Integer, :to_i)};
426
+ if (#{value.respond_to?(:to_i)}) {
427
+ i = #{value.to_i};
428
+ if (Opal.is_a(i, #{::Integer})) {
429
+ return i;
430
+ }
431
+ }
432
+
433
+ if (exception) {
434
+ #{::Kernel.raise ::TypeError, "can't convert #{value.class} into Integer"}
435
+ } else {
436
+ return nil;
437
+ }
412
438
  }
413
439
 
414
440
  if (value === "0") {
@@ -420,7 +446,11 @@ module ::Kernel
420
446
  } else {
421
447
  base = $coerce_to(base, #{::Integer}, 'to_int');
422
448
  if (base === 1 || base < 0 || base > 36) {
423
- #{::Kernel.raise ::ArgumentError, "invalid radix #{base}"}
449
+ if (exception) {
450
+ #{::Kernel.raise ::ArgumentError, "invalid radix #{base}"}
451
+ } else {
452
+ return nil;
453
+ }
424
454
  }
425
455
  }
426
456
 
@@ -456,7 +486,11 @@ module ::Kernel
456
486
  }
457
487
  // no-break
458
488
  }
459
- #{::Kernel.raise ::ArgumentError, "invalid value for Integer(): \"#{value}\""}
489
+ if (exception) {
490
+ #{::Kernel.raise ::ArgumentError, "invalid value for Integer(): \"#{value}\""}
491
+ } else {
492
+ return nil;
493
+ }
460
494
  });
461
495
 
462
496
  base = (base === 0 ? 10 : base);
@@ -464,25 +498,39 @@ module ::Kernel
464
498
  base_digits = '0-' + (base <= 10 ? base - 1 : '9a-' + String.fromCharCode(97 + (base - 11)));
465
499
 
466
500
  if (!(new RegExp('^\\s*[+-]?[' + base_digits + ']+\\s*$')).test(str)) {
467
- #{::Kernel.raise ::ArgumentError, "invalid value for Integer(): \"#{value}\""}
501
+ if (exception) {
502
+ #{::Kernel.raise ::ArgumentError, "invalid value for Integer(): \"#{value}\""}
503
+ } else {
504
+ return nil;
505
+ }
468
506
  }
469
507
 
470
508
  i = parseInt(str, base);
471
509
 
472
510
  if (isNaN(i)) {
473
- #{::Kernel.raise ::ArgumentError, "invalid value for Integer(): \"#{value}\""}
511
+ if (exception) {
512
+ #{::Kernel.raise ::ArgumentError, "invalid value for Integer(): \"#{value}\""}
513
+ } else {
514
+ return nil;
515
+ }
474
516
  }
475
517
 
476
518
  return i;
477
519
  }
478
520
  end
479
521
 
480
- def Float(value)
522
+ def Float(value, exception: true)
481
523
  %x{
482
524
  var str;
483
525
 
526
+ exception = $truthy(#{exception});
527
+
484
528
  if (value === nil) {
485
- #{::Kernel.raise ::TypeError, "can't convert nil into Float"}
529
+ if (exception) {
530
+ #{::Kernel.raise ::TypeError, "can't convert nil into Float"}
531
+ } else {
532
+ return nil;
533
+ }
486
534
  }
487
535
 
488
536
  if (value.$$is_string) {
@@ -496,13 +544,21 @@ module ::Kernel
496
544
  }
497
545
 
498
546
  if (!/^\s*[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?\s*$/.test(str)) {
499
- #{::Kernel.raise ::ArgumentError, "invalid value for Float(): \"#{value}\""}
547
+ if (exception) {
548
+ #{::Kernel.raise ::ArgumentError, "invalid value for Float(): \"#{value}\""}
549
+ } else {
550
+ return nil;
551
+ }
500
552
  }
501
553
 
502
554
  return parseFloat(str);
503
555
  }
504
556
 
505
- return #{::Opal.coerce_to!(value, ::Float, :to_f)};
557
+ if (exception) {
558
+ return #{::Opal.coerce_to!(value, ::Float, :to_f)};
559
+ } else {
560
+ return $coerce_to(value, #{::Float}, 'to_f');
561
+ }
506
562
  }
507
563
  end
508
564
 
data/opal/corelib/main.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  class << self
2
4
  def to_s
3
5
  'main'
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  # https://github.com/ruby/ruby/blob/trunk/doc/marshal.rdoc
2
4
  # https://github.com/ruby/ruby/blob/trunk/marshal.c
3
5
 
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  class ::NilClass
2
4
  def __marshal__(buffer)
3
5
  buffer.append('0')
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  # Polyfills for browsers in the age of IE11
2
4
 
3
5
  unless defined?(`Math.acosh`)
data/opal/corelib/math.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  # helpers: type_error
2
+ # backtick_javascript: true
2
3
 
3
4
  module ::Math
4
5
  self::E = `Math.E`
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  class ::Method
2
4
  attr_reader :owner, :receiver, :name
3
5
 
@@ -1,4 +1,5 @@
1
1
  # helpers: truthy, coerce_to, const_set, Object, return_ivar, assign_ivar, ivar, deny_frozen_access, freeze, prop, jsid
2
+ # backtick_javascript: true
2
3
 
3
4
  class ::Module
4
5
  def self.allocate
data/opal/corelib/nil.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  class ::NilClass
2
4
  `self.$$prototype.$$meta = #{self}`
3
5
 
@@ -54,7 +56,7 @@ class ::NilClass
54
56
  end
55
57
 
56
58
  def to_h
57
- `Opal.hash()`
59
+ `new Map()`
58
60
  end
59
61
 
60
62
  def to_i
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  require 'corelib/numeric'
2
4
 
3
5
  class ::Number < ::Numeric
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  require 'corelib/comparable'
2
4
 
3
5
  class ::Numeric
@@ -1,3 +1,4 @@
1
+ # backtick_javascript: true
1
2
  # helpers: respond_to, truthy
2
3
 
3
4
  module ::ObjectSpace
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  module ::PackUnpack
2
4
  %x{
3
5
  var directives = [
data/opal/corelib/proc.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  # helpers: slice
2
+ # backtick_javascript: true
2
3
 
3
4
  class ::Proc < `Function`
4
5
  `Opal.prop(self.$$prototype, '$$is_proc', true)`
@@ -12,44 +13,45 @@ class ::Proc < `Function`
12
13
  block
13
14
  end
14
15
 
15
- def call(*args, &block)
16
- %x{
17
- if (block !== nil) {
18
- self.$$p = block;
19
- }
20
-
21
- var result, $brk = self.$$brk, $ret = self.$$ret;
22
-
23
- if ($brk || ($ret && self.$$is_lambda)) {
16
+ %x{
17
+ function $call_lambda(self, args) {
18
+ if (self.$$ret) {
24
19
  try {
25
- if (self.$$is_lambda) {
26
- result = self.apply(null, args);
27
- }
28
- else {
29
- result = Opal.yieldX(self, args);
30
- }
20
+ return self.apply(null, args);
31
21
  } catch (err) {
32
- if (err === $brk) {
33
- return err.$v;
34
- }
35
- else if (self.$$is_lambda && err === $ret) {
22
+ if (err === self.$$ret) {
36
23
  return err.$v;
37
- }
38
- else {
24
+ } else {
39
25
  throw err;
40
26
  }
41
27
  }
28
+ } else {
29
+ return self.apply(null, args);
42
30
  }
43
- else {
44
- if (self.$$is_lambda) {
45
- result = self.apply(null, args);
46
- }
47
- else {
48
- result = Opal.yieldX(self, args);
31
+ }
32
+
33
+ function $call_proc(self, args) {
34
+ if (self.$$brk) {
35
+ try {
36
+ return Opal.yieldX(self, args);
37
+ } catch (err) {
38
+ if (err === self.$$brk) {
39
+ return err.$v;
40
+ } else {
41
+ throw err;
42
+ }
49
43
  }
44
+ } else {
45
+ return Opal.yieldX(self, args);
50
46
  }
47
+ }
48
+ }
51
49
 
52
- return result;
50
+ def call(*args, &block)
51
+ %x{
52
+ if (block !== nil) self.$$p = block;
53
+ if (self.$$is_lambda) return $call_lambda(self, args);
54
+ return $call_proc(self, args);
53
55
  }
54
56
  end
55
57
 
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  module ::Process
2
4
  @__clocks__ = []
3
5
  def self.__register_clock__(name, func)
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  class ::Random
2
4
  module self::Formatter
3
5
  def hex(count = nil)
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  class ::Random
2
4
  MATH_RANDOM_GENERATOR = `{
3
5
  new_seed: function() { return 0; },
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  # This is based on an adaptation of Makoto Matsumoto and Takuji Nishimura's code
2
4
  # done by Sean McCullough <banksean@gmail.com> and Dave Heitzman
3
5
  # <daveheitzman@yahoo.com>, subsequently readapted from an updated version of
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  class ::Random
2
4
  %x{
3
5
  var module = { exports: {} };
@@ -1,4 +1,5 @@
1
1
  # helpers: truthy
2
+ # backtick_javascript: true
2
3
 
3
4
  require 'corelib/random/formatter'
4
5
 
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  require 'corelib/enumerable'
2
4
 
3
5
  class ::Range
@@ -145,19 +147,39 @@ class ::Range
145
147
  end
146
148
 
147
149
  def size
148
- infinity = ::Float::INFINITY
149
-
150
- return 0 if (@begin == infinity && !@end.nil?) || (@end == -infinity && !@begin.nil?)
151
- return infinity if `is_infinite(self)`
152
- return nil unless ::Numeric === @begin && ::Numeric === @end
153
-
154
- range_begin = @begin
155
- range_end = @end
156
- range_end -= 1 if @excl
157
-
158
- return 0 if range_end < range_begin
150
+ %x{
151
+ var b = this.begin, e = this.end;
152
+
153
+ // If begin is Numeric
154
+ if (#{::Numeric === `b`}) {
155
+ // If end is Numeric
156
+ if (#{::Numeric === `e`}) {
157
+ // Calculating size based on whether range is exclusive or inclusive
158
+ var size = #{`e` - `b`};
159
+ if (size < 0) {
160
+ return 0;
161
+ }
162
+ if (!this.excl) {
163
+ size += 1;
164
+ }
165
+ return (#{::Float === `b`} || #{::Float === `e`}) ? Math.floor(size) : size;
166
+ }
167
+ // If end is nil
168
+ else if (e === nil) {
169
+ return Infinity;
170
+ }
171
+ }
172
+ // If begin is nil
173
+ else if (b === nil) {
174
+ // If end is Numeric
175
+ if (#{::Numeric === `e`}) {
176
+ return Infinity;
177
+ }
178
+ }
159
179
 
160
- `Math.abs(range_end - range_begin) + 1`.to_i
180
+ // If neither begin nor end is Numeric
181
+ return nil;
182
+ }
161
183
  end
162
184
 
163
185
  def step(n = undefined)
@@ -1,3 +1,5 @@
1
+ # backtick_javascript: true
2
+
1
3
  require 'corelib/numeric'
2
4
  require 'corelib/rational/base'
3
5
 
@@ -1,4 +1,5 @@
1
1
  # helpers: coerce_to, prop, freeze
2
+ # backtick_javascript: true
2
3
 
3
4
  class ::RegexpError < ::StandardError; end
4
5