From 35c7e83bb32869cd96112ffd850b02047b48fac1 Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Sun, 27 Jun 2021 10:48:53 +0900 Subject: [PATCH] [ruby/irb] Optimize show_source command further https://github.com/ruby/irb/pull/249 actually slowed down how `code` is concatenated. The original way of creating `code` is faster. [before] user system total real 2.420137 0.005364 2.425501 ( 2.426264) [after] user system total real 1.000221 0.007454 1.007675 ( 1.008295) Theoretically, this implementation might skip lines that don't appear in Ripper tokens, but this assumes such lines don't impact whether the code passes compilation or not. At least normal blank lines seem to have an `on_ignored_nl` token anyway though. https://github.com/ruby/irb/commit/27dd2867cd --- lib/irb/cmd/show_source.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/irb/cmd/show_source.rb b/lib/irb/cmd/show_source.rb index dcba1d1c71..feff8315f6 100644 --- a/lib/irb/cmd/show_source.rb +++ b/lib/irb/cmd/show_source.rb @@ -61,12 +61,15 @@ module IRB lex = RubyLex.new lines = File.read(file).lines[(first_line - 1)..-1] tokens = RubyLex.ripper_lex_without_warning(lines.join) + + code = +"" prev_tokens = [] # chunk with line number tokens.chunk { |tok| tok[0][0] }.each do |lnum, chunk| - code = lines[0..lnum].join + code << lines[lnum] prev_tokens.concat chunk + continue = lex.process_continue(prev_tokens) code_block_open = lex.check_code_block(code, prev_tokens) if !continue && !code_block_open