opal 1.4.0.alpha1 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a891400c1e60680daab2289df6be2148d87aaf7e007210797a963c68af671e82
4
- data.tar.gz: 4315f9771bd13282d378ae1ec2b564864945cf94e780c17288d53af8f38dfc91
3
+ metadata.gz: ec2d9bb3f02059898f9a494c018fbcb4f451c4c5130b3e9ff455bf3ce1561fc9
4
+ data.tar.gz: a69e0554d43a0ef0ad6e7d439beb313536227615698487b8283321e879cf150d
5
5
  SHA512:
6
- metadata.gz: 3342a7d52885c1cab9b7371d72a758ce0e13aa97bae741ce549111245422366d5965b36d3eeda91b56b8d0ac733e2a3492c7d6c80190b27a9528aa77f12bfc84
7
- data.tar.gz: 1f71da4662d1218e4561154cc042ac2e643f097b119b048f35fc0f6d7c566b3b9321a3d4eb0a7020c83b197a32818379a7e7662aa82684a51c4b33e870be2a9a
6
+ metadata.gz: 5a96aade4e8183b8f00136eb4c5e64ea1f6b12b03aec98096476de4dd414b03b9ecfb90658a29bef403b366e36db43283b6e175cac5dcc3796453535f9ad7bd0
7
+ data.tar.gz: 8ea23169b1492a34b5bf98750259f9d9da636bb5070b50fad624a56a2eea65f4c5975a6385af3dfbdfad2a41985f5d32ba3aa583feea39b79b59ccc3cac20c43
data/CHANGELOG.md CHANGED
@@ -15,6 +15,83 @@ Changes are grouped as follows:
15
15
 
16
16
 
17
17
 
18
+ ## [1.4.0](https://github.com/opal/opal/compare/v1.3.2...v1.4.0) - 2021-12-24
19
+
20
+
21
+ ### Added
22
+
23
+ - Implement `chomp:` option for `String#each_line` and `#lines` ([#2355](https://github.com/opal/opal/pull/2355))
24
+ - Ruby 3.1 support and some older Ruby features we missed ([#2347](https://github.com/opal/opal/pull/2347))
25
+ - Use parser in 3.1 mode to support new language-level features like hashes/kwargs value omission, the pin operator for pattern matching
26
+ - `Array#intersect?`
27
+ - `String#strip` and `String#lstrip` to also remove NUL bytes
28
+ - `Integer.try_convert`
29
+ - `public`, `private`, `protected`, `module_function` now return their arguments
30
+ - `Class#descendants`, `Class#subclasses`
31
+ - (<=1.8) `Kernel#local_variables`
32
+ - (<=2.3) Set local variables for regexp named captures (`/(?<b>a)/ =~ 'a'` => `b = 'a'`)
33
+ - Remove deprecated `NIL`, `TRUE`, `FALSE` constants
34
+ - `String#unpack` and `String#unpack1` to support an `offset:` kwarg
35
+ - `MatchData#match`, `MatchData#match_length`
36
+ - Enumerable modernization
37
+ - `Enumerable#tally` to support an optional hash accumulator
38
+ - `Enumerable#each_{cons,slice}` to return self
39
+ - `Enumerable#compact`
40
+ - `Refinement` becomes its own class now
41
+ - `Struct#keyword_init?`
42
+ - (pre-3.1) Large Enumerator rework
43
+ - Introduce `Enumerator::ArithmeticSequence`
44
+ - Introduce `Enumerator::Chain`
45
+ - Introduce `Enumerator#+` to create `Enumerator::Chain`s
46
+ - `Enumerator#{rewind,peek,peek_values,next,next_values}`
47
+ - Improve corelib support for beginless/endless ranges and `ArithmeticSequences`
48
+ - `String#[]`, `Array#[]`, `Array#[]=`, `Array#fill`, `Array#values_at`
49
+ - `Range#step` and `Numeric#step` return an `ArithmeticSequence` when `Numeric` values are in play
50
+ - Introduce `Range#%`
51
+ - `Enumerator::Yielder#to_proc`
52
+ - Fix #2367
53
+ - (2.7) `UnboundMethod#bind_call`
54
+ - (Opal) `{Kernel,BasicObject}#{inspect,p,pp,method_missing}` may work with JS native values now, also they now correctly report cycles
55
+ - `Enumerable#sum` uses Kahan's summation algorithm to reduce error with floating point values
56
+ - `File.dirname` supports a new `level` argument
57
+ - Vendor in `optparse` and `shellwords` ([#2326](https://github.com/opal/opal/pull/2326))
58
+ - Preliminary support for compiling the whole `bin/opal` with Opal ([#2326](https://github.com/opal/opal/pull/2326))
59
+
60
+ ### Fixed
61
+
62
+ - Fix coertion for `Array#drop` ([#2371](https://github.com/opal/opal/pull/2371))
63
+ - Fix coertion for `File.absolute_path` ([#2372](https://github.com/opal/opal/pull/2372))
64
+ - Fix some `IO#puts` edge cases (no args, empty array, nested array, …) ([#2372](https://github.com/opal/opal/pull/2372))
65
+ - Preserve UNC path prefix on File.join ([#2366](https://github.com/opal/opal/pull/2366))
66
+ - Methods on `Kernel`, `BasicObject`, `Boolean` will never return boxed values anymore ([#2293](https://github.com/opal/opal/pull/2293))
67
+ - `false.tap{}` will now correctly return a JS value of `false`, not `Object(false)`
68
+ - opal-parser doesn't break on `<<~END` strings anymore ([#2364](https://github.com/opal/opal/pull/2364))
69
+ - Fix error reporting at the early stage of loading ([#2326](https://github.com/opal/opal/pull/2326))
70
+
71
+ ### Changed
72
+
73
+ - Various outputted code size optimizations - 19% improvement for minified unmangled AsciiDoctor bundle - see: https://opalrb.com/blog/2021/11/24/optimizing-opal-output-for-size/ ([#2356](https://github.com/opal/opal/pull/2356))
74
+ - Second round of code size optimizations - 3% improvement for AsciiDoctor bundle on top of the first round - 23% total - see: https://github.com/opal/opal/pull/2365/commits ([#2365](https://github.com/opal/opal/pull/2365))
75
+ - The calls to `==`, `!=` and `===` changed their semantics slightly: it's impossible to monkey patch those calls for `String` and `Number`, but on other classes they can now return `nil` and it will be handled correctly
76
+ - The calls to `!` changed their semantics slightly: it's impossible to monkey patch this call for `Boolean` or `NilClass`.
77
+ - Refactored the structure of the internal `stdlib/nodejs` folder ([#2374](https://github.com/opal/opal/pull/2374))
78
+ - Added `nodejs/base` with just I/O, exit, and ARGV management
79
+ - Moved `Process::Status` to corelib
80
+ - Fixed requires to be more robust
81
+
82
+ ### Removed
83
+
84
+ - Removed `nodejs/irb` from stdlib as it's been broken for some time ([#2374](https://github.com/opal/opal/pull/2374))
85
+ - Removed `Kernel#node_require` from `nodejs/kernel` as it's been deprecated for a long time ([#2374](https://github.com/opal/opal/pull/2374))
86
+
87
+ <!--
88
+ ### Deprecated
89
+ ### Internal
90
+ -->
91
+
92
+
93
+
94
+
18
95
  ## [1.3.2](https://github.com/opal/opal/compare/v1.3.1...v1.3.2) - 2021-11-10
19
96
 
20
97
 
@@ -26,13 +103,6 @@ Changes are grouped as follows:
26
103
  - Do not modify `$~` when calling `String#scan` from internal methods ([#2353](https://github.com/opal/opal/pull/2353))
27
104
  - Stop interpreting falsey values as a missing constant in `Module#const_get` ([#2354](https://github.com/opal/opal/pull/2354))
28
105
 
29
- <!--
30
- ### Changed
31
- ### Deprecated
32
- ### Removed
33
- ### Internal
34
- -->
35
-
36
106
 
37
107
 
38
108
 
data/UNRELEASED.md CHANGED
@@ -1,71 +1,8 @@
1
+ <!--
1
2
  ### Added
2
-
3
- - Implement `chomp:` option for `String#each_line` and `#lines` (#2355)
4
- - Ruby 3.1 support and some older Ruby features we missed (#2347)
5
- - Use parser in 3.1 mode to support new language-level features like hashes/kwargs value omission, the pin operator for pattern matching
6
- - `Array#intersect?`
7
- - `String#strip` and `String#lstrip` to also remove NUL bytes
8
- - `Integer.try_convert`
9
- - `public`, `private`, `protected`, `module_function` now return their arguments
10
- - `Class#descendants`, `Class#subclasses`
11
- - (<=1.8) `Kernel#local_variables`
12
- - (<=2.3) Set local variables for regexp named captures (`/(?<b>a)/ =~ 'a'` => `b = 'a'`)
13
- - Remove deprecated `NIL`, `TRUE`, `FALSE` constants
14
- - `String#unpack` and `String#unpack1` to support an `offset:` kwarg
15
- - `MatchData#match`, `MatchData#match_length`
16
- - Enumerable modernization
17
- - `Enumerable#tally` to support an optional hash accumulator
18
- - `Enumerable#each_{cons,slice}` to return self
19
- - `Enumerable#compact`
20
- - `Refinement` becomes its own class now
21
- - `Struct#keyword_init?`
22
- - (pre-3.1) Large Enumerator rework
23
- - Introduce `Enumerator::ArithmeticSequence`
24
- - Introduce `Enumerator::Chain`
25
- - Introduce `Enumerator#+` to create `Enumerator::Chain`s
26
- - `Enumerator#{rewind,peek,peek_values,next,next_values}`
27
- - Improve corelib support for beginless/endless ranges and `ArithmeticSequences`
28
- - `String#[]`, `Array#[]`, `Array#[]=`, `Array#fill`, `Array#values_at`
29
- - `Range#step` and `Numeric#step` return an `ArithmeticSequence` when `Numeric` values are in play
30
- - Introduce `Range#%`
31
- - `Enumerator::Yielder#to_proc`
32
- - Fix #2367
33
- - (2.7) `UnboundMethod#bind_call`
34
- - (Opal) `{Kernel,BasicObject}#{inspect,p,pp,method_missing}` may work with JS native values now, also they now correctly report cycles
35
- - `Enumerable#sum` uses Kahan's summation algorithm to reduce error with floating point values
36
- - `File.dirname` supports a new `level` argument
37
- - Vendor in `optparse` and `shellwords` (#2326)
38
- - Preliminary support for compiling the whole `bin/opal` with Opal (#2326)
39
-
40
3
  ### Fixed
41
-
42
- - Fix defining multiple methods with the same block (#2345)
43
- - Fix coertion for `Array#drop` (#2371)
44
- - Fix coertion for `File.absolute_path` (#2372)
45
- - Fix some `IO#puts` edge cases (no args, empty array, nested array, …) (#2372)
46
- - Preserve UNC path prefix on File.join (#2366)
47
- - Methods on `Kernel`, `BasicObject`, `Boolean` will never return boxed values anymore (#2293)
48
- - `false.tap{}` will now correctly return a JS value of `false`, not `Object(false)`
49
- - opal-parser doesn't break on `<<~END` strings anymore (#2364)
50
- - Fix error reporting at the early stage of loading (#2326)
51
-
52
4
  ### Changed
53
-
54
- - Various outputted code size optimizations - 19% improvement for minified unmangled AsciiDoctor bundle - see: https://opalrb.com/blog/2021/11/24/optimizing-opal-output-for-size/ (#2356)
55
- - Second round of code size optimizations - 3% improvement for AsciiDoctor bundle on top of the first round - 23% total - see: https://github.com/opal/opal/pull/2365/commits (#2365)
56
- - The calls to `==`, `!=` and `===` changed their semantics slightly: it's impossible to monkey patch those calls for `String` and `Number`, but on other classes they can now return `nil` and it will be handled correctly
57
- - The calls to `!` changed their semantics slightly: it's impossible to monkey patch this call for `Boolean` or `NilClass`.
58
- - Refactored the structure of the internal `stdlib/nodejs` folder (#2374)
59
- - Added `nodejs/base` with just I/O, exit, and ARGV management
60
- - Moved `Process::Status` to corelib
61
- - Fixed requires to be more robust
62
-
63
5
  ### Removed
64
-
65
- - Removed `nodejs/irb` from stdlib as it's been broken for some time (#2374)
66
- - Removed `Kernel#node_require` from `nodejs/kernel` as it's been deprecated for a long time (#2374)
67
-
68
- <!--
69
6
  ### Deprecated
70
7
  ### Internal
71
8
  -->
data/docs/releasing.md CHANGED
@@ -11,15 +11,14 @@ _This guide is a work-in-progress._
11
11
 
12
12
  - Ensure all the unreleased changes are documented in UNRELEASED.md
13
13
  - Run `bin/rake changelog VERSION=v1.2.3` specifying the version number you're about to release
14
+ - Empty UNRELEASED.md
14
15
 
15
16
  ## The commit
16
17
 
17
18
  - Commit the updated changelog along with the version bump using this commit message:
18
19
  "Release v1.2.3"
19
20
  - Push the commit and run `bin/rake release` to release the new version to Rubygems
20
- - Go to GitHub releases and create a new release from the latest tag pasting the contents of UNRELEASED.md
21
- - Empty UNRELEASED.md and run `bin/rake changelog`
22
- - Push the updated changelog
21
+ - Go to GitHub releases and create a new release from the latest tag pasting the contents from CHANGELOG.md
23
22
 
24
23
  ## Opal docs
25
24
 
data/lib/opal/nodes/if.rb CHANGED
@@ -147,6 +147,10 @@ module Opal
147
147
  case body.type
148
148
  when :return, :js_return, :break, :next, :redo, :retry
149
149
  false
150
+ when :xstr
151
+ XStringNode.single_line?(
152
+ XStringNode.strip_empty_children(body.children)
153
+ )
150
154
  else
151
155
  body.children.all? { |i| simple?(i) }
152
156
  end
@@ -8,9 +8,9 @@ module Opal
8
8
  def compile
9
9
  @should_add_semicolon = false
10
10
  unpacked_children = unpack_return(children)
11
- stripped_children = strip_empty_children(unpacked_children)
11
+ stripped_children = XStringNode.strip_empty_children(unpacked_children)
12
12
 
13
- if single_line?(stripped_children)
13
+ if XStringNode.single_line?(stripped_children)
14
14
  # If it's a single line we'll try to:
15
15
  #
16
16
  # - strip empty lines
@@ -30,6 +30,31 @@ module Opal
30
30
  push ';' if @should_add_semicolon
31
31
  end
32
32
 
33
+ # Check if there's only one child or if they're all part of
34
+ # the same line (e.g. because of interpolations)
35
+ def self.single_line?(children)
36
+ (children.size == 1) || children.none? do |c|
37
+ c.type == :str && c.loc.expression.source.end_with?("\n")
38
+ end
39
+ end
40
+
41
+ # Will remove empty :str lines coming from cosmetic newlines in x-strings
42
+ #
43
+ # @example
44
+ # # this will generate two additional empty
45
+ # # children before and after `foo()`
46
+ # %x{
47
+ # foo()
48
+ # }
49
+ def self.strip_empty_children(children)
50
+ children = children.dup
51
+ empty_line = ->(child) { child.nil? || (child.type == :str && child.loc.expression.source.rstrip.empty?) }
52
+
53
+ children.shift while children.any? && empty_line[children.first]
54
+ children.pop while children.any? && empty_line[children.last]
55
+
56
+ children
57
+ end
33
58
 
34
59
  private
35
60
 
@@ -97,14 +122,6 @@ module Opal
97
122
  last_value
98
123
  end
99
124
 
100
- # Check if there's only one child or if they're all part of
101
- # the same line (e.g. because of interpolations)
102
- def single_line?(children)
103
- (children.size == 1) || children.none? do |c|
104
- c.type == :str && c.loc.expression.source.end_with?("\n")
105
- end
106
- end
107
-
108
125
  # A case for manually created :js_return statement in Compiler#returns
109
126
  # Since we need to take original source of :str we have to use raw source
110
127
  # so we need to combine "return" with "raw_source"
@@ -119,24 +136,6 @@ module Opal
119
136
 
120
137
  children
121
138
  end
122
-
123
- # Will remove empty :str lines coming from cosmetic newlines in x-strings
124
- #
125
- # @example
126
- # # this will generate two additional empty
127
- # # children before and after `foo()`
128
- # %x{
129
- # foo()
130
- # }
131
- def strip_empty_children(children)
132
- children = children.dup
133
- empty_line = ->(child) { child.nil? || (child.type == :str && child.loc.expression.source.rstrip.empty?) }
134
-
135
- children.shift while children.any? && empty_line[children.first]
136
- children.pop while children.any? && empty_line[children.last]
137
-
138
- children
139
- end
140
139
  end
141
140
  end
142
141
  end
data/lib/opal/version.rb CHANGED
@@ -3,5 +3,5 @@
3
3
  module Opal
4
4
  # WHEN RELEASING:
5
5
  # Remember to update RUBY_ENGINE_VERSION in opal/corelib/constants.rb too!
6
- VERSION = '1.4.0.alpha1'
6
+ VERSION = '1.4.0'
7
7
  end
@@ -1,8 +1,8 @@
1
1
  ::RUBY_PLATFORM = 'opal'
2
2
  ::RUBY_ENGINE = 'opal'
3
3
  ::RUBY_VERSION = '3.1.0'
4
- ::RUBY_ENGINE_VERSION = '1.4.0.alpha1'
5
- ::RUBY_RELEASE_DATE = '2021-12-21'
4
+ ::RUBY_ENGINE_VERSION = '1.4.0'
5
+ ::RUBY_RELEASE_DATE = '2021-12-24'
6
6
  ::RUBY_PATCHLEVEL = 0
7
7
  ::RUBY_REVISION = '0'
8
8
  ::RUBY_COPYRIGHT = 'opal - Copyright (C) 2013-2021 Adam Beynon and the Opal contributors'
@@ -396,27 +396,14 @@ class ::Module
396
396
  end
397
397
 
398
398
  %x{
399
- // Wrapping and forwarding is required to make super work, as the
400
- // same block can be used to define multiple methods.
401
- var wrapper = function() {
402
- block.$$jsid = name
403
- block.$$p = wrapper.$$p
404
- block.$$s = null;
405
- block.$$def = wrapper;
406
- block.$$define_meth = true;
407
-
408
- return block.apply(this, arguments)
409
- }
410
-
411
399
  var id = '$' + name;
412
- wrapper.$$jsid = name
413
- wrapper.$$s = null;
414
- wrapper.$$def = wrapper;
415
- wrapper.$$define_meth = true;
416
400
 
417
- Object.assign(wrapper, block)
401
+ block.$$jsid = name;
402
+ block.$$s = null;
403
+ block.$$def = block;
404
+ block.$$define_meth = true;
418
405
 
419
- return Opal.defn(self, id, wrapper);
406
+ return Opal.defn(self, id, block);
420
407
  }
421
408
  end
422
409
 
@@ -0,0 +1,13 @@
1
+ describe "The x-string expression" do
2
+ it "works with multiline, case and assignment" do
3
+ a = case 1
4
+ when 1
5
+ %x{
6
+ var b = 5;
7
+ return b;
8
+ }
9
+ end
10
+
11
+ a.should == 5
12
+ end
13
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opal
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0.alpha1
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elia Schito
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2021-12-21 00:00:00.000000000 Z
13
+ date: 2021-12-24 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: ast
@@ -860,8 +860,8 @@ files:
860
860
  - spec/opal/core/language/numblocks_spec.rb
861
861
  - spec/opal/core/language/pattern_matching_spec.rb
862
862
  - spec/opal/core/language/safe_navigator_spec.rb
863
- - spec/opal/core/language/super_spec.rb
864
863
  - spec/opal/core/language/while_spec.rb
864
+ - spec/opal/core/language/xstring_spec.rb
865
865
  - spec/opal/core/language_spec.rb
866
866
  - spec/opal/core/marshal/dump_spec.rb
867
867
  - spec/opal/core/marshal/load_spec.rb
@@ -1151,10 +1151,10 @@ licenses:
1151
1151
  metadata:
1152
1152
  homepage_uri: https://opalrb.com/
1153
1153
  bug_tracker_uri: https://github.com/opal/opal/issues
1154
- changelog_uri: https://github.com/opal/opal/blob/v1.4.0.alpha1/CHANGELOG.md
1155
- readme_uri: https://github.com/opal/opal/blob/v1.4.0.alpha1/README.md
1156
- api_documentation_uri: http://opalrb.com/docs/api/v1.4.0.alpha1/index.html
1157
- guides_uri: http://opalrb.com/docs/guides/v1.4.0.alpha1/index.html
1154
+ changelog_uri: https://github.com/opal/opal/blob/v1.4.0/CHANGELOG.md
1155
+ readme_uri: https://github.com/opal/opal/blob/v1.4.0/README.md
1156
+ api_documentation_uri: http://opalrb.com/docs/api/v1.4.0/index.html
1157
+ guides_uri: http://opalrb.com/docs/guides/v1.4.0/index.html
1158
1158
  chat_uri: https://gitter.im/opal/opal
1159
1159
  source_code_uri: https://github.com/opal/opal
1160
1160
  post_install_message:
@@ -1168,9 +1168,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
1168
1168
  version: '2.3'
1169
1169
  required_rubygems_version: !ruby/object:Gem::Requirement
1170
1170
  requirements:
1171
- - - ">"
1171
+ - - ">="
1172
1172
  - !ruby/object:Gem::Version
1173
- version: 1.3.1
1173
+ version: '0'
1174
1174
  requirements: []
1175
1175
  rubygems_version: 3.2.3
1176
1176
  signing_key:
@@ -1,24 +0,0 @@
1
- describe "a block with super" do
2
- it "can be used to define multiple methods" do
3
- block = proc {
4
- super()
5
- }
6
-
7
- c1 = Class.new {
8
- def foo; :foo; end
9
- def bar; :bar; end
10
- def foo_bar; [foo, bar]; end
11
- }
12
-
13
- c2 = Class.new(c1) {
14
- define_method :foo, block
15
- define_method :bar, block
16
- define_method :foo_bar, block
17
- }
18
-
19
- obj = c2.new
20
- obj.foo.should == :foo
21
- obj.bar.should == :bar
22
- obj.foo_bar.should == [:foo, :bar]
23
- end
24
- end