Skip to content

Commit 27eaf24

Browse files
committed
Update to release stdlib from MRI 2.2.0p0.
1 parent d151b1d commit 27eaf24

File tree

7 files changed

+117
-86
lines changed

7 files changed

+117
-86
lines changed

lib/ruby/stdlib/erb.rb

+17-4
Original file line numberDiff line numberDiff line change
@@ -797,8 +797,9 @@ def initialize(str, safe_level=nil, trim_mode=nil, eoutvar='_erbout')
797797
@safe_level = safe_level
798798
compiler = make_compiler(trim_mode)
799799
set_eoutvar(compiler, eoutvar)
800-
@src, @enc = *compiler.compile(str)
800+
@src, @encoding = *compiler.compile(str)
801801
@filename = nil
802+
@lineno = 0
802803
end
803804

804805
##
@@ -811,10 +812,22 @@ def make_compiler(trim_mode)
811812
# The Ruby code generated by ERB
812813
attr_reader :src
813814

815+
# The encoding to eval
816+
attr_reader :encoding
817+
814818
# The optional _filename_ argument passed to Kernel#eval when the ERB code
815819
# is run
816820
attr_accessor :filename
817821

822+
# The optional _lineno_ argument passed to Kernel#eval when the ERB code
823+
# is run
824+
attr_accessor :lineno
825+
826+
def location=((filename, lineno))
827+
@filename = filename
828+
@lineno = lineno if lineno
829+
end
830+
818831
#
819832
# Can be used to set _eoutvar_ as described in ERB::new. It's probably
820833
# easier to just use the constructor though, since calling this method
@@ -844,10 +857,10 @@ def result(b=new_toplevel)
844857
if @safe_level
845858
proc {
846859
$SAFE = @safe_level
847-
eval(@src, b, (@filename || '(erb)'), 0)
860+
eval(@src, b, (@filename || '(erb)'), @lineno)
848861
}.call
849862
else
850-
eval(@src, b, (@filename || '(erb)'), 0)
863+
eval(@src, b, (@filename || '(erb)'), @lineno)
851864
end
852865
end
853866

@@ -869,7 +882,7 @@ def new_toplevel
869882
# print MyClass.new.render('foo', 123)
870883
def def_method(mod, methodname, fname='(ERB)')
871884
src = self.src
872-
magic_comment = "#coding:#{@enc}\n"
885+
magic_comment = "#coding:#{@encoding}\n"
873886
mod.module_eval do
874887
eval(magic_comment + "def #{methodname}\n" + src + "\nend\n", binding, fname, -2)
875888
end

lib/ruby/stdlib/net/http/response.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def read_new(sock) #:nodoc: internal use only
3737

3838
def read_status_line(sock)
3939
str = sock.readline
40-
m = /\AHTTP(?:\/(\d+\.\d+))?\s+(\d\d\d)\s*(.*)\z/in.match(str) or
40+
m = /\AHTTP(?:\/(\d+\.\d+))?\s+(\d\d\d)(?:\s+(.*))?\z/in.match(str) or
4141
raise Net::HTTPBadResponse, "wrong status line: #{str.dump}"
4242
m.captures
4343
end

lib/ruby/stdlib/open-uri.rb

+7-5
Original file line numberDiff line numberDiff line change
@@ -295,10 +295,12 @@ def OpenURI.open_http(buf, target, proxy, options) # :nodoc:
295295
http.verify_mode = options[:ssl_verify_mode] || OpenSSL::SSL::VERIFY_PEER
296296
store = OpenSSL::X509::Store.new
297297
if options[:ssl_ca_cert]
298-
if File.directory? options[:ssl_ca_cert]
299-
store.add_path options[:ssl_ca_cert]
300-
else
301-
store.add_file options[:ssl_ca_cert]
298+
Array(options[:ssl_ca_cert]).each do |cert|
299+
if File.directory? cert
300+
store.add_path cert
301+
else
302+
store.add_file cert
303+
end
302304
end
303305
else
304306
store.set_default_paths
@@ -680,7 +682,7 @@ module OpenRead
680682
#
681683
# [:ssl_ca_cert]
682684
# Synopsis:
683-
# :ssl_ca_cert=>filename
685+
# :ssl_ca_cert=>filename or an Array of filenames
684686
#
685687
# :ssl_ca_cert is used to specify CA certificate for SSL.
686688
# If it is given, default certificates are not used.

lib/ruby/stdlib/prime.rb

+14-16
Original file line numberDiff line numberDiff line change
@@ -272,18 +272,18 @@ def rewind
272272
end
273273

274274
# Iterates the given block for each prime number.
275-
def each(&block)
276-
return self.dup unless block
275+
def each
276+
return self.dup unless block_given?
277277
if @ubound
278278
last_value = nil
279279
loop do
280280
prime = succ
281281
break last_value if prime > @ubound
282-
last_value = block.call(prime)
282+
last_value = yield prime
283283
end
284284
else
285285
loop do
286-
block.call(succ)
286+
yield succ
287287
end
288288
end
289289
end
@@ -350,19 +350,17 @@ def initialize
350350
end
351351

352352
def succ
353-
loop do
354-
if (@step)
355-
@prime += @step
356-
@step = 6 - @step
357-
else
358-
case @prime
359-
when 1; @prime = 2
360-
when 2; @prime = 3
361-
when 3; @prime = 5; @step = 2
362-
end
353+
if (@step)
354+
@prime += @step
355+
@step = 6 - @step
356+
else
357+
case @prime
358+
when 1; @prime = 2
359+
when 2; @prime = 3
360+
when 3; @prime = 5; @step = 2
363361
end
364-
return @prime
365362
end
363+
return @prime
366364
end
367365
alias next succ
368366
def rewind
@@ -479,7 +477,7 @@ def succ
479477
#
480478
# Iterates the given block over all prime numbers. Note that enumeration
481479
# starts from the current position of internal pointer, not rewound.
482-
def each(&block)
480+
def each
483481
return @generator.dup unless block_given?
484482
loop do
485483
yield succ

lib/ruby/stdlib/uri/generic.rb

+10-15
Original file line numberDiff line numberDiff line change
@@ -543,7 +543,7 @@ def set_password(v)
543543
# if properly formatted as 'user:password'
544544
def split_userinfo(ui)
545545
return nil, nil unless ui
546-
user, password = ui.split(/:/, 2)
546+
user, password = ui.split(':'.freeze, 2)
547547

548548
return user, password
549549
end
@@ -695,13 +695,7 @@ def check_port(v)
695695
# see also URI::Generic.port=
696696
#
697697
def set_port(v)
698-
unless !v || v.kind_of?(Fixnum)
699-
if v.empty?
700-
v = nil
701-
else
702-
v = v.to_i
703-
end
704-
end
698+
v = v.empty? ? nil : v.to_i unless !v || v.kind_of?(Fixnum)
705699
@port = v
706700
end
707701
protected :set_port
@@ -768,13 +762,14 @@ def check_path(v)
768762

769763
# If scheme is ftp, path may be relative.
770764
# See RFC 1738 section 3.2.2, and RFC 2396.
771-
if @scheme && @scheme != "ftp"
772-
if v && v != '' && parser.regexp[:ABS_PATH] !~ v
765+
if @scheme && @scheme != "ftp".freeze
766+
if v && v != ''.freeze && parser.regexp[:ABS_PATH] !~ v
773767
raise InvalidComponentError,
774768
"bad component(expected absolute path component): #{v}"
775769
end
776770
else
777-
if v && v != '' && parser.regexp[:ABS_PATH] !~ v && parser.regexp[:REL_PATH] !~ v
771+
if v && v != ''.freeze && parser.regexp[:ABS_PATH] !~ v &&
772+
parser.regexp[:REL_PATH] !~ v
778773
raise InvalidComponentError,
779774
"bad component(expected relative path component): #{v}"
780775
end
@@ -849,9 +844,9 @@ def query=(v)
849844
x = v.to_str
850845
v = x.dup if x.equal? v
851846
v.encode!(Encoding::UTF_8) rescue nil
852-
v.delete!("\t\r\n")
847+
v.delete!("\t\r\n".freeze)
853848
v.force_encoding(Encoding::ASCII_8BIT)
854-
v.gsub!(/(?!%\h\h|[!$-&(-;=?-Z_a-~])./n.freeze){'%%%02X'.freeze % $&.ord}
849+
v.gsub!(/(?!%\h\h|[!$-&(-;=?-_a-~])./n.freeze){'%%%02X'.freeze % $&.ord}
855850
v.force_encoding(Encoding::US_ASCII)
856851
@query = v
857852
end
@@ -939,9 +934,9 @@ def fragment=(v)
939934
x = v.to_str
940935
v = x.dup if x.equal? v
941936
v.encode!(Encoding::UTF_8) rescue nil
942-
v.delete!("\t\r\n")
937+
v.delete!("\t\r\n".freeze)
943938
v.force_encoding(Encoding::ASCII_8BIT)
944-
v.gsub!(/(?!%\h\h|[!-~])./n){'%%%02X' % $&.ord}
939+
v.gsub!(/(?!%\h\h|[!-~])./n){'%%%02X'.freeze % $&.ord}
945940
v.force_encoding(Encoding::US_ASCII)
946941
@fragment = v
947942
end

lib/ruby/stdlib/uri/rfc3986_parser.rb

+54-39
Original file line numberDiff line numberDiff line change
@@ -4,49 +4,64 @@ class RFC3986_Parser # :nodoc:
44
# this regexp is modified not to host is not empty string
55
RFC3986_URI = /\A(?<URI>(?<scheme>[A-Za-z][+\-.0-9A-Za-z]*):(?<hier-part>\/\/(?<authority>(?:(?<userinfo>(?:%\h\h|[!$&-.0-;=A-Z_a-z~])*)@)?(?<host>(?<IP-literal>\[(?:(?<IPv6address>(?:\h{1,4}:){6}(?<ls32>\h{1,4}:\h{1,4}|(?<IPv4address>(?<dec-octet>[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]|\d)\.\g<dec-octet>\.\g<dec-octet>\.\g<dec-octet>))|::(?:\h{1,4}:){5}\g<ls32>|\h{1,4}?::(?:\h{1,4}:){4}\g<ls32>|(?:(?:\h{1,4}:)?\h{1,4})?::(?:\h{1,4}:){3}\g<ls32>|(?:(?:\h{1,4}:){,2}\h{1,4})?::(?:\h{1,4}:){2}\g<ls32>|(?:(?:\h{1,4}:){,3}\h{1,4})?::\h{1,4}:\g<ls32>|(?:(?:\h{1,4}:){,4}\h{1,4})?::\g<ls32>|(?:(?:\h{1,4}:){,5}\h{1,4})?::\h{1,4}|(?:(?:\h{1,4}:){,6}\h{1,4})?::)|(?<IPvFuture>v\h+\.[!$&-.0-;=A-Z_a-z~]+))\])|\g<IPv4address>|(?<reg-name>(?:%\h\h|[!$&-.0-9;=A-Z_a-z~])+))?(?::(?<port>\d*))?)(?<path-abempty>(?:\/(?<segment>(?:%\h\h|[!$&-.0-;=@-Z_a-z~])*))*)|(?<path-absolute>\/(?:(?<segment-nz>(?:%\h\h|[!$&-.0-;=@-Z_a-z~])+)(?:\/\g<segment>)*)?)|(?<path-rootless>\g<segment-nz>(?:\/\g<segment>)*)|(?<path-empty>))(?:\?(?<query>[^#]*))?(?:\#(?<fragment>(?:%\h\h|[!$&-.0-;=@-Z_a-z~\/?])*))?)\z/
66
RFC3986_relative_ref = /\A(?<relative-ref>(?<relative-part>\/\/(?<authority>(?:(?<userinfo>(?:%\h\h|[!$&-.0-;=A-Z_a-z~])*)@)?(?<host>(?<IP-literal>\[(?<IPv6address>(?:\h{1,4}:){6}(?<ls32>\h{1,4}:\h{1,4}|(?<IPv4address>(?<dec-octet>[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]|\d)\.\g<dec-octet>\.\g<dec-octet>\.\g<dec-octet>))|::(?:\h{1,4}:){5}\g<ls32>|\h{1,4}?::(?:\h{1,4}:){4}\g<ls32>|(?:(?:\h{1,4}:){,1}\h{1,4})?::(?:\h{1,4}:){3}\g<ls32>|(?:(?:\h{1,4}:){,2}\h{1,4})?::(?:\h{1,4}:){2}\g<ls32>|(?:(?:\h{1,4}:){,3}\h{1,4})?::\h{1,4}:\g<ls32>|(?:(?:\h{1,4}:){,4}\h{1,4})?::\g<ls32>|(?:(?:\h{1,4}:){,5}\h{1,4})?::\h{1,4}|(?:(?:\h{1,4}:){,6}\h{1,4})?::)|(?<IPvFuture>v\h+\.[!$&-.0-;=A-Z_a-z~]+)\])|\g<IPv4address>|(?<reg-name>(?:%\h\h|[!$&-.0-9;=A-Z_a-z~])+))?(?::(?<port>\d*))?)(?<path-abempty>(?:\/(?<segment>(?:%\h\h|[!$&-.0-;=@-Z_a-z~])*))*)|(?<path-absolute>\/(?:(?<segment-nz>(?:%\h\h|[!$&-.0-;=@-Z_a-z~])+)(?:\/\g<segment>)*)?)|(?<path-noscheme>(?<segment-nz-nc>(?:%\h\h|[!$&-.0-9;=@-Z_a-z~])+)(?:\/\g<segment>)*)|(?<path-empty>))(?:\?(?<query>[^#]*))?(?:\#(?<fragment>(?:%\h\h|[!$&-.0-;=@-Z_a-z~\/?])*))?)\z/
7+
attr_reader :regexp
8+
9+
def initialize
10+
@regexp = default_regexp.each_value(&:freeze).freeze
11+
end
712

813
def split(uri) #:nodoc:
914
begin
1015
uri = uri.to_str
1116
rescue NoMethodError
1217
raise InvalidURIError, "bad URI(is not URI?): #{uri}"
1318
end
14-
unless uri.ascii_only?
19+
uri.ascii_only? or
1520
raise InvalidURIError, "URI must be ascii only #{uri.dump}"
16-
end
1721
if m = RFC3986_URI.match(uri)
18-
ary = []
19-
ary << m["scheme"]
20-
if m["path-rootless"] # opaque
21-
ary << nil # userinfo
22-
ary << nil # host
23-
ary << nil # port
24-
ary << nil # registry
25-
ary << nil # path
26-
ary << m["path-rootless"]
27-
ary[-1] << '?' << m["query"] if m["query"]
28-
ary << nil # query
29-
ary << m["fragment"]
22+
query = m["query".freeze]
23+
scheme = m["scheme".freeze]
24+
opaque = m["path-rootless".freeze]
25+
if opaque
26+
opaque << "?#{query}" if query
27+
[ scheme,
28+
nil, # userinfo
29+
nil, # host
30+
nil, # port
31+
nil, # registry
32+
nil, # path
33+
opaque,
34+
nil, # query
35+
m["fragment".freeze]
36+
]
3037
else # normal
31-
ary << m["userinfo"]
32-
ary << m["host"]
33-
ary << m["port"]
34-
ary << nil # registry
35-
ary << (m["path-abempty"] || m["path-absolute"] || m["path-empty"])
36-
ary << nil # opaque
37-
ary << m["query"]
38-
ary << m["fragment"]
38+
[ scheme,
39+
m["userinfo".freeze],
40+
m["host".freeze],
41+
m["port".freeze],
42+
nil, # registry
43+
(m["path-abempty".freeze] ||
44+
m["path-absolute".freeze] ||
45+
m["path-empty".freeze]),
46+
nil, # opaque
47+
query,
48+
m["fragment".freeze]
49+
]
3950
end
4051
elsif m = RFC3986_relative_ref.match(uri)
41-
ary = [nil]
42-
ary << m["userinfo"]
43-
ary << m["host"]
44-
ary << m["port"]
45-
ary << nil # registry
46-
ary << (m["path-abempty"] || m["path-absolute"] || m["path-noscheme"] || m["path-empty"])
47-
ary << nil # opaque
48-
ary << m["query"]
49-
ary << m["fragment"]
52+
[ nil, # scheme
53+
m["userinfo".freeze],
54+
m["host".freeze],
55+
m["port".freeze],
56+
nil, # registry,
57+
(m["path-abempty".freeze] ||
58+
m["path-absolute".freeze] ||
59+
m["path-noscheme".freeze] ||
60+
m["path-empty".freeze]),
61+
nil, # opaque
62+
m["query".freeze],
63+
m["fragment".freeze]
64+
]
5065
else
5166
raise InvalidURIError, "bad URI(is not URI?): #{uri}"
5267
end
@@ -55,11 +70,11 @@ def split(uri) #:nodoc:
5570
def parse(uri) # :nodoc:
5671
scheme, userinfo, host, port,
5772
registry, path, opaque, query, fragment = self.split(uri)
58-
59-
if scheme && URI.scheme_list.include?(scheme.upcase)
60-
URI.scheme_list[scheme.upcase].new(scheme, userinfo, host, port,
61-
registry, path, opaque, query,
62-
fragment, self)
73+
scheme_list = URI.scheme_list
74+
if scheme && scheme_list.include?(uc = scheme.upcase)
75+
scheme_list[uc].new(scheme, userinfo, host, port,
76+
registry, path, opaque, query,
77+
fragment, self)
6378
else
6479
Generic.new(scheme, userinfo, host, port,
6580
registry, path, opaque, query,
@@ -78,7 +93,9 @@ def inspect
7893
@@to_s.bind(self).call
7994
end
8095

81-
def regexp
96+
private
97+
98+
def default_regexp # :nodoc:
8299
{
83100
SCHEME: /\A[A-Za-z][A-Za-z0-9+\-.]*\z/,
84101
USERINFO: /\A(?:%\h\h|[!$&-.0-;=A-Z_a-z~])*\z/,
@@ -92,8 +109,6 @@ def regexp
92109
}
93110
end
94111

95-
private
96-
97112
def convert_to_uri(uri)
98113
if uri.is_a?(URI::Generic)
99114
uri

lib/ruby/stdlib/win32/registry.rb

+14-6
Original file line numberDiff line numberDiff line change
@@ -170,12 +170,20 @@ class Error < ::StandardError
170170
FormatMessageA = Win32API.new('kernel32.dll', 'FormatMessageA', 'LPLLPLP', 'L')
171171
def initialize(code)
172172
@code = code
173-
msg = WCHAR_NUL * 1024
174-
len = FormatMessageW.call(0x1200, 0, code, 0, msg, 1024, 0)
175-
msg = msg.byteslice(0, len * WCHAR_SIZE)
176-
msg.delete!(WCHAR_CR)
177-
msg.chomp!
178-
super msg.encode(LOCALE)
173+
buff = WCHAR_NUL * 1024
174+
lang = 0
175+
begin
176+
len = FormatMessageW.call(0x1200, 0, code, lang, buff, 1024, 0)
177+
msg = buff.byteslice(0, len * WCHAR_SIZE)
178+
msg.delete!(WCHAR_CR)
179+
msg.chomp!
180+
msg.encode!(LOCALE)
181+
rescue EncodingError
182+
raise unless lang == 0
183+
lang = 0x0409 # en_US
184+
retry
185+
end
186+
super msg
179187
end
180188
attr_reader :code
181189
end

0 commit comments

Comments
 (0)