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.
- checksums.yaml +4 -4
- data/.github/workflows/build.yml +17 -0
- data/Gemfile +1 -0
- data/HACKING.md +47 -26
- data/UNRELEASED.md +28 -0
- data/benchmark/benchmarks +415 -103
- data/benchmark/bm_call_overhead.yml +28 -0
- data/benchmark/run.rb +61 -40
- data/docs/cdp_common.json +3364 -0
- data/docs/cdp_common.md +18 -0
- data/docs/{headless_chrome.md → headless_browsers.md} +31 -12
- data/lib/opal/ast/builder.rb +1 -1
- data/lib/opal/builder.rb +6 -1
- data/lib/opal/builder_processors.rb +5 -3
- data/lib/opal/cache.rb +1 -7
- data/lib/opal/cli_options.rb +72 -58
- data/lib/opal/cli_runners/chrome.rb +47 -9
- data/lib/opal/cli_runners/chrome_cdp_interface.rb +238 -112
- data/lib/opal/cli_runners/compiler.rb +146 -13
- data/lib/opal/cli_runners/deno.rb +32 -0
- data/lib/opal/cli_runners/firefox.rb +350 -0
- data/lib/opal/cli_runners/firefox_cdp_interface.rb +212 -0
- data/lib/opal/cli_runners/node_modules/.bin/chrome-remote-interface.cmd +17 -0
- data/lib/opal/cli_runners/node_modules/.bin/chrome-remote-interface.ps1 +28 -0
- data/lib/opal/cli_runners/node_modules/.package-lock.json +41 -0
- data/lib/opal/cli_runners/node_modules/chrome-remote-interface/LICENSE +1 -1
- data/lib/opal/cli_runners/node_modules/chrome-remote-interface/README.md +322 -182
- data/lib/opal/cli_runners/node_modules/chrome-remote-interface/bin/client.js +99 -114
- data/lib/opal/cli_runners/node_modules/chrome-remote-interface/chrome-remote-interface.js +1 -11
- data/lib/opal/cli_runners/node_modules/chrome-remote-interface/index.js +16 -11
- data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/api.js +41 -33
- data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/chrome.js +224 -214
- data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/devtools.js +71 -191
- data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/external-request.js +26 -6
- data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/protocol.json +20788 -9049
- data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/websocket-wrapper.js +10 -3
- data/lib/opal/cli_runners/node_modules/chrome-remote-interface/package.json +59 -123
- data/lib/opal/cli_runners/node_modules/chrome-remote-interface/webpack.config.js +25 -32
- data/lib/opal/cli_runners/node_modules/commander/History.md +298 -0
- data/lib/opal/cli_runners/node_modules/commander/LICENSE +22 -0
- data/lib/opal/cli_runners/node_modules/commander/Readme.md +217 -61
- data/lib/opal/cli_runners/node_modules/commander/index.js +431 -145
- data/lib/opal/cli_runners/node_modules/commander/package.json +16 -79
- data/lib/opal/cli_runners/node_modules/ws/README.md +334 -98
- data/lib/opal/cli_runners/node_modules/ws/browser.js +8 -0
- data/lib/opal/cli_runners/node_modules/ws/index.js +5 -10
- data/lib/opal/cli_runners/node_modules/ws/lib/buffer-util.js +129 -0
- data/lib/opal/cli_runners/node_modules/ws/lib/constants.js +10 -0
- data/lib/opal/cli_runners/node_modules/ws/lib/event-target.js +184 -0
- data/lib/opal/cli_runners/node_modules/ws/lib/extension.js +223 -0
- data/lib/opal/cli_runners/node_modules/ws/lib/limiter.js +55 -0
- data/lib/opal/cli_runners/node_modules/ws/lib/permessage-deflate.js +518 -0
- data/lib/opal/cli_runners/node_modules/ws/lib/receiver.js +607 -0
- data/lib/opal/cli_runners/node_modules/ws/lib/sender.js +409 -0
- data/lib/opal/cli_runners/node_modules/ws/lib/stream.js +180 -0
- data/lib/opal/cli_runners/node_modules/ws/lib/validation.js +104 -0
- data/lib/opal/cli_runners/node_modules/ws/lib/websocket-server.js +447 -0
- data/lib/opal/cli_runners/node_modules/ws/lib/websocket.js +1195 -0
- data/lib/opal/cli_runners/node_modules/ws/package.json +40 -106
- data/lib/opal/cli_runners/package-lock.json +62 -0
- data/lib/opal/cli_runners/package.json +1 -1
- data/lib/opal/cli_runners.rb +26 -4
- data/lib/opal/nodes/args/prepare_post_args.rb +2 -2
- data/lib/opal/nodes/def.rb +8 -8
- data/lib/opal/nodes/iter.rb +12 -12
- data/lib/opal/nodes/logic.rb +1 -1
- data/lib/opal/nodes/masgn.rb +2 -2
- data/lib/opal/parser/with_ruby_lexer.rb +1 -1
- data/lib/opal/paths.rb +14 -0
- data/lib/opal/rewriter.rb +2 -0
- data/lib/opal/rewriters/forward_args.rb +52 -4
- data/lib/opal/rewriters/targeted_patches.rb +94 -0
- data/lib/opal/version.rb +1 -1
- data/opal/corelib/basic_object.rb +1 -1
- data/opal/corelib/boolean.rb +2 -2
- data/opal/corelib/class.rb +11 -0
- data/opal/corelib/constants.rb +3 -3
- data/opal/corelib/enumerable.rb +4 -0
- data/opal/corelib/enumerator.rb +1 -1
- data/opal/corelib/hash.rb +2 -2
- data/opal/corelib/helpers.rb +1 -1
- data/opal/corelib/kernel.rb +3 -3
- data/opal/corelib/method.rb +1 -1
- data/opal/corelib/module.rb +29 -8
- data/opal/corelib/proc.rb +7 -5
- data/opal/corelib/runtime.js +141 -78
- data/opal/corelib/set.rb +252 -0
- data/opal/corelib/string.rb +2 -1
- data/opal/corelib/time.rb +2 -2
- data/opal/opal.rb +1 -0
- data/opal.gemspec +1 -0
- data/spec/filters/bugs/array.rb +22 -13
- data/spec/filters/bugs/base64.rb +5 -5
- data/spec/filters/bugs/basicobject.rb +16 -8
- data/spec/filters/bugs/bigdecimal.rb +161 -160
- data/spec/filters/bugs/binding.rb +10 -10
- data/spec/filters/bugs/class.rb +8 -8
- data/spec/filters/bugs/complex.rb +2 -1
- data/spec/filters/bugs/date.rb +79 -81
- data/spec/filters/bugs/datetime.rb +29 -29
- data/spec/filters/bugs/delegate.rb +1 -3
- data/spec/filters/bugs/encoding.rb +69 -69
- data/spec/filters/bugs/enumerable.rb +22 -20
- data/spec/filters/bugs/enumerator.rb +88 -85
- data/spec/filters/bugs/exception.rb +46 -40
- data/spec/filters/bugs/file.rb +32 -32
- data/spec/filters/bugs/float.rb +26 -21
- data/spec/filters/bugs/freeze.rb +88 -0
- data/spec/filters/bugs/hash.rb +39 -38
- data/spec/filters/bugs/integer.rb +57 -44
- data/spec/filters/bugs/io.rb +1 -1
- data/spec/filters/bugs/kernel.rb +349 -269
- data/spec/filters/bugs/language.rb +220 -188
- data/spec/filters/bugs/main.rb +5 -3
- data/spec/filters/bugs/marshal.rb +38 -38
- data/spec/filters/bugs/math.rb +2 -1
- data/spec/filters/bugs/method.rb +73 -62
- data/spec/filters/bugs/module.rb +163 -143
- data/spec/filters/bugs/numeric.rb +6 -6
- data/spec/filters/bugs/objectspace.rb +16 -16
- data/spec/filters/bugs/openstruct.rb +1 -1
- data/spec/filters/bugs/pack_unpack.rb +51 -51
- data/spec/filters/bugs/pathname.rb +7 -7
- data/spec/filters/bugs/proc.rb +63 -63
- data/spec/filters/bugs/random.rb +7 -6
- data/spec/filters/bugs/range.rb +12 -9
- data/spec/filters/bugs/rational.rb +8 -7
- data/spec/filters/bugs/regexp.rb +49 -48
- data/spec/filters/bugs/ruby-32.rb +56 -0
- data/spec/filters/bugs/set.rb +30 -30
- data/spec/filters/bugs/singleton.rb +4 -4
- data/spec/filters/bugs/string.rb +187 -99
- data/spec/filters/bugs/stringio.rb +7 -0
- data/spec/filters/bugs/stringscanner.rb +68 -68
- data/spec/filters/bugs/struct.rb +11 -9
- data/spec/filters/bugs/symbol.rb +1 -1
- data/spec/filters/bugs/time.rb +78 -63
- data/spec/filters/bugs/trace_point.rb +4 -4
- data/spec/filters/bugs/unboundmethod.rb +32 -17
- data/spec/filters/bugs/warnings.rb +8 -12
- data/spec/filters/unsupported/array.rb +24 -107
- data/spec/filters/unsupported/basicobject.rb +12 -12
- data/spec/filters/unsupported/bignum.rb +27 -52
- data/spec/filters/unsupported/class.rb +1 -2
- data/spec/filters/unsupported/delegator.rb +3 -3
- data/spec/filters/unsupported/enumerable.rb +2 -9
- data/spec/filters/unsupported/enumerator.rb +2 -11
- data/spec/filters/unsupported/file.rb +1 -1
- data/spec/filters/unsupported/float.rb +28 -47
- data/spec/filters/unsupported/hash.rb +8 -14
- data/spec/filters/unsupported/integer.rb +75 -91
- data/spec/filters/unsupported/kernel.rb +17 -35
- data/spec/filters/unsupported/language.rb +11 -19
- data/spec/filters/unsupported/marshal.rb +22 -41
- data/spec/filters/unsupported/matchdata.rb +28 -52
- data/spec/filters/unsupported/math.rb +1 -1
- data/spec/filters/unsupported/privacy.rb +229 -285
- data/spec/filters/unsupported/range.rb +1 -5
- data/spec/filters/unsupported/regexp.rb +40 -66
- data/spec/filters/unsupported/set.rb +2 -2
- data/spec/filters/unsupported/singleton.rb +4 -4
- data/spec/filters/unsupported/string.rb +305 -508
- data/spec/filters/unsupported/struct.rb +3 -4
- data/spec/filters/unsupported/symbol.rb +15 -18
- data/spec/filters/unsupported/thread.rb +1 -7
- data/spec/filters/unsupported/time.rb +159 -202
- data/spec/filters/unsupported/usage_of_files.rb +170 -259
- data/spec/lib/builder_spec.rb +4 -4
- data/spec/lib/rewriters/forward_args_spec.rb +32 -12
- data/spec/mspec-opal/runner.rb +2 -0
- data/spec/ruby_specs +4 -0
- data/stdlib/deno/base.rb +28 -0
- data/stdlib/deno/file.rb +340 -0
- data/stdlib/{headless_chrome.rb → headless_browser/base.rb} +1 -1
- data/stdlib/headless_browser/file.rb +15 -0
- data/stdlib/headless_browser.rb +4 -0
- data/stdlib/native.rb +1 -1
- data/stdlib/nodejs/file.rb +5 -0
- data/stdlib/opal/platform.rb +8 -6
- data/stdlib/opal-platform.rb +14 -8
- data/stdlib/set.rb +1 -258
- data/tasks/benchmarking.rake +62 -19
- data/tasks/performance.rake +1 -1
- data/tasks/testing.rake +5 -3
- data/test/nodejs/test_file.rb +29 -10
- data/test/opal/http_server.rb +28 -11
- data/test/opal/unsupported_and_bugs.rb +2 -1
- metadata +91 -52
- data/lib/opal/cli_runners/node_modules/ultron/LICENSE +0 -22
- data/lib/opal/cli_runners/node_modules/ultron/index.js +0 -138
- data/lib/opal/cli_runners/node_modules/ultron/package.json +0 -112
- data/lib/opal/cli_runners/node_modules/ws/SECURITY.md +0 -33
- data/lib/opal/cli_runners/node_modules/ws/lib/BufferUtil.fallback.js +0 -56
- data/lib/opal/cli_runners/node_modules/ws/lib/BufferUtil.js +0 -15
- data/lib/opal/cli_runners/node_modules/ws/lib/ErrorCodes.js +0 -28
- data/lib/opal/cli_runners/node_modules/ws/lib/EventTarget.js +0 -158
- data/lib/opal/cli_runners/node_modules/ws/lib/Extensions.js +0 -69
- data/lib/opal/cli_runners/node_modules/ws/lib/PerMessageDeflate.js +0 -339
- data/lib/opal/cli_runners/node_modules/ws/lib/Receiver.js +0 -520
- data/lib/opal/cli_runners/node_modules/ws/lib/Sender.js +0 -438
- data/lib/opal/cli_runners/node_modules/ws/lib/Validation.fallback.js +0 -9
- data/lib/opal/cli_runners/node_modules/ws/lib/Validation.js +0 -17
- data/lib/opal/cli_runners/node_modules/ws/lib/WebSocket.js +0 -705
- data/lib/opal/cli_runners/node_modules/ws/lib/WebSocketServer.js +0 -336
- data/spec/filters/bugs/boolean.rb +0 -3
- data/spec/filters/bugs/matrix.rb +0 -3
- data/spec/filters/unsupported/fixnum.rb +0 -15
- data/spec/filters/unsupported/freeze.rb +0 -102
- data/spec/filters/unsupported/pathname.rb +0 -4
- data/spec/filters/unsupported/proc.rb +0 -4
- data/spec/filters/unsupported/random.rb +0 -5
- data/spec/filters/unsupported/taint.rb +0 -162
@@ -1,81 +1,7 @@
|
|
1
1
|
{
|
2
|
-
"
|
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
|
-
"
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
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
|
-
"
|
116
|
-
"integration": "
|
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
|
-
"
|
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
|
+
}
|
data/lib/opal/cli_runners.rb
CHANGED
@@ -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
|
-
|
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
|
20
|
+
push "$post_args = $slice(arguments)"
|
21
21
|
else
|
22
|
-
push "$post_args = $slice
|
22
|
+
push "$post_args = $slice(arguments, #{offset})"
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
data/lib/opal/nodes/def.rb
CHANGED
@@ -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
|
17
|
+
blockopts["$$arity"] = arity if arity < 0
|
18
18
|
|
19
19
|
if compiler.arity_check?
|
20
|
-
blockopts
|
20
|
+
blockopts["$$parameters"] = parameters_code
|
21
21
|
end
|
22
22
|
|
23
23
|
if compiler.parse_comments?
|
24
|
-
blockopts
|
24
|
+
blockopts["$$comments"] = comments_code
|
25
25
|
end
|
26
26
|
|
27
27
|
if compiler.enable_source_location?
|
28
|
-
blockopts
|
28
|
+
blockopts["$$source_location"] = source_location
|
29
29
|
end
|
30
30
|
|
31
|
-
if blockopts.
|
31
|
+
if blockopts.keys == ["$$arity"]
|
32
32
|
push ", #{arity}"
|
33
|
-
elsif blockopts.
|
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
|
data/lib/opal/nodes/iter.rb
CHANGED
@@ -14,18 +14,18 @@ module Opal
|
|
14
14
|
|
15
15
|
compile_body_or_shortcut
|
16
16
|
|
17
|
-
blockopts =
|
18
|
-
blockopts
|
19
|
-
blockopts
|
20
|
-
blockopts
|
21
|
-
blockopts
|
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
|
24
|
+
blockopts["$$parameters"] = parameters_code
|
25
25
|
end
|
26
26
|
|
27
27
|
if compiler.enable_source_location?
|
28
|
-
blockopts
|
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
|
40
|
+
blockopts["$$has_top_level_mlhs_arg"] = "true"
|
41
41
|
end
|
42
42
|
|
43
43
|
if has_trailing_comma_in_args?
|
44
|
-
blockopts
|
44
|
+
blockopts["$$has_trailing_comma_in_args"] = "true"
|
45
45
|
end
|
46
46
|
|
47
|
-
if blockopts.
|
47
|
+
if blockopts.keys == ["$$arity"]
|
48
48
|
push ", #{arity}"
|
49
|
-
elsif blockopts.
|
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
|
data/lib/opal/nodes/logic.rb
CHANGED
data/lib/opal/nodes/masgn.rb
CHANGED
@@ -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
|
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
|
58
|
+
part = part.dup << s(:js_tmp, "$slice(#{array}, #{pre_splat.size}, #{tmp})")
|
59
59
|
push ', '
|
60
60
|
push expr(part)
|
61
61
|
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