aboutsummaryrefslogtreecommitdiffstats
path: root/re.c
Commit message (Collapse)AuthorAgeFilesLines
* [DOC] Fix doc/regexp.rdoc linksNobuyoshi Nakada2023-11-141-2/+2
| | | | | | | | - Rename regexp.rdoc to exclude from "Pages". This file is for to be included in the "class Regexp" document, but it also appeared as a separate page duplicately. - Fix links on case-sensitive filesystems. - Fix to use rdoc-ref instead of converted HTML page names.
* [DOC] Indentation fix in comments of MatchData#inspectHerwin2023-10-201-4/+3
| | | | The old version did not add syntax highlighting to the code block, and included the "Related:" line in the code block as well.
* [DOC] Fix typo in docs of Regexp#deconstruct_keysHerwin2023-10-201-1/+1
| | | of => if
* Reuse Regexp ptr when recompilingPeter Zhu2023-07-311-10/+25
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When matching an incompatible encoding, the Regexp needs to recompile. If `usecnt == 0`, then we can reuse the `ptr` because nothing else is using it. This avoids allocating another `regex_t`. This speeds up matches that switch to incompatible encodings by 15%. Branch: ``` Regex#match? with different encoding 1.431M (± 1.3%) i/s - 7.264M in 5.076153s Regex#match? with same encoding 16.858M (± 1.1%) i/s - 85.347M in 5.063279s ``` Base: ``` Regex#match? with different encoding 1.248M (± 2.0%) i/s - 6.342M in 5.083151s Regex#match? with same encoding 16.377M (± 1.1%) i/s - 82.519M in 5.039504s ``` Script: ``` regex = /foo/ str1 = "日本語" str2 = "English".force_encoding("ASCII-8BIT") Benchmark.ips do |x| x.report("Regex#match? with different encoding") do |times| i = 0 while i < times regex.match?(str1) regex.match?(str2) i += 1 end end x.report("Regex#match? with same encoding") do |times| i = 0 while i < times regex.match?(str1) i += 1 end end end ```
* Resurrect rb_reg_prepare_re C APITakashi Kokubun2023-07-271-1/+1
| | | | | | | | Existing strscan releases rely on this C API. It means that the current Ruby master doesn't work if your Gemfile.lock has strscan unless it's locked to 3.0.7, which is not released yet. To fix it, let's not remove the C API we've exposed to users.
* Don't load RREGEXP_PTR twicePeter Zhu2023-07-271-2/+1
|
* Refactor err string in rb_reg_prepare_rePeter Zhu2023-07-271-3/+4
|
* Add function rb_reg_onig_matchPeter Zhu2023-07-271-143/+99
| | | | | | rb_reg_onig_match performs preparation, error handling, and cleanup for matching a regex against a string. This reduces repetitive code and removes the need for StringScanner to access internal data of regex.
* Embed struct rmatch into GC slot (#8097)Kunshan Wang2023-07-201-14/+15
|
* Stop allocating unused backref strings at `defined?`Nobuyoshi Nakada2023-06-271-6/+22
|
* Use `rb_reg_nth_defined` instead of `rb_match_nth_defined`Nobuyoshi Nakada2023-06-271-17/+0
|
* [DOC] Regexp doc (#7923)Burdette Lamar2023-06-201-4/+4
|
* * expand tabs. [ci skip]git2023-06-091-4/+4
| | | | Please consider using misc/expand_tabs.rb as a pre-commit hook.
* Optimize `Regexp#dup` and `Regexp.new(/RE/)`Nobuyoshi Nakada2023-06-091-7/+36
| | | | | When copying from another regexp, copy already built `regex_t` instead of re-compiling its source.
* Use UTF-8 encoding for literal extended regexps with UTF-8 characters in ↵Jeremy Evans2023-04-231-1/+8
| | | | | | comments Fixes [Bug #19455]
* MatchData#named_captures: add optional symbolize_names keyword (#6952)Vladimir Dementyev2023-04-191-4/+30
|
* [Feature #19474] Refactor NEWOBJ macrosMatt Valentine-House2023-04-061-2/+2
| | | | NEWOBJ_OF is now our canonical newobj macro. It takes an optional ec
* Stop exporting symbols for MJITTakashi Kokubun2023-03-061-1/+1
|
* [DOC] Fix options of `Regexp#initialize`Nobuyoshi Nakada2023-03-061-1/+1
| | | | `Integer#|` is bit-wise OR operator, not logical OR.
* `rb_scan_args` never fills optional arguments with `Qundef`Nobuyoshi Nakada2023-03-061-2/+2
|
* [Bug #19471] `Regexp.compile` should handle keyword argumentsNobuyoshi Nakada2023-03-031-1/+1
| | | | | As well as `Regexp.new`, it should pass keyword arguments to the `Regexp#initialize` method.
* Remove support for the Regexp.new 3rd argumentJeremy Evans2023-03-011-13/+2
| | | | | | This was deprecated in Ruby 3.2. Fixes [Bug #18797]
* Adjust `else` style to be consistent in each files [ci skip]Nobuyoshi Nakada2023-02-261-4/+8
|
* Remove (newly unneeded) remarks about aliasesBurdetteLamar2023-02-191-11/+0
|
* Implement Write Barrier for RMatch objectsJean Boussier2023-02-101-13/+12
| | | | They only have two references.
* [DOC] Fix typo in document of regexp [ci skip]OKURA Masafumi2023-02-101-2/+2
|
* Remove `REG_LITERAL` flagNobuyoshi Nakada2023-02-091-4/+0
| | | | All `Regexp` literals are frozen now.
* Fix parsing of regexps that toggle extended mode on/off inside regexpJeremy Evans2023-01-301-33/+120
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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]
* [DOC] Correction to RDoc for Regexp.new (#7130)Burdette Lamar2023-01-161-0/+2
| | | Correction to RDoc for Regexp.new
* Always issue deprecation warning when calling Regexp.new with 3rd positional ↵Jeremy Evans2022-12-221-14/+10
| | | | | | | | | | | | | | 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>
* Refactor `reg_extract_args` to return regexp if givenNobuyoshi Nakada2022-12-221-12/+9
|
* Share argument parsing in `Regexp#initialize` and `Regexp.linear_time?`Nobuyoshi Nakada2022-12-221-20/+41
|
* typo in doc [ci skip]卜部昌平2022-12-191-1/+1
|
* Note about Regexp.linera_time? [ci skip]卜部昌平2022-12-191-0/+10
|
* Add `Regexp.linear_time?` (#6901)TSUYUSATO Kitsune2022-12-141-0/+34
|
* Introduce encoding check macroS-H-GAMELINKS2022-12-021-1/+2
|
* Prevent segfault in String#scan with ObjectSpace.each_objectYusuke Endoh2022-12-011-0/+7
| | | | | | | | | | 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]
* Using UNDEF_P macroS-H-GAMELINKS2022-11-161-2/+2
|
* Suppress false warning by a bug of gccNobuyoshi Nakada2022-11-081-4/+5
| | | | | | | 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
* Refactor timeout-setting code to a functionYusuke Endoh2022-10-241-13/+12
|
* Refactor timeout-related code in re.c a littleYusuke Endoh2022-10-241-9/+9
|
* Fix per-instance Regexp timeout (#6621)Yusuke Endoh2022-10-241-2/+8
| | | | | | | | | | 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
* Fix argument & Remove enumS-H-GAMELINKS2022-10-231-9/+3
|
* Introduce rb_memsearch_with_char_size functionS-H-GAMELINKS2022-10-231-10/+14
|
* * expand tabs. [ci skip]git2022-10-101-2/+2
| | | | | 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.
* Should use dedecated function `Check_Type`Nobuyoshi Nakada2022-10-101-12/+4
|
* Add MatchData#deconstruct/deconstruct_keysVladimir Dementyev2022-10-101-0/+85
|
* [DOC] `offset` argument of Regexp#matchNobuyoshi Nakada2022-08-181-1/+6
|
* Speed up setting the backref match objectAaron Patterson2022-08-021-3/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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
* Expand tabs [ci skip]Takashi Kokubun2022-07-211-636/+636
| | | | [Misc #18891]