From: "mame (Yusuke Endoh)" Date: 2022-10-20T05:49:44+00:00 Subject: [ruby-core:110431] [Ruby master Bug#19055] Regexp.new(regexp, timeout: nil) is intrupted by Regexp.timeout Issue #19055 has been updated by mame (Yusuke Endoh). Discussed at the dev meeting. > Is it though? It's basically breaking the intent of whoever set the global Regexp.timeout. @matz agreed with this. He decided *not* to allow users to specify "force no timeout per instance, with ignoring the global timeout setting". So, we do *not* introduce a new API for that, like `Regexp.new(str, timeout: false)` or something. Also, the following is decided for other detailed behaviors: ```ruby # The following Regexps waits for 2^64 nanoseconds (= 500 years, essentially infinite) Regexp.new(str, timeout: 1e300) Regexp.new(str, timeout: Float::INFINITY) # The following code should not create a Regexp instance but raise immediately Regexp.new(str, timeout: 0) # Raise an exception Regexp.new(str, timeout: 1e-300) # Same as 0 because it is truncated to the nanosecond Regexp.new(str, timeout: -1) # Same as 0 ``` Another possible meaning of `Regexp.new(str, timeout: 0)` is to raise an exception immediately at the match. However, we do not see any use case for the behavior. Also, it would be less useful in terms of early failure. We may allow it in future if there is a reasonable use case. ---------------------------------------- Bug #19055: Regexp.new(regexp, timeout: nil) is intrupted by Regexp.timeout https://bugs.ruby-lang.org/issues/19055#change-99741 * Author: jaruga (Jun Aruga) * Status: Open * Priority: Normal * ruby -v: ruby 3.2.0preview2 (2022-09-09 master 35cfc9a3bb) [x86_64-linux] * Backport: 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN ---------------------------------------- It seems that that a code for `Regexp timeout` written in the release page[1] is actually interrupted by the `Regexp.timeout` (global configuration) in Ruby 3.2.0 preview2 built from the source. Do you know what's wrong? ``` $ cat reg_timeout2.rb Regexp.timeout = 1.0 # This regexp has no timeout long_time_re = Regexp.new("^a*b?a*$", timeout: nil) long_time_re =~ "a" * 50000 + "x" # never interrupted ``` The error `Regexp::TimeoutError` appeared soon after around 1 second after running the script `reg_timeout2.rb`. ``` $ which ruby /usr/local/ruby-3.2.0-preview2/bin/ruby $ ruby -v ruby 3.2.0preview2 (2022-09-09 master 35cfc9a3bb) [x86_64-linux] $ ruby reg_timeout2.rb reg_timeout2.rb:4:in `
': regexp match timeout (Regexp::TimeoutError) $ time ruby reg_timeout2.rb reg_timeout2.rb:4:in `
': regexp match timeout (Regexp::TimeoutError) real 0m1.072s user 0m1.053s sys 0m0.014s $ echo $? 1 ``` ``` $ which irb /usr/local/ruby-3.2.0-preview2/bin/irb $ irb irb(main):001:0> Regexp.timeout = 1.0 => 1.0 irb(main):002:0> long_time_re = Regexp.new("^a*b?a*$", timeout: nil) => /^a*b?a*$/ irb(main):003:0> long_time_re =~ "a" * 50000 + "x" (irb):3:in `
': regexp match timeout (Regexp::TimeoutError) from /usr/local/ruby-3.2.0-preview2/lib/ruby/gems/3.2.0+2/gems/irb-1.4.1/exe/irb:11:in `' from /usr/local/ruby-3.2.0-preview2/bin/irb:25:in `load' from /usr/local/ruby-3.2.0-preview2/bin/irb:25:in `
' irb(main):004:0> ``` [1] https://www.ruby-lang.org/en/news/2022/09/09/ruby-3-2-0-preview2-released/ -- https://bugs.ruby-lang.org/ Unsubscribe: