opal 1.8.0.alpha1 → 1.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.eslintrc.js +1 -0
- data/CHANGELOG.md +119 -2
- data/README.md +7 -7
- data/UNRELEASED.md +1 -78
- data/docs/releasing.md +8 -16
- data/lib/opal/cli_runners/chrome.rb +5 -1
- data/lib/opal/nodes/closure.rb +15 -7
- data/lib/opal/nodes/defined.rb +1 -1
- data/lib/opal/nodes/literal.rb +10 -6
- data/lib/opal/nodes/rescue.rb +1 -1
- data/lib/opal/simple_server.rb +2 -2
- data/lib/opal/version.rb +1 -1
- data/opal/corelib/array.rb +39 -21
- data/opal/corelib/class.rb +26 -8
- data/opal/corelib/complex.rb +1 -1
- data/opal/corelib/constants.rb +2 -2
- data/opal/corelib/enumerator/arithmetic_sequence.rb +1 -1
- data/opal/corelib/error.rb +10 -0
- data/opal/corelib/hash.rb +36 -20
- data/opal/corelib/kernel.rb +0 -1
- data/opal/corelib/method.rb +1 -0
- data/opal/corelib/module.rb +82 -22
- data/opal/corelib/number.rb +28 -1
- data/opal/corelib/range.rb +55 -11
- data/opal/corelib/rational.rb +1 -1
- data/opal/corelib/runtime.js +132 -50
- data/opal/corelib/string.rb +36 -8
- data/opal/corelib/struct.rb +1 -1
- data/opal/corelib/time.rb +1 -1
- data/spec/filters/bugs/array.rb +58 -0
- data/spec/filters/bugs/basicobject.rb +7 -0
- data/spec/filters/bugs/bigdecimal.rb +1 -2
- data/spec/filters/bugs/binding.rb +1 -0
- data/spec/filters/bugs/cgi.rb +40 -0
- data/spec/filters/bugs/class.rb +2 -3
- data/spec/filters/bugs/complex.rb +3 -0
- data/spec/filters/bugs/date.rb +5 -2
- data/spec/filters/bugs/datetime.rb +1 -0
- data/spec/filters/bugs/delegate.rb +1 -2
- data/spec/filters/bugs/encoding.rb +1 -1
- data/spec/filters/bugs/enumerable.rb +11 -0
- data/spec/filters/bugs/enumerator.rb +15 -2
- data/spec/filters/bugs/exception.rb +9 -4
- data/spec/filters/bugs/file.rb +2 -0
- data/spec/filters/bugs/float.rb +1 -0
- data/spec/filters/bugs/freeze.rb +5 -49
- data/spec/filters/bugs/hash.rb +1 -0
- data/spec/filters/bugs/integer.rb +5 -6
- data/spec/filters/bugs/kernel.rb +12 -6
- data/spec/filters/bugs/language.rb +33 -15
- data/spec/filters/bugs/marshal.rb +63 -4
- data/spec/filters/bugs/method.rb +2 -13
- data/spec/filters/bugs/module.rb +19 -17
- data/spec/filters/bugs/objectspace.rb +2 -0
- data/spec/filters/bugs/pathname.rb +1 -0
- data/spec/filters/bugs/proc.rb +4 -2
- data/spec/filters/bugs/random.rb +0 -3
- data/spec/filters/bugs/range.rb +3 -17
- data/spec/filters/bugs/rational.rb +2 -0
- data/spec/filters/bugs/refinement.rb +19 -0
- data/spec/filters/bugs/regexp.rb +27 -5
- data/spec/filters/bugs/ruby-32.rb +0 -4
- data/spec/filters/bugs/set.rb +10 -2
- data/spec/filters/bugs/singleton.rb +0 -2
- data/spec/filters/bugs/string.rb +140 -1
- data/spec/filters/bugs/struct.rb +15 -5
- data/spec/filters/bugs/time.rb +56 -2
- data/spec/filters/bugs/trace_point.rb +1 -0
- data/spec/filters/bugs/unboundmethod.rb +4 -9
- data/spec/filters/bugs/warnings.rb +0 -1
- data/spec/filters/platform/firefox/exception.rb +3 -3
- data/spec/filters/platform/firefox/kernel.rb +1 -0
- data/spec/filters/platform/safari/exception.rb +2 -2
- data/spec/filters/platform/safari/float.rb +1 -0
- data/spec/filters/platform/safari/kernel.rb +1 -0
- data/spec/filters/platform/safari/literal_regexp.rb +2 -2
- data/spec/filters/unsupported/hash.rb +1 -1
- data/spec/lib/compiler_spec.rb +4 -0
- data/spec/opal/core/class/clone_spec.rb +36 -0
- data/spec/opal/core/module/define_method_spec.rb +29 -0
- data/spec/opal/core/object_id_spec.rb +0 -6
- data/spec/opal/language/predefined_spec.rb +20 -0
- data/spec/opal/language/yield_spec.rb +43 -0
- data/spec/ruby_specs +1 -2
- data/stdlib/bigdecimal.rb +2 -0
- data/stdlib/cgi/util.rb +89 -0
- data/stdlib/cgi.rb +1 -14
- data/stdlib/delegate.rb +3 -4
- data/stdlib/pathname.rb +1 -1
- data/stdlib/promise/v2.rb +22 -7
- data/stdlib/stringio.rb +2 -0
- data/tasks/testing.rake +15 -11
- data/test/opal/promisev2/test_always.rb +14 -0
- data/test/opal/unsupported_and_bugs.rb +0 -8
- metadata +16 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ea935af6a628e09fb047d39c25422f717a4a4b9ef442fe7ec06183134b3163a1
|
4
|
+
data.tar.gz: d539d6a55c69651064a272a6110498bdba7d2146fa08704f4e759ee7693c28b2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 603568ce7472d94e52edc2b4862a5cadb72313e8e1f344c723655a7a691b09cbde1d208e30935a68a2a78c59fa073724d66b24ef7cf56cf69eb8567b9aa851f4
|
7
|
+
data.tar.gz: 7ea6135b1f97d50584259706244705273b429d1eff03c44742f7c165b6caec782a06d33ac209f94545ec2c4f8665c1992367aebbf5699052fc62163414c99e1d
|
data/.eslintrc.js
CHANGED
data/CHANGELOG.md
CHANGED
@@ -16,18 +16,135 @@ Changes are grouped as follows:
|
|
16
16
|
|
17
17
|
|
18
18
|
|
19
|
-
## [1.
|
19
|
+
## [1.8.0](https://github.com/opal/opal/compare/v1.7.4...v1.8.0) - 2023-10-26
|
20
20
|
|
21
21
|
|
22
22
|
<!--
|
23
23
|
### Internal
|
24
|
-
### Changed
|
25
24
|
### Added
|
26
25
|
### Removed
|
27
26
|
### Deprecated
|
28
27
|
### Performance
|
28
|
+
### Fixed
|
29
|
+
### Documentation
|
29
30
|
-->
|
30
31
|
|
32
|
+
## Highlights
|
33
|
+
|
34
|
+
### `Hash` is now bridged to JavaScript `Map`
|
35
|
+
|
36
|
+
This change brings a lot of benefits, but also some incompatibilities. The main benefit is that `Hash` now is both more performant and relies on native JavaScript capabilities.
|
37
|
+
This improves interoperability with JavaScript. As a downside, applications reaching for internal `Hash` data structures will need to be updated.
|
38
|
+
|
39
|
+
Interacting with `Hash` from `JavaScript` is easier than ever:
|
40
|
+
|
41
|
+
```ruby
|
42
|
+
hash = `new Map([['a', 1], ['b', 2]])`
|
43
|
+
hash # => {a: 1, b: 2}
|
44
|
+
`console.log(hash)` # => Map(2) {"a" => 1, "b" => 2}
|
45
|
+
`hash.get('a')` # => 1
|
46
|
+
`hash.set('c', 3)`
|
47
|
+
hash # => {a: 1, b: 2, c: 3}
|
48
|
+
hash.keys # => ["a", "b", "c"]
|
49
|
+
hash.values # => [1, 2, 3]
|
50
|
+
```
|
51
|
+
|
52
|
+
### Performance improvements
|
53
|
+
|
54
|
+
This release brings a lot of performance improvements, our tests on Asciidoctor show a 25% improvement in performance, but we've seen up to 66% performance improvement on some applications.
|
55
|
+
|
56
|
+
## Changelog
|
57
|
+
|
58
|
+
### Deprecated
|
59
|
+
|
60
|
+
- Deprecate using x-string to access JavaScript without an explicit magic-comment ([#2543](https://github.com/opal/opal/pull/2543))
|
61
|
+
|
62
|
+
### Compatibility
|
63
|
+
|
64
|
+
- Add a magic-comment that will disable x-string compilation to JavaScript ([#2543](https://github.com/opal/opal/pull/2543))
|
65
|
+
- Pass value in `PromiseV2#always` just like `PromiseV1#always` does it ([#2579](https://github.com/opal/opal/pull/2579))
|
66
|
+
- `#hash` now returns integers ([#2582](https://github.com/opal/opal/pull/2582))
|
67
|
+
- Improve `Range#include?`/`member?`/`cover?`/`===` ([#2598](https://github.com/opal/opal/pull/2598))
|
68
|
+
- Make `Module#define_method` more compatible with CRuby ([#2593](https://github.com/opal/opal/pull/2593))
|
69
|
+
- `Hash#clone` must freeze clone if original is frozen, but `Hash#dup` must not ([#2603](https://github.com/opal/opal/pull/2603))
|
70
|
+
|
71
|
+
### Fixed
|
72
|
+
|
73
|
+
- Fix `Kernel#Float` with `exception:` option ([#2532](https://github.com/opal/opal/pull/2532))
|
74
|
+
- Fix `Kernel#Integer` with `exception:` option ([#2531](https://github.com/opal/opal/pull/2531))
|
75
|
+
- Fix `String#split` with limit and capturing regexp ([#2544](https://github.com/opal/opal/pull/2544))
|
76
|
+
- Fix `switch` with Object-wrapped values ([#2542](https://github.com/opal/opal/pull/2542))
|
77
|
+
- Fix non-direct subclasses of bridged classes not calling the original constructor ([#2546](https://github.com/opal/opal/pull/2546))
|
78
|
+
- Regexp.escape: Cast to String or drop exception ([#2552](https://github.com/opal/opal/pull/2552))
|
79
|
+
- Propagate removal of method from included/prepended modules ([#2553](https://github.com/opal/opal/pull/2553))
|
80
|
+
- Restore `nodejs/yaml` functionality ([#2551](https://github.com/opal/opal/pull/2551))
|
81
|
+
- Fix sine `Range#size` edge cases ([#2541](https://github.com/opal/opal/pull/2541))
|
82
|
+
- Use a Map instead of a POJO for the jsid_cache ([#2584](https://github.com/opal/opal/pull/2584))
|
83
|
+
- Fix `String#object_id`, `String#__id__`, `String#hash` to match CRuby's behavior ([#2576](https://github.com/opal/opal/pull/2576))
|
84
|
+
- Lowercase response headers in `SimpleServer` for rack 3.0 compatibility ([#2578](https://github.com/opal/opal/pull/2578))
|
85
|
+
- Fix `Module#clone` and `Module#dup` to properly copy methods ([#2572](https://github.com/opal/opal/pull/2572))
|
86
|
+
- Chrome runner fix: support code that contains `</script>` ([#2581](https://github.com/opal/opal/pull/2581))
|
87
|
+
- Do not skip `$truthy` when left hand side of a comparison is `self` ([#2596](https://github.com/opal/opal/pull/2596))
|
88
|
+
- Unexpected `return`/`break` should raise `LocalJumpError` ([#2591](https://github.com/opal/opal/pull/2591))
|
89
|
+
|
90
|
+
### Added
|
91
|
+
|
92
|
+
- SourceMap support for `Kernel#eval` ([#2534](https://github.com/opal/opal/pull/2534))
|
93
|
+
- Add `CGI::Util#escapeURIComponent` and `CGI::Util#unescapeURIComponent` ([#2566](https://github.com/opal/opal/pull/2566))
|
94
|
+
- `CGI::Util` implement additional methods ([#2601](https://github.com/opal/opal/pull/2601))
|
95
|
+
|
96
|
+
### Changed
|
97
|
+
|
98
|
+
- Change compilation of Regexp nodes that may contain advanced features, so if invalid that they would raise at runtime, not parse-time ([#2548](https://github.com/opal/opal/pull/2548))
|
99
|
+
- `Hash` is now bridged to JavaScript `Map` and support for non-symbol keys in keyword arguments ([#2568](https://github.com/opal/opal/pull/2568))
|
100
|
+
|
101
|
+
### Documentation
|
102
|
+
|
103
|
+
- Bridging documentation ([#2541](https://github.com/opal/opal/pull/2541))
|
104
|
+
- Fix Typo in Running tests Section of README.md File ([#2580](https://github.com/opal/opal/pull/2580))
|
105
|
+
|
106
|
+
### Performance
|
107
|
+
|
108
|
+
- Improve performance of `Array#intersect?` and `#intersection` ([#2533](https://github.com/opal/opal/pull/2533))
|
109
|
+
- `Proc#call`: Refactor for performance ([#2541](https://github.com/opal/opal/pull/2541))
|
110
|
+
- Opal.stub_for: optimize ([#2541](https://github.com/opal/opal/pull/2541))
|
111
|
+
- Hash: Optimize `#to_a` ([#2541](https://github.com/opal/opal/pull/2541))
|
112
|
+
- Array: Optimize `#collect`/`#map` ([#2541](https://github.com/opal/opal/pull/2541))
|
113
|
+
- Optimize argument slicing in runtime for performance ([#2555](https://github.com/opal/opal/pull/2555))
|
114
|
+
- Closure: Generate a JavaScript object, not an Error, gain up to 15% on Asciidoctor ([#2556](https://github.com/opal/opal/pull/2556))
|
115
|
+
- Optimize `String#split` and `String#start_with` ([#2560](https://github.com/opal/opal/pull/2560))
|
116
|
+
- Compute `$@` dynamically ([#2592](https://github.com/opal/opal/pull/2592))
|
117
|
+
- Optimize the `$prop` helper ([#2597](https://github.com/opal/opal/pull/2597))
|
118
|
+
- Improve `Array.push()` performance when pushing many items ([#2565](https://github.com/opal/opal/pull/2565))
|
119
|
+
- Optimize `Opal.instance_methods` ([#2600](https://github.com/opal/opal/pull/2600))
|
120
|
+
|
121
|
+
### Internal
|
122
|
+
|
123
|
+
- Update rubocop ([#2535](https://github.com/opal/opal/pull/2535))
|
124
|
+
- Match3Node Cleanup ([#2541](https://github.com/opal/opal/pull/2541))
|
125
|
+
- IFlipFlop/EFlipFlop: Refactor for readability ([#2541](https://github.com/opal/opal/pull/2541))
|
126
|
+
- ForRewriter: Refactor for readability ([#2541](https://github.com/opal/opal/pull/2541))
|
127
|
+
|
128
|
+
|
129
|
+
|
130
|
+
|
131
|
+
## [1.7.4](https://github.com/opal/opal/compare/v1.7.3...v1.7.4) - 2023-09-14
|
132
|
+
|
133
|
+
|
134
|
+
### Fixed
|
135
|
+
|
136
|
+
- Use a Map instead of a POJO for the jsid_cache ([#2584](https://github.com/opal/opal/pull/2584))
|
137
|
+
- Lowercase response headers in `SimpleServer` for rack 3.0 compatibility ([#2578](https://github.com/opal/opal/pull/2578))
|
138
|
+
- Fix `switch` with Object-wrapped values ([#2542](https://github.com/opal/opal/pull/2542))
|
139
|
+
- Regexp.escape: Cast to String or drop exception ([#2552](https://github.com/opal/opal/pull/2552))
|
140
|
+
- Chrome runner fix: support code that contains `</script>` ([#2581](https://github.com/opal/opal/pull/2581))
|
141
|
+
|
142
|
+
|
143
|
+
|
144
|
+
|
145
|
+
## [1.7.3](https://github.com/opal/opal/compare/v1.7.2...v1.7.3) - 2023-03-23
|
146
|
+
|
147
|
+
|
31
148
|
### Fixed
|
32
149
|
|
33
150
|
- Disallow to define a singleton class for Number ([#2521](https://github.com/opal/opal/pull/2521))
|
data/README.md
CHANGED
@@ -145,12 +145,7 @@ The test suite can be run using:
|
|
145
145
|
|
146
146
|
$ bundle exec rake
|
147
147
|
|
148
|
-
This
|
149
|
-
|
150
|
-
#### Automated runs
|
151
|
-
|
152
|
-
A `Guardfile` with decent mappings between specs and lib/corelib/stdlib files is in place.
|
153
|
-
Run `bundle exec guard -i` to start `guard`.
|
148
|
+
This command will run all RSpec and MSpec examples in sequence.
|
154
149
|
|
155
150
|
|
156
151
|
### MSpec
|
@@ -170,6 +165,11 @@ visit `http://localhost:9292/` in any web browser.
|
|
170
165
|
$ rake rspec
|
171
166
|
|
172
167
|
|
168
|
+
### Automated runs
|
169
|
+
|
170
|
+
A `Guardfile` with decent mappings between specs and lib/corelib/stdlib files is in place.
|
171
|
+
Run `bundle exec guard -i` to start `guard`.
|
172
|
+
|
173
173
|
## Code Overview
|
174
174
|
|
175
175
|
What code is supposed to run where?
|
@@ -247,7 +247,7 @@ Support this project by becoming a sponsor. Your logo will show up here with a l
|
|
247
247
|
|
248
248
|
### Sponsored Contributions
|
249
249
|
|
250
|
-
<a href="https://nebulab.it/?utm_source=github&utm_medium=sponsors" target="_blank"><img src="https://
|
250
|
+
<a href="https://nebulab.it/?utm_source=github&utm_medium=sponsors" target="_blank"><img src="https://raw.githubusercontent.com/solidusio/brand/master/partners/Nebulab/logo-dark-light.svg" alt="Nebulab Logo"></a>
|
251
251
|
|
252
252
|
|
253
253
|
## License
|
data/UNRELEASED.md
CHANGED
@@ -1,87 +1,10 @@
|
|
1
1
|
<!--
|
2
2
|
### Internal
|
3
|
+
### Changed
|
3
4
|
### Added
|
4
5
|
### Removed
|
5
6
|
### Deprecated
|
6
7
|
### Performance
|
7
8
|
### Fixed
|
8
|
-
### Documentation
|
9
9
|
-->
|
10
10
|
|
11
|
-
## Highlights
|
12
|
-
|
13
|
-
### `Hash` is now bridged to JavaScript `Map`
|
14
|
-
|
15
|
-
This change brings a lot of benefits, but also some incompatibilities. The main benefit is that `Hash` now is both more performant and relies on native JavaScript capabilities.
|
16
|
-
This improves interoperability with JavaScript. As a downside, applications reaching for internal `Hash` data structures will need to be updated.
|
17
|
-
|
18
|
-
Interacting with `Hash` from `JavaScript` is easier than ever:
|
19
|
-
|
20
|
-
```ruby
|
21
|
-
hash = `new Map([['a', 1], ['b', 2]])`
|
22
|
-
hash # => {a: 1, b: 2}
|
23
|
-
`console.log(hash)` # => Map(2) {"a" => 1, "b" => 2}
|
24
|
-
`hash.get('a')` # => 1
|
25
|
-
`hash.set('c', 3)`
|
26
|
-
hash # => {a: 1, b: 2, c: 3}
|
27
|
-
hash.keys # => ["a", "b", "c"]
|
28
|
-
hash.values # => [1, 2, 3]
|
29
|
-
```
|
30
|
-
|
31
|
-
### Performance improvements
|
32
|
-
|
33
|
-
This release brings a lot of performance improvements, our tests on Asciidoctor show a 25% improvement in performance, but we've seen up to 66% performance improvement on some applications.
|
34
|
-
|
35
|
-
## Changelog
|
36
|
-
|
37
|
-
### Deprecated
|
38
|
-
|
39
|
-
- Deprecate using x-string to access JavaScript without an explicit magic-comment (#2543)
|
40
|
-
|
41
|
-
### Compatibility
|
42
|
-
|
43
|
-
- Add a magic-comment that will disable x-string compilation to JavaScript (#2543)
|
44
|
-
|
45
|
-
### Fixed
|
46
|
-
|
47
|
-
- Fix `Kernel#Float` with `exception:` option (#2532)
|
48
|
-
- Fix `Kernel#Integer` with `exception:` option (#2531)
|
49
|
-
- Fix `String#split` with limit and capturing regexp (#2544)
|
50
|
-
- Fix `switch` with Object-wrapped values (#2542)
|
51
|
-
- Fix non-direct subclasses of bridged classes not calling the original constructor (#2546)
|
52
|
-
- Regexp.escape: Cast to String or drop exception (#2552)
|
53
|
-
- Propagate removal of method from included/prepended modules (#2553)
|
54
|
-
- Restore `nodejs/yaml` functionality (#2551)
|
55
|
-
- Fix sine `Range#size` edge cases (#2541)
|
56
|
-
|
57
|
-
### Added
|
58
|
-
|
59
|
-
- SourceMap support for `Kernel#eval` (#2534)
|
60
|
-
- Add `CGI::Util#escapeURIComponent` and `CGI::Util#unescapeURIComponent` (#2566)
|
61
|
-
|
62
|
-
### Changed
|
63
|
-
|
64
|
-
- Change compilation of Regexp nodes that may contain advanced features, so if invalid that they would raise at runtime, not parse-time (#2548)
|
65
|
-
- `Hash` is now bridged to JavaScript `Map` and support for non-symbol keys in keyword arguments (#2568)
|
66
|
-
|
67
|
-
### Documentation
|
68
|
-
|
69
|
-
- Bridging documentation (#2541)
|
70
|
-
|
71
|
-
### Performance
|
72
|
-
|
73
|
-
- Improve performance of `Array#intersect?` and `#intersection` (#2533)
|
74
|
-
- `Proc#call`: Refactor for performance (#2541)
|
75
|
-
- Opal.stub_for: optimize (#2541)
|
76
|
-
- Hash: Optimize `#to_a` (#2541)
|
77
|
-
- Array: Optimize `#collect`/`#map` (#2541)
|
78
|
-
- Optimize argument slicing in runtime for performance (#2555)
|
79
|
-
- Closure: Generate a JavaScript object, not an Error, gain up to 15% on Asciidoctor (#2556)
|
80
|
-
- Optimize `String#split` and `String#start_with` (#2560)
|
81
|
-
|
82
|
-
### Internal
|
83
|
-
|
84
|
-
- Update rubocop (#2535)
|
85
|
-
- Match3Node Cleanup (#2541)
|
86
|
-
- IFlipFlop/EFlipFlop: Refactor for readability (#2541)
|
87
|
-
- ForRewriter: Refactor for readability (#2541)
|
data/docs/releasing.md
CHANGED
@@ -8,21 +8,14 @@ _This guide is a work-in-progress._
|
|
8
8
|
|
9
9
|
All of the following is now covered by `bin/rake release:prepare VERSION=v1.2.3`
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
- Update `
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
- [skip for pre-releases] Run `bin/rake changelog VERSION=v1.2.3` specifying the version number you're about to release
|
20
|
-
- [skip for pre-releases] Empty UNRELEASED.md
|
21
|
-
|
22
|
-
### The commit
|
23
|
-
|
24
|
-
- Commit the updated changelog along with the version bump using this commit message:
|
25
|
-
"Release v1.2.3"
|
11
|
+
1. Update the version
|
12
|
+
- Update `lib/opal/version.rb`
|
13
|
+
- Update `opal/corelib/constants.rb` with the same version number along with release dates
|
14
|
+
2. Update the changelog
|
15
|
+
- Ensure all the unreleased changes are documented in UNRELEASED.md
|
16
|
+
- [skip for pre-releases] Run `bin/rake changelog VERSION=v1.2.3` specifying the version number you're about to release
|
17
|
+
- [skip for pre-releases] Empty UNRELEASED.md
|
18
|
+
3. Commit the updated changelog along with the version bump using this commit message: "Release v1.2.3"
|
26
19
|
|
27
20
|
---
|
28
21
|
|
@@ -56,4 +49,3 @@ All of the following is now covered by `bin/rake release:prepare VERSION=v1.2.3`
|
|
56
49
|
- Create a new pull request that:
|
57
50
|
- Updates a version to `v1.x.0.dev` in both `lib/opal/version.rb` and `opal/corelib/constants.rb`
|
58
51
|
- Remember to merge that PR before merging anything else next once we decide to not release any more point releases from `master`.
|
59
|
-
|
@@ -70,6 +70,10 @@ module Opal
|
|
70
70
|
ext = builder.output_extension
|
71
71
|
module_type = ' type="module"' if builder.esm?
|
72
72
|
|
73
|
+
# Some maps may contain `</script>` fragment (eg. in strings) which would close our
|
74
|
+
# `<script>` tag prematurely. For this case, we need to escape the `</script>` tag.
|
75
|
+
map_json = map.to_json.gsub(/(<\/scr)(ipt>)/i, '\1"+"\2')
|
76
|
+
|
73
77
|
# Chrome can't handle huge data passed to `addScriptToEvaluateOnLoad`
|
74
78
|
# https://groups.google.com/a/chromium.org/forum/#!topic/chromium-discuss/U5qyeX_ydBo
|
75
79
|
# The only way is to create temporary files and pass them to chrome.
|
@@ -86,7 +90,7 @@ module Opal
|
|
86
90
|
sourceMapSupport.install({
|
87
91
|
retrieveSourceMap: function(path) {
|
88
92
|
return path.endsWith('/index.#{ext}') ? {
|
89
|
-
url: './index.map', map: #{
|
93
|
+
url: './index.map', map: #{map_json}
|
90
94
|
} : null;
|
91
95
|
}
|
92
96
|
});
|
data/lib/opal/nodes/closure.rb
CHANGED
@@ -102,7 +102,7 @@ module Opal
|
|
102
102
|
def generate_thrower(type, closure, value)
|
103
103
|
id = closure.register_catcher(type)
|
104
104
|
closure.register_thrower(type, id)
|
105
|
-
push id, '.$throw(',
|
105
|
+
push id, '.$throw(', expr_or_nil(value), ', ', scope.identify!, '.$$is_lambda)'
|
106
106
|
id
|
107
107
|
end
|
108
108
|
|
@@ -113,11 +113,11 @@ module Opal
|
|
113
113
|
id = closure.throwers[type]
|
114
114
|
else
|
115
115
|
id = compiler.unique_temp('t_')
|
116
|
-
|
117
|
-
|
116
|
+
parent_scope = closure.node.scope&.parent || top_scope
|
117
|
+
parent_scope.add_scope_temp("#{id} = $thrower('#{type}')")
|
118
118
|
closure.register_thrower(type, id)
|
119
119
|
end
|
120
|
-
push id, '.$throw(',
|
120
|
+
push id, '.$throw(', expr_or_nil(value), ', ', scope.identify!, '.$$is_lambda)'
|
121
121
|
id
|
122
122
|
end
|
123
123
|
|
@@ -132,7 +132,7 @@ module Opal
|
|
132
132
|
if iter_closure
|
133
133
|
generate_thrower_without_catcher(:return, iter_closure, value)
|
134
134
|
elsif compiler.eval?
|
135
|
-
push 'Opal.t_eval_return.$throw(',
|
135
|
+
push 'Opal.t_eval_return.$throw(', expr_or_nil(value), ', false)'
|
136
136
|
else
|
137
137
|
error 'Invalid return'
|
138
138
|
end
|
@@ -211,9 +211,11 @@ module Opal
|
|
211
211
|
|
212
212
|
helper :thrower
|
213
213
|
|
214
|
+
catchers_without_eval_return = catchers.grep_v(:eval_return)
|
215
|
+
|
214
216
|
push "} catch($e) {"
|
215
217
|
indent do
|
216
|
-
|
218
|
+
catchers.each do |type|
|
217
219
|
case type
|
218
220
|
when :eval_return
|
219
221
|
line "if ($e === Opal.t_eval_return) return $e.$v;"
|
@@ -225,9 +227,15 @@ module Opal
|
|
225
227
|
end
|
226
228
|
line "}"
|
227
229
|
|
230
|
+
unless catchers_without_eval_return.empty?
|
231
|
+
push " finally {", *catchers_without_eval_return.map { |type| "$t_#{type}.is_orphan = true;" }, "}"
|
232
|
+
end
|
233
|
+
|
228
234
|
unshift "return " if closure_is? SEND
|
229
235
|
|
230
|
-
|
236
|
+
unless catchers_without_eval_return.empty?
|
237
|
+
unshift "var ", catchers_without_eval_return.map { |type| "$t_#{type} = $thrower('#{type}')" }.join(", "), "; "
|
238
|
+
end
|
231
239
|
unshift "try { "
|
232
240
|
|
233
241
|
unless closure_is? JS_FUNCTION
|
data/lib/opal/nodes/defined.rb
CHANGED
data/lib/opal/nodes/literal.rb
CHANGED
@@ -5,14 +5,10 @@ require 'opal/nodes/base'
|
|
5
5
|
module Opal
|
6
6
|
module Nodes
|
7
7
|
class ValueNode < Base
|
8
|
-
handle :true, :false, :
|
8
|
+
handle :true, :false, :nil
|
9
9
|
|
10
10
|
def compile
|
11
|
-
|
12
|
-
push scope.self
|
13
|
-
else
|
14
|
-
push type.to_s
|
15
|
-
end
|
11
|
+
push type.to_s
|
16
12
|
end
|
17
13
|
|
18
14
|
def self.truthy_optimize?
|
@@ -20,6 +16,14 @@ module Opal
|
|
20
16
|
end
|
21
17
|
end
|
22
18
|
|
19
|
+
class SelfNode < Base
|
20
|
+
handle :self
|
21
|
+
|
22
|
+
def compile
|
23
|
+
push scope.self
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
23
27
|
class NumericNode < Base
|
24
28
|
handle :int, :float
|
25
29
|
|
data/lib/opal/nodes/rescue.rb
CHANGED
data/lib/opal/simple_server.rb
CHANGED
@@ -51,7 +51,7 @@ class Opal::SimpleServer
|
|
51
51
|
asset = fetch_asset(path)
|
52
52
|
[
|
53
53
|
200,
|
54
|
-
{ '
|
54
|
+
{ 'content-type' => 'application/javascript' },
|
55
55
|
[asset[:data], "\n", asset[:map].to_data_uri_comment],
|
56
56
|
]
|
57
57
|
end
|
@@ -99,6 +99,6 @@ class Opal::SimpleServer
|
|
99
99
|
</html>
|
100
100
|
HTML
|
101
101
|
end
|
102
|
-
[200, { '
|
102
|
+
[200, { 'content-type' => 'text/html' }, [html]]
|
103
103
|
end
|
104
104
|
end
|
data/lib/opal/version.rb
CHANGED
data/opal/corelib/array.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# helpers: truthy, falsy,
|
1
|
+
# helpers: truthy, falsy, yield1, hash_get, hash_put, hash_delete, coerce_to, respond_to, deny_frozen_access, freeze, opal32_init, opal32_add
|
2
2
|
# backtick_javascript: true
|
3
3
|
|
4
4
|
require 'corelib/enumerable'
|
@@ -76,6 +76,22 @@ class ::Array < `Array`
|
|
76
76
|
}
|
77
77
|
return #{`array`.to_a};
|
78
78
|
}
|
79
|
+
|
80
|
+
function fast_push(arr, objects) {
|
81
|
+
// push.apply() for arrays longer than 32767 may cause various argument errors in browsers
|
82
|
+
// but it is significantly faster than a for loop, which pushes each element separately
|
83
|
+
// but apply() has a overhead by itself, for a small number of elements
|
84
|
+
// the for loop is significantly faster
|
85
|
+
// this is using the best option depending on objects.length
|
86
|
+
var length = objects.length;
|
87
|
+
if (length > 6 && length < 32767) {
|
88
|
+
arr.push.apply(arr, objects);
|
89
|
+
} else {
|
90
|
+
for (var i = 0; i < length; i++) {
|
91
|
+
arr.push(objects[i]);
|
92
|
+
}
|
93
|
+
}
|
94
|
+
}
|
79
95
|
}
|
80
96
|
|
81
97
|
def self.[](*objects)
|
@@ -99,7 +115,7 @@ class ::Array < `Array`
|
|
99
115
|
}
|
100
116
|
|
101
117
|
if (arguments.length === 0) {
|
102
|
-
self.splice(0, self.length);
|
118
|
+
if (self.length > 0) self.splice(0, self.length);
|
103
119
|
return self;
|
104
120
|
}
|
105
121
|
|
@@ -253,7 +269,7 @@ class ::Array < `Array`
|
|
253
269
|
end
|
254
270
|
|
255
271
|
%x{
|
256
|
-
if (#{
|
272
|
+
if (#{self} === #{other}) {
|
257
273
|
return 0;
|
258
274
|
}
|
259
275
|
|
@@ -1216,7 +1232,7 @@ class ::Array < `Array`
|
|
1216
1232
|
result.push(ary);
|
1217
1233
|
break;
|
1218
1234
|
default:
|
1219
|
-
|
1235
|
+
fast_push(result, _flatten(ary, level - 1));
|
1220
1236
|
}
|
1221
1237
|
}
|
1222
1238
|
return result;
|
@@ -1260,27 +1276,31 @@ class ::Array < `Array`
|
|
1260
1276
|
`$freeze(self)`
|
1261
1277
|
end
|
1262
1278
|
|
1279
|
+
`var $hash_ids`
|
1280
|
+
|
1263
1281
|
def hash
|
1264
1282
|
%x{
|
1265
1283
|
var top = ($hash_ids === undefined),
|
1266
|
-
result =
|
1284
|
+
result = $opal32_init(),
|
1267
1285
|
hash_id = self.$object_id(),
|
1268
1286
|
item, i, key;
|
1269
1287
|
|
1270
|
-
|
1271
|
-
|
1272
|
-
$hash_ids = Object.create(null);
|
1273
|
-
}
|
1288
|
+
result = $opal32_add(result, 0xA);
|
1289
|
+
result = $opal32_add(result, self.length);
|
1274
1290
|
|
1275
|
-
|
1276
|
-
|
1277
|
-
|
1278
|
-
|
1291
|
+
if (top) {
|
1292
|
+
$hash_ids = Object.create(null);
|
1293
|
+
}
|
1294
|
+
// return early for recursive structures
|
1295
|
+
else if ($hash_ids[hash_id]) {
|
1296
|
+
return $opal32_add(result, 0x01010101);
|
1297
|
+
}
|
1279
1298
|
|
1299
|
+
try {
|
1280
1300
|
for (key in $hash_ids) {
|
1281
1301
|
item = $hash_ids[key];
|
1282
1302
|
if (#{eql?(`item`)}) {
|
1283
|
-
return
|
1303
|
+
return $opal32_add(result, 0x01010101);
|
1284
1304
|
}
|
1285
1305
|
}
|
1286
1306
|
|
@@ -1288,10 +1308,10 @@ class ::Array < `Array`
|
|
1288
1308
|
|
1289
1309
|
for (i = 0; i < self.length; i++) {
|
1290
1310
|
item = self[i];
|
1291
|
-
result
|
1311
|
+
result = $opal32_add(result, item.$hash());
|
1292
1312
|
}
|
1293
1313
|
|
1294
|
-
return result
|
1314
|
+
return result;
|
1295
1315
|
} finally {
|
1296
1316
|
if (top) {
|
1297
1317
|
$hash_ids = undefined;
|
@@ -1741,9 +1761,7 @@ class ::Array < `Array`
|
|
1741
1761
|
%x{
|
1742
1762
|
$deny_frozen_access(self);
|
1743
1763
|
|
1744
|
-
|
1745
|
-
self.push(objects[i]);
|
1746
|
-
}
|
1764
|
+
fast_push(self, objects);
|
1747
1765
|
}
|
1748
1766
|
|
1749
1767
|
self
|
@@ -1801,8 +1819,8 @@ class ::Array < `Array`
|
|
1801
1819
|
other = `convertToArray(other)`
|
1802
1820
|
|
1803
1821
|
%x{
|
1804
|
-
self.splice(0, self.length);
|
1805
|
-
|
1822
|
+
if (self.length > 0) self.splice(0, self.length);
|
1823
|
+
fast_push(self, other);
|
1806
1824
|
}
|
1807
1825
|
|
1808
1826
|
self
|
data/opal/corelib/class.rb
CHANGED
@@ -24,6 +24,32 @@ class ::Class
|
|
24
24
|
}
|
25
25
|
end
|
26
26
|
|
27
|
+
def clone(freeze: nil)
|
28
|
+
unless freeze.nil? || freeze == true || freeze == false
|
29
|
+
raise ArgumentError, "unexpected value for freeze: #{freeze.class}"
|
30
|
+
end
|
31
|
+
|
32
|
+
copy = `Opal.allocate_class(nil, self.$$super)`
|
33
|
+
copy.copy_instance_variables(self)
|
34
|
+
copy.copy_singleton_methods(self)
|
35
|
+
copy.initialize_clone(self, freeze: freeze)
|
36
|
+
|
37
|
+
if freeze == true || (freeze.nil? && frozen?)
|
38
|
+
copy.freeze
|
39
|
+
end
|
40
|
+
|
41
|
+
copy
|
42
|
+
end
|
43
|
+
|
44
|
+
def dup
|
45
|
+
copy = `Opal.allocate_class(nil, self.$$super)`
|
46
|
+
|
47
|
+
copy.copy_instance_variables(self)
|
48
|
+
copy.initialize_dup(self)
|
49
|
+
|
50
|
+
copy
|
51
|
+
end
|
52
|
+
|
27
53
|
def descendants
|
28
54
|
subclasses + subclasses.map(&:descendants).flatten
|
29
55
|
end
|
@@ -31,14 +57,6 @@ class ::Class
|
|
31
57
|
def inherited(cls)
|
32
58
|
end
|
33
59
|
|
34
|
-
def initialize_dup(original)
|
35
|
-
initialize_copy(original)
|
36
|
-
%x{
|
37
|
-
self.$$name = null;
|
38
|
-
self.$$full_name = null;
|
39
|
-
}
|
40
|
-
end
|
41
|
-
|
42
60
|
def new(*args, &block)
|
43
61
|
%x{
|
44
62
|
var object = #{allocate};
|