From: "nobu (Nobuyoshi Nakada) via ruby-core" Date: 2023-06-09T05:35:03+00:00 Subject: [ruby-core:113838] [Ruby master Feature#19694] Add Regexp#timeout= setter Issue #19694 has been updated by nobu (Nobuyoshi Nakada). janosch-x (Janosch M�ller) wrote in #note-9: > I guess the only noteworthy argument for a change goes like this: > > A custom `timeout` only being available on `Regexp::new` might lead people to write less performant code. I made a patch to improve `Regexp.new(/RE/)` (and `Regexp#dup`). https://github.com/nobu/ruby/tree/re_copy Iteration per second (i/s) against master 441302be1a: | |compare-ruby|built-ruby| |:-------|-----------:|---------:| |dup | 16.684k| 817.776k| | | -| 49.02x| |string | 16.520k| 16.538k| | | -| 1.00x| |regexp | 16.365k| 842.451k| | | -| 51.48x| > I'm not sure this is a strong argument. The big Regexps that take a noteworthy time to compile are often those with interpolation, as seen in the OP, and I assume these aren't so easy to pre-compile or deduplicate anyway. A regexp with interpolation can be replaced with `Regexp.new` at almost same performance. ---------------------------------------- Feature #19694: Add Regexp#timeout= setter https://bugs.ruby-lang.org/issues/19694#change-103486 * Author: aharpole (Aaron Harpole) * Status: Open * Priority: Normal ---------------------------------------- # Abstract In addition to allowing for a Regexp timeout to be set on individual instances by setting a `timeout` argument in `Regexp.new`, I'm proposing that we also allow setting the timeout on Regexp objects with a `#timeout=` setter. # Background To be able to roll out a global Regexp timeout for a large application, there are inevitably some individual regexes for which a different timeout is appropriate. While the `timeout` keyword argument was added to `Regexp.new`, this isn't always a viable option. In the case of regex literal syntax (`/ab*/` or `%r{ab*}`, for instance), it's not possible to set a timeout at all right now without converting to `Regexp.new`, which may be awkward depending on the contents of the regex. It also is desirable from time to time to be able to set a timeout for a regex object after it's been initialized. Finally, because we offer a `Regexp#timeout` getter, for consistency it would be nice to also offer a setter. The introduction of a `Regexp#timeout=` setter was mentioned as a possible way to set individual timeouts in https://bugs.ruby-lang.org/issues/19104#Specification. # Proposal I propose that we add the method `Regexp#timeout=`. It works the same way the `timeout` argument works in `Regexp.new`, taking either a float or nil. This makes it relatively easy to add timeouts to specific regex literals (regex literals are frozen by default so you do have to `dup` them first): ``` emoji_filter_pattern = %r{ (?