opal 1.6.1 → 1.7.0

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 (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
@@ -1,81 +1,7 @@
1
1
  {
2
- "_args": [
3
- [
4
- {
5
- "raw": "ws@2.0.x",
6
- "scope": null,
7
- "escapedName": "ws",
8
- "name": "ws",
9
- "rawSpec": "2.0.x",
10
- "spec": ">=2.0.0 <2.1.0",
11
- "type": "range"
12
- },
13
- "/Users/ilya/Work/opal/lib/opal/cli_runners/node_modules/chrome-remote-interface"
14
- ]
15
- ],
16
- "_from": "ws@>=2.0.0 <2.1.0",
17
- "_id": "ws@2.0.3",
18
- "_inCache": true,
19
- "_location": "/ws",
20
- "_nodeVersion": "7.5.0",
21
- "_npmOperationalInternal": {
22
- "host": "packages-18-east.internal.npmjs.com",
23
- "tmp": "tmp/ws-2.0.3.tgz_1486561489812_0.7949141394346952"
24
- },
25
- "_npmUser": {
26
- "name": "lpinca",
27
- "email": "luigipinca@gmail.com"
28
- },
29
- "_npmVersion": "4.1.2",
30
- "_phantomChildren": {},
31
- "_requested": {
32
- "raw": "ws@2.0.x",
33
- "scope": null,
34
- "escapedName": "ws",
35
- "name": "ws",
36
- "rawSpec": "2.0.x",
37
- "spec": ">=2.0.0 <2.1.0",
38
- "type": "range"
39
- },
40
- "_requiredBy": [
41
- "/chrome-remote-interface"
42
- ],
43
- "_resolved": "https://registry.npmjs.org/ws/-/ws-2.0.3.tgz",
44
- "_shasum": "532fd499c3f7d7d720e543f1f807106cfc57d9cb",
45
- "_shrinkwrap": null,
46
- "_spec": "ws@2.0.x",
47
- "_where": "/Users/ilya/Work/opal/lib/opal/cli_runners/node_modules/chrome-remote-interface",
48
- "author": {
49
- "name": "Einar Otto Stangvik",
50
- "email": "einaros@gmail.com",
51
- "url": "http://2x.io"
52
- },
53
- "bugs": {
54
- "url": "https://github.com/websockets/ws/issues"
55
- },
56
- "dependencies": {
57
- "ultron": "~1.1.0"
58
- },
2
+ "name": "ws",
3
+ "version": "7.5.9",
59
4
  "description": "Simple to use, blazing fast and thoroughly tested websocket client and server for Node.js",
60
- "devDependencies": {
61
- "benchmark": "~2.1.2",
62
- "bufferutil": "~2.0.0",
63
- "eslint": "~3.15.0",
64
- "eslint-config-semistandard": "~7.0.0",
65
- "eslint-config-standard": "~6.2.1",
66
- "eslint-plugin-promise": "~3.4.0",
67
- "eslint-plugin-standard": "~2.0.1",
68
- "istanbul": "~0.4.5",
69
- "mocha": "~3.2.0",
70
- "utf-8-validate": "~3.0.0"
71
- },
72
- "directories": {},
73
- "dist": {
74
- "shasum": "532fd499c3f7d7d720e543f1f807106cfc57d9cb",
75
- "tarball": "https://registry.npmjs.org/ws/-/ws-2.0.3.tgz"
76
- },
77
- "gitHead": "3918e11d200e574beca9d5abd61fbe3020434aed",
78
- "homepage": "https://github.com/websockets/ws#readme",
79
5
  "keywords": [
80
6
  "HyBi",
81
7
  "Push",
@@ -84,39 +10,47 @@
84
10
  "WebSockets",
85
11
  "real-time"
86
12
  ],
13
+ "homepage": "https://github.com/websockets/ws",
14
+ "bugs": "https://github.com/websockets/ws/issues",
15
+ "repository": "websockets/ws",
16
+ "author": "Einar Otto Stangvik <einaros@gmail.com> (http://2x.io)",
87
17
  "license": "MIT",
88
18
  "main": "index.js",
89
- "maintainers": [
90
- {
91
- "name": "3rdeden",
92
- "email": "npm@3rd-Eden.com"
93
- },
94
- {
95
- "name": "einaros",
96
- "email": "einaros@gmail.com"
97
- },
98
- {
99
- "name": "lpinca",
100
- "email": "luigipinca@gmail.com"
101
- },
102
- {
103
- "name": "v1",
104
- "email": "npm@3rd-Eden.com"
105
- }
19
+ "browser": "browser.js",
20
+ "engines": {
21
+ "node": ">=8.3.0"
22
+ },
23
+ "files": [
24
+ "browser.js",
25
+ "index.js",
26
+ "lib/*.js"
106
27
  ],
107
- "name": "ws",
108
- "optionalDependencies": {},
109
- "readme": "ERROR: No README data found!",
110
- "repository": {
111
- "type": "git",
112
- "url": "git://github.com/websockets/ws.git"
113
- },
114
28
  "scripts": {
115
- "coverage": "istanbul cover _mocha --report html -- test/*.test.js",
116
- "integration": "npm run lint && mocha test/*.integration.js",
117
- "lint": "eslint .",
118
- "test": "npm run lint && mocha test/*.test.js",
119
- "test-travis": "npm run lint && istanbul cover _mocha --report lcovonly -- test/*.test.js"
29
+ "test": "nyc --reporter=lcov --reporter=text mocha --throw-deprecation test/*.test.js",
30
+ "integration": "mocha --throw-deprecation test/*.integration.js",
31
+ "lint": "eslint --ignore-path .gitignore . && prettier --check --ignore-path .gitignore \"**/*.{json,md,yaml,yml}\""
120
32
  },
121
- "version": "2.0.3"
33
+ "peerDependencies": {
34
+ "bufferutil": "^4.0.1",
35
+ "utf-8-validate": "^5.0.2"
36
+ },
37
+ "peerDependenciesMeta": {
38
+ "bufferutil": {
39
+ "optional": true
40
+ },
41
+ "utf-8-validate": {
42
+ "optional": true
43
+ }
44
+ },
45
+ "devDependencies": {
46
+ "benchmark": "^2.1.4",
47
+ "bufferutil": "^4.0.1",
48
+ "eslint": "^7.2.0",
49
+ "eslint-config-prettier": "^8.1.0",
50
+ "eslint-plugin-prettier": "^4.0.0",
51
+ "mocha": "^7.0.0",
52
+ "nyc": "^15.0.0",
53
+ "prettier": "^2.0.5",
54
+ "utf-8-validate": "^5.0.2"
55
+ }
122
56
  }
@@ -0,0 +1,62 @@
1
+ {
2
+ "name": "cli_runners",
3
+ "lockfileVersion": 2,
4
+ "requires": true,
5
+ "packages": {
6
+ "": {
7
+ "dependencies": {
8
+ "chrome-remote-interface": "^0.31.3"
9
+ }
10
+ },
11
+ "node_modules/chrome-remote-interface": {
12
+ "version": "0.31.3",
13
+ "license": "MIT",
14
+ "dependencies": {
15
+ "commander": "2.11.x",
16
+ "ws": "^7.2.0"
17
+ },
18
+ "bin": {
19
+ "chrome-remote-interface": "bin/client.js"
20
+ }
21
+ },
22
+ "node_modules/commander": {
23
+ "version": "2.11.0",
24
+ "license": "MIT"
25
+ },
26
+ "node_modules/ws": {
27
+ "version": "7.5.9",
28
+ "license": "MIT",
29
+ "engines": {
30
+ "node": ">=8.3.0"
31
+ },
32
+ "peerDependencies": {
33
+ "bufferutil": "^4.0.1",
34
+ "utf-8-validate": "^5.0.2"
35
+ },
36
+ "peerDependenciesMeta": {
37
+ "bufferutil": {
38
+ "optional": true
39
+ },
40
+ "utf-8-validate": {
41
+ "optional": true
42
+ }
43
+ }
44
+ }
45
+ },
46
+ "dependencies": {
47
+ "chrome-remote-interface": {
48
+ "version": "0.31.3",
49
+ "requires": {
50
+ "commander": "2.11.x",
51
+ "ws": "^7.2.0"
52
+ }
53
+ },
54
+ "commander": {
55
+ "version": "2.11.0"
56
+ },
57
+ "ws": {
58
+ "version": "7.5.9",
59
+ "requires": {}
60
+ }
61
+ }
62
+ }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "dependencies": {
3
- "chrome-remote-interface": "latest"
3
+ "chrome-remote-interface": "^0.31.3"
4
4
  }
5
5
  }
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'opal/os'
4
+
3
5
  module Opal
4
6
  # `Opal::CliRunners` is the register in which JavaScript runners can be
5
7
  # defined for use by `Opal::CLI`. Runners will be called via the `#call`
@@ -19,6 +21,12 @@ module Opal
19
21
  class RunnerError < StandardError
20
22
  end
21
23
 
24
+ @runners = []
25
+
26
+ def self.registered_runners
27
+ @runners
28
+ end
29
+
22
30
  @register = {}
23
31
 
24
32
  def self.[](name)
@@ -45,6 +53,8 @@ module Opal
45
53
  def self.register_runner(name, runner, path = nil)
46
54
  autoload runner, path if path
47
55
 
56
+ @runners.push(runner.to_s)
57
+
48
58
  if runner.respond_to? :call
49
59
  self[name] = -> { runner }
50
60
  else
@@ -61,17 +71,29 @@ module Opal
61
71
  nil
62
72
  end
63
73
 
64
- register_runner :applescript, :Applescript, 'opal/cli_runners/applescript'
74
+ # running on all OS
65
75
  register_runner :chrome, :Chrome, 'opal/cli_runners/chrome'
66
76
  register_runner :compiler, :Compiler, 'opal/cli_runners/compiler'
77
+ register_runner :deno, :Deno, 'opal/cli_runners/deno'
78
+ register_runner :firefox, :Firefox, 'opal/cli_runners/firefox'
67
79
  register_runner :nashorn, :Nashorn, 'opal/cli_runners/nashorn'
68
80
  register_runner :nodejs, :Nodejs, 'opal/cli_runners/nodejs'
69
- register_runner :gjs, :Gjs, 'opal/cli_runners/gjs'
70
81
  register_runner :quickjs, :Quickjs, 'opal/cli_runners/quickjs'
71
- register_runner :miniracer, :MiniRacer, 'opal/cli_runners/mini_racer'
72
82
  register_runner :server, :Server, 'opal/cli_runners/server'
73
83
 
74
- alias_runner :osascript, :applescript
75
84
  alias_runner :node, :nodejs
85
+
86
+ if !OS.windows? && !OS.macos?
87
+ register_runner :gjs, :Gjs, 'opal/cli_runners/gjs'
88
+ end
89
+
90
+ unless OS.windows?
91
+ register_runner :miniracer, :MiniRacer, 'opal/cli_runners/mini_racer'
92
+ end
93
+
94
+ if OS.macos?
95
+ register_runner :applescript, :Applescript, 'opal/cli_runners/applescript'
96
+ alias_runner :osascript, :applescript
97
+ end
76
98
  end
77
99
  end
@@ -17,9 +17,9 @@ module Opal
17
17
  helper :slice
18
18
 
19
19
  if offset == 0
20
- push "$post_args = $slice.call(arguments)"
20
+ push "$post_args = $slice(arguments)"
21
21
  else
22
- push "$post_args = $slice.call(arguments, #{offset})"
22
+ push "$post_args = $slice(arguments, #{offset})"
23
23
  end
24
24
  end
25
25
  end
@@ -12,26 +12,26 @@ module Opal
12
12
  def compile
13
13
  compile_body_or_shortcut
14
14
 
15
- blockopts = []
15
+ blockopts = {}
16
16
 
17
- blockopts << "$$arity: #{arity}"
17
+ blockopts["$$arity"] = arity if arity < 0
18
18
 
19
19
  if compiler.arity_check?
20
- blockopts << "$$parameters: #{parameters_code}"
20
+ blockopts["$$parameters"] = parameters_code
21
21
  end
22
22
 
23
23
  if compiler.parse_comments?
24
- blockopts << "$$comments: #{comments_code}"
24
+ blockopts["$$comments"] = comments_code
25
25
  end
26
26
 
27
27
  if compiler.enable_source_location?
28
- blockopts << "$$source_location: #{source_location}"
28
+ blockopts["$$source_location"] = source_location
29
29
  end
30
30
 
31
- if blockopts.length == 1
31
+ if blockopts.keys == ["$$arity"]
32
32
  push ", #{arity}"
33
- elsif blockopts.length > 1
34
- push ', {', blockopts.join(', '), '}'
33
+ elsif !blockopts.empty?
34
+ push ', {', blockopts.map { |k, v| "#{k}: #{v}" }.join(', '), '}'
35
35
  end
36
36
 
37
37
  wrap_with_definition
@@ -14,18 +14,18 @@ module Opal
14
14
 
15
15
  compile_body_or_shortcut
16
16
 
17
- blockopts = []
18
- blockopts << "$$arity: #{arity}"
19
- blockopts << "$$s: #{scope.self}" if @define_self
20
- blockopts << "$$brk: #{@closure.throwers[:break]}" if @closure&.throwers&.key? :break
21
- blockopts << "$$ret: #{@closure.throwers[:return]}" if @closure&.throwers&.key? :return
17
+ blockopts = {}
18
+ blockopts["$$arity"] = arity if arity < 0
19
+ blockopts["$$s"] = scope.self if @define_self
20
+ blockopts["$$brk"] = @closure.throwers[:break] if @closure&.throwers&.key? :break
21
+ blockopts["$$ret"] = @closure.throwers[:return] if @closure&.throwers&.key? :return
22
22
 
23
23
  if compiler.arity_check?
24
- blockopts << "$$parameters: #{parameters_code}"
24
+ blockopts["$$parameters"] = parameters_code
25
25
  end
26
26
 
27
27
  if compiler.enable_source_location?
28
- blockopts << "$$source_location: #{source_location}"
28
+ blockopts["$$source_location"] = source_location
29
29
  end
30
30
 
31
31
  # MRI expands a passed argument if the block:
@@ -37,17 +37,17 @@ module Opal
37
37
  # This flag on the method indicates that a block has a top level mlhs argument
38
38
  # which means that we have to expand passed array explicitly in runtime.
39
39
  if has_top_level_mlhs_arg?
40
- blockopts << "$$has_top_level_mlhs_arg: true"
40
+ blockopts["$$has_top_level_mlhs_arg"] = "true"
41
41
  end
42
42
 
43
43
  if has_trailing_comma_in_args?
44
- blockopts << "$$has_trailing_comma_in_args: true"
44
+ blockopts["$$has_trailing_comma_in_args"] = "true"
45
45
  end
46
46
 
47
- if blockopts.length == 1
47
+ if blockopts.keys == ["$$arity"]
48
48
  push ", #{arity}"
49
- elsif blockopts.length > 1
50
- push ', {', blockopts.join(', '), '}'
49
+ elsif !blockopts.empty?
50
+ push ', {', blockopts.map { |k, v| "#{k}: #{v}" }.join(', '), '}'
51
51
  end
52
52
 
53
53
  scope.nesting if @define_nesting
@@ -53,7 +53,7 @@ module Opal
53
53
 
54
54
  def compile_iter
55
55
  helper :slice
56
- push "return #{scope.identity}.apply(null, $slice.call(arguments))"
56
+ push "return #{scope.identity}.apply(null, $slice(arguments))"
57
57
  end
58
58
  end
59
59
 
@@ -44,7 +44,7 @@ module Opal
44
44
  if post_splat.empty? # trailing splat
45
45
  if part = splat.children[0]
46
46
  helper :slice
47
- part = part.dup << s(:js_tmp, "$slice.call(#{array}, #{pre_splat.size})")
47
+ part = part.dup << s(:js_tmp, "$slice(#{array}, #{pre_splat.size})")
48
48
  push ', '
49
49
  push expr(part)
50
50
  end
@@ -55,7 +55,7 @@ module Opal
55
55
 
56
56
  if part = splat.children[0]
57
57
  helper :slice
58
- part = part.dup << s(:js_tmp, "$slice.call(#{array}, #{pre_splat.size}, #{tmp})")
58
+ part = part.dup << s(:js_tmp, "$slice(#{array}, #{pre_splat.size}, #{tmp})")
59
59
  push ', '
60
60
  push expr(part)
61
61
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class Opal::Parser::WithRubyLexer < Parser::Ruby31
3
+ class Opal::Parser::WithRubyLexer < Parser::Ruby32
4
4
  include Opal::Parser::DefaultConfig
5
5
  Opal::Parser.default_parser_class = self
6
6
  end
data/lib/opal/paths.rb CHANGED
@@ -30,6 +30,20 @@ module Opal
30
30
  nil
31
31
  end
32
32
 
33
+ # All files that Opal depends on while compiling (for cache keying and
34
+ # watching)
35
+ def self.dependent_files
36
+ # We want to ensure the compiler and any Gemfile/gemspec (for development)
37
+ # stays untouched
38
+ opal_path = File.expand_path('..', Opal.gem_dir)
39
+ files = Dir["#{opal_path}/{Gemfile*,*.gemspec,lib/**/*}"]
40
+
41
+ # Also check if parser wasn't changed:
42
+ files += $LOADED_FEATURES.grep(%r{lib/(parser|ast)})
43
+
44
+ files
45
+ end
46
+
33
47
  module UseGem
34
48
  # Adds the "require_paths" (usually `lib/`) of gem with the given name to
35
49
  # Opal paths. By default will include the "require_paths" from all the
data/lib/opal/rewriter.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'opal/rewriters/opal_engine_check'
4
+ require 'opal/rewriters/targeted_patches'
4
5
  require 'opal/rewriters/for_rewriter'
5
6
  require 'opal/rewriters/js_reserved_words'
6
7
  require 'opal/rewriters/block_to_iter'
@@ -57,6 +58,7 @@ module Opal
57
58
  use Rewriters::Numblocks
58
59
  use Rewriters::ForwardArgs
59
60
  use Rewriters::BlockToIter
61
+ use Rewriters::TargetedPatches
60
62
  use Rewriters::DotJsSyntax
61
63
  use Rewriters::PatternMatching
62
64
  use Rewriters::JsReservedWords
@@ -11,17 +11,65 @@ module Opal
11
11
  )
12
12
  end
13
13
 
14
+ def on_forwarded_restarg(_node)
15
+ process(
16
+ s(:splat, s(:lvar, '$fwd_rest'))
17
+ )
18
+ end
19
+
20
+ def on_forwarded_kwrestarg(_node)
21
+ process(
22
+ s(:kwsplat, s(:lvar, '$fwd_kwrest'))
23
+ )
24
+ end
25
+
26
+ def on_block_pass(node)
27
+ if !node.children.first
28
+ process(
29
+ node.updated(nil,
30
+ [s(:lvar, '$fwd_block')]
31
+ )
32
+ )
33
+ else
34
+ super
35
+ end
36
+ end
37
+
14
38
  def on_args(node)
15
39
  if node.children.last && node.children.last.type == :forward_arg
16
40
  prev_children = node.children[0..-2]
17
41
 
18
- node.updated(nil,
42
+ super(node.updated(nil,
19
43
  [
20
44
  *prev_children,
21
45
  s(:restarg, '$fwd_rest'),
22
46
  s(:blockarg, '$fwd_block')
23
47
  ]
24
- )
48
+ ))
49
+ else
50
+ super
51
+ end
52
+ end
53
+
54
+ def on_restarg(node)
55
+ if !node.children.first
56
+ node.updated(nil, ['$fwd_rest'])
57
+ else
58
+ super
59
+ end
60
+ end
61
+
62
+ def on_kwrestarg(node)
63
+ if !node.children.first
64
+ node.updated(nil, ['$fwd_kwrest'])
65
+ else
66
+ super
67
+ end
68
+ end
69
+
70
+ def on_blockarg(node)
71
+ if !node.children.first
72
+ node.updated(nil, ['$fwd_block'])
25
73
  else
26
74
  super
27
75
  end
@@ -34,7 +82,7 @@ module Opal
34
82
 
35
83
  prev_children = node.children[0..-2]
36
84
 
37
- node.updated(nil,
85
+ super(node.updated(nil,
38
86
  [
39
87
  *prev_children,
40
88
  s(:splat,
@@ -44,7 +92,7 @@ module Opal
44
92
  s(:lvar, '$fwd_block')
45
93
  )
46
94
  ]
47
- )
95
+ ))
48
96
  else
49
97
  super
50
98
  end
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'opal/rewriters/base'
4
+
5
+ module Opal
6
+ module Rewriters
7
+ # This module attempts to run some optimizations or compatibility
8
+ # improvements against some libraries used with Opal.
9
+ #
10
+ # This should be a last resort and must not break functionality in
11
+ # existing applications.
12
+ class TargetedPatches < Base
13
+ def on_def(node)
14
+ name, args, body = *node
15
+
16
+ if body && body.type == :begin && body.children.length >= 2
17
+ # parser/rubyxx.rb - racc generated code often looks like:
18
+ #
19
+ # def _reduce_219(val, _values, result)
20
+ # result = @builder.op_assign(val[0], val[1], val[2])
21
+ # result
22
+ # end
23
+ #
24
+ # This converter transform this into just
25
+ #
26
+ # def _reduce_219(val, _values, result)
27
+ # @builder.op_assign(val[0], val[1], val[2])
28
+ # end
29
+
30
+ calls = body.children
31
+ assignment, ret = calls.last(2)
32
+ if assignment.type == :lvasgn && ret.type == :lvar &&
33
+ assignment.children.first == ret.children.first
34
+
35
+ if calls.length == 2
36
+ node.updated(nil, [name, args, assignment.children[1]])
37
+ else
38
+ calls = calls[0..-3] << assignment.children[1]
39
+ node.updated(nil, [name, args, body.updated(nil, calls)])
40
+ end
41
+ else
42
+ super
43
+ end
44
+ else
45
+ super
46
+ end
47
+ end
48
+
49
+ def on_array(node)
50
+ children = node.children
51
+
52
+ # Optimize large arrays produced by lexer, but mainly we are interested
53
+ # in improving compile times, by reducing the tree for the further
54
+ # compilation efforts (also reducing the bundle size a bit)
55
+ #
56
+ # This particular patch reduces compile time of the following command
57
+ # by 12.5%:
58
+ #
59
+ # OPAL_CACHE_DISABLE=true OPAL_PREFORK_DISABLE=true bin/opal \
60
+ # --no-source-map -ropal-parser -ropal/platform -ce \
61
+ # 'puts ::Opal.compile($stdin.read)' > _Cnow.js
62
+ #
63
+ # So, in short, an array of a kind:
64
+ #
65
+ # [1, 2, 3, nil, nil, :something, :abc, nil, ...]
66
+ #
67
+ # Becomes compiled to:
68
+ #
69
+ # Opal.large_array_unpack("1,2,3,,something,abc,,...")
70
+
71
+ if children.length > 32
72
+ ssin_array = children.all? do |child|
73
+ # Break for wrong types
74
+ next false unless %i[str sym int nil].include?(child.type)
75
+ # Break for strings that may conflict with our numbers, nils and separator
76
+ next false if %i[str sym].include?(child.type) && child.children.first.to_s =~ /\A[0-9-]|\A\z|,/
77
+ # Break for too numbers out of range, as there may be decoding issues
78
+ next false if child.type == :int && !(-1_000_000..1_000_000).cover?(child.children.first)
79
+ true
80
+ end
81
+
82
+ if ssin_array
83
+ str = children.map { |i| i.children.first.to_s }.join(',')
84
+ node.updated(:jscall, [s(:js_tmp, :Opal), :large_array_unpack, s(:sym, str)])
85
+ else
86
+ super
87
+ end
88
+ else
89
+ super
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
data/lib/opal/version.rb CHANGED
@@ -3,5 +3,5 @@
3
3
  module Opal
4
4
  # WHEN RELEASING:
5
5
  # Remember to update RUBY_ENGINE_VERSION in opal/corelib/constants.rb too!
6
- VERSION = '1.6.1'
6
+ VERSION = '1.7.0'
7
7
  end
@@ -30,7 +30,7 @@ class ::BasicObject
30
30
  #{raise ::TypeError, "#{inspect} is not a symbol nor a string"}
31
31
  }
32
32
 
33
- var func = self['$' + symbol];
33
+ var func = self[Opal.jsid(symbol)];
34
34
 
35
35
  if (func) {
36
36
  if (block !== nil) {