Commit graph

172 commits

Author SHA1 Message Date
Jeremy Evans
289fd3c801 [ruby/irb] Pass local variables from workspace binding to lexer
This fixes at least an issue where irb will incorrectly assume
code opens a heredoc when it does not, such as this code:

```ruby
s1 = 'testing'
s2 = 'this'
s2 <<s1
p s1
s1
```

Ruby parses the `s2 <<s1` as `s2.<<(s1)`, not as a heredoc, because
`s2` is a local variable in scope.  irb was using ripper without
letting ripper know that `s2` was a local variable, so ripper would
lex it as a heredoc instead of a method call.

Fix the situation by prepending a line at line 0 with all local
variable definitions in scope whenever lexing.  This fixes the
heredoc issue, and potentially other issues that depend on whether
an identifier is a local variable or not.

Fixes [Bug #17530]

4ed2187f76
2021-07-10 13:44:17 +09:00
Koichi ITO
c45f7556b5 [ruby/irb] Fix Encoding::ConverterNotFoundError
Follow https://github.com/ruby/irb/pull/237.

This PR fixes the following `Encoding::ConverterNotFoundError`.

```console
% bin/spring stop && bin/rails c
Spring stopped.
Running via Spring preloader in process 58395
Loading development environment (Rails 6.0.3.7)
irb(main):001:0> "こんにちは".do_something
Traceback (most recent call last):
(snip)

    12: from /Users/koic/src/github.com/ruby/irb/lib/irb.rb:547:in `eval_input'
    11: from /Users/koic/src/github.com/ruby/irb/lib/irb/ruby-lex.rb:232:in `each_top_level_statement'
    10: from /Users/koic/src/github.com/ruby/irb/lib/irb/ruby-lex.rb:232:in `catch'
     9: from /Users/koic/src/github.com/ruby/irb/lib/irb/ruby-lex.rb:233:in  `block in each_top_level_statement'
     8: from /Users/koic/src/github.com/ruby/irb/lib/irb/ruby-lex.rb:233:in `loop'
     7: from /Users/koic/src/github.com/ruby/irb/lib/irb/ruby-lex.rb:251:in `block (2 levels) in each_top_level_statement'
     6: from /Users/koic/src/github.com/ruby/irb/lib/irb.rb:548:in `block in eval_input'
     5: from /Users/koic/src/github.com/ruby/irb/lib/irb.rb:758:in `signal_status'
     4: from /Users/koic/src/github.com/ruby/irb/lib/irb.rb:586:in `block (2 levels) in eval_input'
     3: from /Users/koic/src/github.com/ruby/irb/lib/irb.rb:650:in `handle_exception'
     2: from /Users/koic/src/github.com/ruby/irb/lib/irb.rb:601:in `encode_with_invalid_byte_sequence'
     1: from /Users/koic/src/github.com/ruby/irb/lib/irb.rb:601:in `new'
/Users/koic/src/github.com/ruby/irb/lib/irb.rb:601:in `initialize': code
converter not found (UTF-8 to UTF-8) (Encoding::ConverterNotFoundError)
```

First, this patch skips `Encoding::Converter.new` for the same encoding.
170531df19/lib/irb.rb (L601)

Next, this is a talk about the condition for skipping. `IRB.conf[:LC_MESSAGES].encoding`
becomes `"UTF-8"` string when `Reline.encoding_system_needs.name` is set in the below.
170531df19/lib/irb/input-method.rb (L269)

OTOH, `message.encoding` is `Encoding::UTF_8`, so these are compared as a string by this patch.

6df6e76cfc
2021-05-11 16:17:17 +09:00
aycabta
774cc32b4d [ruby/irb] Treat encodings in exception correctly
4452adbe04
2021-05-11 09:32:08 +09:00
Koichi Sasada
1ac68bba4e [ruby/irb] SIGINT should raise Interrupt after IRB session
5832cfe75b
2021-04-02 01:57:44 +09:00
Jeremy Evans
dbea0be13d [ruby/irb] Update help message for next context-mode of 4
While here, fixing tab/space issues in help message, and sync
rdoc for IRB class to match the help message.

ef8e3901cc
2021-02-27 06:51:12 +09:00
Nobuhiro IMAI
e80e5a2f89 [ruby/irb] use RubyLex::TerminateLineInput appropriately [Bug #17564]
* using the appropriciate exception instead of `break` so that the session
  can be continue after the `irb_source` and `irb_load` commands
* suppress extra new line due to one more `#prompt` call

bdefaa7cfd
2021-01-27 15:02:05 +09:00
Nobuhiro IMAI
d290a02bd7 [ruby/irb] handle repeated exception separately
fcf6b34bc5
2021-01-18 02:12:53 +09:00
aycabta
6cbb3fd142 [ruby/irb] Fix comment, irb gem supports 2.5.0 or older
36118015ba
2021-01-08 13:32:10 +09:00
aycabta
111fddd543 [ruby/irb] Fix BACK_TRACE_LIMIT logic
30dc5d43fe
2021-01-08 13:25:18 +09:00
aycabta
917050220a [ruby/irb] Use Exception#full_message to show backtrace in the correct order
[Bug #17466]

1c76845cca
2021-01-08 13:25:18 +09:00
Nobuhiro IMAI
4bb683a570 [ruby/irb] fix typo in IRB::Irb#convert_invalid_byte_sequence
d09d3c3d68
2021-01-08 13:25:18 +09:00
aycabta
e72a6ed45f [ruby/irb] Escape invalid byte sequence in Exception
This fixes ruby/irb#141.

0815317d42
2021-01-05 18:05:06 +09:00
aycabta
4131cd05be [ruby/irb] Support arg for measure command
b43f35d8f3
2020-12-22 23:45:43 +09:00
aycabta
9f08e3c703 [ruby/irb] Add measure command
You can use "measure" command to check performance in IRB like below:

  irb(main):001:0> 3
  => 3
  irb(main):002:0> measure
  TIME is added.
  => nil
  irb(main):003:0> 3
  processing time: 0.000058s
  => 3
  irb(main):004:0> measure :off
  => nil
  irb(main):005:0> 3
  => 3

You can set "measure :on" by "IRB.conf[:MEASURE] = true" in .irbrc, and, also,
set custom performance check method:

  IRB.conf[:MEASURE_PROC][:CUSTOM] = proc { |context, code, line_no, &block|
    time = Time.now
    result = block.()
    now = Time.now
    puts 'custom processing time: %fs' % (Time.now - time) if IRB.conf[:MEASURE]
    result
  }

3899eaf2e2
2020-12-20 16:23:59 +09:00
aycabta
2d112c346a [ruby/irb] Stop using bang version for #inspect of result
fc1426d34e
2020-11-22 21:00:11 +09:00
Andrew Kerr
ef3c25888e Fix small typo in comment in lib/irb.c 2020-10-22 10:56:35 -07:00
aycabta
555ea83344 [ruby/irb] Drop OMIT_ON_ASSIGNMENT and add :truncate option for ECHO_ON_ASSIGNMENT
4c89b0775b
2020-09-19 05:13:08 +09:00
aycabta
8f9b1902f4 [ruby/irb] Omit output if first line of multiline is too long
0feeae38c5
2020-09-14 02:13:18 +09:00
aycabta
e468d9f49c [ruby/irb] Add OMIT_ON_ASSIGNMENT
Omit the results evaluated at assignment if they are too long.

The behavior of ECHO_ON_ASSIGNMENT being on by default is hard to understand,
so I change it to off by default. Instead, we turn OMIT_ON_ASSIGNMENT on by
default. The result is displayed on assignment, but it will always be short
and within one line of the screen.

c5ea79d5ce
2020-09-14 02:13:11 +09:00
Nobuyoshi Nakada
d32229e338 [ruby/irb] Prefer require_relative to load the files in this library
0ac3bc7296
2020-08-18 14:38:01 +09:00
Nobuyoshi Nakada
bc646e6715
[DOC] get rid of parsing as TIDYLINK unintentionally 2020-04-07 13:59:38 +09:00
aycabta
22477128cd [ruby/irb] Suppress crashing when EncodingError has occurred without lineno
13572d8cdc
2020-03-26 17:41:21 +09:00
aycabta
ffbb162f1a [ruby/irb] Detect multiple lines output simplify
The old implementation performance test code:

    require 'objspace'
    puts "%.5g MB" % (ObjectSpace.memsize_of_all * 0.001 * 0.001)
    /\A.*\Z/ !~ ('abc' * 20_000_000)
    puts "%.5g MB" % (ObjectSpace.memsize_of_all * 0.001 * 0.001)

and run `time test.rb`:

    2.5868 MB
    62.226 MB

    real    0m1.307s
    user    0m0.452s
    sys     0m0.797s

The new implementation performance test code:

    require 'objspace'
    puts "%.5g MB" % (ObjectSpace.memsize_of_all * 0.001 * 0.001)
    ('abc' * 20_000_000).include?("\n")
    puts "%.5g MB" % (ObjectSpace.memsize_of_all * 0.001 * 0.001)

and run `time test.rb`:

    2.5861 MB
    62.226 MB

    real    0m0.132s
    user    0m0.088s
    sys     0m0.042s

40d6610baf
2020-03-26 17:41:21 +09:00
Yusuke Endoh
7e2ed7d1aa [ruby/irb] Add a new easter egg: dancing ruby
e37dc7e58e
2020-02-02 03:22:51 +09:00
Kenta Murata
93ca212dda [ruby/irb] [ruby/irb] Rewrite an expression to detect multiline
ed5cf375a6

5b7bbf9c34
2020-01-21 09:51:26 +09:00
Kenta Murata
51a8055d7d [ruby/irb] Add newline_before_multiline_output
9eb1801a66
2020-01-21 09:51:16 +09:00
Marcus Stollsteimer
05b0410f91 [ruby/irb] Fix typo
4bb1340687
2019-12-24 21:22:46 +09:00
Nobuyoshi Nakada
e68999c82c
Fixed misspellings
Fixed misspellings reported at [Bug #16437], for default gems.
2019-12-20 12:19:45 +09:00
aycabta
51ea1abb5f Remove e2mmap dependency 2019-11-25 05:38:09 +09:00
Kazuhiro NISHIYAMA
88d6009d91
Use more strict regexp to avoid to match naninanirb.rb 2019-11-21 23:10:30 +09:00
aycabta
91bf3b7a77 Use singleline/multiline instead of readline/reidline 2019-11-21 02:44:35 +09:00
aycabta
a5b6d7bca8 Suppress warnings except for when last evaluation
Co-authored-by: Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
2019-11-13 15:15:28 +09:00
Jeremy Evans
652800cc09 Only untaint line on Ruby <2.7
Untaint is deprecated and has no effect on Ruby 2.7+.
2019-11-05 20:54:46 +09:00
zverok
4fe06f4667 IRB: Document command evaluation history. 2019-10-26 10:24:20 -07:00
Jeremy Evans
1fb4584825 Remove unsused output_method argument
Fixes Ruby Bug 9876.
2019-10-24 23:47:50 +09:00
takkanm
87958520f3 set real path to __FILE__ and __dir__ in Binding#irb
When reading Binding#irb, the file of the calling source is reflected in __FILE__ and __dir__.
2019-10-11 09:33:25 +09:00
Steven Willis
9d2fed2ccd Don't echo results of assignment expressions 2019-08-16 06:02:45 +09:00
aycabta
43b52ac0a5 Revert "Don't echo results of assignment expressions"
This reverts commit 1ee88c51b3.
2019-08-06 20:28:48 +09:00
Steven Willis
1ee88c51b3 Don't echo results of assignment expressions 2019-08-06 20:15:07 +09:00
Yusuke Endoh
c683763865 Use source_location instead of eval(__FILE__,binding) in Binding#irb
e9e17cbc05 (enabling the warning by
default) caused a warning in test-spec:
```
/data/chkbuild/tmp/build/20190802T213005Z/ruby/spec/ruby/core/binding/irb_spec.rb
Binding#irb
- creates an IRB session with the binding in scope/data/chkbuild/tmp/build/20190802T213005Z/ruby/spec/ruby/core/binding/fixtures/irb.rb:3: warning: __FILE__ in eval may not return location in binding; use Binding#source_location instead
```
20190802T213005Z.log.html.gz

ref: [Bug #4352]
2019-08-03 07:44:44 +09:00
aycabta
10d7b39d5d Check wether prompt_i is nil 2019-07-15 02:58:28 +09:00
aycabta
078e50c5e9 Save history in IRB is enabled by default 2019-07-15 01:16:18 +09:00
aycabta
6d57369105 Auto indent in IRB is enabled by default 2019-07-15 01:07:37 +09:00
aycabta
76851381cb Show "-" if indent level is negative 2019-07-01 21:14:50 +09:00
aycabta
d009e321a0 Use IRB.conf[:AUTO_INDENT] setting in multiline mode 2019-06-19 09:19:41 +09:00
aycabta
85ff2d74a2 Avoid auto indent in prompt when dynamic auto indent 2019-06-19 08:28:00 +09:00
Nobuyoshi Nakada
aa32465ab3
irb.rb: [DOC] the default prompt includes :PROMPT_N [ci skip] 2019-06-14 15:31:03 +09:00
aycabta
f80771f0a9 Use Reline.prompt_proc in IRB 2019-06-14 08:26:06 +09:00
aycabta
260235ce87 Use Reline as Reidline multiline editor in IRB 2019-05-25 02:16:19 +09:00
aycabta
3a9008b984 Add --colorize and --nocolorize options to IRB 2019-05-21 08:57:21 +09:00