From ae5efb55d1bd52e3a08c9ffb6ab4e0cef74cef12 Mon Sep 17 00:00:00 2001 From: Benoit Daloze Date: Sun, 14 Dec 2025 21:36:45 +0100 Subject: [PATCH] [ruby/prism] Simplify and optimize Prism::Node#tunnel * By comparing byte offsets which folds 3 branches into 1. * Also avoids allocation of Location objects. https://github.com/ruby/prism/commit/71fcb891e0 --- prism/templates/lib/prism/node.rb.erb | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/prism/templates/lib/prism/node.rb.erb b/prism/templates/lib/prism/node.rb.erb index 066a0cea1b..181842e230 100644 --- a/prism/templates/lib/prism/node.rb.erb +++ b/prism/templates/lib/prism/node.rb.erb @@ -184,24 +184,14 @@ module Prism queue = [self] #: Array[Prism::node] result = [] #: Array[Prism::node] + line_offset = source.offsets[line - 1] or raise + search_offset = line_offset + column + while (node = queue.shift) result << node node.each_child_node do |child_node| - child_location = child_node.location - - start_line = child_location.start_line - end_line = child_location.end_line - - if start_line == end_line - if line == start_line && column >= child_location.start_column && column < child_location.end_column - queue << child_node - break - end - elsif (line == start_line && column >= child_location.start_column) || (line == end_line && column < child_location.end_column) - queue << child_node - break - elsif line > start_line && line < end_line + if child_node.start_offset <= search_offset && search_offset < child_node.end_offset queue << child_node break end