opal 1.8.1 → 1.8.3.rc1
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 +30 -41
- data/.rubocop.yml +3 -1
- data/CHANGELOG.md +14 -2
- data/Gemfile +1 -0
- data/UNRELEASED.md +13 -3
- data/docs/compiled_ruby.md +14 -14
- data/docs/releasing.md +4 -2
- data/exe/opal-build +1 -1
- data/lib/opal/compiler.rb +1 -1
- data/lib/opal/nodes/call_special.rb +1 -1
- data/lib/opal/nodes/literal.rb +1 -1
- data/lib/opal/nodes/rescue.rb +1 -1
- data/lib/opal/nodes/scope.rb +1 -1
- data/lib/opal/version.rb +1 -1
- data/opal/corelib/array.rb +1 -1
- data/opal/corelib/basic_object.rb +1 -1
- data/opal/corelib/constants.rb +3 -3
- data/opal/corelib/error.rb +16 -1
- data/opal/corelib/hash.rb +1 -1
- data/opal/corelib/io.rb +1 -1
- data/opal/corelib/module.rb +1 -1
- data/opal/corelib/object_space.rb +1 -1
- data/opal/corelib/runtime.js +2 -2
- data/opal/corelib/string/encoding.rb +6 -6
- data/opal/corelib/string.rb +3 -3
- data/opal.gemspec +2 -1
- data/spec/lib/compiler_spec.rb +16 -6
- data/spec/lib/fixtures/build_order/file5.rb.erb +1 -1
- data/spec/lib/rewriters/hashes/key_duplicates_rewriter_spec.rb +1 -1
- data/spec/lib/spec_helper.rb +11 -0
- data/spec/opal/core/array/include_spec.rb +12 -0
- data/spec/opal/core/runtime/rescue_spec.rb +5 -5
- data/spec/opal/core/string_spec.rb +35 -0
- data/spec/opal/stdlib/native/hash_spec.rb +2 -2
- data/spec/opal/stdlib/opal_raw_spec.rb +74 -0
- data/spec/support/source_map_helper.rb +1 -3
- data/stdlib/bigdecimal.rb +14 -14
- data/stdlib/date/date_time.rb +1 -1
- data/stdlib/deno/file.rb +1 -1
- data/stdlib/js.rb +7 -66
- data/stdlib/native.rb +3 -3
- data/stdlib/nodejs/file.rb +7 -7
- data/stdlib/opal/raw.rb +73 -0
- data/stdlib/optparse.rb +6 -6
- data/stdlib/shellwords.rb +1 -1
- data/tasks/testing.rake +13 -2
- metadata +27 -10
- data/spec/opal/stdlib/js_spec.rb +0 -74
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0b7bdbaa11982b36e41c9595ac6cba3ced898573fa40bee52b0d599aee66c0d9
|
4
|
+
data.tar.gz: 23b40fdd12f4b82aafb53ffcc376aff8ee7635e74f37fe7b711d99dbc2c315ac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 419a5ea103d370ec908f98bd2e4e24d79401d8704b781eea52b359041b12b6a012eb048caa01bd2ccedd34746e22b0b6a2fbce51802bc040157855a393b58244
|
7
|
+
data.tar.gz: 2ba934b813ebb3fb51291273cb4653f80652a1a2a02555b7fd97d8d4c1813fe13938c85495b18b426e59a384dc0cdf706b1e4df63a117163d8327418ac83ec2d
|
data/.github/workflows/build.yml
CHANGED
@@ -14,82 +14,64 @@ permissions:
|
|
14
14
|
jobs:
|
15
15
|
rake:
|
16
16
|
name: ${{ matrix.combo.name || matrix.combo.ruby }}
|
17
|
+
env:
|
18
|
+
DEFAULT_RUBY: '3.3'
|
17
19
|
strategy:
|
18
20
|
fail-fast: false
|
19
21
|
matrix:
|
20
22
|
combo:
|
21
23
|
- name: mspec-nodejs
|
22
|
-
ruby: '3.0'
|
23
24
|
command: bin/rake mspec_nodejs
|
24
25
|
- name: mspec-chrome
|
25
|
-
ruby: '3.0'
|
26
26
|
command: bin/rake mspec_chrome
|
27
27
|
- name: mspec-firefox
|
28
|
-
|
29
|
-
# when changing version, also change it below
|
30
|
-
MOZILLA_FIREFOX_BINARY: '/opt/hostedtoolcache/firefox/106.0.4/x64/firefox'
|
31
|
-
ruby: '3.0'
|
28
|
+
firefox: '106.0.4'
|
32
29
|
command: xvfb-run bin/rake mspec_firefox
|
33
30
|
- name: minitest
|
34
|
-
ruby: '3.0'
|
35
31
|
command: bin/rake minitest
|
36
32
|
- name: minitest-strict-mode
|
37
|
-
ruby: '3.0'
|
38
33
|
command: bin/rake minitest
|
39
34
|
strict: 'true'
|
40
|
-
- name: head-ruby
|
41
|
-
|
42
|
-
|
35
|
+
# - name: head-ruby
|
36
|
+
# ruby: head
|
37
|
+
# permissive: true
|
43
38
|
- name: current-ruby
|
44
|
-
ruby: 3.
|
39
|
+
ruby: '3.3'
|
45
40
|
- name: previous-ruby
|
46
|
-
ruby: '3.
|
41
|
+
ruby: '3.2'
|
47
42
|
- name: older-ruby
|
48
|
-
ruby:
|
43
|
+
ruby: '3.1'
|
49
44
|
- name: near-eol-ruby
|
50
|
-
ruby: 2.6
|
51
|
-
- name: smoke-test
|
52
45
|
ruby: '3.0'
|
46
|
+
- name: smoke-test
|
53
47
|
command: bin/rake smoke_test
|
54
48
|
- name: windows-mspec-nodejs
|
55
49
|
command: bundle exec rake mspec_nodejs
|
56
|
-
ruby: '3.0'
|
57
50
|
os: windows-latest
|
58
51
|
- name: windows-mspec-chrome
|
59
52
|
command: bundle exec rake mspec_chrome
|
60
|
-
ruby: '3.0'
|
61
53
|
os: windows-latest
|
62
54
|
# - name: windows-mspec-firefox
|
63
|
-
#
|
64
|
-
# # when changing version, also change it below and above
|
65
|
-
# MOZILLA_FIREFOX_BINARY: 'C:/Program Files/Firefox_106.0.4/firefox.exe'
|
66
|
-
# ruby: '3.0'
|
55
|
+
# firefox: '106.0.4'
|
67
56
|
# command: bundle exec rake mspec_firefox
|
68
57
|
# os: windows-latest
|
69
58
|
- name: macos-mspec-safari
|
70
59
|
command: bundle exec rake mspec_safari
|
71
|
-
ruby: '3.0'
|
72
60
|
os: 'macos-latest'
|
73
61
|
- name: windows-minitest
|
74
62
|
command: bundle exec rake minitest
|
75
|
-
ruby: '3.0'
|
76
63
|
os: windows-latest
|
77
64
|
- name: windows
|
78
65
|
command: bundle exec rake rspec
|
79
|
-
ruby: '3.0'
|
80
66
|
os: windows-latest
|
81
67
|
- name: macos
|
82
68
|
command: bundle exec rake rspec
|
83
|
-
ruby: '3.0'
|
84
69
|
os: 'macos-latest'
|
85
70
|
- name: lint
|
86
71
|
command: bin/rake lint
|
87
|
-
ruby: '3.0'
|
88
72
|
- name: timezone
|
89
73
|
command: bin/rake mspec_nodejs TZ="Pacific/Fiji"
|
90
|
-
ruby: '3.0'
|
91
74
|
- name: performance
|
92
|
-
ruby: '3.0'
|
93
75
|
permissive: true
|
94
76
|
fetchdepth: '0'
|
95
77
|
command: bin/rake performance:compare
|
@@ -102,29 +84,32 @@ jobs:
|
|
102
84
|
runs-on: ${{ matrix.combo.os || 'ubuntu-latest' }}
|
103
85
|
continue-on-error: ${{ matrix.combo.permissive || false }}
|
104
86
|
steps:
|
105
|
-
-
|
87
|
+
- if: ${{ matrix.combo.firefox }}
|
88
|
+
id: setup-firefox
|
89
|
+
uses: browser-actions/setup-firefox@latest
|
106
90
|
with:
|
107
|
-
|
108
|
-
|
109
|
-
- uses: actions/checkout@v2
|
91
|
+
firefox-version: ${{ matrix.combo.firefox }}
|
92
|
+
- uses: actions/checkout@v4
|
110
93
|
with:
|
111
94
|
fetch-depth: ${{ fromJSON(matrix.combo.fetchdepth || '1') }}
|
112
95
|
- if: ${{ matrix.combo.os != 'ryzen' }}
|
113
96
|
uses: ruby/setup-ruby@v1
|
114
97
|
with:
|
115
|
-
ruby-version: ${{ matrix.combo.ruby }}
|
98
|
+
ruby-version: ${{ matrix.combo.ruby || env.DEFAULT_RUBY }}
|
116
99
|
bundler-cache: false
|
117
100
|
- run: ruby bin/git-submodule-fast-install
|
118
101
|
- run: bundle lock
|
119
|
-
- uses: actions/cache@
|
102
|
+
- uses: actions/cache@v4
|
103
|
+
env:
|
104
|
+
KEY_PREFIX: ${{ runner.os }}-${{ matrix.combo.ruby || env.DEFAULT_RUBY }}
|
120
105
|
with:
|
121
106
|
path: ./vendor/bundle
|
122
|
-
key: ${{
|
107
|
+
key: ${{ env.KEY_PREFIX }}-gem-${{ github.ref }}-${{ hashFiles('**/Gemfile.lock') }}
|
123
108
|
restore-keys: |
|
124
|
-
${{
|
125
|
-
${{
|
126
|
-
${{
|
127
|
-
- uses: actions/cache@
|
109
|
+
${{ env.KEY_PREFIX }}-gem-${{ github.ref }}
|
110
|
+
${{ env.KEY_PREFIX }}-gem-master
|
111
|
+
${{ env.KEY_PREFIX }}-gem-
|
112
|
+
- uses: actions/cache@v4
|
128
113
|
with:
|
129
114
|
path: ./node_modules
|
130
115
|
key: ${{ runner.os }}-npm-${{ github.ref }}-${{ hashFiles('**/yarn.lock') }}
|
@@ -138,8 +123,12 @@ jobs:
|
|
138
123
|
bundle config path $PWD/vendor/bundle
|
139
124
|
bundle install --jobs 4 --retry 3
|
140
125
|
bundle clean
|
141
|
-
- name: set environment variables
|
126
|
+
- name: set environment variables USE_STRICT
|
142
127
|
if: ${{ matrix.combo.strict == 'true' }}
|
143
128
|
run: |
|
144
129
|
echo "USE_STRICT=true" >> $GITHUB_ENV
|
130
|
+
- name: set environment variables MOZILLA_FIREFOX_BINARY
|
131
|
+
if: ${{ matrix.combo.firefox }}
|
132
|
+
run: |
|
133
|
+
echo "MOZILLA_FIREFOX_BINARY=${{ steps.setup-firefox.outputs.firefox-path }}" >> $GITHUB_ENV
|
145
134
|
- run: ${{ matrix.combo.command || 'bin/rake rspec' }}
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -16,7 +16,7 @@ Changes are grouped as follows:
|
|
16
16
|
|
17
17
|
|
18
18
|
|
19
|
-
## [1.8.
|
19
|
+
## [1.8.2](https://github.com/opal/opal/compare/v1.8.1...v1.8.2) - 2023-11-23
|
20
20
|
|
21
21
|
|
22
22
|
<!--
|
@@ -25,9 +25,21 @@ Changes are grouped as follows:
|
|
25
25
|
### Added
|
26
26
|
### Removed
|
27
27
|
### Deprecated
|
28
|
+
-->
|
29
|
+
|
28
30
|
### Performance
|
31
|
+
|
32
|
+
- Optimize `Hash#rehash` for the common case, avoid calling `$slice` when no hash collision is present ([#2571](https://github.com/opal/opal/pull/2571))
|
33
|
+
|
29
34
|
### Fixed
|
30
|
-
|
35
|
+
|
36
|
+
- `String#{r,l,}strip`: Make them work like in MRI for non-breaking white-space ([#2612](https://github.com/opal/opal/pull/2612))
|
37
|
+
- Compat regression fix: `Hash#to_n` should return a JS object ([#2613](https://github.com/opal/opal/pull/2613))
|
38
|
+
|
39
|
+
|
40
|
+
|
41
|
+
|
42
|
+
## [1.8.1](https://github.com/opal/opal/compare/v1.8.0...v1.8.1) - 2023-11-09
|
31
43
|
|
32
44
|
|
33
45
|
### Fixed
|
data/Gemfile
CHANGED
data/UNRELEASED.md
CHANGED
@@ -1,10 +1,20 @@
|
|
1
1
|
<!--
|
2
|
-
### Internal
|
3
|
-
### Changed
|
4
2
|
### Added
|
5
3
|
### Removed
|
6
4
|
### Deprecated
|
7
5
|
### Performance
|
8
|
-
### Fixed
|
9
6
|
-->
|
10
7
|
|
8
|
+
### Changed
|
9
|
+
- Use of `JS` constant is now deprecated. The constant has been renamed to `Opal::Raw`. Throw a warning if such a constant is in use (#2525)
|
10
|
+
|
11
|
+
### Fixed
|
12
|
+
- `String#chars`: Fix iteration over out-of-BMP characters (#2620)
|
13
|
+
- Fix `Array#include?` to respect nil return value (#2661)
|
14
|
+
- Fix `opal-build` command line utility for newer Ruby versions (#2675)
|
15
|
+
- Depend on `base64` gem for Ruby 3.4 compatibility (#2652)
|
16
|
+
|
17
|
+
### Internal
|
18
|
+
- Ensure we default to later Ruby versions in CI (#2624)
|
19
|
+
- Unassorted CI/Rubocop/testing system changes (#2676, #2654, #2644, #2631, #2627, #2626)
|
20
|
+
|
data/docs/compiled_ruby.md
CHANGED
@@ -423,48 +423,48 @@ foo. JS[:a]
|
|
423
423
|
|
424
424
|
### Calling JavaScript Operators
|
425
425
|
|
426
|
-
Opal has a `
|
426
|
+
Opal has a `opal/raw` library in the stdlib that provides a `Opal::Raw` module which can
|
427
427
|
be used to call JavaScript operators such as `new`. Example:
|
428
428
|
|
429
429
|
```ruby
|
430
|
-
require '
|
430
|
+
require 'opal/raw'
|
431
431
|
|
432
432
|
# new foo(bar)
|
433
|
-
|
433
|
+
Opal::Raw.new(foo, bar)
|
434
434
|
|
435
435
|
# delete foo["bar"]
|
436
|
-
|
436
|
+
Opal::Raw.delete(foo, :bar)
|
437
437
|
|
438
438
|
# "bar" in foo
|
439
|
-
|
439
|
+
Opal::Raw.in(:bar, foo)
|
440
440
|
|
441
441
|
# foo instanceof bar
|
442
|
-
|
442
|
+
Opal::Raw.instanceof(foo, bar)
|
443
443
|
|
444
444
|
# typeof foo
|
445
|
-
|
445
|
+
Opal::Raw.typeof(foo)
|
446
446
|
```
|
447
447
|
|
448
448
|
### Calling JavaScript Global Functions
|
449
449
|
|
450
|
-
You can also use the `
|
451
|
-
`
|
450
|
+
You can also use the `opal/raw` library to call JavaScript global functions via
|
451
|
+
`Opal::Raw.call`:
|
452
452
|
|
453
453
|
```ruby
|
454
|
-
require '
|
454
|
+
require 'opal/raw'
|
455
455
|
|
456
456
|
# parseFloat("1.1")
|
457
|
-
|
457
|
+
Opal::Raw.call(:parseFloat, "1.1")
|
458
458
|
```
|
459
459
|
|
460
460
|
For convenience, `method_missing` is aliased to call, allowing you to call
|
461
|
-
global JavaScript methods directly on the `
|
461
|
+
global JavaScript methods directly on the `Opal::Raw` module:
|
462
462
|
|
463
463
|
```ruby
|
464
|
-
require '
|
464
|
+
require 'opal/raw'
|
465
465
|
|
466
466
|
# parseFloat("1.1")
|
467
|
-
|
467
|
+
Opal::Raw.parseFloat("1.1")
|
468
468
|
```
|
469
469
|
|
470
470
|
|
data/docs/releasing.md
CHANGED
@@ -21,7 +21,7 @@ All of the following is now covered by `bin/rake release:prepare VERSION=v1.2.3`
|
|
21
21
|
|
22
22
|
## Release!
|
23
23
|
|
24
|
-
- Push the commit to `master`
|
24
|
+
- Push the commit to `master` or the current stable branch
|
25
25
|
- Run `bin/rake release` to release the new version to Rubygems
|
26
26
|
- Go to GitHub releases and create a new release from the latest tag pasting the contents from CHANGELOG.md (or UNRELEASED.md for pre-releases)
|
27
27
|
|
@@ -36,7 +36,9 @@ All of the following is now covered by `bin/rake release:prepare VERSION=v1.2.3`
|
|
36
36
|
|
37
37
|
### [skip for pre-releases] Opal site
|
38
38
|
|
39
|
-
- Open `opal.github.io`
|
39
|
+
- Open `opal.github.io`
|
40
|
+
- checkout the `source` branch
|
41
|
+
- update the opal version in the `Gemfile` with `bundle update opal`
|
40
42
|
- run `bin/build`
|
41
43
|
- `git push` the latest changes
|
42
44
|
|
data/exe/opal-build
CHANGED
data/lib/opal/compiler.rb
CHANGED
@@ -190,7 +190,7 @@ module Opal
|
|
190
190
|
|
191
191
|
# @!method backtick_javascript?
|
192
192
|
#
|
193
|
-
# Allows use of a backtick operator (and `%x{}
|
193
|
+
# Allows use of a backtick operator (and `%x{}`) to embed verbatim JavaScript.
|
194
194
|
# If false, backtick operator will
|
195
195
|
compiler_option :backtick_javascript, default: nil, as: :backtick_javascript?, magic_comment: true
|
196
196
|
|
data/lib/opal/nodes/literal.rb
CHANGED
@@ -132,7 +132,7 @@ module Opal
|
|
132
132
|
if SUPPORTED_FLAGS =~ flag
|
133
133
|
true
|
134
134
|
else
|
135
|
-
compiler.warning "Skipping the '#{flag}' Regexp flag as it's not widely supported by JavaScript vendors."
|
135
|
+
compiler.warning "Skipping the '#{flag}' Regexp flag as it's not widely supported by JavaScript vendors.", @sexp.line
|
136
136
|
false
|
137
137
|
end
|
138
138
|
end
|
data/lib/opal/nodes/rescue.rb
CHANGED
data/lib/opal/nodes/scope.rb
CHANGED
@@ -267,7 +267,7 @@ module Opal
|
|
267
267
|
@identity = "$$#{mid}"
|
268
268
|
else
|
269
269
|
# Parent scope is the defining module/class
|
270
|
-
name ||= [
|
270
|
+
name ||= [parent && (parent.name || parent.scope_name), mid].compact.join('_')
|
271
271
|
@identity = @compiler.unique_temp(name)
|
272
272
|
end
|
273
273
|
|
data/lib/opal/version.rb
CHANGED
data/opal/corelib/array.rb
CHANGED
@@ -63,7 +63,7 @@ class ::BasicObject
|
|
63
63
|
::Kernel.raise ::ArgumentError, 'wrong number of arguments (0 for 1..3)' unless (1..3).cover? args.size
|
64
64
|
|
65
65
|
string, file, _lineno = *args
|
66
|
-
default_eval_options = { file:
|
66
|
+
default_eval_options = { file: file || '(eval)', eval: true }
|
67
67
|
compiling_options = __OPAL_COMPILER_CONFIG__.merge(default_eval_options)
|
68
68
|
compiled = ::Opal.compile string, compiling_options
|
69
69
|
block = ::Kernel.proc do
|
data/opal/corelib/constants.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
::RUBY_PLATFORM = 'opal'
|
2
2
|
::RUBY_ENGINE = 'opal'
|
3
3
|
::RUBY_VERSION = '3.2.0'
|
4
|
-
::RUBY_ENGINE_VERSION = '1.8.
|
5
|
-
::RUBY_RELEASE_DATE = '
|
4
|
+
::RUBY_ENGINE_VERSION = '1.8.3.rc1'
|
5
|
+
::RUBY_RELEASE_DATE = '2024-08-08'
|
6
6
|
::RUBY_PATCHLEVEL = 0
|
7
7
|
::RUBY_REVISION = '0'
|
8
|
-
::RUBY_COPYRIGHT = 'opal - Copyright (C) 2011-
|
8
|
+
::RUBY_COPYRIGHT = 'opal - Copyright (C) 2011-2024 Adam Beynon and the Opal contributors'
|
9
9
|
::RUBY_DESCRIPTION = "opal #{::RUBY_ENGINE_VERSION} (#{::RUBY_RELEASE_DATE} revision #{::RUBY_REVISION})"
|
data/opal/corelib/error.rb
CHANGED
@@ -326,7 +326,22 @@ class ::LocalJumpError
|
|
326
326
|
end
|
327
327
|
end
|
328
328
|
|
329
|
+
module ::Opal
|
330
|
+
module Raw
|
331
|
+
class Error
|
332
|
+
end
|
333
|
+
end
|
334
|
+
end
|
335
|
+
|
329
336
|
module ::JS
|
330
|
-
|
337
|
+
def self.const_missing(const)
|
338
|
+
if const == :Error
|
339
|
+
warn '[Opal] JS::Error class has been renamed to Opal::Raw::Error and will change semantics in Opal 2.1. ' \
|
340
|
+
'To ensure forward compatibility, please update your rescue clauses.'
|
341
|
+
|
342
|
+
::JS::Raw::Error
|
343
|
+
else
|
344
|
+
super
|
345
|
+
end
|
331
346
|
end
|
332
347
|
end
|
data/opal/corelib/hash.rb
CHANGED
data/opal/corelib/io.rb
CHANGED
data/opal/corelib/module.rb
CHANGED
@@ -581,7 +581,7 @@ class ::Module
|
|
581
581
|
::Kernel.raise ::ArgumentError, 'wrong number of arguments (0 for 1..3)' unless (1..3).cover? args.size
|
582
582
|
|
583
583
|
string, file, _lineno = *args
|
584
|
-
default_eval_options = { file:
|
584
|
+
default_eval_options = { file: file || '(eval)', eval: true }
|
585
585
|
compiling_options = __OPAL_COMPILER_CONFIG__.merge(default_eval_options)
|
586
586
|
compiled = ::Opal.compile string, compiling_options
|
587
587
|
block = ::Kernel.proc do
|
data/opal/corelib/runtime.js
CHANGED
@@ -1747,7 +1747,7 @@
|
|
1747
1747
|
return result;
|
1748
1748
|
}
|
1749
1749
|
}
|
1750
|
-
else if (candidate === Opal.
|
1750
|
+
else if ((Opal.Opal.Raw && candidate === Opal.Opal.Raw.Error) || candidate['$==='](exception)) {
|
1751
1751
|
return candidate;
|
1752
1752
|
}
|
1753
1753
|
}
|
@@ -2403,7 +2403,7 @@
|
|
2403
2403
|
}
|
2404
2404
|
|
2405
2405
|
var objects = keys.get(key_hash),
|
2406
|
-
objects_copy = $slice(objects),
|
2406
|
+
objects_copy = (objects.length === 1) ? objects : $slice(objects),
|
2407
2407
|
object;
|
2408
2408
|
|
2409
2409
|
for (var i=0; i<objects_copy.length; i++) {
|
@@ -75,16 +75,16 @@ class ::Encoding
|
|
75
75
|
|
76
76
|
def each_char(string, &block)
|
77
77
|
%x{
|
78
|
-
var
|
78
|
+
var high_surrogate = "";
|
79
79
|
for (var i = 0, length = string.length; i < length; i++) {
|
80
80
|
var charcode = string.charCodeAt(i);
|
81
81
|
var chr = string.charAt(i);
|
82
|
-
if (charcode >=
|
83
|
-
|
82
|
+
if (charcode >= 0xD800 && charcode <= 0xDBFF) {
|
83
|
+
high_surrogate = chr;
|
84
84
|
continue;
|
85
85
|
}
|
86
|
-
else if (charcode >=
|
87
|
-
chr =
|
86
|
+
else if (charcode >= 0xDC00 && charcode <= 0xDFFF) {
|
87
|
+
chr = high_surrogate + chr;
|
88
88
|
}
|
89
89
|
if (string.encoding.name != "UTF-8") {
|
90
90
|
chr = new String(chr);
|
@@ -400,7 +400,7 @@ class ::String
|
|
400
400
|
end
|
401
401
|
|
402
402
|
def initialize_copy(other)
|
403
|
-
%{
|
403
|
+
%x{
|
404
404
|
self.encoding = other.encoding;
|
405
405
|
self.internal_encoding = other.internal_encoding;
|
406
406
|
}
|
data/opal/corelib/string.rb
CHANGED
@@ -724,7 +724,7 @@ class ::String < `String`
|
|
724
724
|
end
|
725
725
|
|
726
726
|
def lstrip
|
727
|
-
`self.replace(/^[\
|
727
|
+
`self.replace(/^[\x00\x09\x0a-\x0d\x20]*/, '')`
|
728
728
|
end
|
729
729
|
|
730
730
|
def ascii_only?
|
@@ -1023,7 +1023,7 @@ class ::String < `String`
|
|
1023
1023
|
end
|
1024
1024
|
|
1025
1025
|
def rstrip
|
1026
|
-
`self.replace(/[\
|
1026
|
+
`self.replace(/[\x00\x09\x0a-\x0d\x20]*$/, '')`
|
1027
1027
|
end
|
1028
1028
|
|
1029
1029
|
def scan(pattern, no_matchdata: false, &block)
|
@@ -1201,7 +1201,7 @@ class ::String < `String`
|
|
1201
1201
|
end
|
1202
1202
|
|
1203
1203
|
def strip
|
1204
|
-
`self.replace(/^[\
|
1204
|
+
`self.replace(/^[\x00\x09\x0a-\x0d\x20]*|[\x00\x09\x0a-\x0d\x20]*$/g, '')`
|
1205
1205
|
end
|
1206
1206
|
|
1207
1207
|
def sub(pattern, replacement = undefined, &block)
|
data/opal.gemspec
CHANGED
@@ -34,6 +34,7 @@ Gem::Specification.new do |spec|
|
|
34
34
|
spec.required_ruby_version = '>= 2.3'
|
35
35
|
|
36
36
|
spec.add_dependency 'ast', '>= 2.3.0'
|
37
|
+
spec.add_dependency 'base64', '>= 0.2.0'
|
37
38
|
spec.add_dependency 'parser', ['~> 3.0', '>= 3.0.3.2']
|
38
39
|
|
39
40
|
spec.add_development_dependency 'sourcemap', '~> 0.1.0'
|
@@ -44,7 +45,7 @@ Gem::Specification.new do |spec|
|
|
44
45
|
spec.add_development_dependency 'rack-test'
|
45
46
|
spec.add_development_dependency 'selenium-webdriver'
|
46
47
|
spec.add_development_dependency 'benchmark-ips', '< 2.8'
|
47
|
-
spec.add_development_dependency 'sinatra', '~> 3.
|
48
|
+
spec.add_development_dependency 'sinatra', '~> 3.2'
|
48
49
|
spec.add_development_dependency 'rubocop', '~> 1.50'
|
49
50
|
spec.add_development_dependency 'rubocop-performance', '~> 1.1'
|
50
51
|
spec.add_development_dependency 'rack', '~> 2.2'
|
data/spec/lib/compiler_spec.rb
CHANGED
@@ -487,7 +487,7 @@ RSpec.describe Opal::Compiler do
|
|
487
487
|
options = options.merge(eval: true)
|
488
488
|
warnings_number = 0
|
489
489
|
compiler = Opal::Compiler.new(code, options)
|
490
|
-
allow(compiler).to receive(:warning) { warnings_number += 1}
|
490
|
+
allow(compiler).to receive(:warning) { warnings_number += 1 }
|
491
491
|
compiler.compile
|
492
492
|
expect(warnings_number)
|
493
493
|
end
|
@@ -644,12 +644,12 @@ RSpec.describe Opal::Compiler do
|
|
644
644
|
it 'adds the file and line to the backtrace' do
|
645
645
|
error = nil
|
646
646
|
begin
|
647
|
-
compiled('BEGIN {}', file:
|
647
|
+
compiled('BEGIN {}', file: "#{File.basename(__FILE__)}/foobar.js.rb")
|
648
648
|
rescue Opal::SyntaxError => syntax_error
|
649
649
|
error = syntax_error
|
650
650
|
end
|
651
651
|
|
652
|
-
expect(error.backtrace[0]).to eq("foobar.js.rb:in `BEGIN {}'")
|
652
|
+
expect(error.backtrace[0]).to eq("#{File.basename(__FILE__)}/foobar.js.rb:in `BEGIN {}'")
|
653
653
|
expect(compiler_backtrace(error)[0]).to end_with(":in `error'")
|
654
654
|
expect(compiler_backtrace(error)[-3]).to end_with(":in `block in compile'")
|
655
655
|
expect(compiler_backtrace(error)[-1]).to end_with(":in `compile'")
|
@@ -660,14 +660,21 @@ RSpec.describe Opal::Compiler do
|
|
660
660
|
context 'at parse time' do
|
661
661
|
it 'adds the file and line to the backtrace' do
|
662
662
|
error = nil
|
663
|
+
|
663
664
|
begin
|
664
|
-
parsed('def foo', file:
|
665
|
+
parsed('def foo', file: "#{File.basename(__FILE__)}/foobar.js.rb")
|
665
666
|
rescue Opal::SyntaxError => syntax_error
|
666
667
|
error = syntax_error
|
667
668
|
end
|
668
|
-
expect(error.backtrace[0]).to eq("foobar.js.rb:1:in `def foo'")
|
669
|
+
expect(error.backtrace[0]).to eq("#{File.basename(__FILE__)}/foobar.js.rb:1:in `def foo'")
|
669
670
|
expect(compiler_backtrace(error)[0]).to end_with(":in `block in parse'")
|
670
671
|
expect(error.backtrace.size).to be > 1
|
672
|
+
|
673
|
+
expect($diagnostic_messages.flatten).to eq([
|
674
|
+
"#{File.basename(__FILE__)}/foobar.js.rb:1:8: error: unexpected token $end",
|
675
|
+
"#{File.basename(__FILE__)}/foobar.js.rb:1: def foo",
|
676
|
+
"#{File.basename(__FILE__)}/foobar.js.rb:1: ",
|
677
|
+
])
|
671
678
|
end
|
672
679
|
end
|
673
680
|
|
@@ -707,7 +714,10 @@ RSpec.describe Opal::Compiler do
|
|
707
714
|
end
|
708
715
|
|
709
716
|
def compiled(code, options = compiler_options)
|
710
|
-
Opal::Compiler.new(code, options)
|
717
|
+
compiler = Opal::Compiler.new(code, options)
|
718
|
+
@compiler_warnings = []
|
719
|
+
allow(compiler).to receive(:warning) { |*args| @compiler_warnings << args }
|
720
|
+
compiler.compile
|
711
721
|
end
|
712
722
|
|
713
723
|
def parsed(code, options = compiler_options)
|