regexp_parser 2.6.0 → 2.6.2

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: cadf1761e17469c6bf76db652a4f6fc97a3d33b7eaa46e6ea16f95ee6661743d
4
- data.tar.gz: 3d6252f67f201b3cb6a3b94721c65b39abfe7b13bf0097fc9144498f6fdf8837
3
+ metadata.gz: 66568005494b517613155277c6be4731eb8a26bb9b48a692a9430507286ce583
4
+ data.tar.gz: d1fc6c6f1a0c7f939c51703ac844c2dbb134f96e0e55780646cb7e3e87d7a652
5
5
  SHA512:
6
- metadata.gz: 3fb24f56b5d8da354aa5825dc2e9432c7e8bd836c9c2a7009c8883e367fb8ca61020a04854c714cacff913281b1156b4663334696edcb1d7e9239d8c8184d439
7
- data.tar.gz: e793b72a9394e26bf0b9e6cb58c7536b72c30562382713f8b60735969f3b3b9b3aea78bf45efa661397d7141c2684a6df2b32cc8b449c413ea9d11c90c5396db
6
+ metadata.gz: b955b2215b71c94497e52841142fab8c2b9930d0d6cea6ea2b3eeb8ed9fe84575e2f34aae3a6051af2b56429f98cf070b9151805f2cb93ddb511ec1e0e50dd7c
7
+ data.tar.gz: 3a4f083942b66ddb4b67ab33f14bb1c0b724a60c2b30605059d32ce3648e9cb46e31e797b7a526a2028c1e018d73365f5ef955256de4e63397d6ea105714ff12
data/CHANGELOG.md CHANGED
@@ -7,6 +7,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.6.2] - 2023-01-19 - [Janosch Müller](mailto:janosch84@gmail.com)
11
+
12
+ ### Fixed
13
+
14
+ - fixed `SystemStackError` when cloning recursive subexpression calls
15
+ * e.g. `Regexp::Parser.parse(/a|b\g<0>/).dup`
16
+
17
+ ## [2.6.1] - 2022-11-16 - [Janosch Müller](mailto:janosch84@gmail.com)
18
+
19
+ ### Fixed
20
+
21
+ - fixed scanning of two negative lookbehind edge cases
22
+ * `(?<!x)y>` used to raise a ScannerError
23
+ * `(?<!x>)y` used to be misinterpreted as a named group
24
+ * thanks to [Sergio Medina](https://github.com/serch) for the report
25
+
10
26
  ## [2.6.0] - 2022-09-26 - [Janosch Müller](mailto:janosch84@gmail.com)
11
27
 
12
28
  ### Fixed
@@ -5,7 +5,19 @@ module Regexp::Expression
5
5
  attr_accessor :referenced_expression
6
6
 
7
7
  def initialize_copy(orig)
8
- self.referenced_expression = orig.referenced_expression.dup
8
+ exp_id = [self.class, self.starts_at]
9
+
10
+ # prevent infinite recursion for recursive subexp calls
11
+ copied = @@copied ||= {}
12
+ self.referenced_expression =
13
+ if copied[exp_id]
14
+ orig.referenced_expression
15
+ else
16
+ copied[exp_id] = true
17
+ orig.referenced_expression.dup
18
+ end
19
+ copied.clear
20
+
9
21
  super
10
22
  end
11
23
  end
@@ -63,16 +63,20 @@ class Regexp::MatchLength
63
63
  end
64
64
 
65
65
  def to_re
66
- "(?:#{reify.call}){#{min_rep},#{max_rep unless max_rep == Float::INFINITY}}"
66
+ /(?:#{reify.call}){#{min_rep},#{max_rep unless max_rep == Float::INFINITY}}/
67
67
  end
68
68
 
69
69
  private
70
70
 
71
71
  attr_accessor :base_min, :base_max, :min_rep, :max_rep, :exp_class, :reify
72
72
 
73
- def test_regexp
74
- @test_regexp ||= Regexp.new("^#{to_re}$").tap do |regexp|
75
- regexp.respond_to?(:match?) || def regexp.match?(str); !!match(str) end
73
+ if Regexp.method_defined?(:match?) # ruby >= 2.4
74
+ def test_regexp
75
+ @test_regexp ||= /^#{to_re}$/
76
+ end
77
+ else
78
+ def test_regexp
79
+ @test_regexp ||= /^#{to_re}$/.tap { |r| def r.match?(s); !!match(s) end }
76
80
  end
77
81
  end
78
82
  end
@@ -90,8 +90,8 @@
90
90
  group_options = '?' . ( [^!#'():<=>~]+ . ':'? ) ?;
91
91
 
92
92
  group_ref = [gk];
93
- group_name_id_ab = ([^0-9\->] | utf8_multibyte) . ([^>] | utf8_multibyte)*;
94
- group_name_id_sq = ([^0-9\-'] | utf8_multibyte) . ([^'] | utf8_multibyte)*;
93
+ group_name_id_ab = ([^!0-9\->] | utf8_multibyte) . ([^>] | utf8_multibyte)*;
94
+ group_name_id_sq = ([^0-9\-'] | utf8_multibyte) . ([^'] | utf8_multibyte)*;
95
95
  group_number = '-'? . [1-9] . [0-9]*;
96
96
  group_level = [+\-] . [0-9]+;
97
97