rubysl-irb 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.travis.yml +8 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE +25 -0
  6. data/README.md +29 -0
  7. data/Rakefile +1 -0
  8. data/lib/irb/cmd/chws.rb +33 -0
  9. data/lib/irb/cmd/fork.rb +39 -0
  10. data/lib/irb/cmd/help.rb +31 -0
  11. data/lib/irb/cmd/load.rb +67 -0
  12. data/lib/irb/cmd/nop.rb +39 -0
  13. data/lib/irb/cmd/pushws.rb +39 -0
  14. data/lib/irb/cmd/subirb.rb +43 -0
  15. data/lib/irb/completion.rb +205 -0
  16. data/lib/irb/context.rb +255 -0
  17. data/lib/irb/ext/change-ws.rb +62 -0
  18. data/lib/irb/ext/history.rb +110 -0
  19. data/lib/irb/ext/loader.rb +120 -0
  20. data/lib/irb/ext/math-mode.rb +37 -0
  21. data/lib/irb/ext/multi-irb.rb +241 -0
  22. data/lib/irb/ext/save-history.rb +70 -0
  23. data/lib/irb/ext/tracer.rb +61 -0
  24. data/lib/irb/ext/use-loader.rb +65 -0
  25. data/lib/irb/ext/workspaces.rb +56 -0
  26. data/lib/irb/extend-command.rb +264 -0
  27. data/lib/irb/frame.rb +67 -0
  28. data/lib/irb/help.rb +35 -0
  29. data/lib/irb/init.rb +258 -0
  30. data/lib/irb/input-method.rb +120 -0
  31. data/lib/irb/lc/error.rb +30 -0
  32. data/lib/irb/lc/help-message.rb +37 -0
  33. data/lib/irb/lc/ja/error.rb +27 -0
  34. data/lib/irb/lc/ja/help-message +36 -0
  35. data/lib/irb/locale.rb +184 -0
  36. data/lib/irb/notifier.rb +145 -0
  37. data/lib/irb/output-method.rb +85 -0
  38. data/lib/irb/rubinius.rb +55 -0
  39. data/lib/irb/ruby-lex.rb +1149 -0
  40. data/lib/irb/ruby-token.rb +273 -0
  41. data/lib/irb/slex.rb +285 -0
  42. data/lib/irb/version.rb +16 -0
  43. data/lib/irb/workspace.rb +107 -0
  44. data/lib/irb/ws-for-case-2.rb +15 -0
  45. data/lib/irb/xmp.rb +86 -0
  46. data/lib/irb.rb +1 -0
  47. data/lib/rubysl/irb/irb.rb +356 -0
  48. data/lib/rubysl/irb/version.rb +5 -0
  49. data/lib/rubysl/irb.rb +2 -0
  50. data/rubysl-irb.gemspec +31 -0
  51. metadata +219 -0
@@ -0,0 +1,16 @@
1
+ #
2
+ # irb/version.rb - irb version definition file
3
+ # $Release Version: 0.9.5$
4
+ # $Revision: 11708 $
5
+ # $Date: 2007-02-12 15:01:19 -0800 (Mon, 12 Feb 2007) $
6
+ # by Keiju ISHITSUKA(keiju@ishitsuka.com)
7
+ #
8
+ # --
9
+ #
10
+ #
11
+ #
12
+
13
+ module IRB
14
+ @RELEASE_VERSION = "0.9.5"
15
+ @LAST_UPDATE_DATE = "05/04/13"
16
+ end
@@ -0,0 +1,107 @@
1
+ #
2
+ # irb/workspace-binding.rb -
3
+ # $Release Version: 0.9.5$
4
+ # $Revision: 11708 $
5
+ # $Date: 2007-02-12 15:01:19 -0800 (Mon, 12 Feb 2007) $
6
+ # by Keiju ISHITSUKA(keiju@ruby-lang.org)
7
+ #
8
+ # --
9
+ #
10
+ #
11
+ #
12
+ module IRB
13
+ class WorkSpace
14
+ # create new workspace. set self to main if specified, otherwise
15
+ # inherit main from TOPLEVEL_BINDING.
16
+ def initialize(*main)
17
+ if main[0].kind_of?(Binding)
18
+ @binding = main.shift
19
+ elsif IRB.conf[:SINGLE_IRB]
20
+ @binding = TOPLEVEL_BINDING
21
+ else
22
+ case IRB.conf[:CONTEXT_MODE]
23
+ when 0 # binding in proc on TOPLEVEL_BINDING
24
+ @binding = eval("proc{binding}.call",
25
+ TOPLEVEL_BINDING,
26
+ __FILE__,
27
+ __LINE__)
28
+ when 1 # binding in loaded file
29
+ require "tempfile"
30
+ f = Tempfile.open("irb-binding")
31
+ f.print <<EOF
32
+ $binding = binding
33
+ EOF
34
+ f.close
35
+ load f.path
36
+ @binding = $binding
37
+
38
+ when 2 # binding in loaded file(thread use)
39
+ unless defined? BINDING_QUEUE
40
+ require "thread"
41
+
42
+ IRB.const_set("BINDING_QUEUE", SizedQueue.new(1))
43
+ Thread.abort_on_exception = true
44
+ Thread.start do
45
+ eval "require \"irb/ws-for-case-2\"", TOPLEVEL_BINDING, __FILE__, __LINE__
46
+ end
47
+ Thread.pass
48
+ end
49
+ @binding = BINDING_QUEUE.pop
50
+
51
+ when 3 # binging in function on TOPLEVEL_BINDING(default)
52
+ @binding = eval("def irb_binding; binding; end; irb_binding",
53
+ TOPLEVEL_BINDING,
54
+ __FILE__,
55
+ __LINE__ - 3)
56
+ end
57
+ end
58
+ if main.empty?
59
+ @main = eval("self", @binding)
60
+ else
61
+ @main = main[0]
62
+ IRB.conf[:__MAIN__] = @main
63
+ case @main
64
+ when Module
65
+ @binding = eval("IRB.conf[:__MAIN__].module_eval('binding', __FILE__, __LINE__)", @binding, __FILE__, __LINE__)
66
+ else
67
+ begin
68
+ @binding = eval("IRB.conf[:__MAIN__].instance_eval('binding', __FILE__, __LINE__)", @binding, __FILE__, __LINE__)
69
+ rescue TypeError
70
+ IRB.fail CantChangeBinding, @main.inspect
71
+ end
72
+ end
73
+ end
74
+ eval("_=nil", @binding)
75
+ end
76
+
77
+ attr_reader :binding
78
+ attr_reader :main
79
+
80
+ def evaluate(context, statements, file = __FILE__, line = __LINE__)
81
+ eval(statements, @binding, file, line)
82
+ end
83
+
84
+ # error message manipulator
85
+ def filter_backtrace(bt)
86
+ case IRB.conf[:CONTEXT_MODE]
87
+ when 0
88
+ return nil if bt =~ /\(irb_local_binding\)/
89
+ when 1
90
+ if(bt =~ %r!/tmp/irb-binding! or
91
+ bt =~ %r!irb/.*\.rb! or
92
+ bt =~ /irb\.rb/)
93
+ return nil
94
+ end
95
+ when 2
96
+ return nil if bt =~ /irb\/.*\.rb/
97
+ when 3
98
+ return nil if bt =~ /irb\/.*\.rb/
99
+ bt.sub!(/:\s*in `irb_binding'/){""}
100
+ end
101
+ bt
102
+ end
103
+
104
+ def IRB.delete_caller
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,15 @@
1
+ #
2
+ # irb/ws-for-case-2.rb -
3
+ # $Release Version: 0.9.5$
4
+ # $Revision: 11708 $
5
+ # $Date: 2007-02-12 15:01:19 -0800 (Mon, 12 Feb 2007) $
6
+ # by Keiju ISHITSUKA(keiju@ruby-lang.org)
7
+ #
8
+ # --
9
+ #
10
+ #
11
+ #
12
+
13
+ while true
14
+ IRB::BINDING_QUEUE.push b = binding
15
+ end
data/lib/irb/xmp.rb ADDED
@@ -0,0 +1,86 @@
1
+ #
2
+ # xmp.rb - irb version of gotoken xmp
3
+ # $Release Version: 0.9$
4
+ # $Revision: 11708 $
5
+ # $Date: 2007-02-12 15:01:19 -0800 (Mon, 12 Feb 2007) $
6
+ # by Keiju ISHITSUKA(Nippon Rational Inc.)
7
+ #
8
+ # --
9
+ #
10
+ #
11
+ #
12
+
13
+ require "irb"
14
+ require "irb/frame"
15
+
16
+ class XMP
17
+ @RCS_ID='-$Id: xmp.rb 11708 2007-02-12 23:01:19Z shyouhei $-'
18
+
19
+ def initialize(bind = nil)
20
+ IRB.init_config(nil)
21
+ #IRB.parse_opts
22
+ #IRB.load_modules
23
+
24
+ IRB.conf[:PROMPT_MODE] = :XMP
25
+
26
+ bind = IRB::Frame.top(1) unless bind
27
+ ws = IRB::WorkSpace.new(bind)
28
+ @io = StringInputMethod.new
29
+ @irb = IRB::Irb.new(ws, @io)
30
+ @irb.context.ignore_sigint = false
31
+
32
+ # IRB.conf[:IRB_RC].call(@irb.context) if IRB.conf[:IRB_RC]
33
+ IRB.conf[:MAIN_CONTEXT] = @irb.context
34
+ end
35
+
36
+ def puts(exps)
37
+ @io.puts exps
38
+
39
+ if @irb.context.ignore_sigint
40
+ begin
41
+ trap_proc_b = trap("SIGINT"){@irb.signal_handle}
42
+ catch(:IRB_EXIT) do
43
+ @irb.eval_input
44
+ end
45
+ ensure
46
+ trap("SIGINT", trap_proc_b)
47
+ end
48
+ else
49
+ catch(:IRB_EXIT) do
50
+ @irb.eval_input
51
+ end
52
+ end
53
+ end
54
+
55
+ class StringInputMethod < IRB::InputMethod
56
+ def initialize
57
+ super
58
+ @exps = []
59
+ end
60
+
61
+ def eof?
62
+ @exps.empty?
63
+ end
64
+
65
+ def gets
66
+ while l = @exps.shift
67
+ next if /^\s+$/ =~ l
68
+ l.concat "\n"
69
+ print @prompt, l
70
+ break
71
+ end
72
+ l
73
+ end
74
+
75
+ def puts(exps)
76
+ @exps.concat exps.split(/\n/)
77
+ end
78
+ end
79
+ end
80
+
81
+ def xmp(exps, bind = nil)
82
+ bind = IRB::Frame.top(1) unless bind
83
+ xmp = XMP.new(bind)
84
+ xmp.puts exps
85
+ xmp
86
+ end
data/lib/irb.rb ADDED
@@ -0,0 +1 @@
1
+ require "rubysl/irb"
@@ -0,0 +1,356 @@
1
+ #
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)
7
+ #
8
+ # --
9
+ #
10
+ #
11
+ #
12
+ require "e2mmap"
13
+
14
+ require "irb/init"
15
+ require "irb/context"
16
+ require "irb/extend-command"
17
+ #require "irb/workspace"
18
+
19
+ require "irb/ruby-lex"
20
+ require "irb/input-method"
21
+ require "irb/locale"
22
+
23
+ STDOUT.sync = true
24
+
25
+ module IRB
26
+ @RCS_ID='-$Id: irb.rb 15408 2008-02-08 15:44:54Z nobu $-'
27
+
28
+ class Abort < Exception;end
29
+
30
+ #
31
+ @CONF = {}
32
+
33
+ def IRB.conf
34
+ @CONF
35
+ end
36
+
37
+ # IRB version method
38
+ def IRB.version
39
+ if v = @CONF[:VERSION] then return v end
40
+
41
+ require "irb/version"
42
+ rv = @RELEASE_VERSION.sub(/\.0/, "")
43
+ @CONF[:VERSION] = format("irb %s(%s)", rv, @LAST_UPDATE_DATE)
44
+ end
45
+
46
+ def IRB.CurrentContext
47
+ IRB.conf[:MAIN_CONTEXT]
48
+ end
49
+
50
+ # initialize IRB and start TOP_LEVEL irb
51
+ def IRB.start(ap_path = nil)
52
+ $0 = File::basename(ap_path, ".rb") if ap_path
53
+
54
+ IRB.setup(ap_path)
55
+
56
+ if @CONF[:IRB_CLASS]
57
+ klass = @CONF[:IRB_CLASS]
58
+ else
59
+ klass = Irb
60
+ end
61
+
62
+ if @CONF[:SCRIPT]
63
+ irb = klass.new(nil, @CONF[:SCRIPT])
64
+ else
65
+ irb = klass.new
66
+ end
67
+
68
+ @CONF[:IRB_RC].call(irb.context) if @CONF[:IRB_RC]
69
+ @CONF[:MAIN_CONTEXT] = irb.context
70
+
71
+ trap("SIGINT") do
72
+ irb.signal_handle
73
+ end
74
+
75
+ catch(:IRB_EXIT) do
76
+ irb.eval_input
77
+ end
78
+ # print "\n"
79
+ end
80
+
81
+ def IRB.irb_exit(irb, ret)
82
+ throw :IRB_EXIT, ret
83
+ end
84
+
85
+ def IRB.irb_abort(irb, exception = Abort)
86
+ if defined? Thread
87
+ irb.context.thread.raise exception, "abort then interrupt!!"
88
+ else
89
+ raise exception, "abort then interrupt!!"
90
+ end
91
+ end
92
+
93
+ #
94
+ # irb interpriter main routine
95
+ #
96
+ class Irb
97
+ def initialize(workspace = nil, input_method = nil, output_method = nil)
98
+ @context = Context.new(self, workspace, input_method, output_method)
99
+ @context.main.extend ExtendCommandBundle
100
+ @signal_status = :IN_IRB
101
+
102
+ @scanner = RubyLex.new
103
+ @scanner.exception_on_syntax_error = false
104
+ end
105
+ attr_reader :context
106
+ attr_accessor :scanner
107
+
108
+ def eval_input
109
+ @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
128
+ 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
134
+ end
135
+
136
+ @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
150
+ end
151
+
152
+ process_statements
153
+ end
154
+
155
+ def process_statements
156
+ @scanner.each_top_level_statement do |line, line_no|
157
+ signal_status(:IN_EVAL) do
158
+ begin
159
+ 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
200
+ if $SAFE > 2
201
+ abort "Error: irb does not work for $SAFE level higher than 2"
202
+ end
203
+ end
204
+ end
205
+ end
206
+
207
+ def suspend_name(path = nil, name = nil)
208
+ @context.irb_path, back_path = path, @context.irb_path if path
209
+ @context.irb_name, back_name = name, @context.irb_name if name
210
+ begin
211
+ yield back_path, back_name
212
+ ensure
213
+ @context.irb_path = back_path if path
214
+ @context.irb_name = back_name if name
215
+ end
216
+ end
217
+
218
+ def suspend_workspace(workspace)
219
+ @context.workspace, back_workspace = workspace, @context.workspace
220
+ begin
221
+ yield back_workspace
222
+ ensure
223
+ @context.workspace = back_workspace
224
+ end
225
+ end
226
+
227
+ def suspend_input_method(input_method)
228
+ back_io = @context.io
229
+ @context.instance_eval{@io = input_method}
230
+ begin
231
+ yield back_io
232
+ ensure
233
+ @context.instance_eval{@io = back_io}
234
+ end
235
+ end
236
+
237
+ def suspend_context(context)
238
+ @context, back_context = context, @context
239
+ begin
240
+ yield back_context
241
+ ensure
242
+ @context = back_context
243
+ end
244
+ end
245
+
246
+ def signal_handle
247
+ unless @context.ignore_sigint?
248
+ print "\nabort!!\n" if @context.verbose?
249
+ exit
250
+ end
251
+
252
+ case @signal_status
253
+ when :IN_INPUT
254
+ print "^C\n"
255
+ raise RubyLex::TerminateLineInput
256
+ when :IN_EVAL
257
+ IRB.irb_abort(self)
258
+ when :IN_LOAD
259
+ IRB.irb_abort(self, LoadAbort)
260
+ when :IN_IRB
261
+ # ignore
262
+ else
263
+ # ignore other cases as well
264
+ end
265
+ end
266
+
267
+ def signal_status(status)
268
+ return yield if @signal_status == :IN_LOAD
269
+
270
+ signal_status_back = @signal_status
271
+ @signal_status = status
272
+ begin
273
+ yield
274
+ ensure
275
+ @signal_status = signal_status_back
276
+ end
277
+ end
278
+
279
+ def prompt(prompt, ltype, indent, line_no)
280
+ p = prompt.dup
281
+ 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
306
+ end
307
+ p
308
+ end
309
+
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
316
+ end
317
+
318
+ def inspect
319
+ ary = []
320
+ 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
329
+ end
330
+ format("#<%s: %s>", self.class, ary.join(", "))
331
+ end
332
+ end
333
+
334
+ # Singleton method
335
+ def @CONF.inspect
336
+ IRB.version unless self[:VERSION]
337
+
338
+ array = []
339
+ for k, v in sort{|a1, a2| a1[0].id2name <=> a2[0].id2name}
340
+ case k
341
+ when :MAIN_CONTEXT, :__TMP__EHV__
342
+ array.push format("CONF[:%s]=...myself...", k.id2name)
343
+ 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(", "))
350
+ else
351
+ array.push format("CONF[:%s]=%s", k.id2name, v.inspect)
352
+ end
353
+ end
354
+ array.join("\n")
355
+ end
356
+ end