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.
- checksums.yaml +4 -4
- data/.github/workflows/build.yml +17 -0
- data/CHANGELOG.md +35 -1
- data/Gemfile +1 -0
- data/HACKING.md +47 -26
- 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 +89 -50
- 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
data/spec/lib/builder_spec.rb
CHANGED
@@ -30,8 +30,8 @@ RSpec.describe Opal::Builder do
|
|
30
30
|
|
31
31
|
it 'compiles them as empty files' do
|
32
32
|
source = 'require "foo"'
|
33
|
-
expect(ruby_processor).to receive('new').with(source, anything, anything).once.and_call_original
|
34
|
-
expect(ruby_processor).to receive('new').with('', anything, anything).once.and_call_original
|
33
|
+
expect(ruby_processor).to receive('new').with(source, anything, anything, anything).once.and_call_original
|
34
|
+
expect(ruby_processor).to receive('new').with('', anything, anything, anything).once.and_call_original
|
35
35
|
|
36
36
|
builder.build_str(source, 'bar.rb')
|
37
37
|
end
|
@@ -53,8 +53,8 @@ RSpec.describe Opal::Builder do
|
|
53
53
|
|
54
54
|
it 'compiles them as empty files' do
|
55
55
|
source = 'puts 5'
|
56
|
-
expect(ruby_processor).to receive('new').with(anything, './base64.rb', anything).once.and_call_original
|
57
|
-
expect(ruby_processor).to receive('new').with(source, anything, anything).once.and_call_original
|
56
|
+
expect(ruby_processor).to receive('new').with(anything, './base64.rb', anything, anything).once.and_call_original
|
57
|
+
expect(ruby_processor).to receive('new').with(source, anything, anything, anything).once.and_call_original
|
58
58
|
|
59
59
|
builder.build_str(source, 'bar.rb')
|
60
60
|
end
|
@@ -15,6 +15,8 @@ RSpec.describe Opal::Rewriters::ForwardArgs do
|
|
15
15
|
end.yield_self { |children| s(ast.type, *children) }
|
16
16
|
when :fwd_rest
|
17
17
|
"$fwd_rest"
|
18
|
+
when :fwd_kwrest
|
19
|
+
"$fwd_kwrest"
|
18
20
|
when :fwd_block
|
19
21
|
"$fwd_block"
|
20
22
|
else
|
@@ -32,6 +34,36 @@ RSpec.describe Opal::Rewriters::ForwardArgs do
|
|
32
34
|
end
|
33
35
|
ENDDEST
|
34
36
|
|
37
|
+
include_examples 'it rewrites source-to-AST', <<~ENDSOURCE, correct_names.(ast_of(<<~ENDDEST))
|
38
|
+
def forward_star(*)
|
39
|
+
other(*)
|
40
|
+
end
|
41
|
+
ENDSOURCE
|
42
|
+
def forward_star(*fwd_rest)
|
43
|
+
other(*fwd_rest)
|
44
|
+
end
|
45
|
+
ENDDEST
|
46
|
+
|
47
|
+
include_examples 'it rewrites source-to-AST', <<~ENDSOURCE, correct_names.(ast_of(<<~ENDDEST))
|
48
|
+
def forward_kwstar(**)
|
49
|
+
other(**)
|
50
|
+
end
|
51
|
+
ENDSOURCE
|
52
|
+
def forward_kwstar(**fwd_kwrest)
|
53
|
+
other(**fwd_kwrest)
|
54
|
+
end
|
55
|
+
ENDDEST
|
56
|
+
|
57
|
+
include_examples 'it rewrites source-to-AST', <<~ENDSOURCE, correct_names.(ast_of(<<~ENDDEST))
|
58
|
+
def forward_block(&)
|
59
|
+
other(&)
|
60
|
+
end
|
61
|
+
ENDSOURCE
|
62
|
+
def forward_block(&fwd_block)
|
63
|
+
other(&fwd_block)
|
64
|
+
end
|
65
|
+
ENDDEST
|
66
|
+
|
35
67
|
include_examples 'it rewrites source-to-AST', <<~ENDSOURCE, correct_names.(ast_of(<<~ENDDEST))
|
36
68
|
def forward(first_arg, ...)
|
37
69
|
other(first_arg, second_arg, ...)
|
@@ -45,16 +77,4 @@ RSpec.describe Opal::Rewriters::ForwardArgs do
|
|
45
77
|
other(*fwd_rest, &fwd_block)
|
46
78
|
end
|
47
79
|
ENDDEST
|
48
|
-
|
49
|
-
# Not supported by the parser (nor by the rewriter which would have to rearrange the arguments)
|
50
|
-
|
51
|
-
# include_examples 'it rewrites source-to-AST', <<~ENDSOURCE, correct_names.(parse(<<~ENDDEST))
|
52
|
-
# def forward(a:, ...)
|
53
|
-
# other(...)
|
54
|
-
# end
|
55
|
-
# ENDSOURCE
|
56
|
-
# def forward(*fwd_rest, a:, &fwd_block)
|
57
|
-
# other(*fwd_rest, &fwd_block)
|
58
|
-
# end
|
59
|
-
# ENDDEST
|
60
80
|
end
|
data/spec/mspec-opal/runner.rb
CHANGED
@@ -79,6 +79,8 @@ class OSpecFormatter
|
|
79
79
|
'browser' => BrowserFormatter,
|
80
80
|
'server' => BrowserFormatter,
|
81
81
|
'chrome' => DottedFormatter,
|
82
|
+
'firefox' => DottedFormatter,
|
83
|
+
'deno' => NodeJSFormatter,
|
82
84
|
'node' => NodeJSFormatter,
|
83
85
|
'nodejs' => NodeJSFormatter,
|
84
86
|
'gjs' => ColoredDottedFormatter,
|
data/spec/ruby_specs
CHANGED
@@ -37,6 +37,8 @@ ruby/core/comparable
|
|
37
37
|
ruby/core/complex
|
38
38
|
!ruby/core/complex/marshal_dump_spec
|
39
39
|
|
40
|
+
ruby/core/data
|
41
|
+
|
40
42
|
ruby/core/enumerable
|
41
43
|
ruby/core/enumerator
|
42
44
|
ruby/core/enumerator/arithmetic_sequence
|
@@ -126,6 +128,8 @@ ruby/core/rational
|
|
126
128
|
ruby/core/regexp
|
127
129
|
ruby/core/random
|
128
130
|
|
131
|
+
ruby/core/refinement
|
132
|
+
|
129
133
|
ruby/core/string
|
130
134
|
!ruby/core/string/crypt_spec
|
131
135
|
!ruby/core/string/scrub_spec
|
data/stdlib/deno/base.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
module Deno
|
2
|
+
VERSION = `Deno.version.deno`
|
3
|
+
end
|
4
|
+
|
5
|
+
`Opal.exit = Deno.exit`
|
6
|
+
|
7
|
+
ARGV = `Deno.args.slice(2)`
|
8
|
+
ARGV.shift if ARGV.first == '--'
|
9
|
+
|
10
|
+
STDOUT.write_proc = ->(string) { `Deno.stdout.write(new TextEncoder().encode(string))` }
|
11
|
+
STDERR.write_proc = ->(string) { `Deno.stderr.write(new TextEncoder().encode(string))` }
|
12
|
+
|
13
|
+
STDIN.read_proc = %x{function(_count) {
|
14
|
+
// Ignore count, return as much as we can get
|
15
|
+
var buf = new Uint8Array(65536), count;
|
16
|
+
try {
|
17
|
+
count = Deno.stdin.readSync(buf);
|
18
|
+
}
|
19
|
+
catch (e) { // Windows systems may raise EOF
|
20
|
+
return nil;
|
21
|
+
}
|
22
|
+
if (count == 0) return nil;
|
23
|
+
return buf.toString('utf8', 0, count);
|
24
|
+
}}
|
25
|
+
|
26
|
+
STDIN.tty = true
|
27
|
+
STDOUT.tty = true
|
28
|
+
STDERR.tty = true
|
data/stdlib/deno/file.rb
ADDED
@@ -0,0 +1,340 @@
|
|
1
|
+
`/* global Deno */`
|
2
|
+
require 'corelib/file'
|
3
|
+
|
4
|
+
%x{
|
5
|
+
var warnings = {}, errno_codes = #{Errno.constants};
|
6
|
+
|
7
|
+
function handle_unsupported_feature(message) {
|
8
|
+
switch (Opal.config.unsupported_features_severity) {
|
9
|
+
case 'error':
|
10
|
+
#{Kernel.raise NotImplementedError, `message`}
|
11
|
+
break;
|
12
|
+
case 'warning':
|
13
|
+
warn(message)
|
14
|
+
break;
|
15
|
+
default: // ignore
|
16
|
+
// noop
|
17
|
+
}
|
18
|
+
}
|
19
|
+
function warn(string) {
|
20
|
+
if (warnings[string]) {
|
21
|
+
return;
|
22
|
+
}
|
23
|
+
warnings[string] = true;
|
24
|
+
#{warn(`string`)};
|
25
|
+
}
|
26
|
+
function is_utf8(bytes) {
|
27
|
+
var i = 0;
|
28
|
+
while (i < bytes.length) {
|
29
|
+
if ((// ASCII
|
30
|
+
bytes[i] === 0x09 ||
|
31
|
+
bytes[i] === 0x0A ||
|
32
|
+
bytes[i] === 0x0D ||
|
33
|
+
(0x20 <= bytes[i] && bytes[i] <= 0x7E)
|
34
|
+
)
|
35
|
+
) {
|
36
|
+
i += 1;
|
37
|
+
continue;
|
38
|
+
}
|
39
|
+
|
40
|
+
if ((// non-overlong 2-byte
|
41
|
+
(0xC2 <= bytes[i] && bytes[i] <= 0xDF) &&
|
42
|
+
(0x80 <= bytes[i + 1] && bytes[i + 1] <= 0xBF)
|
43
|
+
)
|
44
|
+
) {
|
45
|
+
i += 2;
|
46
|
+
continue;
|
47
|
+
}
|
48
|
+
|
49
|
+
if ((// excluding overlongs
|
50
|
+
bytes[i] === 0xE0 &&
|
51
|
+
(0xA0 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) &&
|
52
|
+
(0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF)
|
53
|
+
) ||
|
54
|
+
(// straight 3-byte
|
55
|
+
((0xE1 <= bytes[i] && bytes[i] <= 0xEC) ||
|
56
|
+
bytes[i] === 0xEE ||
|
57
|
+
bytes[i] === 0xEF) &&
|
58
|
+
(0x80 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) &&
|
59
|
+
(0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF)
|
60
|
+
) ||
|
61
|
+
(// excluding surrogates
|
62
|
+
bytes[i] === 0xED &&
|
63
|
+
(0x80 <= bytes[i + 1] && bytes[i + 1] <= 0x9F) &&
|
64
|
+
(0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF)
|
65
|
+
)
|
66
|
+
) {
|
67
|
+
i += 3;
|
68
|
+
continue;
|
69
|
+
}
|
70
|
+
|
71
|
+
if ((// planes 1-3
|
72
|
+
bytes[i] === 0xF0 &&
|
73
|
+
(0x90 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) &&
|
74
|
+
(0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) &&
|
75
|
+
(0x80 <= bytes[i + 3] && bytes[i + 3] <= 0xBF)
|
76
|
+
) ||
|
77
|
+
(// planes 4-15
|
78
|
+
(0xF1 <= bytes[i] && bytes[i] <= 0xF3) &&
|
79
|
+
(0x80 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) &&
|
80
|
+
(0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) &&
|
81
|
+
(0x80 <= bytes[i + 3] && bytes[i + 3] <= 0xBF)
|
82
|
+
) ||
|
83
|
+
(// plane 16
|
84
|
+
bytes[i] === 0xF4 &&
|
85
|
+
(0x80 <= bytes[i + 1] && bytes[i + 1] <= 0x8F) &&
|
86
|
+
(0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) &&
|
87
|
+
(0x80 <= bytes[i + 3] && bytes[i + 3] <= 0xBF)
|
88
|
+
)
|
89
|
+
) {
|
90
|
+
i += 4;
|
91
|
+
continue;
|
92
|
+
}
|
93
|
+
|
94
|
+
return false;
|
95
|
+
}
|
96
|
+
|
97
|
+
return true;
|
98
|
+
}
|
99
|
+
function executeIOAction(action) {
|
100
|
+
try {
|
101
|
+
return action();
|
102
|
+
} catch (error) {
|
103
|
+
if (errno_codes.indexOf(error.code) >= 0) {
|
104
|
+
var error_class = #{Errno.const_get(`error.code`)}
|
105
|
+
#{Kernel.raise `error_class`.new(`error.message`)}
|
106
|
+
}
|
107
|
+
#{Kernel.raise `error`}
|
108
|
+
}
|
109
|
+
}
|
110
|
+
}
|
111
|
+
|
112
|
+
class File < IO
|
113
|
+
`var __utf8TextDecoder__ = new TextDecoder('utf8')`
|
114
|
+
`var __textEncoder__ = new TextEncoder()`
|
115
|
+
|
116
|
+
def self.read(path)
|
117
|
+
`return executeIOAction(function(){return Deno.readFileSync(#{path}).toString()})`
|
118
|
+
end
|
119
|
+
|
120
|
+
def self.write(path, data)
|
121
|
+
`executeIOAction(function(){return Deno.writeFileSync(#{path}, __textEncoder__.encode(#{data}));})`
|
122
|
+
data.size
|
123
|
+
end
|
124
|
+
|
125
|
+
def self.delete(path)
|
126
|
+
`executeIOAction(function(){return Deno.removeSync(#{path})})`
|
127
|
+
end
|
128
|
+
|
129
|
+
class << self
|
130
|
+
alias unlink delete
|
131
|
+
end
|
132
|
+
|
133
|
+
def self.exist?(path)
|
134
|
+
path = path.path if path.respond_to? :path
|
135
|
+
`return executeIOAction(function(){return Deno.statSync(#{path})})`
|
136
|
+
end
|
137
|
+
|
138
|
+
def self.realpath(pathname, dir_string = nil, cache = nil, &block)
|
139
|
+
pathname = join(dir_string, pathname) if dir_string
|
140
|
+
if block_given?
|
141
|
+
`
|
142
|
+
Deno.realpath(#{pathname}, #{cache}, function(error, realpath){
|
143
|
+
if (error) Opal.IOError.$new(error.message)
|
144
|
+
else #{block.call(`realpath`)}
|
145
|
+
})
|
146
|
+
`
|
147
|
+
else
|
148
|
+
`return executeIOAction(function(){return Deno.realpathSync(#{pathname}, #{cache})})`
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
def self.join(*paths)
|
153
|
+
# by itself, `path.posix.join` normalizes leading // to /.
|
154
|
+
# restore the leading / on UNC paths (i.e., paths starting with //).
|
155
|
+
paths = paths.map(&:to_s)
|
156
|
+
prefix = paths.first&.start_with?('//') ? '/' : ''
|
157
|
+
path = prefix
|
158
|
+
paths.each do |pth|
|
159
|
+
path << if pth.end_with?('/') || pth.start_with?('/')
|
160
|
+
pth
|
161
|
+
else
|
162
|
+
'/' + pth
|
163
|
+
end
|
164
|
+
end
|
165
|
+
path
|
166
|
+
end
|
167
|
+
|
168
|
+
def self.directory?(path)
|
169
|
+
return false unless exist? path
|
170
|
+
result = `executeIOAction(function(){return !!Deno.lstatSync(path).isDirectory})`
|
171
|
+
unless result
|
172
|
+
realpath = realpath(path)
|
173
|
+
if realpath != path
|
174
|
+
result = `executeIOAction(function(){return !!Deno.lstatSync(realpath).isDirectory})`
|
175
|
+
end
|
176
|
+
end
|
177
|
+
result
|
178
|
+
end
|
179
|
+
|
180
|
+
def self.file?(path)
|
181
|
+
return false unless exist? path
|
182
|
+
result = `executeIOAction(function(){return !!Deno.lstatSync(path).isFile})`
|
183
|
+
unless result
|
184
|
+
realpath = realpath(path)
|
185
|
+
if realpath != path
|
186
|
+
result = `executeIOAction(function(){return !!Deno.lstatSync(realpath).isFile})`
|
187
|
+
end
|
188
|
+
end
|
189
|
+
result
|
190
|
+
end
|
191
|
+
|
192
|
+
def self.readable?(path)
|
193
|
+
return false unless exist? path
|
194
|
+
%{
|
195
|
+
try {
|
196
|
+
Deno.openSync(path, {read: true}).close();
|
197
|
+
return true;
|
198
|
+
} catch (error) {
|
199
|
+
return false;
|
200
|
+
}
|
201
|
+
}
|
202
|
+
end
|
203
|
+
|
204
|
+
def self.size(path)
|
205
|
+
`return executeIOAction(function(){return Deno.lstatSync(path).size})`
|
206
|
+
end
|
207
|
+
|
208
|
+
def self.open(path, mode = 'r')
|
209
|
+
file = new(path, mode)
|
210
|
+
if block_given?
|
211
|
+
begin
|
212
|
+
yield(file)
|
213
|
+
ensure
|
214
|
+
file.close
|
215
|
+
end
|
216
|
+
else
|
217
|
+
file
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
def self.stat(path)
|
222
|
+
path = path.path if path.respond_to? :path
|
223
|
+
File::Stat.new(path)
|
224
|
+
end
|
225
|
+
|
226
|
+
def self.mtime(path)
|
227
|
+
`return executeIOAction(function(){return Deno.statSync(#{path}).mtime})`
|
228
|
+
end
|
229
|
+
|
230
|
+
def self.symlink?(path)
|
231
|
+
`return executeIOAction(function(){return Deno.lstatSync(#{path}).isSymLink})`
|
232
|
+
end
|
233
|
+
|
234
|
+
def self.absolute_path(path, basedir = nil)
|
235
|
+
raise 'File::absolute_path is currently unsupported in Deno!'
|
236
|
+
end
|
237
|
+
|
238
|
+
# Instance Methods
|
239
|
+
|
240
|
+
def initialize(path, flags = 'r')
|
241
|
+
@binary_flag = flags.include?('b')
|
242
|
+
# Node does not recognize this flag
|
243
|
+
flags = flags.delete('b')
|
244
|
+
# encoding flag is unsupported
|
245
|
+
encoding_option_rx = /:(.*)/
|
246
|
+
if encoding_option_rx.match?(flags)
|
247
|
+
`handle_unsupported_feature("Encoding option (:encoding) is unsupported by Node.js openSync method and will be removed.")`
|
248
|
+
flags = flags.sub(encoding_option_rx, '')
|
249
|
+
end
|
250
|
+
@path = path
|
251
|
+
|
252
|
+
fd = `executeIOAction(function(){return Deno.openSync(path, flags)})`
|
253
|
+
super(fd, flags)
|
254
|
+
end
|
255
|
+
|
256
|
+
attr_reader :path
|
257
|
+
|
258
|
+
def sysread(bytes)
|
259
|
+
if @eof
|
260
|
+
raise EOFError, 'end of file reached'
|
261
|
+
else
|
262
|
+
if @binary_flag
|
263
|
+
%x{
|
264
|
+
var buf = executeIOAction(function(){return Deno.readFileSync(#{@path})})
|
265
|
+
var content
|
266
|
+
if (is_utf8(buf)) {
|
267
|
+
content = buf.toString('utf8')
|
268
|
+
} else {
|
269
|
+
// coerce to utf8
|
270
|
+
content = __utf8TextDecoder__.decode(__textEncoder__.encode(buf.toString('binary')))
|
271
|
+
}
|
272
|
+
}
|
273
|
+
res = `content`
|
274
|
+
else
|
275
|
+
res = `executeIOAction(function(){return Deno.readFileSync(#{@path}).toString('utf8')})`
|
276
|
+
end
|
277
|
+
@eof = true
|
278
|
+
@lineno = res.size
|
279
|
+
res
|
280
|
+
end
|
281
|
+
end
|
282
|
+
|
283
|
+
def write(string)
|
284
|
+
`executeIOAction(function(){return #{@fd}.writeSync(__textEncoder__.encode(#{string}))})`
|
285
|
+
end
|
286
|
+
|
287
|
+
def flush
|
288
|
+
# not supported by deno
|
289
|
+
end
|
290
|
+
|
291
|
+
def close
|
292
|
+
`executeIOAction(function(){return #{@fd}.close()})`
|
293
|
+
super
|
294
|
+
end
|
295
|
+
|
296
|
+
def mtime
|
297
|
+
`return executeIOAction(function(){return Deno.statSync(#{@path}).mtime})`
|
298
|
+
end
|
299
|
+
end
|
300
|
+
|
301
|
+
class File::Stat
|
302
|
+
def initialize(path)
|
303
|
+
@path = path
|
304
|
+
end
|
305
|
+
|
306
|
+
def file?
|
307
|
+
`return executeIOAction(function(){return Deno.statSync(#{@path}).isFile})`
|
308
|
+
end
|
309
|
+
|
310
|
+
def directory?
|
311
|
+
`return executeIOAction(function(){return Deno.statSync(#{@path}).isDirectory})`
|
312
|
+
end
|
313
|
+
|
314
|
+
def mtime
|
315
|
+
`return executeIOAction(function(){return Deno.statSync(#{@path}).mtime})`
|
316
|
+
end
|
317
|
+
|
318
|
+
def readable?
|
319
|
+
%x{
|
320
|
+
return executeIOAction(function(){
|
321
|
+
Deno.openSync(path, {read: true}).close();
|
322
|
+
return true;
|
323
|
+
})
|
324
|
+
}
|
325
|
+
end
|
326
|
+
|
327
|
+
def writable?
|
328
|
+
%x{
|
329
|
+
return executeIOAction(function(){
|
330
|
+
Deno.openSync(path, {write: true}).close();
|
331
|
+
return true;
|
332
|
+
})
|
333
|
+
}
|
334
|
+
end
|
335
|
+
|
336
|
+
def executable?
|
337
|
+
# accessible only over unstable API
|
338
|
+
false
|
339
|
+
end
|
340
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class File
|
4
|
+
def self.write(path, data)
|
5
|
+
# This is only to enable CDP runners to write the benchmark results
|
6
|
+
%x{
|
7
|
+
var http = new XMLHttpRequest();
|
8
|
+
http.open("POST", "/File.write");
|
9
|
+
http.setRequestHeader("Content-Type", "application/json");
|
10
|
+
// Failure is not an option
|
11
|
+
http.send(JSON.stringify({filename: #{path}, data: #{data}, secret: window.OPAL_CDP_SHARED_SECRET}));
|
12
|
+
}
|
13
|
+
data.length
|
14
|
+
end
|
15
|
+
end
|
data/stdlib/native.rb
CHANGED
@@ -615,7 +615,7 @@ end
|
|
615
615
|
class Class
|
616
616
|
def native_alias(new_jsid, existing_mid)
|
617
617
|
%x{
|
618
|
-
var aliased = #{self}.prototype[
|
618
|
+
var aliased = #{self}.prototype[Opal.jsid(#{existing_mid})];
|
619
619
|
if (!aliased) {
|
620
620
|
#{raise NameError.new("undefined method `#{existing_mid}' for class `#{inspect}'", existing_mid)};
|
621
621
|
}
|
data/stdlib/nodejs/file.rb
CHANGED
@@ -135,6 +135,11 @@ class File < IO
|
|
135
135
|
data.size
|
136
136
|
end
|
137
137
|
|
138
|
+
def self.symlink(path, new_path)
|
139
|
+
`executeIOAction(function(){return __fs__.symlinkSync(#{path}, #{new_path})})`
|
140
|
+
0
|
141
|
+
end
|
142
|
+
|
138
143
|
def self.delete(path)
|
139
144
|
`executeIOAction(function(){return __fs__.unlinkSync(#{path})})`
|
140
145
|
end
|
data/stdlib/opal/platform.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
1
|
require 'opal-platform'
|
2
2
|
|
3
3
|
case OPAL_PLATFORM
|
4
|
-
when 'nashorn'
|
5
|
-
when 'gjs'
|
6
|
-
when 'quickjs'
|
7
|
-
when '
|
8
|
-
when '
|
9
|
-
when '
|
4
|
+
when 'nashorn' then require 'nashorn'
|
5
|
+
when 'gjs' then require 'gjs'
|
6
|
+
when 'quickjs' then require 'quickjs'
|
7
|
+
when 'deno' then require 'deno/base'
|
8
|
+
when 'nodejs' then require 'nodejs/base'
|
9
|
+
when 'headless-chrome' then require 'headless_browser/base'
|
10
|
+
when 'headless-firefox' then require 'headless_browser/base'
|
11
|
+
when 'opal-miniracer' then require 'opal/miniracer'
|
10
12
|
end
|
data/stdlib/opal-platform.rb
CHANGED
@@ -1,19 +1,25 @@
|
|
1
|
-
`/* global Java, GjsFileImporter */`
|
1
|
+
`/* global Java, GjsFileImporter, Deno */`
|
2
2
|
|
3
|
-
browser
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
3
|
+
browser = `typeof(document) !== "undefined"`
|
4
|
+
deno = `typeof(Deno) === "object" && typeof(Deno.version) === "object"`
|
5
|
+
node = `typeof(process) !== "undefined" && process.versions && process.versions.node`
|
6
|
+
nashorn = `typeof(Java) !== "undefined" && Java.type`
|
7
|
+
headless_chrome = `typeof(opalheadlesschrome) !== "undefined"`
|
8
|
+
headless_firefox = `typeof(opalheadlessfirefox) !== "undefined"`
|
9
|
+
gjs = `typeof(window) !== "undefined" && typeof(GjsFileImporter) !== "undefined"`
|
10
|
+
quickjs = `typeof(window) === "undefined" && typeof(__loadScript) !== "undefined"`
|
11
|
+
opal_miniracer = `typeof(opalminiracer) !== "undefined"`
|
10
12
|
|
11
13
|
OPAL_PLATFORM = if nashorn
|
12
14
|
'nashorn'
|
15
|
+
elsif deno
|
16
|
+
'deno'
|
13
17
|
elsif node
|
14
18
|
'nodejs'
|
15
19
|
elsif headless_chrome
|
16
20
|
'headless-chrome'
|
21
|
+
elsif headless_firefox
|
22
|
+
'headless-firefox'
|
17
23
|
elsif gjs
|
18
24
|
'gjs'
|
19
25
|
elsif quickjs
|