irb 1.1.0.pre.4

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 (56) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +10 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.md +55 -0
  5. data/Rakefile +10 -0
  6. data/bin/console +6 -0
  7. data/bin/setup +6 -0
  8. data/doc/irb/irb-tools.rd.ja +184 -0
  9. data/doc/irb/irb.rd.ja +411 -0
  10. data/exe/irb +11 -0
  11. data/irb.gemspec +84 -0
  12. data/lib/irb.rb +870 -0
  13. data/lib/irb/cmd/chws.rb +34 -0
  14. data/lib/irb/cmd/fork.rb +39 -0
  15. data/lib/irb/cmd/help.rb +46 -0
  16. data/lib/irb/cmd/load.rb +67 -0
  17. data/lib/irb/cmd/nop.rb +39 -0
  18. data/lib/irb/cmd/pushws.rb +41 -0
  19. data/lib/irb/cmd/subirb.rb +43 -0
  20. data/lib/irb/color.rb +233 -0
  21. data/lib/irb/completion.rb +339 -0
  22. data/lib/irb/context.rb +458 -0
  23. data/lib/irb/ext/change-ws.rb +46 -0
  24. data/lib/irb/ext/history.rb +157 -0
  25. data/lib/irb/ext/loader.rb +129 -0
  26. data/lib/irb/ext/multi-irb.rb +265 -0
  27. data/lib/irb/ext/save-history.rb +117 -0
  28. data/lib/irb/ext/tracer.rb +72 -0
  29. data/lib/irb/ext/use-loader.rb +77 -0
  30. data/lib/irb/ext/workspaces.rb +67 -0
  31. data/lib/irb/extend-command.rb +328 -0
  32. data/lib/irb/frame.rb +81 -0
  33. data/lib/irb/help.rb +37 -0
  34. data/lib/irb/init.rb +312 -0
  35. data/lib/irb/input-method.rb +298 -0
  36. data/lib/irb/inspector.rb +142 -0
  37. data/lib/irb/lc/.document +4 -0
  38. data/lib/irb/lc/error.rb +32 -0
  39. data/lib/irb/lc/help-message +52 -0
  40. data/lib/irb/lc/ja/encoding_aliases.rb +11 -0
  41. data/lib/irb/lc/ja/error.rb +31 -0
  42. data/lib/irb/lc/ja/help-message +55 -0
  43. data/lib/irb/locale.rb +182 -0
  44. data/lib/irb/magic-file.rb +38 -0
  45. data/lib/irb/notifier.rb +232 -0
  46. data/lib/irb/output-method.rb +92 -0
  47. data/lib/irb/ruby-lex.rb +499 -0
  48. data/lib/irb/ruby_logo.aa +38 -0
  49. data/lib/irb/slex.rb +282 -0
  50. data/lib/irb/src_encoding.rb +7 -0
  51. data/lib/irb/version.rb +17 -0
  52. data/lib/irb/workspace.rb +181 -0
  53. data/lib/irb/ws-for-case-2.rb +15 -0
  54. data/lib/irb/xmp.rb +170 -0
  55. data/man/irb.1 +207 -0
  56. metadata +140 -0
@@ -0,0 +1,38 @@
1
+
2
+ -+smJYYN?mm-
3
+ HB"BBYT TQg NggT
4
+ 9Q+g Nm,T 8g NJW
5
+ YS+ N2NJ"Sg N?
6
+ BQg #( gT Nggggk J
7
+ 5j NJ NJ NNge
8
+ #Q #JJ NgT N(
9
+ @j bj mT J
10
+ Bj @/d NJ (
11
+ #q #(( NgT #J
12
+ 5d #(t mT $d
13
+ #q @(@J NJB;
14
+ @( 5d ? HHH H HQmgggggggmN qD
15
+ 5d #uN 2QdH E O
16
+ 5 5JSd Nd NJH @d j
17
+ Fd @J4d s NQH #d (
18
+ #( #o6d Nd NgH #d #d
19
+ 4 B&Od v NgT #d F
20
+ #( 9JGd NH NgUd F
21
+ #d #GJQ d NP $
22
+ #J #U+#Q N Q # j
23
+ j /W BQ+ BQ d NJ NJ
24
+ - NjJH HBIjTQggPJQgW N W k #J
25
+ #J b HYWgggN j s Nag d NN b #d
26
+ #J 5- D s Ngg N d Nd F
27
+ Fd BKH2 #+ s NNgg J Q J ]
28
+ F H @ J N y K(d P I
29
+ F4 E N? #d y #Q NJ E j
30
+ F W Nd q m Bg NxW N(H-
31
+ F d b @ m Hd gW vKJ
32
+ NJ d K d s Bg aT FDd
33
+ b # d N m BQ mV N>
34
+ e5 Nd #d NggggggQWH HHHH NJ -
35
+ m7 NW H N HSVO1z=?11-
36
+ NgTH bB kH WBHWWHBHWmQgg&gggggNNN
37
+ NNggggggNN
38
+
@@ -0,0 +1,282 @@
1
+ # frozen_string_literal: false
2
+ #
3
+ # irb/slex.rb - simple lex analyzer
4
+ # $Release Version: 0.9.6$
5
+ # $Revision$
6
+ # by Keiju ISHITSUKA(keiju@ruby-lang.org)
7
+ #
8
+ # --
9
+ #
10
+ #
11
+ #
12
+
13
+ require "e2mmap"
14
+ require_relative "notifier"
15
+
16
+ # :stopdoc:
17
+ module IRB
18
+ class SLex
19
+
20
+ extend Exception2MessageMapper
21
+ def_exception :ErrNodeNothing, "node nothing"
22
+ def_exception :ErrNodeAlreadyExists, "node already exists"
23
+
24
+ DOUT = Notifier::def_notifier("SLex::")
25
+ D_WARN = DOUT::def_notifier(1, "Warn: ")
26
+ D_DEBUG = DOUT::def_notifier(2, "Debug: ")
27
+ D_DETAIL = DOUT::def_notifier(4, "Detail: ")
28
+
29
+ DOUT.level = Notifier::D_NOMSG
30
+
31
+ def initialize
32
+ @head = Node.new("")
33
+ end
34
+
35
+ def def_rule(token, preproc = nil, postproc = nil, &block)
36
+ D_DETAIL.pp token
37
+
38
+ postproc = block if block_given?
39
+ create(token, preproc, postproc)
40
+ end
41
+
42
+ def def_rules(*tokens, &block)
43
+ if block_given?
44
+ p = block
45
+ end
46
+ for token in tokens
47
+ def_rule(token, nil, p)
48
+ end
49
+ end
50
+
51
+ def preproc(token, proc)
52
+ node = search(token)
53
+ node.preproc=proc
54
+ end
55
+
56
+ # need a check?
57
+ def postproc(token)
58
+ node = search(token, proc)
59
+ node.postproc=proc
60
+ end
61
+
62
+ def search(token)
63
+ @head.search(token.split(//))
64
+ end
65
+
66
+ def create(token, preproc = nil, postproc = nil)
67
+ @head.create_subnode(token.split(//), preproc, postproc)
68
+ end
69
+
70
+ def match(token)
71
+ case token
72
+ when Array
73
+ when String
74
+ return match(token.split(//))
75
+ else
76
+ return @head.match_io(token)
77
+ end
78
+ ret = @head.match(token)
79
+ D_DETAIL.exec_if{D_DETAIL.printf "match end: %s:%s\n", ret, token.inspect}
80
+ ret
81
+ end
82
+
83
+ def inspect
84
+ format("<SLex: @head = %s>", @head.inspect)
85
+ end
86
+
87
+ #----------------------------------------------------------------------
88
+ #
89
+ # class Node -
90
+ #
91
+ #----------------------------------------------------------------------
92
+ class Node
93
+ # if postproc is nil, this node is an abstract node.
94
+ # if postproc is non-nil, this node is a real node.
95
+ def initialize(preproc = nil, postproc = nil)
96
+ @Tree = {}
97
+ @preproc = preproc
98
+ @postproc = postproc
99
+ end
100
+
101
+ attr_accessor :preproc
102
+ attr_accessor :postproc
103
+
104
+ def search(chrs, opt = nil)
105
+ return self if chrs.empty?
106
+ ch = chrs.shift
107
+ if node = @Tree[ch]
108
+ node.search(chrs, opt)
109
+ else
110
+ if opt
111
+ chrs.unshift ch
112
+ self.create_subnode(chrs)
113
+ else
114
+ SLex.fail ErrNodeNothing
115
+ end
116
+ end
117
+ end
118
+
119
+ def create_subnode(chrs, preproc = nil, postproc = nil)
120
+ if chrs.empty?
121
+ if @postproc
122
+ D_DETAIL.pp node
123
+ SLex.fail ErrNodeAlreadyExists
124
+ else
125
+ D_DEBUG.puts "change abstract node to real node."
126
+ @preproc = preproc
127
+ @postproc = postproc
128
+ end
129
+ return self
130
+ end
131
+
132
+ ch = chrs.shift
133
+ if node = @Tree[ch]
134
+ if chrs.empty?
135
+ if node.postproc
136
+ DebugLogger.pp node
137
+ DebugLogger.pp self
138
+ DebugLogger.pp ch
139
+ DebugLogger.pp chrs
140
+ SLex.fail ErrNodeAlreadyExists
141
+ else
142
+ D_WARN.puts "change abstract node to real node"
143
+ node.preproc = preproc
144
+ node.postproc = postproc
145
+ end
146
+ else
147
+ node.create_subnode(chrs, preproc, postproc)
148
+ end
149
+ else
150
+ if chrs.empty?
151
+ node = Node.new(preproc, postproc)
152
+ else
153
+ node = Node.new
154
+ node.create_subnode(chrs, preproc, postproc)
155
+ end
156
+ @Tree[ch] = node
157
+ end
158
+ node
159
+ end
160
+
161
+ #
162
+ # chrs: String
163
+ # character array
164
+ # io must have getc()/ungetc(); and ungetc() must be
165
+ # able to be called arbitrary number of times.
166
+ #
167
+ def match(chrs, op = "")
168
+ D_DETAIL.print "match>: ", chrs, "op:", op, "\n"
169
+ if chrs.empty?
170
+ if @preproc.nil? || @preproc.call(op, chrs)
171
+ DOUT.printf(D_DETAIL, "op1: %s\n", op)
172
+ @postproc.call(op, chrs)
173
+ else
174
+ nil
175
+ end
176
+ else
177
+ ch = chrs.shift
178
+ if node = @Tree[ch]
179
+ if ret = node.match(chrs, op+ch)
180
+ return ret
181
+ else
182
+ chrs.unshift ch
183
+ if @postproc and @preproc.nil? || @preproc.call(op, chrs)
184
+ DOUT.printf(D_DETAIL, "op2: %s\n", op.inspect)
185
+ ret = @postproc.call(op, chrs)
186
+ return ret
187
+ else
188
+ return nil
189
+ end
190
+ end
191
+ else
192
+ chrs.unshift ch
193
+ if @postproc and @preproc.nil? || @preproc.call(op, chrs)
194
+ DOUT.printf(D_DETAIL, "op3: %s\n", op)
195
+ @postproc.call(op, chrs)
196
+ return ""
197
+ else
198
+ return nil
199
+ end
200
+ end
201
+ end
202
+ end
203
+
204
+ def match_io(io, op = "")
205
+ if op == ""
206
+ ch = io.getc
207
+ if ch == nil
208
+ return nil
209
+ end
210
+ else
211
+ ch = io.getc_of_rests
212
+ end
213
+ if ch.nil?
214
+ if @preproc.nil? || @preproc.call(op, io)
215
+ D_DETAIL.printf("op1: %s\n", op)
216
+ @postproc.call(op, io)
217
+ else
218
+ nil
219
+ end
220
+ else
221
+ if node = @Tree[ch]
222
+ if ret = node.match_io(io, op+ch)
223
+ ret
224
+ else
225
+ io.ungetc ch
226
+ if @postproc and @preproc.nil? || @preproc.call(op, io)
227
+ DOUT.exec_if{D_DETAIL.printf "op2: %s\n", op.inspect}
228
+ @postproc.call(op, io)
229
+ else
230
+ nil
231
+ end
232
+ end
233
+ else
234
+ io.ungetc ch
235
+ if @postproc and @preproc.nil? || @preproc.call(op, io)
236
+ D_DETAIL.printf("op3: %s\n", op)
237
+ @postproc.call(op, io)
238
+ else
239
+ nil
240
+ end
241
+ end
242
+ end
243
+ end
244
+ end
245
+ end
246
+ end
247
+ # :startdoc:
248
+
249
+ if $0 == __FILE__
250
+ case $1
251
+ when "1"
252
+ tr = SLex.new
253
+ print "0: ", tr.inspect, "\n"
254
+ tr.def_rule("=") {print "=\n"}
255
+ print "1: ", tr.inspect, "\n"
256
+ tr.def_rule("==") {print "==\n"}
257
+ print "2: ", tr.inspect, "\n"
258
+
259
+ print "case 1:\n"
260
+ print tr.match("="), "\n"
261
+ print "case 2:\n"
262
+ print tr.match("=="), "\n"
263
+ print "case 3:\n"
264
+ print tr.match("=>"), "\n"
265
+
266
+ when "2"
267
+ tr = SLex.new
268
+ print "0: ", tr.inspect, "\n"
269
+ tr.def_rule("=") {print "=\n"}
270
+ print "1: ", tr.inspect, "\n"
271
+ tr.def_rule("==", proc{false}) {print "==\n"}
272
+ print "2: ", tr.inspect, "\n"
273
+
274
+ print "case 1:\n"
275
+ print tr.match("="), "\n"
276
+ print "case 2:\n"
277
+ print tr.match("=="), "\n"
278
+ print "case 3:\n"
279
+ print tr.match("=>"), "\n"
280
+ end
281
+ exit
282
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: false
2
+ # DO NOT WRITE ANY MAGIC COMMENT HERE.
3
+ module IRB
4
+ def self.default_src_encoding
5
+ return __ENCODING__
6
+ end
7
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: false
2
+ #
3
+ # irb/version.rb - irb version definition file
4
+ # $Release Version: 0.9.6$
5
+ # $Revision$
6
+ # by Keiju ISHITSUKA(keiju@ishitsuka.com)
7
+ #
8
+ # --
9
+ #
10
+ #
11
+ #
12
+
13
+ module IRB # :nodoc:
14
+ VERSION = "1.1.0.pre.4"
15
+ @RELEASE_VERSION = VERSION
16
+ @LAST_UPDATE_DATE = "2019-09-01"
17
+ end
@@ -0,0 +1,181 @@
1
+ # frozen_string_literal: false
2
+ #
3
+ # irb/workspace-binding.rb -
4
+ # $Release Version: 0.9.6$
5
+ # $Revision$
6
+ # by Keiju ISHITSUKA(keiju@ruby-lang.org)
7
+ #
8
+ # --
9
+ #
10
+ #
11
+ #
12
+
13
+ require "delegate"
14
+
15
+ module IRB # :nodoc:
16
+ class WorkSpace
17
+ # Creates a new workspace.
18
+ #
19
+ # set self to main if specified, otherwise
20
+ # inherit main from TOPLEVEL_BINDING.
21
+ def initialize(*main)
22
+ if main[0].kind_of?(Binding)
23
+ @binding = main.shift
24
+ elsif IRB.conf[:SINGLE_IRB]
25
+ @binding = TOPLEVEL_BINDING
26
+ else
27
+ case IRB.conf[:CONTEXT_MODE]
28
+ when 0 # binding in proc on TOPLEVEL_BINDING
29
+ @binding = eval("proc{binding}.call",
30
+ TOPLEVEL_BINDING,
31
+ __FILE__,
32
+ __LINE__)
33
+ when 1 # binding in loaded file
34
+ require "tempfile"
35
+ f = Tempfile.open("irb-binding")
36
+ f.print <<EOF
37
+ $binding = binding
38
+ EOF
39
+ f.close
40
+ load f.path
41
+ @binding = $binding
42
+
43
+ when 2 # binding in loaded file(thread use)
44
+ unless defined? BINDING_QUEUE
45
+ IRB.const_set(:BINDING_QUEUE, Thread::SizedQueue.new(1))
46
+ Thread.abort_on_exception = true
47
+ Thread.start do
48
+ eval "require \"irb/ws-for-case-2\"", TOPLEVEL_BINDING, __FILE__, __LINE__
49
+ end
50
+ Thread.pass
51
+ end
52
+ @binding = BINDING_QUEUE.pop
53
+
54
+ when 3 # binding in function on TOPLEVEL_BINDING(default)
55
+ @binding = eval("self.class.send(:remove_method, :irb_binding) if defined?(irb_binding); private; def irb_binding; binding; end; irb_binding",
56
+ TOPLEVEL_BINDING,
57
+ __FILE__,
58
+ __LINE__ - 3)
59
+ end
60
+ end
61
+
62
+ if main.empty?
63
+ @main = eval("self", @binding)
64
+ else
65
+ @main = main[0]
66
+ end
67
+ IRB.conf[:__MAIN__] = @main
68
+
69
+ unless main.empty?
70
+ case @main
71
+ when Module
72
+ @binding = eval("IRB.conf[:__MAIN__].module_eval('binding', __FILE__, __LINE__)", @binding, __FILE__, __LINE__)
73
+ else
74
+ begin
75
+ @binding = eval("IRB.conf[:__MAIN__].instance_eval('binding', __FILE__, __LINE__)", @binding, __FILE__, __LINE__)
76
+ rescue TypeError
77
+ IRB.fail CantChangeBinding, @main.inspect
78
+ end
79
+ end
80
+ end
81
+
82
+ case @main
83
+ when Object
84
+ use_delegator = @main.frozen?
85
+ else
86
+ use_delegator = true
87
+ end
88
+
89
+ if use_delegator
90
+ @main = SimpleDelegator.new(@main)
91
+ IRB.conf[:__MAIN__] = @main
92
+ @main.singleton_class.class_eval do
93
+ private
94
+ define_method(:exit) do |*a, &b|
95
+ # Do nothing, will be overridden
96
+ end
97
+ define_method(:binding, Kernel.instance_method(:binding))
98
+ define_method(:local_variables, Kernel.instance_method(:local_variables))
99
+ end
100
+ @binding = eval("IRB.conf[:__MAIN__].instance_eval('binding', __FILE__, __LINE__)", @binding, *@binding.source_location)
101
+ end
102
+
103
+ @binding.local_variable_set(:_, nil)
104
+ end
105
+
106
+ # The Binding of this workspace
107
+ attr_reader :binding
108
+ # The top-level workspace of this context, also available as
109
+ # <code>IRB.conf[:__MAIN__]</code>
110
+ attr_reader :main
111
+
112
+ # Evaluate the given +statements+ within the context of this workspace.
113
+ def evaluate(context, statements, file = __FILE__, line = __LINE__)
114
+ eval(statements, @binding, file, line)
115
+ end
116
+
117
+ def local_variable_set(name, value)
118
+ @binding.local_variable_set(name, value)
119
+ end
120
+
121
+ def local_variable_get(name)
122
+ @binding.local_variable_get(name)
123
+ end
124
+
125
+ # error message manipulator
126
+ def filter_backtrace(bt)
127
+ return nil if bt =~ /irb\/.*\.rb/
128
+ return nil if bt =~ /irb\.rb/
129
+ case IRB.conf[:CONTEXT_MODE]
130
+ when 1
131
+ return nil if bt =~ %r!/tmp/irb-binding!
132
+ when 3
133
+ bt = bt.sub(/:\s*in `irb_binding'/, '')
134
+ end
135
+ bt
136
+ end
137
+
138
+ def code_around_binding
139
+ if @binding.respond_to?(:source_location)
140
+ file, pos = @binding.source_location
141
+ else
142
+ file, pos = @binding.eval('[__FILE__, __LINE__]')
143
+ end
144
+
145
+ if defined?(::SCRIPT_LINES__[file]) && lines = ::SCRIPT_LINES__[file]
146
+ code = ::SCRIPT_LINES__[file].join('')
147
+ else
148
+ begin
149
+ code = File.read(file)
150
+ rescue SystemCallError
151
+ return
152
+ end
153
+ end
154
+
155
+ # NOT using #use_colorize? of IRB.conf[:MAIN_CONTEXT] because this method may be called before IRB::Irb#run
156
+ use_colorize = IRB.conf.fetch(:USE_COLORIZE, true)
157
+ if use_colorize
158
+ lines = Color.colorize_code(code).lines
159
+ else
160
+ lines = code.lines
161
+ end
162
+ pos -= 1
163
+
164
+ start_pos = [pos - 5, 0].max
165
+ end_pos = [pos + 5, lines.size - 1].min
166
+
167
+ if use_colorize
168
+ fmt = " %2s #{Color.colorize("%#{end_pos.to_s.length}d", [:BLUE, :BOLD])}: %s"
169
+ else
170
+ fmt = " %2s %#{end_pos.to_s.length}d: %s"
171
+ end
172
+ body = (start_pos..end_pos).map do |current_pos|
173
+ sprintf(fmt, pos == current_pos ? '=>' : '', current_pos + 1, lines[current_pos])
174
+ end.join("")
175
+ "\nFrom: #{file} @ line #{pos + 1} :\n\n#{body}#{Color.clear}\n"
176
+ end
177
+
178
+ def IRB.delete_caller
179
+ end
180
+ end
181
+ end