opal 1.6.1 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (212) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/build.yml +17 -0
  3. data/CHANGELOG.md +35 -1
  4. data/Gemfile +1 -0
  5. data/HACKING.md +47 -26
  6. data/benchmark/benchmarks +415 -103
  7. data/benchmark/bm_call_overhead.yml +28 -0
  8. data/benchmark/run.rb +61 -40
  9. data/docs/cdp_common.json +3364 -0
  10. data/docs/cdp_common.md +18 -0
  11. data/docs/{headless_chrome.md → headless_browsers.md} +31 -12
  12. data/lib/opal/ast/builder.rb +1 -1
  13. data/lib/opal/builder.rb +6 -1
  14. data/lib/opal/builder_processors.rb +5 -3
  15. data/lib/opal/cache.rb +1 -7
  16. data/lib/opal/cli_options.rb +72 -58
  17. data/lib/opal/cli_runners/chrome.rb +47 -9
  18. data/lib/opal/cli_runners/chrome_cdp_interface.rb +238 -112
  19. data/lib/opal/cli_runners/compiler.rb +146 -13
  20. data/lib/opal/cli_runners/deno.rb +32 -0
  21. data/lib/opal/cli_runners/firefox.rb +350 -0
  22. data/lib/opal/cli_runners/firefox_cdp_interface.rb +212 -0
  23. data/lib/opal/cli_runners/node_modules/.bin/chrome-remote-interface.cmd +17 -0
  24. data/lib/opal/cli_runners/node_modules/.bin/chrome-remote-interface.ps1 +28 -0
  25. data/lib/opal/cli_runners/node_modules/.package-lock.json +41 -0
  26. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/LICENSE +1 -1
  27. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/README.md +322 -182
  28. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/bin/client.js +99 -114
  29. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/chrome-remote-interface.js +1 -11
  30. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/index.js +16 -11
  31. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/api.js +41 -33
  32. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/chrome.js +224 -214
  33. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/devtools.js +71 -191
  34. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/external-request.js +26 -6
  35. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/protocol.json +20788 -9049
  36. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/websocket-wrapper.js +10 -3
  37. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/package.json +59 -123
  38. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/webpack.config.js +25 -32
  39. data/lib/opal/cli_runners/node_modules/commander/History.md +298 -0
  40. data/lib/opal/cli_runners/node_modules/commander/LICENSE +22 -0
  41. data/lib/opal/cli_runners/node_modules/commander/Readme.md +217 -61
  42. data/lib/opal/cli_runners/node_modules/commander/index.js +431 -145
  43. data/lib/opal/cli_runners/node_modules/commander/package.json +16 -79
  44. data/lib/opal/cli_runners/node_modules/ws/README.md +334 -98
  45. data/lib/opal/cli_runners/node_modules/ws/browser.js +8 -0
  46. data/lib/opal/cli_runners/node_modules/ws/index.js +5 -10
  47. data/lib/opal/cli_runners/node_modules/ws/lib/buffer-util.js +129 -0
  48. data/lib/opal/cli_runners/node_modules/ws/lib/constants.js +10 -0
  49. data/lib/opal/cli_runners/node_modules/ws/lib/event-target.js +184 -0
  50. data/lib/opal/cli_runners/node_modules/ws/lib/extension.js +223 -0
  51. data/lib/opal/cli_runners/node_modules/ws/lib/limiter.js +55 -0
  52. data/lib/opal/cli_runners/node_modules/ws/lib/permessage-deflate.js +518 -0
  53. data/lib/opal/cli_runners/node_modules/ws/lib/receiver.js +607 -0
  54. data/lib/opal/cli_runners/node_modules/ws/lib/sender.js +409 -0
  55. data/lib/opal/cli_runners/node_modules/ws/lib/stream.js +180 -0
  56. data/lib/opal/cli_runners/node_modules/ws/lib/validation.js +104 -0
  57. data/lib/opal/cli_runners/node_modules/ws/lib/websocket-server.js +447 -0
  58. data/lib/opal/cli_runners/node_modules/ws/lib/websocket.js +1195 -0
  59. data/lib/opal/cli_runners/node_modules/ws/package.json +40 -106
  60. data/lib/opal/cli_runners/package-lock.json +62 -0
  61. data/lib/opal/cli_runners/package.json +1 -1
  62. data/lib/opal/cli_runners.rb +26 -4
  63. data/lib/opal/nodes/args/prepare_post_args.rb +2 -2
  64. data/lib/opal/nodes/def.rb +8 -8
  65. data/lib/opal/nodes/iter.rb +12 -12
  66. data/lib/opal/nodes/logic.rb +1 -1
  67. data/lib/opal/nodes/masgn.rb +2 -2
  68. data/lib/opal/parser/with_ruby_lexer.rb +1 -1
  69. data/lib/opal/paths.rb +14 -0
  70. data/lib/opal/rewriter.rb +2 -0
  71. data/lib/opal/rewriters/forward_args.rb +52 -4
  72. data/lib/opal/rewriters/targeted_patches.rb +94 -0
  73. data/lib/opal/version.rb +1 -1
  74. data/opal/corelib/basic_object.rb +1 -1
  75. data/opal/corelib/boolean.rb +2 -2
  76. data/opal/corelib/class.rb +11 -0
  77. data/opal/corelib/constants.rb +3 -3
  78. data/opal/corelib/enumerable.rb +4 -0
  79. data/opal/corelib/enumerator.rb +1 -1
  80. data/opal/corelib/hash.rb +2 -2
  81. data/opal/corelib/helpers.rb +1 -1
  82. data/opal/corelib/kernel.rb +3 -3
  83. data/opal/corelib/method.rb +1 -1
  84. data/opal/corelib/module.rb +29 -8
  85. data/opal/corelib/proc.rb +7 -5
  86. data/opal/corelib/runtime.js +141 -78
  87. data/opal/corelib/set.rb +252 -0
  88. data/opal/corelib/string.rb +2 -1
  89. data/opal/corelib/time.rb +2 -2
  90. data/opal/opal.rb +1 -0
  91. data/opal.gemspec +1 -0
  92. data/spec/filters/bugs/array.rb +22 -13
  93. data/spec/filters/bugs/base64.rb +5 -5
  94. data/spec/filters/bugs/basicobject.rb +16 -8
  95. data/spec/filters/bugs/bigdecimal.rb +161 -160
  96. data/spec/filters/bugs/binding.rb +10 -10
  97. data/spec/filters/bugs/class.rb +8 -8
  98. data/spec/filters/bugs/complex.rb +2 -1
  99. data/spec/filters/bugs/date.rb +79 -81
  100. data/spec/filters/bugs/datetime.rb +29 -29
  101. data/spec/filters/bugs/delegate.rb +1 -3
  102. data/spec/filters/bugs/encoding.rb +69 -69
  103. data/spec/filters/bugs/enumerable.rb +22 -20
  104. data/spec/filters/bugs/enumerator.rb +88 -85
  105. data/spec/filters/bugs/exception.rb +46 -40
  106. data/spec/filters/bugs/file.rb +32 -32
  107. data/spec/filters/bugs/float.rb +26 -21
  108. data/spec/filters/bugs/freeze.rb +88 -0
  109. data/spec/filters/bugs/hash.rb +39 -38
  110. data/spec/filters/bugs/integer.rb +57 -44
  111. data/spec/filters/bugs/io.rb +1 -1
  112. data/spec/filters/bugs/kernel.rb +349 -269
  113. data/spec/filters/bugs/language.rb +220 -188
  114. data/spec/filters/bugs/main.rb +5 -3
  115. data/spec/filters/bugs/marshal.rb +38 -38
  116. data/spec/filters/bugs/math.rb +2 -1
  117. data/spec/filters/bugs/method.rb +73 -62
  118. data/spec/filters/bugs/module.rb +163 -143
  119. data/spec/filters/bugs/numeric.rb +6 -6
  120. data/spec/filters/bugs/objectspace.rb +16 -16
  121. data/spec/filters/bugs/openstruct.rb +1 -1
  122. data/spec/filters/bugs/pack_unpack.rb +51 -51
  123. data/spec/filters/bugs/pathname.rb +7 -7
  124. data/spec/filters/bugs/proc.rb +63 -63
  125. data/spec/filters/bugs/random.rb +7 -6
  126. data/spec/filters/bugs/range.rb +12 -9
  127. data/spec/filters/bugs/rational.rb +8 -7
  128. data/spec/filters/bugs/regexp.rb +49 -48
  129. data/spec/filters/bugs/ruby-32.rb +56 -0
  130. data/spec/filters/bugs/set.rb +30 -30
  131. data/spec/filters/bugs/singleton.rb +4 -4
  132. data/spec/filters/bugs/string.rb +187 -99
  133. data/spec/filters/bugs/stringio.rb +7 -0
  134. data/spec/filters/bugs/stringscanner.rb +68 -68
  135. data/spec/filters/bugs/struct.rb +11 -9
  136. data/spec/filters/bugs/symbol.rb +1 -1
  137. data/spec/filters/bugs/time.rb +78 -63
  138. data/spec/filters/bugs/trace_point.rb +4 -4
  139. data/spec/filters/bugs/unboundmethod.rb +32 -17
  140. data/spec/filters/bugs/warnings.rb +8 -12
  141. data/spec/filters/unsupported/array.rb +24 -107
  142. data/spec/filters/unsupported/basicobject.rb +12 -12
  143. data/spec/filters/unsupported/bignum.rb +27 -52
  144. data/spec/filters/unsupported/class.rb +1 -2
  145. data/spec/filters/unsupported/delegator.rb +3 -3
  146. data/spec/filters/unsupported/enumerable.rb +2 -9
  147. data/spec/filters/unsupported/enumerator.rb +2 -11
  148. data/spec/filters/unsupported/file.rb +1 -1
  149. data/spec/filters/unsupported/float.rb +28 -47
  150. data/spec/filters/unsupported/hash.rb +8 -14
  151. data/spec/filters/unsupported/integer.rb +75 -91
  152. data/spec/filters/unsupported/kernel.rb +17 -35
  153. data/spec/filters/unsupported/language.rb +11 -19
  154. data/spec/filters/unsupported/marshal.rb +22 -41
  155. data/spec/filters/unsupported/matchdata.rb +28 -52
  156. data/spec/filters/unsupported/math.rb +1 -1
  157. data/spec/filters/unsupported/privacy.rb +229 -285
  158. data/spec/filters/unsupported/range.rb +1 -5
  159. data/spec/filters/unsupported/regexp.rb +40 -66
  160. data/spec/filters/unsupported/set.rb +2 -2
  161. data/spec/filters/unsupported/singleton.rb +4 -4
  162. data/spec/filters/unsupported/string.rb +305 -508
  163. data/spec/filters/unsupported/struct.rb +3 -4
  164. data/spec/filters/unsupported/symbol.rb +15 -18
  165. data/spec/filters/unsupported/thread.rb +1 -7
  166. data/spec/filters/unsupported/time.rb +159 -202
  167. data/spec/filters/unsupported/usage_of_files.rb +170 -259
  168. data/spec/lib/builder_spec.rb +4 -4
  169. data/spec/lib/rewriters/forward_args_spec.rb +32 -12
  170. data/spec/mspec-opal/runner.rb +2 -0
  171. data/spec/ruby_specs +4 -0
  172. data/stdlib/deno/base.rb +28 -0
  173. data/stdlib/deno/file.rb +340 -0
  174. data/stdlib/{headless_chrome.rb → headless_browser/base.rb} +1 -1
  175. data/stdlib/headless_browser/file.rb +15 -0
  176. data/stdlib/headless_browser.rb +4 -0
  177. data/stdlib/native.rb +1 -1
  178. data/stdlib/nodejs/file.rb +5 -0
  179. data/stdlib/opal/platform.rb +8 -6
  180. data/stdlib/opal-platform.rb +14 -8
  181. data/stdlib/set.rb +1 -258
  182. data/tasks/benchmarking.rake +62 -19
  183. data/tasks/performance.rake +1 -1
  184. data/tasks/testing.rake +5 -3
  185. data/test/nodejs/test_file.rb +29 -10
  186. data/test/opal/http_server.rb +28 -11
  187. data/test/opal/unsupported_and_bugs.rb +2 -1
  188. metadata +89 -50
  189. data/lib/opal/cli_runners/node_modules/ultron/LICENSE +0 -22
  190. data/lib/opal/cli_runners/node_modules/ultron/index.js +0 -138
  191. data/lib/opal/cli_runners/node_modules/ultron/package.json +0 -112
  192. data/lib/opal/cli_runners/node_modules/ws/SECURITY.md +0 -33
  193. data/lib/opal/cli_runners/node_modules/ws/lib/BufferUtil.fallback.js +0 -56
  194. data/lib/opal/cli_runners/node_modules/ws/lib/BufferUtil.js +0 -15
  195. data/lib/opal/cli_runners/node_modules/ws/lib/ErrorCodes.js +0 -28
  196. data/lib/opal/cli_runners/node_modules/ws/lib/EventTarget.js +0 -158
  197. data/lib/opal/cli_runners/node_modules/ws/lib/Extensions.js +0 -69
  198. data/lib/opal/cli_runners/node_modules/ws/lib/PerMessageDeflate.js +0 -339
  199. data/lib/opal/cli_runners/node_modules/ws/lib/Receiver.js +0 -520
  200. data/lib/opal/cli_runners/node_modules/ws/lib/Sender.js +0 -438
  201. data/lib/opal/cli_runners/node_modules/ws/lib/Validation.fallback.js +0 -9
  202. data/lib/opal/cli_runners/node_modules/ws/lib/Validation.js +0 -17
  203. data/lib/opal/cli_runners/node_modules/ws/lib/WebSocket.js +0 -705
  204. data/lib/opal/cli_runners/node_modules/ws/lib/WebSocketServer.js +0 -336
  205. data/spec/filters/bugs/boolean.rb +0 -3
  206. data/spec/filters/bugs/matrix.rb +0 -3
  207. data/spec/filters/unsupported/fixnum.rb +0 -15
  208. data/spec/filters/unsupported/freeze.rb +0 -102
  209. data/spec/filters/unsupported/pathname.rb +0 -4
  210. data/spec/filters/unsupported/proc.rb +0 -4
  211. data/spec/filters/unsupported/random.rb +0 -5
  212. data/spec/filters/unsupported/taint.rb +0 -162
@@ -90,13 +90,13 @@ class ::Boolean < `Boolean`
90
90
  # the methods defined on Boolean, but our implementation doesn't allow that,
91
91
  # unless you define them on Boolean and not on TrueClass/FalseClass.
92
92
  def method_missing(method, *args, &block)
93
- `var body = self.$$class.$$prototype['$' + #{method}]`
93
+ `var body = self.$$class.$$prototype[Opal.jsid(#{method})]`
94
94
  super unless `typeof body !== 'undefined' && !body.$$stub`
95
95
  `Opal.send(self, body, #{args}, #{block})`
96
96
  end
97
97
 
98
98
  def respond_to_missing?(method, _include_all = false)
99
- `var body = self.$$class.$$prototype['$' + #{method}]`
99
+ `var body = self.$$class.$$prototype[Opal.jsid(#{method})]`
100
100
  `typeof body !== 'undefined' && !body.$$stub`
101
101
  end
102
102
 
@@ -83,5 +83,16 @@ class ::Class
83
83
  }
84
84
  end
85
85
 
86
+ def attached_object
87
+ %x{
88
+ if (self.$$singleton_of != null) {
89
+ return self.$$singleton_of;
90
+ }
91
+ else {
92
+ #{::Kernel.raise ::TypeError, "`#{self}' is not a singleton class"}
93
+ }
94
+ }
95
+ end
96
+
86
97
  alias inspect to_s
87
98
  end
@@ -1,8 +1,8 @@
1
1
  ::RUBY_PLATFORM = 'opal'
2
2
  ::RUBY_ENGINE = 'opal'
3
- ::RUBY_VERSION = '3.1.0'
4
- ::RUBY_ENGINE_VERSION = '1.6.1'
5
- ::RUBY_RELEASE_DATE = '2022-12-09'
3
+ ::RUBY_VERSION = '3.2.0'
4
+ ::RUBY_ENGINE_VERSION = '1.7.0'
5
+ ::RUBY_RELEASE_DATE = '2022-12-26'
6
6
  ::RUBY_PATCHLEVEL = 0
7
7
  ::RUBY_REVISION = '0'
8
8
  ::RUBY_COPYRIGHT = 'opal - Copyright (C) 2013-2022 Adam Beynon and the Opal contributors'
@@ -1268,6 +1268,10 @@ module ::Enumerable
1268
1268
  }
1269
1269
  end
1270
1270
 
1271
+ def to_set(klass = Set, *args, &block)
1272
+ klass.new(self, *args, &block)
1273
+ end
1274
+
1271
1275
  def zip(*others, &block)
1272
1276
  to_a.zip(*others)
1273
1277
  end
@@ -37,7 +37,7 @@ class ::Enumerator
37
37
  else
38
38
  @object = `arguments[0]`
39
39
  @method = `arguments[1] || "each"`
40
- @args = `$slice.call(arguments, 2)`
40
+ @args = `$slice(arguments, 2)`
41
41
  @size = nil
42
42
  end
43
43
  end
data/opal/corelib/hash.rb CHANGED
@@ -1031,7 +1031,7 @@ class ::Hash
1031
1031
  return [key, $hash_delete(self, key)];
1032
1032
  }
1033
1033
 
1034
- return self.$default(nil);
1034
+ return nil;
1035
1035
  }
1036
1036
  end
1037
1037
 
@@ -1136,7 +1136,7 @@ class ::Hash
1136
1136
  %x{
1137
1137
  $deny_frozen_access(self);
1138
1138
 
1139
- var keys = Opal.slice.call(self.$$keys),
1139
+ var keys = Opal.slice(self.$$keys),
1140
1140
  i, length = keys.length, key, value, new_key;
1141
1141
 
1142
1142
  for (i = 0; i < length; i++) {
@@ -147,7 +147,7 @@ module ::Opal
147
147
  var method_name, method;
148
148
  for (var i = method_names.length - 1; i >= 0; i--) {
149
149
  method_name = method_names[i];
150
- method = owner_class.$$prototype['$'+method_name];
150
+ method = owner_class.$$prototype[Opal.jsid(method_name)];
151
151
 
152
152
  if (method && !method.$$stub) {
153
153
  method.$$pristine = true;
@@ -1,4 +1,4 @@
1
- # helpers: truthy, coerce_to, respond_to, Opal, deny_frozen_access, freeze, freeze_props
1
+ # helpers: truthy, coerce_to, respond_to, Opal, deny_frozen_access, freeze, freeze_props, jsid
2
2
  # use_strict: true
3
3
 
4
4
  module ::Kernel
@@ -31,7 +31,7 @@ module ::Kernel
31
31
 
32
32
  def method(name)
33
33
  %x{
34
- var meth = self['$' + name];
34
+ var meth = self[$jsid(name)];
35
35
 
36
36
  if (!meth || meth.$$stub) {
37
37
  #{::Kernel.raise ::NameError.new("undefined method `#{name}' for class `#{self.class}'", name)};
@@ -662,7 +662,7 @@ module ::Kernel
662
662
 
663
663
  def respond_to?(name, include_all = false)
664
664
  %x{
665
- var body = self['$' + name];
665
+ var body = self[$jsid(name)];
666
666
 
667
667
  if (typeof(body) === "function" && !body.$$stub) {
668
668
  return true;
@@ -53,7 +53,7 @@ class ::Method
53
53
  var proc = self.$call.bind(self);
54
54
  proc.$$unbound = #{@method};
55
55
  proc.$$is_lambda = true;
56
- proc.$$arity = #{@method}.$$arity;
56
+ proc.$$arity = #{@method}.$$arity == null ? #{@method}.length : #{@method}.$$arity;
57
57
  proc.$$parameters = #{@method}.$$parameters;
58
58
  return proc;
59
59
  }
@@ -1,4 +1,4 @@
1
- # helpers: truthy, coerce_to, const_set, Object, return_ivar, assign_ivar, ivar, deny_frozen_access, freeze, prop
1
+ # helpers: truthy, coerce_to, const_set, Object, return_ivar, assign_ivar, ivar, deny_frozen_access, freeze, prop, jsid
2
2
 
3
3
  class ::Module
4
4
  def self.allocate
@@ -138,7 +138,7 @@ class ::Module
138
138
 
139
139
  for (var i = names.length - 1; i >= 0; i--) {
140
140
  var name = names[i],
141
- id = '$' + name,
141
+ id = $jsid(name),
142
142
  ivar = $ivar(name);
143
143
 
144
144
  var body = $return_ivar(ivar);
@@ -164,7 +164,7 @@ class ::Module
164
164
 
165
165
  for (var i = names.length - 1; i >= 0; i--) {
166
166
  var name = names[i],
167
- id = '$' + name + '=',
167
+ id = $jsid(name + '='),
168
168
  ivar = $ivar(name);
169
169
 
170
170
  var body = $assign_ivar(ivar)
@@ -200,6 +200,10 @@ class ::Module
200
200
  }
201
201
  Opal.const_cache_version++;
202
202
  self.$$autoload[#{const}] = { path: #{path}, loaded: false, required: false, success: false, exception: false };
203
+
204
+ if (self.$const_added && !self.$const_added.$$pristine) {
205
+ self.$const_added(#{const});
206
+ }
203
207
  }
204
208
  return nil;
205
209
  }
@@ -246,6 +250,10 @@ class ::Module
246
250
  `Opal.class_variables(self).hasOwnProperty(name)`
247
251
  end
248
252
 
253
+ def const_added(name)
254
+ end
255
+ ::Opal.pristine self, :const_added
256
+
249
257
  def remove_class_variable(name)
250
258
  `$deny_frozen_access(self)`
251
259
 
@@ -424,7 +432,7 @@ class ::Module
424
432
  block.$$def = block;
425
433
  block.$$define_meth = true;
426
434
 
427
- return Opal.defn(self, '$' + name, block);
435
+ return Opal.defn(self, $jsid(name), block);
428
436
  }
429
437
  end
430
438
 
@@ -503,7 +511,7 @@ class ::Module
503
511
 
504
512
  def instance_method(name)
505
513
  %x{
506
- var meth = self.$$prototype['$' + name];
514
+ var meth = self.$$prototype[$jsid(name)];
507
515
 
508
516
  if (!meth || meth.$$stub) {
509
517
  #{::Kernel.raise ::NameError.new("undefined method `#{name}' for class `#{self.name}'", name)};
@@ -589,7 +597,7 @@ class ::Module
589
597
 
590
598
  def method_defined?(method)
591
599
  %x{
592
- var body = self.$$prototype['$' + method];
600
+ var body = self.$$prototype[$jsid(method)];
593
601
  return (!!body) && !body.$$stub;
594
602
  }
595
603
  end
@@ -605,7 +613,7 @@ class ::Module
605
613
  else {
606
614
  for (var i = 0, length = methods.length; i < length; i++) {
607
615
  var meth = methods[i],
608
- id = '$' + meth,
616
+ id = $jsid(meth),
609
617
  func = self.$$prototype[id];
610
618
 
611
619
  Opal.defs(self, id, func);
@@ -754,7 +762,7 @@ class ::Module
754
762
  %x{
755
763
  klass_id = Opal.id(klass);
756
764
  if (typeof self.$$refine_modules === "undefined") {
757
- self.$$refine_modules = {};
765
+ self.$$refine_modules = Object.create(null);
758
766
  }
759
767
  if (typeof self.$$refine_modules[klass_id] === "undefined") {
760
768
  m = self.$$refine_modules[klass_id] = #{::Refinement.new};
@@ -769,6 +777,17 @@ class ::Module
769
777
  m
770
778
  end
771
779
 
780
+ def refinements
781
+ %x{
782
+ var refine_modules = self.$$refine_modules, hash = #{{}};;
783
+ if (typeof refine_modules === "undefined") return hash;
784
+ for (var id in refine_modules) {
785
+ hash['$[]='](refine_modules[id].refined_class, refine_modules[id]);
786
+ }
787
+ return hash;
788
+ }
789
+ end
790
+
772
791
  # Compiler overrides this method
773
792
  def using(mod)
774
793
  ::Kernel.raise 'Module#using is not permitted in methods'
@@ -780,6 +799,8 @@ class ::Module
780
799
  end
781
800
 
782
801
  class ::Refinement < ::Module
802
+ attr_reader :refined_class
803
+
783
804
  def inspect
784
805
  if @refinement_module
785
806
  "#<refinement:#{@refined_class.inspect}@#{@refinement_module.inspect}>"
data/opal/corelib/proc.rb CHANGED
@@ -81,8 +81,10 @@ class ::Proc < `Function`
81
81
  %x{
82
82
  if (self.$$is_curried) {
83
83
  return -1;
84
- } else {
84
+ } else if (self.$$arity != null) {
85
85
  return self.$$arity;
86
+ } else {
87
+ return self.length;
86
88
  }
87
89
  }
88
90
  end
@@ -100,12 +102,12 @@ class ::Proc < `Function`
100
102
  end
101
103
  end
102
104
 
103
- def parameters
105
+ def parameters(lambda: undefined)
104
106
  %x{
105
107
  if (self.$$is_curried) {
106
108
  return #{[[:rest]]};
107
109
  } else if (self.$$parameters) {
108
- if (self.$$is_lambda) {
110
+ if (lambda == null ? self.$$is_lambda : lambda) {
109
111
  return self.$$parameters;
110
112
  } else {
111
113
  var result = [], i, length;
@@ -142,7 +144,7 @@ class ::Proc < `Function`
142
144
  }
143
145
 
144
146
  function curried () {
145
- var args = $slice.call(arguments),
147
+ var args = $slice(arguments),
146
148
  length = args.length,
147
149
  result;
148
150
 
@@ -156,7 +158,7 @@ class ::Proc < `Function`
156
158
 
157
159
  result = function () {
158
160
  return curried.apply(null,
159
- args.concat($slice.call(arguments)));
161
+ args.concat($slice(arguments)));
160
162
  }
161
163
  result.$$is_lambda = self.$$is_lambda;
162
164
  result.$$is_curried = true;