Skip to content

Commit

Permalink
[PRISM] Fix segv with regex once flag
Browse files Browse the repository at this point in the history
When you have an interpolated regex with a `once` flag and local
variable is outside the block created by the `once` flag, Prism would
see a segv. This is because it was not taking the depth into account.

To fix this, we need to add 1 to the `local_depth_offset` on the
`scope`.

Fixes: ruby/prism#2047
  • Loading branch information
eileencodes authored and jemmaissroff committed Dec 12, 2023
1 parent 1572322 commit a652634
Show file tree
Hide file tree
Showing 2 changed files with 2 additions and 0 deletions.
1 change: 1 addition & 0 deletions prism_compile.c
Expand Up @@ -1437,6 +1437,7 @@ pm_scope_node_init(const pm_node_t *node, pm_scope_node_t *scope, pm_scope_node_
case PM_INTERPOLATED_REGULAR_EXPRESSION_NODE: {
RUBY_ASSERT(node->flags & PM_REGULAR_EXPRESSION_FLAGS_ONCE);
scope->body = (pm_node_t *)node;
scope->local_depth_offset += 1;
break;
}
case PM_LAMBDA_NODE: {
Expand Down
1 change: 1 addition & 0 deletions test/ruby/test_compile_prism.rb
Expand Up @@ -601,6 +601,7 @@ def test_RegularExpressionNode
assert_prism_eval('/pit/ne')

assert_prism_eval('2.times.map { /#{1}/o }')
assert_prism_eval('2.times.map { foo = 1; /#{foo}/o }')
end

def test_StringNode
Expand Down

0 comments on commit a652634

Please sign in to comment.