summaryrefslogtreecommitdiff
path: root/re.c
AgeCommit message (Collapse)Author
2023-03-06Stop exporting symbols for MJITTakashi Kokubun
Notes: Merged: https://github.com/ruby/ruby/pull/7459
2023-03-06[DOC] Fix options of `Regexp#initialize`Nobuyoshi Nakada
`Integer#|` is bit-wise OR operator, not logical OR. Notes: Merged: https://github.com/ruby/ruby/pull/7435
2023-03-06`rb_scan_args` never fills optional arguments with `Qundef`Nobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/7435
2023-03-03[Bug #19471] `Regexp.compile` should handle keyword argumentsNobuyoshi Nakada
As well as `Regexp.new`, it should pass keyword arguments to the `Regexp#initialize` method. Notes: Merged: https://github.com/ruby/ruby/pull/7431
2023-03-01Remove support for the Regexp.new 3rd argumentJeremy Evans
This was deprecated in Ruby 3.2. Fixes [Bug #18797] Notes: Merged: https://github.com/ruby/ruby/pull/7039
2023-02-26Adjust `else` style to be consistent in each files [ci skip]Nobuyoshi Nakada
2023-02-19Remove (newly unneeded) remarks about aliasesBurdetteLamar
2023-02-10Implement Write Barrier for RMatch objectsJean Boussier
They only have two references. Notes: Merged: https://github.com/ruby/ruby/pull/7286
2023-02-10[DOC] Fix typo in document of regexp [ci skip]OKURA Masafumi
Notes: Merged: https://github.com/ruby/ruby/pull/7283 Merged-By: nobu <nobu@ruby-lang.org>
2023-02-09Remove `REG_LITERAL` flagNobuyoshi Nakada
All `Regexp` literals are frozen now. Notes: Merged: https://github.com/ruby/ruby/pull/7276
2023-01-30Fix parsing of regexps that toggle extended mode on/off inside regexpJeremy Evans
This was broken in ec3542229b29ec93062e9d90e877ea29d3c19472. That commit didn't handle cases where extended mode was turned on/off inside the regexp. There are two ways to turn extended mode on/off: ``` /(?-x:#y)#z /x =~ '#y' /(?-x)#y(?x)#z /x =~ '#y' ``` These can be nested inside the same regexp: ``` /(?-x:(?x)#x (?-x)#y)#z /x =~ '#y' ``` As you can probably imagine, this makes handling these regexps somewhat complex. Due to the nesting inside portions of regexps, the unassign_nonascii function needs to be recursive. In recursive mode, it needs to track both opening and closing parentheses, similar to how it already tracked opening and closing brackets for character classes. When scanning the regexp and coming to `(?` not followed by `#`, scan for options, and use `x` and `i` to determine whether to turn on or off extended mode. For `:`, indicting only the current regexp section should have the extended mode switched, recurse with the extended mode set or unset. For `)`, indicating the remainder of the regexp (or current regexp portion if already recursing) should turn extended mode on or off, just change the extended mode flag and keep scanning. While testing this, I noticed that `a`, `d`, and `u` are accepted as options, in addition to `i`, `m`, and `x`, but I can't see where those options are documented. I'm not sure whether or not handling `a`, `d`, and `u` as options is a bug. Fixes [Bug #19379] Notes: Merged: https://github.com/ruby/ruby/pull/7192
2023-01-16[DOC] Correction to RDoc for Regexp.new (#7130)Burdette Lamar
Correction to RDoc for Regexp.new Notes: Merged-By: BurdetteLamar <BurdetteLamar@Yahoo.com>
2022-12-22Always issue deprecation warning when calling Regexp.new with 3rd positional ↵Jeremy Evans
argument Previously, only certain values of the 3rd argument triggered a deprecation warning. First step for fix for bug #18797. Support for the 3rd argument will be removed after the release of Ruby 3.2. Fix minor fallout discovered by the tests. Co-authored-by: Nobuyoshi Nakada <nobu@ruby-lang.org> Notes: Merged: https://github.com/ruby/ruby/pull/6976
2022-12-22Refactor `reg_extract_args` to return regexp if givenNobuyoshi Nakada
2022-12-22Share argument parsing in `Regexp#initialize` and `Regexp.linear_time?`Nobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/6988
2022-12-19typo in doc [ci skip]卜部昌平
2022-12-19Note about Regexp.linera_time? [ci skip]卜部昌平
2022-12-14Add `Regexp.linear_time?` (#6901)TSUYUSATO Kitsune
Notes: Merged-By: makenowjust <make.just.on@gmail.com>
2022-12-02Introduce encoding check macroS-H-GAMELINKS
Notes: Merged: https://github.com/ruby/ruby/pull/6700
2022-12-01Prevent segfault in String#scan with ObjectSpace.each_objectYusuke Endoh
Calling `String#scan` without a block creates an incomplete MatchData object whose `RMATCH(match)->str` is Qfalse. Usually this object is not leaked, but it was possible to pull it by using ObjectSpace.each_object. This change hides the internal MatchData object by using rb_obj_hide. Fixes [Bug #19159] Notes: Merged: https://github.com/ruby/ruby/pull/6836
2022-11-16Using UNDEF_P macroS-H-GAMELINKS
Notes: Merged: https://github.com/ruby/ruby/pull/6721
2022-11-08Suppress false warning by a bug of gccNobuyoshi Nakada
GCC [Bug 99578] seems triggered by calling `rb_reg_last_match` before `match_check(match)`, probably by `NIL_P(match)` in `rb_reg_nth_match`. [Bug 99578]: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99578 Notes: Merged: https://github.com/ruby/ruby/pull/6690
2022-10-24Refactor timeout-setting code to a functionYusuke Endoh
2022-10-24Refactor timeout-related code in re.c a littleYusuke Endoh
2022-10-24Fix per-instance Regexp timeout (#6621)Yusuke Endoh
Fix per-instance Regexp timeout This makes it follow what was decided in [Bug #19055]: * `Regexp.new(str, timeout: nil)` should respect the global timeout * `Regexp.new(str, timeout: huge_val)` should use the maximum value that can be represented in the internal representation * `Regexp.new(str, timeout: 0 or negative value)` should raise an error Notes: Merged-By: mame <mame@ruby-lang.org>
2022-10-23Fix argument & Remove enumS-H-GAMELINKS
Notes: Merged: https://github.com/ruby/ruby/pull/6616
2022-10-23Introduce rb_memsearch_with_char_size functionS-H-GAMELINKS
Notes: Merged: https://github.com/ruby/ruby/pull/6616
2022-10-10* expand tabs. [ci skip]git
Tabs were expanded because the file did not have any tab indentation in unedited lines. Please update your editor config, and use misc/expand_tabs.rb in the pre-commit hook.
2022-10-10Should use dedecated function `Check_Type`Nobuyoshi Nakada
2022-10-10Add MatchData#deconstruct/deconstruct_keysVladimir Dementyev
Notes: Merged: https://github.com/ruby/ruby/pull/6216
2022-08-18[DOC] `offset` argument of Regexp#matchNobuyoshi Nakada
2022-08-02Speed up setting the backref match objectAaron Patterson
This patch speeds up setting the backref match object by avoiding some memcopies. Take the following code for example: ```ruby "hello world" =~ /hello/ p $~ ``` When the RE matches the string, we have to set the Match object in the backref global. So we would allocate a match object[^1] and use `rb_reg_region_copy`[^2] to make a deep copy of the stack allocated `re_registers` struct[^3] in to the newly created Ruby object. This could possibly trigger GC[^4], and would allocate new memory. This patch makes a shallow copy of the `re_registers` struct on to the Match object allowing the match object to manage the `re_registers` pointer and also avoiding some calls to `xmalloc` and some manual memcopy. Benchmark looks like this: ```ruby require "benchmark/ips" def test_re thing thing =~ /hello/ end Benchmark.ips do |x| x.report("re hit") do test_re "hello world" end x.report("re miss") do test_re "world" end end ``` Before this patch: ``` $ ruby -v test.rb ruby 3.2.0dev (2022-07-27T22:29:00Z master 4ad69899b7) [arm64-darwin21] Ignoring bcrypt-3.1.16 because its extensions are not built. Try: gem pristine bcrypt --version 3.1.16 Warming up -------------------------------------- re hit 345.401k i/100ms re miss 673.584k i/100ms Calculating ------------------------------------- re hit 3.452M (± 0.5%) i/s - 17.270M in 5.002535s re miss 6.736M (± 0.4%) i/s - 34.353M in 5.099593s ``` After this patch: ``` $ ./ruby -v test.rb ruby 3.2.0dev (2022-08-01T21:24:12Z less-memcpy 0ff2a56606) [arm64-darwin21] Warming up -------------------------------------- re hit 419.578k i/100ms re miss 673.251k i/100ms Calculating ------------------------------------- re hit 4.201M (± 0.7%) i/s - 21.398M in 5.093593s re miss 6.716M (± 0.4%) i/s - 33.663M in 5.012756s ``` Matches get faster and misses maintain the same speed [^1]: https://github.com/ruby/ruby/blob/24204d54ab730791bfbd0cd66b8e12f0bd62ca5d/re.c#L1737 [^2]: https://github.com/ruby/ruby/blob/24204d54ab730791bfbd0cd66b8e12f0bd62ca5d/re.c#L1738 [^3]: https://github.com/ruby/ruby/blob/24204d54ab730791bfbd0cd66b8e12f0bd62ca5d/re.c#L1686 [^4]: https://github.com/ruby/ruby/blob/24204d54ab730791bfbd0cd66b8e12f0bd62ca5d/re.c#L981 Notes: Merged: https://github.com/ruby/ruby/pull/6206
2022-07-21Expand tabs [ci skip]Takashi Kokubun
[Misc #18891] Notes: Merged: https://github.com/ruby/ruby/pull/6094
2022-06-26[DOC] Fix a typo [ci skip]Kazuhiro NISHIYAMA
2022-06-20Document that Regexp#source does not retain lexer escapesJeremy Evans
Related to [Feature #18838] Notes: Merged: https://github.com/ruby/ruby/pull/6047
2022-06-20[Feature #18788] [DOC] String options to `Regexp.new`Nobuyoshi Nakada
Co-Authored-By: Janosch Müller <janosch.mueller@betterplace.org> Notes: Merged: https://github.com/ruby/ruby/pull/6039
2022-06-20[Feature #18788] Support options as `String` to `Regexp.new`Nobuyoshi Nakada
`Regexp.new` now supports passing the regexp flags not only as an `Integer`, but also as a `String. Unknown flags raise errors. Notes: Merged: https://github.com/ruby/ruby/pull/6039
2022-06-20Warn suspicious flag to `Regexp.new`Nobuyoshi Nakada
Now second argument should be `true`, `false`, `nil` or Integer. This flag is confused with third argument some times. Notes: Merged: https://github.com/ruby/ruby/pull/6039
2022-06-20[DOC] Refine Regexp.new argument descriptionsNobuyoshi Nakada
2022-06-20[DOC] Regexp timeout is float or nilNobuyoshi Nakada
2022-06-20[DOC] Fixed omissions in Regexp.new argumentsNobuyoshi Nakada
2022-06-06Ignore invalid escapes in regexp commentsJeremy Evans
Invalid escapes are handled at multiple levels. The first level is in parse.y, so skip invalid unicode escape checks for regexps in parse.y. Make rb_reg_preprocess and unescape_nonascii accept the regexp options. In unescape_nonascii, if the regexp is an extended regexp, when "#" is encountered, ignore all characters until the end of line or end of regexp. Unfortunately, in extended regexps, you can use "#" as a non-comment character inside a character class, so also parse "[" and "]" specially for extended regexps, and only skip comments if "#" is not inside a character class. Handle nested character classes as well. This issue doesn't just affect extended regexps, it also affects "(#?" comments inside all regexps. So for those comments, scan until trailing ")" and ignore content inside. I'm not sure if there are other corner cases not handled. A better fix would be to redesign the regexp parser so that it unescaped during parsing instead of before parsing, so you already know the current parsing state. Fixes [Bug #18294] Co-authored-by: Nobuyoshi Nakada <nobu@ruby-lang.org> Notes: Merged: https://github.com/ruby/ruby/pull/5721 Merged-By: jeremyevans <code@jeremyevans.net>
2022-04-18[DOC] Enhanced RDoc for MatchData (#5822)Burdette Lamar
Treats: #to_s #named_captures #string #inspect #hash #== Notes: Merged-By: BurdetteLamar <BurdetteLamar@Yahoo.com>
2022-04-18Enhanced RDoc for MatchData (#5821)Burdette Lamar
Treats: #[] #values_at Notes: Merged-By: BurdetteLamar <BurdetteLamar@Yahoo.com>
2022-04-18Enhanced RDoc for MatchData (#5820)Burdette Lamar
Treats: #pre_match #post_match #to_a #captures Notes: Merged-By: BurdetteLamar <BurdetteLamar@Yahoo.com>
2022-04-18[DOC] Enhanced RDoc for MatchData (#5819)Burdette Lamar
Treats: #begin #end #match #match_length Notes: Merged-By: BurdetteLamar <BurdetteLamar@Yahoo.com>
2022-04-18[DOC] Enhanced RDoc for MatchData (#5818)Burdette Lamar
Treats: #regexp #names #size #offset Notes: Merged-By: BurdetteLamar <BurdetteLamar@Yahoo.com>
2022-04-18[DOC] Enhanced RDoc for Regexp (#5815)Burdette Lamar
Treats: ::new ::escape ::try_convert ::union ::last_match Notes: Merged-By: BurdetteLamar <BurdetteLamar@Yahoo.com>
2022-04-16[DOC] Enhanced RDoc for Regexp (#5812)Burdette Lamar
Treats: #fixed_encoding? #hash #== #=~ #match #match? Also, in regexp.rdoc: Changes heading from 'Special Global Variables' to 'Regexp Global Variables'. Add tiny section 'Regexp Interpolation'. Notes: Merged-By: BurdetteLamar <BurdetteLamar@Yahoo.com>
2022-04-15[DOC] Enhanced RDoc for Regexp (#5807)Burdette Lamar
Treats: #source #inspect #to_s #casefold? #options #names #named_captures Notes: Merged-By: BurdetteLamar <BurdetteLamar@Yahoo.com>