ruby-changes:66612
From: Takashi <ko1@a...>
Date: Sun, 27 Jun 2021 10:53:00 +0900 (JST)
Subject: [ruby-changes:66612] 35c7e83bb3 (master): [ruby/irb] Optimize show_source command further
https://git.ruby-lang.org/ruby.git/commit/?id=35c7e83bb3 From 35c7e83bb32869cd96112ffd850b02047b48fac1 Mon Sep 17 00:00:00 2001 From: Takashi Kokubun <takashikkbn@g...> Date: Sun, 27 Jun 2021 10:48:53 +0900 Subject: [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 dcba1d1..feff831 100644 --- a/lib/irb/cmd/show_source.rb +++ b/lib/irb/cmd/show_source.rb @@ -61,12 +61,15 @@ module IRB https://github.com/ruby/ruby/blob/trunk/lib/irb/cmd/show_source.rb#L61 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 -- cgit v1.1 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/