Skip to content

Reset the number of registers after string pattern match - #221

Merged
kou merged 1 commit into
ruby:masterfrom
kou:fix-size-after-non-regexp-match
Oct 6, 2026
Merged

kou merged 1 commit into
ruby:masterfrom
kou:fix-size-after-non-regexp-match

Conversation

@kou

@kou kou commented Oct 6, 2026

Copy link
Copy Markdown
Member

set_registers() used onig_region_set() that doesn't change num_regs when the region is already allocated. So StringScanner#size and #captures after a string pattern match reported the number of registers of the previous Regexp match:

s = StringScanner.new("abc")
s.scan(/(a)(b)/)
s.scan("c")
s.size     # => 3 (should be 1)
s.captures # => [nil, nil] (should be [])

Use onig_region_resize() like adjust_registers_to_matched() does. This is consistent with the JRuby and TruffleRuby implementations.

`set_registers()` used `onig_region_set()` that doesn't change
`num_regs` when the region is already allocated. So
`StringScanner#size` and `#captures` after a string pattern match
reported the number of registers of the previous `Regexp` match:

```ruby
s = StringScanner.new("abc")
s.scan(/(a)(b)/)
s.scan("c")
s.size     # => 3 (should be 1)
s.captures # => [nil, nil] (should be [])
```

Use `onig_region_resize()` like `adjust_registers_to_matched()` does.
This is consistent with the JRuby and TruffleRuby implementations.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Copilot AI balanced review requested due to automatic review settings October 6, 2026 04:47

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟢 Approval recommended

The focused implementation correctly fixes stale registers and includes appropriate regression coverage.

Review effort: Balanced
Findings: None

What changed in this PR

Fixes stale capture counts after non-Regexp matches by resizing the match region.

Changes:

  • Resets match registers to one entry for string matches.
  • Adds regression coverage for string, getch, and get_byte matches.
File Description
ext/​strscan/​strscan.c Resizes the match region before recording a string match.
test/​strscan/​test_stringscanner.rb Verifies size and captures reset correctly.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

@kou
kou merged commit f829ead into ruby:master Oct 6, 2026
43 checks passed
@kou
kou deleted the fix-size-after-non-regexp-match branch October 6, 2026 04:57
matzbot pushed a commit to ruby/ruby that referenced this pull request Oct 6, 2026
match
(ruby/strscan#221)

`set_registers()` used `onig_region_set()` that doesn't change
`num_regs` when the region is already allocated. So `StringScanner#size`
and `#captures` after a string pattern match reported the number of
registers of the previous `Regexp` match:

```ruby
s = StringScanner.new("abc")
s.scan(/(a)(b)/)
s.scan("c")
s.size     # => 3 (should be 1)
s.captures # => [nil, nil] (should be [])
```

Use `onig_region_resize()` like `adjust_registers_to_matched()` does.
This is consistent with the JRuby and TruffleRuby implementations.

ruby/strscan@f829eade26

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants