Skip to content

Commit c57a586

Browse files
committed
fix: respond_to_missing should call super at end
- Fix @closed initializing - Improve performance of method_missing
1 parent 0e2c71a commit c57a586

3 files changed

Lines changed: 9 additions & 27 deletions

File tree

lib/rb/io/multi_writer.rb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,11 @@ class MultiWriter
1818
attr_accessor :writers
1919
attr_reader :closed
2020

21-
@closed = false
22-
2321
alias_method :sync_close?, :sync_close
2422
alias_method :closed?, :closed
2523

2624
def initialize(*writers, sync_close: false)
25+
@closed = false
2726
@writers = writers
2827
@sync_close = sync_close
2928
end

lib/rb/io/stapled.rb

Lines changed: 6 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -23,32 +23,25 @@ class Stapled
2323
# Underlying `IO`s might have a different status.
2424
attr_reader :closed
2525

26-
@closed = false
27-
28-
WRITER_DELEGATE = %w[
29-
<<
30-
].freeze
31-
32-
READER_DELEGATE = %w[
33-
eof
34-
eof?
35-
].freeze
26+
WRITER_DELEGATE = IO.instance_methods.grep(/^put|^print|write|<</).freeze
27+
READER_DELEGATE = IO.instance_methods.grep(/^get[a-z]*|read|each|eof/).freeze
3628

3729
alias_method :sync_close?, :sync_close
3830
alias_method :closed?, :closed
3931

4032
# Creates a new `IO::Stapled` which reads from *reader* and writes to *writer*.
4133
def initialize(reader, writer, sync_close: false)
34+
@closed = false
4235
@reader = reader
4336
@writer = writer
4437
@sync_close = sync_close
4538
end
4639

4740
def method_missing(name, *args, &block)
48-
if write_methods?(name.to_s)
41+
if WRITER_DELEGATE.include?(name)
4942
check_open
5043
@writer.send(name, *args, &block)
51-
elsif read_methods?(name.to_s)
44+
elsif READER_DELEGATE.include?(name)
5245
check_open
5346
@reader.send(name, *args, &block)
5447
else
@@ -57,17 +50,7 @@ def method_missing(name, *args, &block)
5750
end
5851

5952
def respond_to_missing?(name, include_private = false)
60-
super || write_methods?(name.to_s) || read_methods?(name.to_s)
61-
end
62-
63-
def write_methods?(name)
64-
name.include?("put") || name.include?("prin") ||
65-
name.include?("write") || WRITER_DELEGATE.include?(name)
66-
end
67-
68-
def read_methods?(name)
69-
name.include?("get") || name.include?("read") ||
70-
name.include?("each") || READER_DELEGATE.include?(name)
53+
WRITER_DELEGATE.include?(name) || READER_DELEGATE.include?(name) || super
7154
end
7255

7356
# Flushes `writer`.

lib/rb/process.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@ def initialize(stdout, stderr, status)
1717
end
1818

1919
def method_missing(name, *args, &block)
20-
@status.send(name, *args, &block)
20+
@status.respond_to?(name) ? @status.send(name, *args, &block) : super
2121
end
2222

2323
def respond_to_missing?(name, include_private = false)
24-
super || @status.respond_to?(name, include_private)
24+
@status.respond_to?(name, include_private) || super
2525
end
2626

2727
def exit_code

0 commit comments

Comments
 (0)