opal 1.6.1 → 1.7.0.rc1

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/Gemfile +1 -0
  4. data/HACKING.md +47 -26
  5. data/UNRELEASED.md +28 -0
  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 +91 -52
  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.rc1'
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) {