rubysl-irb 1.0.2 → 2.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +3 -2
  3. data/lib/irb/cmd/chws.rb +6 -6
  4. data/lib/irb/cmd/fork.rb +10 -10
  5. data/lib/irb/cmd/help.rb +24 -14
  6. data/lib/irb/cmd/load.rb +8 -7
  7. data/lib/irb/cmd/nop.rb +8 -8
  8. data/lib/irb/cmd/pushws.rb +6 -5
  9. data/lib/irb/cmd/subirb.rb +6 -7
  10. data/lib/irb/completion.rb +90 -58
  11. data/lib/irb/context.rb +197 -30
  12. data/lib/irb/ext/change-ws.rb +17 -10
  13. data/lib/irb/ext/history.rb +20 -10
  14. data/lib/irb/ext/loader.rb +22 -12
  15. data/lib/irb/ext/math-mode.rb +16 -6
  16. data/lib/irb/ext/multi-irb.rb +69 -24
  17. data/lib/irb/ext/save-history.rb +87 -37
  18. data/lib/irb/ext/tracer.rb +17 -7
  19. data/lib/irb/ext/use-loader.rb +14 -6
  20. data/lib/irb/ext/workspaces.rb +16 -6
  21. data/lib/irb/extend-command.rb +92 -34
  22. data/lib/irb/frame.rb +18 -5
  23. data/lib/irb/help.rb +20 -19
  24. data/lib/irb/init.rb +156 -104
  25. data/lib/irb/input-method.rb +96 -23
  26. data/lib/irb/inspector.rb +145 -0
  27. data/lib/irb/lc/.document +4 -0
  28. data/lib/irb/lc/error.rb +8 -7
  29. data/lib/irb/lc/{help-message.rb → help-message} +14 -11
  30. data/lib/irb/lc/ja/encoding_aliases.rb +10 -0
  31. data/lib/irb/lc/ja/error.rb +19 -16
  32. data/lib/irb/lc/ja/help-message +33 -28
  33. data/lib/irb/locale.rb +83 -85
  34. data/lib/irb/magic-file.rb +37 -0
  35. data/lib/irb/notifier.rb +101 -15
  36. data/lib/irb/output-method.rb +38 -32
  37. data/lib/irb/ruby-lex.rb +143 -81
  38. data/lib/irb/ruby-token.rb +13 -19
  39. data/lib/irb/slex.rb +26 -27
  40. data/lib/irb/src_encoding.rb +4 -0
  41. data/lib/irb/version.rb +6 -7
  42. data/lib/irb/workspace.rb +22 -15
  43. data/lib/irb/ws-for-case-2.rb +5 -6
  44. data/lib/irb/xmp.rb +91 -4
  45. data/lib/rubysl/irb/irb.rb +523 -175
  46. data/lib/rubysl/irb/version.rb +1 -1
  47. data/rubysl-irb.gemspec +7 -6
  48. metadata +35 -15
@@ -1,9 +1,8 @@
1
1
  #
2
2
  # irb.rb - irb main module
3
- # $Release Version: 0.9.5 $
4
- # $Revision: 15408 $
5
- # $Date: 2008-02-08 07:44:54 -0800 (Fri, 08 Feb 2008) $
6
- # by Keiju ISHITSUKA(keiju@ruby-lang.org)
3
+ # $Release Version: 0.9.6 $
4
+ # $Revision$
5
+ # by Keiju ISHITSUKA(keiju@ruby-lang.org)
7
6
  #
8
7
  # --
9
8
  #
@@ -22,19 +21,341 @@ require "irb/locale"
22
21
 
23
22
  STDOUT.sync = true
24
23
 
24
+ # IRB stands for "interactive ruby" and is a tool to interactively execute ruby
25
+ # expressions read from the standard input.
26
+ #
27
+ # The +irb+ command from your shell will start the interpreter.
28
+ #
29
+ # == Usage
30
+ #
31
+ # Use of irb is easy if you know ruby.
32
+ #
33
+ # When executing irb, prompts are displayed as follows. Then, enter the ruby
34
+ # expression. An input is executed when it is syntactically complete.
35
+ #
36
+ # $ irb
37
+ # irb(main):001:0> 1+2
38
+ # #=> 3
39
+ # irb(main):002:0> class Foo
40
+ # irb(main):003:1> def foo
41
+ # irb(main):004:2> print 1
42
+ # irb(main):005:2> end
43
+ # irb(main):006:1> end
44
+ # #=> nil
45
+ #
46
+ # The Readline extension module can be used with irb. Use of Readline is
47
+ # default if it's installed.
48
+ #
49
+ # == Command line options
50
+ #
51
+ # Usage: irb.rb [options] [programfile] [arguments]
52
+ # -f Suppress read of ~/.irbrc
53
+ # -m Bc mode (load mathn, fraction or matrix are available)
54
+ # -d Set $DEBUG to true (same as `ruby -d')
55
+ # -r load-module Same as `ruby -r'
56
+ # -I path Specify $LOAD_PATH directory
57
+ # -U Same as `ruby -U`
58
+ # -E enc Same as `ruby -E`
59
+ # -w Same as `ruby -w`
60
+ # -W[level=2] Same as `ruby -W`
61
+ # --inspect Use `inspect' for output (default except for bc mode)
62
+ # --noinspect Don't use inspect for output
63
+ # --readline Use Readline extension module
64
+ # --noreadline Don't use Readline extension module
65
+ # --prompt prompt-mode
66
+ # --prompt-mode prompt-mode
67
+ # Switch prompt mode. Pre-defined prompt modes are
68
+ # `default', `simple', `xmp' and `inf-ruby'
69
+ # --inf-ruby-mode Use prompt appropriate for inf-ruby-mode on emacs.
70
+ # Suppresses --readline.
71
+ # --simple-prompt Simple prompt mode
72
+ # --noprompt No prompt mode
73
+ # --tracer Display trace for each execution of commands.
74
+ # --back-trace-limit n
75
+ # Display backtrace top n and tail n. The default
76
+ # value is 16.
77
+ # --irb_debug n Set internal debug level to n (not for popular use)
78
+ # -v, --version Print the version of irb
79
+ #
80
+ # == Configuration
81
+ #
82
+ # IRB reads from <code>~/.irbrc</code> when it's invoked.
83
+ #
84
+ # If <code>~/.irbrc</code> doesn't exist, +irb+ will try to read in the following order:
85
+ #
86
+ # * +.irbrc+
87
+ # * +irb.rc+
88
+ # * +_irbrc+
89
+ # * <code>$irbrc</code>
90
+ #
91
+ # The following are alternatives to the command line options. To use them type
92
+ # as follows in an +irb+ session:
93
+ #
94
+ # IRB.conf[:IRB_NAME]="irb"
95
+ # IRB.conf[:MATH_MODE]=false
96
+ # IRB.conf[:INSPECT_MODE]=nil
97
+ # IRB.conf[:IRB_RC] = nil
98
+ # IRB.conf[:BACK_TRACE_LIMIT]=16
99
+ # IRB.conf[:USE_LOADER] = false
100
+ # IRB.conf[:USE_READLINE] = nil
101
+ # IRB.conf[:USE_TRACER] = false
102
+ # IRB.conf[:IGNORE_SIGINT] = true
103
+ # IRB.conf[:IGNORE_EOF] = false
104
+ # IRB.conf[:PROMPT_MODE] = :DEFALUT
105
+ # IRB.conf[:PROMPT] = {...}
106
+ # IRB.conf[:DEBUG_LEVEL]=0
107
+ #
108
+ # === Auto indentation
109
+ #
110
+ # To enable auto-indent mode in irb, add the following to your +.irbrc+:
111
+ #
112
+ # IRB.conf[:AUTO_INDENT] = true
113
+ #
114
+ # === Autocompletion
115
+ #
116
+ # To enable autocompletion for irb, add the following to your +.irbrc+:
117
+ #
118
+ # require 'irb/completion'
119
+ #
120
+ # === History
121
+ #
122
+ # By default, irb disables history and will not store any commands you used.
123
+ #
124
+ # If you want to enable history, add the following to your +.irbrc+:
125
+ #
126
+ # IRB.conf[:SAVE_HISTORY] = 1000
127
+ #
128
+ # This will now store the last 1000 commands in <code>~/.irb_history</code>.
129
+ #
130
+ # See IRB::Context#save_history= for more information.
131
+ #
132
+ # == Customizing the IRB Prompt
133
+ #
134
+ # In order to customize the prompt, you can change the following Hash:
135
+ #
136
+ # IRB.conf[:PROMPT]
137
+ #
138
+ # This example can be used in your +.irbrc+
139
+ #
140
+ # IRB.conf[:PROMPT][:MY_PROMPT] = { # name of prompt mode
141
+ # :AUTO_INDENT => true # enables auto-indent mode
142
+ # :PROMPT_I => nil, # normal prompt
143
+ # :PROMPT_S => nil, # prompt for continuated strings
144
+ # :PROMPT_C => nil, # prompt for continuated statement
145
+ # :RETURN => " ==>%s\n" # format to return value
146
+ # }
147
+ #
148
+ # IRB.conf[:PROMPT_MODE] = :MY_PROMPT
149
+ #
150
+ # Or, invoke irb with the above prompt mode by:
151
+ #
152
+ # irb --prompt my-prompt
153
+ #
154
+ # Constants +PROMPT_I+, +PROMPT_S+ and +PROMPT_C+ specify the format. In the
155
+ # prompt specification, some special strings are available:
156
+ #
157
+ # %N # command name which is running
158
+ # %m # to_s of main object (self)
159
+ # %M # inspect of main object (self)
160
+ # %l # type of string(", ', /, ]), `]' is inner %w[...]
161
+ # %NNi # indent level. NN is degits and means as same as printf("%NNd").
162
+ # # It can be ommited
163
+ # %NNn # line number.
164
+ # %% # %
165
+ #
166
+ # For instance, the default prompt mode is defined as follows:
167
+ #
168
+ # IRB.conf[:PROMPT_MODE][:DEFAULT] = {
169
+ # :PROMPT_I => "%N(%m):%03n:%i> ",
170
+ # :PROMPT_S => "%N(%m):%03n:%i%l ",
171
+ # :PROMPT_C => "%N(%m):%03n:%i* ",
172
+ # :RETURN => "%s\n" # used to printf
173
+ # }
174
+ #
175
+ # irb comes with a number of available modes:
176
+ #
177
+ # # :NULL:
178
+ # # :PROMPT_I:
179
+ # # :PROMPT_N:
180
+ # # :PROMPT_S:
181
+ # # :PROMPT_C:
182
+ # # :RETURN: |
183
+ # # %s
184
+ # # :DEFAULT:
185
+ # # :PROMPT_I: ! '%N(%m):%03n:%i> '
186
+ # # :PROMPT_N: ! '%N(%m):%03n:%i> '
187
+ # # :PROMPT_S: ! '%N(%m):%03n:%i%l '
188
+ # # :PROMPT_C: ! '%N(%m):%03n:%i* '
189
+ # # :RETURN: |
190
+ # # => %s
191
+ # # :CLASSIC:
192
+ # # :PROMPT_I: ! '%N(%m):%03n:%i> '
193
+ # # :PROMPT_N: ! '%N(%m):%03n:%i> '
194
+ # # :PROMPT_S: ! '%N(%m):%03n:%i%l '
195
+ # # :PROMPT_C: ! '%N(%m):%03n:%i* '
196
+ # # :RETURN: |
197
+ # # %s
198
+ # # :SIMPLE:
199
+ # # :PROMPT_I: ! '>> '
200
+ # # :PROMPT_N: ! '>> '
201
+ # # :PROMPT_S:
202
+ # # :PROMPT_C: ! '?> '
203
+ # # :RETURN: |
204
+ # # => %s
205
+ # # :INF_RUBY:
206
+ # # :PROMPT_I: ! '%N(%m):%03n:%i> '
207
+ # # :PROMPT_N:
208
+ # # :PROMPT_S:
209
+ # # :PROMPT_C:
210
+ # # :RETURN: |
211
+ # # %s
212
+ # # :AUTO_INDENT: true
213
+ # # :XMP:
214
+ # # :PROMPT_I:
215
+ # # :PROMPT_N:
216
+ # # :PROMPT_S:
217
+ # # :PROMPT_C:
218
+ # # :RETURN: |2
219
+ # # ==>%s
220
+ #
221
+ # == Restrictions
222
+ #
223
+ # Because irb evaluates input immediately after it is syntactically complete,
224
+ # the results may be slightly different than directly using ruby.
225
+ #
226
+ # == IRB Sessions
227
+ #
228
+ # IRB has a special feature, that allows you to manage many sessions at once.
229
+ #
230
+ # You can create new sessions with Irb.irb, and get a list of current sessions
231
+ # with the +jobs+ command in the prompt.
232
+ #
233
+ # === Commands
234
+ #
235
+ # JobManager provides commands to handle the current sessions:
236
+ #
237
+ # jobs # List of current sessions
238
+ # fg # Switches to the session of the given number
239
+ # kill # Kills the session with the given number
240
+ #
241
+ # The +exit+ command, or ::irb_exit, will quit the current session and call any
242
+ # exit hooks with IRB.irb_at_exit.
243
+ #
244
+ # A few commands for loading files within the session are also available:
245
+ #
246
+ # +source+::
247
+ # Loads a given file in the current session and displays the source lines,
248
+ # see IrbLoader#source_file
249
+ # +irb_load+::
250
+ # Loads the given file similarly to Kernel#load, see IrbLoader#irb_load
251
+ # +irb_require+::
252
+ # Loads the given file similarly to Kernel#require
253
+ #
254
+ # === Configuration
255
+ #
256
+ # The command line options, or IRB.conf, specify the default behavior of
257
+ # Irb.irb.
258
+ #
259
+ # On the other hand, each conf in IRB@Command+line+options is used to
260
+ # individually configure IRB.irb.
261
+ #
262
+ # If a proc is set for IRB.conf[:IRB_RC], its will be invoked after execution
263
+ # of that proc with the context of the current session as its argument. Each
264
+ # session can be configured using this mechanism.
265
+ #
266
+ # === Session variables
267
+ #
268
+ # There are a few variables in every Irb session that can come in handy:
269
+ #
270
+ # <code>_</code>::
271
+ # The value command executed, as a local variable
272
+ # <code>__</code>::
273
+ # The history of evaluated commands
274
+ # <code>__[line_no]</code>::
275
+ # Returns the evaluation value at the given line number, +line_no+.
276
+ # If +line_no+ is a negative, the return value +line_no+ many lines before
277
+ # the most recent return value.
278
+ #
279
+ # === Example using IRB Sessions
280
+ #
281
+ # # invoke a new session
282
+ # irb(main):001:0> irb
283
+ # # list open sessions
284
+ # irb.1(main):001:0> jobs
285
+ # #0->irb on main (#<Thread:0x400fb7e4> : stop)
286
+ # #1->irb#1 on main (#<Thread:0x40125d64> : running)
287
+ #
288
+ # # change the active session
289
+ # irb.1(main):002:0> fg 0
290
+ # # define class Foo in top-level session
291
+ # irb(main):002:0> class Foo;end
292
+ # # invoke a new session with the context of Foo
293
+ # irb(main):003:0> irb Foo
294
+ # # define Foo#foo
295
+ # irb.2(Foo):001:0> def foo
296
+ # irb.2(Foo):002:1> print 1
297
+ # irb.2(Foo):003:1> end
298
+ #
299
+ # # change the active session
300
+ # irb.2(Foo):004:0> fg 0
301
+ # # list open sessions
302
+ # irb(main):004:0> jobs
303
+ # #0->irb on main (#<Thread:0x400fb7e4> : running)
304
+ # #1->irb#1 on main (#<Thread:0x40125d64> : stop)
305
+ # #2->irb#2 on Foo (#<Thread:0x4011d54c> : stop)
306
+ # # check if Foo#foo is available
307
+ # irb(main):005:0> Foo.instance_methods #=> [:foo, ...]
308
+ #
309
+ # # change the active sesssion
310
+ # irb(main):006:0> fg 2
311
+ # # define Foo#bar in the context of Foo
312
+ # irb.2(Foo):005:0> def bar
313
+ # irb.2(Foo):006:1> print "bar"
314
+ # irb.2(Foo):007:1> end
315
+ # irb.2(Foo):010:0> Foo.instance_methods #=> [:bar, :foo, ...]
316
+ #
317
+ # # change the active session
318
+ # irb.2(Foo):011:0> fg 0
319
+ # irb(main):007:0> f = Foo.new #=> #<Foo:0x4010af3c>
320
+ # # invoke a new session with the context of f (instance of Foo)
321
+ # irb(main):008:0> irb f
322
+ # # list open sessions
323
+ # irb.3(<Foo:0x4010af3c>):001:0> jobs
324
+ # #0->irb on main (#<Thread:0x400fb7e4> : stop)
325
+ # #1->irb#1 on main (#<Thread:0x40125d64> : stop)
326
+ # #2->irb#2 on Foo (#<Thread:0x4011d54c> : stop)
327
+ # #3->irb#3 on #<Foo:0x4010af3c> (#<Thread:0x4010a1e0> : running)
328
+ # # evaluate f.foo
329
+ # irb.3(<Foo:0x4010af3c>):002:0> foo #=> 1 => nil
330
+ # # evaluate f.bar
331
+ # irb.3(<Foo:0x4010af3c>):003:0> bar #=> bar => nil
332
+ # # kill jobs 1, 2, and 3
333
+ # irb.3(<Foo:0x4010af3c>):004:0> kill 1, 2, 3
334
+ # # list open sesssions, should only include main session
335
+ # irb(main):009:0> jobs
336
+ # #0->irb on main (#<Thread:0x400fb7e4> : running)
337
+ # # quit irb
338
+ # irb(main):010:0> exit
25
339
  module IRB
26
- @RCS_ID='-$Id: irb.rb 15408 2008-02-08 15:44:54Z nobu $-'
340
+ @RCS_ID='-$Id$-'
27
341
 
342
+ # An exception raised by IRB.irb_abort
28
343
  class Abort < Exception;end
29
344
 
30
- #
31
345
  @CONF = {}
32
346
 
347
+
348
+ # Displays current configuration.
349
+ #
350
+ # Modifing the configuration is achieved by sending a message to IRB.conf.
351
+ #
352
+ # See IRB@Configuration for more information.
33
353
  def IRB.conf
34
354
  @CONF
35
355
  end
36
356
 
37
- # IRB version method
357
+ # Returns the current version of IRB, including release version and last
358
+ # updated date.
38
359
  def IRB.version
39
360
  if v = @CONF[:VERSION] then return v end
40
361
 
@@ -43,26 +364,25 @@ module IRB
43
364
  @CONF[:VERSION] = format("irb %s(%s)", rv, @LAST_UPDATE_DATE)
44
365
  end
45
366
 
367
+ # The current IRB::Context of the session, see IRB.conf
368
+ #
369
+ # irb
370
+ # irb(main):001:0> IRB.CurrentContext.irb_name = "foo"
371
+ # foo(main):002:0> IRB.conf[:MAIN_CONTEXT].irb_name #=> "foo"
46
372
  def IRB.CurrentContext
47
373
  IRB.conf[:MAIN_CONTEXT]
48
374
  end
49
375
 
50
- # initialize IRB and start TOP_LEVEL irb
376
+ # Initializes IRB and creates a new Irb.irb object at the +TOPLEVEL_BINDING+
51
377
  def IRB.start(ap_path = nil)
52
378
  $0 = File::basename(ap_path, ".rb") if ap_path
53
379
 
54
380
  IRB.setup(ap_path)
55
381
 
56
- if @CONF[:IRB_CLASS]
57
- klass = @CONF[:IRB_CLASS]
58
- else
59
- klass = Irb
60
- end
61
-
62
382
  if @CONF[:SCRIPT]
63
- irb = klass.new(nil, @CONF[:SCRIPT])
383
+ irb = Irb.new(nil, @CONF[:SCRIPT])
64
384
  else
65
- irb = klass.new
385
+ irb = Irb.new
66
386
  end
67
387
 
68
388
  @CONF[:IRB_RC].call(irb.context) if @CONF[:IRB_RC]
@@ -71,29 +391,40 @@ module IRB
71
391
  trap("SIGINT") do
72
392
  irb.signal_handle
73
393
  end
74
-
75
- catch(:IRB_EXIT) do
76
- irb.eval_input
394
+
395
+ begin
396
+ catch(:IRB_EXIT) do
397
+ irb.eval_input
398
+ end
399
+ ensure
400
+ irb_at_exit
77
401
  end
78
402
  # print "\n"
79
403
  end
80
404
 
405
+ # Calls each event hook of IRB.conf[:AT_EXIT] when the current session quits.
406
+ def IRB.irb_at_exit
407
+ @CONF[:AT_EXIT].each{|hook| hook.call}
408
+ end
409
+
410
+ # Quits irb
81
411
  def IRB.irb_exit(irb, ret)
82
412
  throw :IRB_EXIT, ret
83
413
  end
84
414
 
415
+ # Aborts then interrupts irb.
416
+ #
417
+ # Will raise an Abort exception, or the given +exception+.
85
418
  def IRB.irb_abort(irb, exception = Abort)
86
419
  if defined? Thread
87
- irb.context.thread.raise exception, "abort then interrupt!!"
420
+ irb.context.thread.raise exception, "abort then interrupt!"
88
421
  else
89
- raise exception, "abort then interrupt!!"
422
+ raise exception, "abort then interrupt!"
90
423
  end
91
424
  end
92
425
 
93
- #
94
- # irb interpriter main routine
95
- #
96
426
  class Irb
427
+ # Creates a new irb session
97
428
  def initialize(workspace = nil, input_method = nil, output_method = nil)
98
429
  @context = Context.new(self, workspace, input_method, output_method)
99
430
  @context.main.extend ExtendCommandBundle
@@ -102,236 +433,253 @@ module IRB
102
433
  @scanner = RubyLex.new
103
434
  @scanner.exception_on_syntax_error = false
104
435
  end
436
+ # Returns the current context of this irb session
105
437
  attr_reader :context
438
+ # The lexer used by this irb session
106
439
  attr_accessor :scanner
107
440
 
441
+ # Evaluates input for this session.
108
442
  def eval_input
109
443
  @scanner.set_prompt do
110
- |ltype, indent, continue, line_no|
111
- if ltype
112
- f = @context.prompt_s
113
- elsif continue
114
- f = @context.prompt_c
115
- elsif indent > 0
116
- f = @context.prompt_n
117
- else @context.prompt_i
118
- f = @context.prompt_i
119
- end
120
- f = "" unless f
121
- if @context.prompting?
122
- @context.io.prompt = p = prompt(f, ltype, indent, line_no)
123
- else
124
- @context.io.prompt = p = ""
125
- end
126
- if @context.auto_indent_mode
127
- unless ltype
444
+ |ltype, indent, continue, line_no|
445
+ if ltype
446
+ f = @context.prompt_s
447
+ elsif continue
448
+ f = @context.prompt_c
449
+ elsif indent > 0
450
+ f = @context.prompt_n
451
+ else
452
+ f = @context.prompt_i
453
+ end
454
+ f = "" unless f
455
+ if @context.prompting?
456
+ @context.io.prompt = p = prompt(f, ltype, indent, line_no)
457
+ else
458
+ @context.io.prompt = p = ""
459
+ end
460
+ if @context.auto_indent_mode
461
+ unless ltype
128
462
  ind = prompt(@context.prompt_i, ltype, indent, line_no)[/.*\z/].size +
129
- indent * 2 - p.size
130
- ind += 2 if continue
131
- @context.io.prompt = p + " " * ind if ind > 0
132
- end
133
- end
463
+ indent * 2 - p.size
464
+ ind += 2 if continue
465
+ @context.io.prompt = p + " " * ind if ind > 0
466
+ end
467
+ end
134
468
  end
135
-
469
+
136
470
  @scanner.set_input(@context.io) do
137
- signal_status(:IN_INPUT) do
138
- if l = @context.io.gets
139
- print l if @context.verbose?
140
- else
141
- if @context.ignore_eof? and @context.io.readable_atfer_eof?
142
- l = "\n"
143
- if @context.verbose?
144
- printf "Use \"exit\" to leave %s\n", @context.ap_name
145
- end
146
- end
147
- end
148
- l
149
- end
471
+ signal_status(:IN_INPUT) do
472
+ if l = @context.io.gets
473
+ print l if @context.verbose?
474
+ else
475
+ if @context.ignore_eof? and @context.io.readable_after_eof?
476
+ l = "\n"
477
+ if @context.verbose?
478
+ printf "Use \"exit\" to leave %s\n", @context.ap_name
479
+ end
480
+ else
481
+ print "\n"
482
+ end
483
+ end
484
+ l
485
+ end
150
486
  end
151
487
 
152
- process_statements
153
- end
154
-
155
- def process_statements
156
488
  @scanner.each_top_level_statement do |line, line_no|
157
- signal_status(:IN_EVAL) do
158
- begin
489
+ signal_status(:IN_EVAL) do
490
+ begin
159
491
  line.untaint
160
- @context.evaluate(line, line_no)
161
- output_value if @context.echo?
162
- exc = nil
163
- rescue Interrupt => exc
164
- rescue SystemExit, SignalException
165
- raise
166
- rescue Exception => exc
167
- end
168
- if exc
169
- print exc.class, ": ", exc, "\n"
170
- if exc.backtrace[0] =~ /irb(2)?(\/.*|-.*|\.rb)?:/ && exc.class.to_s !~ /^IRB/
171
- irb_bug = true
172
- else
173
- irb_bug = false
174
- end
175
-
176
- messages = []
177
- lasts = []
178
- levels = 0
179
- for m in exc.backtrace
180
- m = @context.workspace.filter_backtrace(m) unless irb_bug
181
- if m
182
- if messages.size < @context.back_trace_limit
183
- messages.push "\tfrom "+m
184
- else
185
- lasts.push "\tfrom "+m
186
- if lasts.size > @context.back_trace_limit
187
- lasts.shift
188
- levels += 1
189
- end
190
- end
191
- end
192
- end
193
- print messages.join("\n"), "\n"
194
- unless lasts.empty?
195
- printf "... %d levels...\n", levels if levels > 0
196
- print lasts.join("\n")
197
- end
198
- print "Maybe IRB bug!!\n" if irb_bug
199
- end
492
+ @context.evaluate(line, line_no)
493
+ output_value if @context.echo?
494
+ exc = nil
495
+ rescue Interrupt => exc
496
+ rescue SystemExit, SignalException
497
+ raise
498
+ rescue Exception => exc
499
+ end
500
+ if exc
501
+ print exc.class, ": ", exc, "\n"
502
+ if exc.backtrace[0] =~ /irb(2)?(\/.*|-.*|\.rb)?:/ && exc.class.to_s !~ /^IRB/ &&
503
+ !(SyntaxError === exc)
504
+ irb_bug = true
505
+ else
506
+ irb_bug = false
507
+ end
508
+
509
+ messages = []
510
+ lasts = []
511
+ levels = 0
512
+ for m in exc.backtrace
513
+ m = @context.workspace.filter_backtrace(m) unless irb_bug
514
+ if m
515
+ if messages.size < @context.back_trace_limit
516
+ messages.push "\tfrom "+m
517
+ else
518
+ lasts.push "\tfrom "+m
519
+ if lasts.size > @context.back_trace_limit
520
+ lasts.shift
521
+ levels += 1
522
+ end
523
+ end
524
+ end
525
+ end
526
+ print messages.join("\n"), "\n"
527
+ unless lasts.empty?
528
+ printf "... %d levels...\n", levels if levels > 0
529
+ print lasts.join("\n")
530
+ end
531
+ print "Maybe IRB bug!\n" if irb_bug
532
+ end
200
533
  if $SAFE > 2
201
534
  abort "Error: irb does not work for $SAFE level higher than 2"
202
535
  end
203
- end
536
+ end
204
537
  end
205
538
  end
206
539
 
540
+ # Evaluates the given block using the given +path+ as the Context#irb_path
541
+ # and +name+ as the Context#irb_name.
542
+ #
543
+ # Used by the irb command +source+, see IRB@IRB+Sessions for more
544
+ # information.
207
545
  def suspend_name(path = nil, name = nil)
208
546
  @context.irb_path, back_path = path, @context.irb_path if path
209
547
  @context.irb_name, back_name = name, @context.irb_name if name
210
548
  begin
211
- yield back_path, back_name
549
+ yield back_path, back_name
212
550
  ensure
213
- @context.irb_path = back_path if path
214
- @context.irb_name = back_name if name
551
+ @context.irb_path = back_path if path
552
+ @context.irb_name = back_name if name
215
553
  end
216
554
  end
217
555
 
556
+ # Evaluates the given block using the given +workspace+ as the
557
+ # Context#workspace.
558
+ #
559
+ # Used by the irb command +irb_load+, see IRB@IRB+Sessions for more
560
+ # information.
218
561
  def suspend_workspace(workspace)
219
562
  @context.workspace, back_workspace = workspace, @context.workspace
220
563
  begin
221
- yield back_workspace
564
+ yield back_workspace
222
565
  ensure
223
- @context.workspace = back_workspace
566
+ @context.workspace = back_workspace
224
567
  end
225
568
  end
226
569
 
570
+ # Evaluates the given block using the given +input_method+ as the
571
+ # Context#io.
572
+ #
573
+ # Used by the irb commands +source+ and +irb_load+, see IRB@IRB+Sessions
574
+ # for more information.
227
575
  def suspend_input_method(input_method)
228
576
  back_io = @context.io
229
577
  @context.instance_eval{@io = input_method}
230
578
  begin
231
- yield back_io
579
+ yield back_io
232
580
  ensure
233
- @context.instance_eval{@io = back_io}
581
+ @context.instance_eval{@io = back_io}
234
582
  end
235
583
  end
236
584
 
585
+ # Evaluates the given block using the given +context+ as the Context.
237
586
  def suspend_context(context)
238
587
  @context, back_context = context, @context
239
588
  begin
240
- yield back_context
589
+ yield back_context
241
590
  ensure
242
- @context = back_context
591
+ @context = back_context
243
592
  end
244
593
  end
245
594
 
595
+ # Handler for the signal SIGINT, see Kernel#trap for more information.
246
596
  def signal_handle
247
597
  unless @context.ignore_sigint?
248
- print "\nabort!!\n" if @context.verbose?
249
- exit
598
+ print "\nabort!\n" if @context.verbose?
599
+ exit
250
600
  end
251
601
 
252
602
  case @signal_status
253
603
  when :IN_INPUT
254
- print "^C\n"
255
- raise RubyLex::TerminateLineInput
604
+ print "^C\n"
605
+ raise RubyLex::TerminateLineInput
256
606
  when :IN_EVAL
257
- IRB.irb_abort(self)
607
+ IRB.irb_abort(self)
258
608
  when :IN_LOAD
259
- IRB.irb_abort(self, LoadAbort)
609
+ IRB.irb_abort(self, LoadAbort)
260
610
  when :IN_IRB
261
- # ignore
611
+ # ignore
262
612
  else
263
- # ignore other cases as well
613
+ # ignore other cases as well
264
614
  end
265
615
  end
266
616
 
617
+ # Evaluates the given block using the given +status+.
267
618
  def signal_status(status)
268
619
  return yield if @signal_status == :IN_LOAD
269
620
 
270
621
  signal_status_back = @signal_status
271
622
  @signal_status = status
272
623
  begin
273
- yield
624
+ yield
274
625
  ensure
275
- @signal_status = signal_status_back
626
+ @signal_status = signal_status_back
276
627
  end
277
628
  end
278
629
 
279
- def prompt(prompt, ltype, indent, line_no)
630
+ def prompt(prompt, ltype, indent, line_no) # :nodoc:
280
631
  p = prompt.dup
281
632
  p.gsub!(/%([0-9]+)?([a-zA-Z])/) do
282
- case $2
283
- when "N"
284
- @context.irb_name
285
- when "m"
286
- @context.main.to_s
287
- when "M"
288
- @context.main.inspect
289
- when "l"
290
- ltype
291
- when "i"
292
- if $1
293
- format("%" + $1 + "d", indent)
294
- else
295
- indent.to_s
296
- end
297
- when "n"
298
- if $1
299
- format("%" + $1 + "d", line_no)
300
- else
301
- line_no.to_s
302
- end
303
- when "%"
304
- "%"
305
- end
633
+ case $2
634
+ when "N"
635
+ @context.irb_name
636
+ when "m"
637
+ @context.main.to_s
638
+ when "M"
639
+ @context.main.inspect
640
+ when "l"
641
+ ltype
642
+ when "i"
643
+ if $1
644
+ format("%" + $1 + "d", indent)
645
+ else
646
+ indent.to_s
647
+ end
648
+ when "n"
649
+ if $1
650
+ format("%" + $1 + "d", line_no)
651
+ else
652
+ line_no.to_s
653
+ end
654
+ when "%"
655
+ "%"
656
+ end
306
657
  end
307
658
  p
308
659
  end
309
660
 
310
- def output_value
311
- if @context.inspect?
312
- printf @context.return_format, @context.last_value.inspect
313
- else
314
- printf @context.return_format, @context.last_value
315
- end
661
+ def output_value # :nodoc:
662
+ printf @context.return_format, @context.inspect_last_value
316
663
  end
317
664
 
665
+ # Outputs the local variables to this current session, including
666
+ # #signal_status and #context, using IRB::Locale.
318
667
  def inspect
319
668
  ary = []
320
669
  for iv in instance_variables
321
- case iv
322
- when "@signal_status"
323
- ary.push format("%s=:%s", iv, @signal_status.id2name)
324
- when "@context"
325
- ary.push format("%s=%s", iv, eval(iv).__to_s__)
326
- else
327
- ary.push format("%s=%s", iv, eval(iv))
328
- end
670
+ case (iv = iv.to_s)
671
+ when "@signal_status"
672
+ ary.push format("%s=:%s", iv, @signal_status.id2name)
673
+ when "@context"
674
+ ary.push format("%s=%s", iv, eval(iv).__to_s__)
675
+ else
676
+ ary.push format("%s=%s", iv, eval(iv))
677
+ end
329
678
  end
330
679
  format("#<%s: %s>", self.class, ary.join(", "))
331
680
  end
332
681
  end
333
682
 
334
- # Singleton method
335
683
  def @CONF.inspect
336
684
  IRB.version unless self[:VERSION]
337
685
 
@@ -339,16 +687,16 @@ module IRB
339
687
  for k, v in sort{|a1, a2| a1[0].id2name <=> a2[0].id2name}
340
688
  case k
341
689
  when :MAIN_CONTEXT, :__TMP__EHV__
342
- array.push format("CONF[:%s]=...myself...", k.id2name)
690
+ array.push format("CONF[:%s]=...myself...", k.id2name)
343
691
  when :PROMPT
344
- s = v.collect{
345
- |kk, vv|
346
- ss = vv.collect{|kkk, vvv| ":#{kkk.id2name}=>#{vvv.inspect}"}
347
- format(":%s=>{%s}", kk.id2name, ss.join(", "))
348
- }
349
- array.push format("CONF[:%s]={%s}", k.id2name, s.join(", "))
692
+ s = v.collect{
693
+ |kk, vv|
694
+ ss = vv.collect{|kkk, vvv| ":#{kkk.id2name}=>#{vvv.inspect}"}
695
+ format(":%s=>{%s}", kk.id2name, ss.join(", "))
696
+ }
697
+ array.push format("CONF[:%s]={%s}", k.id2name, s.join(", "))
350
698
  else
351
- array.push format("CONF[:%s]=%s", k.id2name, v.inspect)
699
+ array.push format("CONF[:%s]=%s", k.id2name, v.inspect)
352
700
  end
353
701
  end
354
702
  array.join("\n")