git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58931 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
eregon 2017-05-27 21:55:02 +00:00
Родитель 24db428785
Коммит ead4095935
29 изменённых файлов: 430 добавлений и 129 удалений

Просмотреть файл

@ -20,6 +20,9 @@ matrix:
env: CHECK_LEAKS=true
- os: linux
rvm: ruby-head
allow_failures:
- os: linux
rvm: ruby-head
branches:
only:
- master

Просмотреть файл

@ -41,7 +41,7 @@ describe :dir_delete, shared: true do
it "raises an Errno::ENOTDIR when trying to remove a non-directory" do
file = DirSpecs.mock_rmdir("nonempty/regular")
open(file, "w") {}
touch(file)
lambda do
Dir.send @method, file
end.should raise_error(Errno::ENOTDIR)

Просмотреть файл

@ -0,0 +1,19 @@
require File.expand_path('../../../spec_helper', __FILE__)
describe "UncaughtThrowError" do
it "is a subclass of ArgumentError" do
ArgumentError.should be_ancestor_of(UncaughtThrowError)
end
end
describe "UncaughtThrowError#tag" do
it "returns the object thrown" do
begin
throw :abc
rescue UncaughtThrowError => e
e.tag.should == :abc
end
end
end

Просмотреть файл

@ -14,7 +14,7 @@ module IOSpecs
"\n",
"\n",
"Aqu\303\255 est\303\241 la l\303\255nea tres.\n",
"Ist hier Linie vier.\n",
"Hier ist Zeile vier.\n",
"\n",
"Est\303\241 aqui a linha cinco.\n",
"Here is line six.\n" ]
@ -31,8 +31,8 @@ module IOSpecs
"Aquí está",
" la línea",
" tres.\n",
"Ist hier L",
"inie vier.",
"Hier ist Z",
"eile vier.",
"\n",
"\n",
"Está aqui",
@ -55,9 +55,10 @@ module IOSpecs
"está ",
"la ",
"línea ",
"tres.\nIst ",
"hier ",
"Linie ",
"tres.\nHier",
" ",
"ist ",
"Zeile ",
"vier.\n\nEst",
"á ",
"aqui ",
@ -71,37 +72,35 @@ module IOSpecs
end
def self.lines_r_separator
[ "Voici la ligne une.\nQui \303\250 la linea due.\n\n\n" \
"Aqu\303\255 est\303\241 la l\303\255nea tr",
"es.\nIst hier",
" Linie vier",
[ "Voici la ligne une.\nQui \303\250 la linea due.\n\n\nAqu\303\255 est\303\241 la l\303\255nea tr",
"es.\nHier",
" ist Zeile vier",
".\n\nEst\303\241 aqui a linha cinco.\nHer",
"e is line six.\n" ]
end
def self.lines_empty_separator
[ "Voici la ligne une.\nQui \303\250 la linea due.\n\n",
"Aqu\303\255 est\303\241 la l\303\255nea tres.\nIst hier Linie vier.\n\n",
"Aqu\303\255 est\303\241 la l\303\255nea tres.\nHier ist Zeile vier.\n\n",
"Est\303\241 aqui a linha cinco.\nHere is line six.\n" ]
end
def self.lines_space_separator
[ "Voici ", "la ", "ligne ", "une.\nQui ",
"\303\250 ", "la ", "linea ", "due.\n\n\nAqu\303\255 ",
"est\303\241 ", "la ", "l\303\255nea ", "tres.\nIst ",
"hier ", "Linie ", "vier.\n\nEst\303\241 ", "aqui ", "a ",
"est\303\241 ", "la ", "l\303\255nea ", "tres.\nHier ",
"ist ", "Zeile ", "vier.\n\nEst\303\241 ", "aqui ", "a ",
"linha ", "cinco.\nHere ", "is ", "line ", "six.\n" ]
end
def self.lines_arbitrary_separator
[ "Voici la ligne une.\nQui \303\250",
" la linea due.\n\n\nAqu\303\255 est\303\241 la l\303\255nea tres.\n" \
"Ist hier Linie vier.\n\nEst\303\241 aqui a linha cinco.\nHere is line six.\n" ]
" la linea due.\n\n\nAqu\303\255 est\303\241 la l\303\255nea tres.\nHier ist Zeile vier.\n\nEst\303\241 aqui a linha cinco.\nHere is line six.\n" ]
end
def self.paragraphs
[ "Voici la ligne une.\nQui \303\250 la linea due.\n\n",
"Aqu\303\255 est\303\241 la l\303\255nea tres.\nIst hier Linie vier.\n\n",
"Aqu\303\255 est\303\241 la l\303\255nea tres.\nHier ist Zeile vier.\n\n",
"Est\303\241 aqui a linha cinco.\nHere is line six.\n" ]
end

Просмотреть файл

@ -3,7 +3,7 @@ Qui è la linea due.
Aquí está la línea tres.
Ist hier Linie vier.
Hier ist Zeile vier.
Está aqui a linha cinco.
Here is line six.

Просмотреть файл

@ -5,6 +5,11 @@ describe "Kernel#gets" do
it "is a private method" do
Kernel.should have_private_instance_method(:gets)
end
it "calls ARGF.gets" do
ARGF.should_receive(:gets).and_return("spec")
gets.should == "spec"
end
end
describe "Kernel.gets" do

Просмотреть файл

@ -42,7 +42,7 @@ describe :kernel_system, shared: true do
@shell = ENV['SHELL']
end
before :each do
after :each do
ENV['SHELL'] = @shell
end
@ -51,7 +51,7 @@ describe :kernel_system, shared: true do
end
it "ignores SHELL env var and always uses `sh`" do
ENV['SHELL'] = "/bin/zsh"
ENV['SHELL'] = "/bin/fakeshell"
lambda { @object.system("echo $0") }.should output_to_fd("sh\n")
end
end

Просмотреть файл

@ -46,7 +46,7 @@ describe "Kernel#test" do
context "writable test" do
before do
@tmp_file = tmp("file.kernel.test")
open(@tmp_file, "w") {}
touch(@tmp_file)
end
after do

Просмотреть файл

@ -24,6 +24,62 @@ describe "The alias keyword" do
@obj.__value.should == 5
end
it "works with a simple symbol on the left-hand side" do
@meta.class_eval do
alias :a value
end
@obj.a.should == 5
end
it "works with a single quoted symbol on the left-hand side" do
@meta.class_eval do
alias :'a' value
end
@obj.a.should == 5
end
it "works with a doubule quoted symbol on the left-hand side" do
@meta.class_eval do
alias :"a" value
end
@obj.a.should == 5
end
it "works with an interoplated symbol on the left-hand side" do
@meta.class_eval do
alias :"#{'a'}" value
end
@obj.a.should == 5
end
it "works with a simple symbol on the right-hand side" do
@meta.class_eval do
alias a :value
end
@obj.a.should == 5
end
it "works with a single quoted symbol on the right-hand side" do
@meta.class_eval do
alias a :'value'
end
@obj.a.should == 5
end
it "works with a doubule quoted symbol on the right-hand side" do
@meta.class_eval do
alias a :"value"
end
@obj.a.should == 5
end
it "works with an interoplated symbol on the right-hand side" do
@meta.class_eval do
alias a :"#{'value'}"
end
@obj.a.should == 5
end
it "adds the new method to the list of methods" do
original_methods = @obj.methods
@meta.class_eval do

Просмотреть файл

@ -1,16 +1,49 @@
require File.expand_path('../../spec_helper', __FILE__)
describe "The undef keyword" do
it "undefines a method" do
undef_class = Class.new do
def meth(o); o; end
describe "undefines a method" do
before :each do
@undef_class = Class.new do
def meth(o); o; end
end
@obj = @undef_class.new
@obj.meth(5).should == 5
end
obj = undef_class.new
obj.meth(5).should == 5
undef_class.class_eval do
undef meth
it "with an identifier" do
@undef_class.class_eval do
undef meth
end
lambda { @obj.meth(5) }.should raise_error(NoMethodError)
end
it "with a simple symbol" do
@undef_class.class_eval do
undef :meth
end
lambda { @obj.meth(5) }.should raise_error(NoMethodError)
end
it "with a single quoted symbol" do
@undef_class.class_eval do
undef :'meth'
end
lambda { @obj.meth(5) }.should raise_error(NoMethodError)
end
it "with a double quoted symbol" do
@undef_class.class_eval do
undef :"meth"
end
lambda { @obj.meth(5) }.should raise_error(NoMethodError)
end
it "with a interpolated symbol" do
@undef_class.class_eval do
undef :"#{'meth'}"
end
lambda { @obj.meth(5) }.should raise_error(NoMethodError)
end
lambda { obj.meth(5) }.should raise_error(NoMethodError)
end
it "allows undefining multiple methods at a time" do

Просмотреть файл

@ -23,7 +23,20 @@ describe "CGI::Cookie#to_s" do
end
it "escapes the self's values" do
cookie = CGI::Cookie.new("test-cookie", " !\"\#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~")
cookie.to_s.should == "test-cookie=+%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~; path="
cookie = CGI::Cookie.new("test-cookie", " !\"\#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}")
cookie.to_s.should == "test-cookie=+%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D; path="
end
ruby_version_is ""..."2.5" do
it "escapes tilde" do
cookie = CGI::Cookie.new("test-cookie", "~").to_s.should == "test-cookie=%7E; path="
end
end
ruby_version_is "2.5" do
it "does not escape tilde" do
cookie = CGI::Cookie.new("test-cookie", "~").to_s.should == "test-cookie=~; path="
end
end
end

Просмотреть файл

@ -9,8 +9,7 @@ describe "BasicSocket#recv" do
end
after :each do
@server.closed?.should be_false
@server.close
@server.close unless @server.closed?
ScratchPad.clear
end
@ -83,8 +82,11 @@ describe "BasicSocket#recv" do
client = @server.accept
buf = "foo"
client.recv(4, 0, buf)
client.close
begin
client.recv(4, 0, buf)
ensure
client.close
end
buf.should == "data"
socket.close

Просмотреть файл

@ -72,26 +72,20 @@ module SocketSpecs
# TCPServer echo server accepting one connection
class SpecTCPServer
attr_accessor :hostname, :port, :logger
attr_reader :hostname, :port
def initialize(host=nil, port=nil, logger=nil)
@hostname = host || SocketSpecs.hostname
@port = port || SocketSpecs.port
@logger = logger
def initialize
@hostname = SocketSpecs.hostname
@server = TCPServer.new @hostname, 0
@port = @server.addr[1]
start
end
def start
log "SpecTCPServer starting on #{@hostname}:#{@port}"
@server = TCPServer.new @hostname, @port
@thread = Thread.new do
socket = @server.accept
log "SpecTCPServer accepted connection: #{socket}"
service socket
end
self
end
def service(socket)

Просмотреть файл

@ -17,8 +17,11 @@ describe "Socket::IPSocket#recvfrom" do
data = nil
t = Thread.new do
client = @server.accept
data = client.recvfrom(6)
client.close
begin
data = client.recvfrom(6)
ensure
client.close
end
end
@client.send('hello', 0)
@ -33,8 +36,11 @@ describe "Socket::IPSocket#recvfrom" do
data = nil
t = Thread.new do
client = @server.accept
data = client.recvfrom(3)
client.close
begin
data = client.recvfrom(3)
ensure
client.close
end
end
@client.send('hello', 0)

Просмотреть файл

@ -16,7 +16,7 @@ describe "TCPSocket#recv_nonblock" do
end
it "returns a String read from the socket" do
@socket = TCPSocket.new @hostname, SocketSpecs.port
@socket = TCPSocket.new @hostname, @server.port
@socket.write "TCPSocket#recv_nonblock"
# Wait for the server to echo. This spec is testing the return
@ -29,7 +29,7 @@ describe "TCPSocket#recv_nonblock" do
ruby_version_is '2.3' do
it 'returns :wait_readable in exceptionless mode' do
@socket = TCPSocket.new @hostname, SocketSpecs.port
@socket = TCPSocket.new @hostname, @server.port
@socket.recv_nonblock(50, exception: false).should == :wait_readable
end
end

Просмотреть файл

@ -5,10 +5,7 @@ describe "TCPSocket#setsockopt" do
before :each do
@server = SocketSpecs::SpecTCPServer.new
@hostname = @server.hostname
end
before :each do
@sock = TCPSocket.new @hostname, SocketSpecs.port
@sock = TCPSocket.new @hostname, @server.port
end
after :each do

Просмотреть файл

@ -29,28 +29,28 @@ describe :tcpsocket_new, shared: true do
end
it "silently ignores 'nil' as the third parameter" do
@socket = TCPSocket.send(@method, @hostname, SocketSpecs.port, nil)
@socket = TCPSocket.send(@method, @hostname, @server.port, nil)
@socket.should be_an_instance_of(TCPSocket)
end
it "connects to a listening server with host and port" do
@socket = TCPSocket.send(@method, @hostname, SocketSpecs.port)
@socket = TCPSocket.send(@method, @hostname, @server.port)
@socket.should be_an_instance_of(TCPSocket)
end
it "connects to a server when passed local_host argument" do
@socket = TCPSocket.send(@method, @hostname, SocketSpecs.port, @hostname)
@socket = TCPSocket.send(@method, @hostname, @server.port, @hostname)
@socket.should be_an_instance_of(TCPSocket)
end
it "connects to a server when passed local_host and local_port arguments" do
@socket = TCPSocket.send(@method, @hostname, SocketSpecs.port,
@socket = TCPSocket.send(@method, @hostname, @server.port,
@hostname, SocketSpecs.local_port)
@socket.should be_an_instance_of(TCPSocket)
end
it "has an address once it has connected to a listening server" do
@socket = TCPSocket.send(@method, @hostname, SocketSpecs.port)
@socket = TCPSocket.send(@method, @hostname, @server.port)
@socket.should be_an_instance_of(TCPSocket)
# TODO: Figure out how to abstract this. You can get AF_INET

Просмотреть файл

@ -6,22 +6,25 @@ describe "UDPSocket.send" do
@ready = false
@server_thread = Thread.new do
@server = UDPSocket.open
@server.bind(nil, SocketSpecs.port)
@ready = true
begin
@msg = @server.recvfrom_nonblock(64)
rescue IO::WaitReadable
IO.select([@server])
retry
@server.bind(nil, SocketSpecs.port)
@ready = true
begin
@msg = @server.recvfrom_nonblock(64)
rescue IO::WaitReadable
IO.select([@server])
retry
end
ensure
@server.close if !@server.closed?
end
@server.close
end
Thread.pass while @server_thread.status and !@ready
end
it "sends data in ad hoc mode" do
@socket = UDPSocket.open
@socket.send("ad hoc", 0, SocketSpecs.hostname,SocketSpecs.port)
@socket.send("ad hoc", 0, SocketSpecs.hostname, SocketSpecs.port)
@socket.close
@server_thread.join
@ -33,7 +36,7 @@ describe "UDPSocket.send" do
it "sends data in ad hoc mode (with port given as a String)" do
@socket = UDPSocket.open
@socket.send("ad hoc", 0, SocketSpecs.hostname,SocketSpecs.str_port)
@socket.send("ad hoc", 0, SocketSpecs.hostname, SocketSpecs.str_port)
@socket.close
@server_thread.join
@ -45,7 +48,7 @@ describe "UDPSocket.send" do
it "sends data in connection mode" do
@socket = UDPSocket.open
@socket.connect(SocketSpecs.hostname,SocketSpecs.port)
@socket.connect(SocketSpecs.hostname, SocketSpecs.port)
@socket.send("connection-based", 0)
@socket.close
@server_thread.join
@ -55,4 +58,17 @@ describe "UDPSocket.send" do
@msg[1][1].should be_kind_of(Fixnum)
@msg[1][3].should == "127.0.0.1"
end
it "raises EMSGSIZE if data is too too big" do
@socket = UDPSocket.open
begin
lambda do
@socket.send('1' * 100_000, 0, SocketSpecs.hostname, SocketSpecs.str_port)
end.should raise_error(Errno::EMSGSIZE)
ensure
@socket.send("ad hoc", 0, SocketSpecs.hostname, SocketSpecs.port)
@socket.close
@server_thread.join
end
end
end

Просмотреть файл

@ -0,0 +1,21 @@
require File.expand_path('../../../../spec_helper', __FILE__)
require File.expand_path('../../fixtures/classes', __FILE__)
describe "UDPSocket#write" do
it "raises EMSGSIZE if msg is too long" do
begin
host, port = SocketSpecs.hostname, SocketSpecs.port
s1 = UDPSocket.new
s1.bind(host, port)
s2 = UDPSocket.new
s2.connect(host, port)
lambda do
s2.write('1' * 100_000)
end.should raise_error(Errno::EMSGSIZE)
ensure
s1.close if s1 && !s1.closed?
s2.close if s2 && !s2.closed?
end
end
end

Просмотреть файл

@ -42,6 +42,10 @@ describe "YAML.dump" do
it "dumps a File without any state" do
file = File.new(__FILE__)
YAML.dump(file).should match_yaml("--- !ruby/object:File {}\n")
begin
YAML.dump(file).should match_yaml("--- !ruby/object:File {}\n")
ensure
file.close
end
end
end

Просмотреть файл

@ -4,8 +4,72 @@ require "zlib"
describe "Zlib.crc_table" do
it "returns the same value as zlib's get_crc_table()" do
Zlib.crc_table.should ==
[0, 1996959894, 3993919788, 2567524794, 124634137, 1886057615, 3915621685, 2657392035, 249268274, 2044508324, 3772115230, 2547177864, 162941995, 2125561021, 3887607047, 2428444049, 498536548, 1789927666, 4089016648, 2227061214, 450548861, 1843258603, 4107580753, 2211677639, 325883990, 1684777152, 4251122042, 2321926636, 335633487, 1661365465, 4195302755, 2366115317, 997073096, 1281953886, 3579855332, 2724688242, 1006888145, 1258607687, 3524101629, 2768942443, 901097722, 1119000684, 3686517206, 2898065728, 853044451, 1172266101, 3705015759, 2882616665, 651767980, 1373503546, 3369554304, 3218104598, 565507253, 1454621731, 3485111705, 3099436303, 671266974, 1594198024, 3322730930, 2970347812, 795835527, 1483230225, 3244367275, 3060149565, 1994146192, 31158534, 2563907772, 4023717930, 1907459465, 112637215, 2680153253, 3904427059, 2013776290, 251722036, 2517215374, 3775830040, 2137656763, 141376813, 2439277719, 3865271297, 1802195444, 476864866, 2238001368, 4066508878, 1812370925, 453092731, 2181625025, 4111451223, 1706088902, 314042704, 2344532202, 4240017532, 1658658271, 366619977, 2362670323, 4224994405, 1303535960, 984961486, 2747007092, 3569037538, 1256170817, 1037604311, 2765210733, 3554079995, 1131014506, 879679996, 2909243462, 3663771856, 1141124467, 855842277, 2852801631, 3708648649, 1342533948, 654459306, 3188396048, 3373015174, 1466479909, 544179635, 3110523913, 3462522015, 1591671054, 702138776, 2966460450, 3352799412, 1504918807, 783551873, 3082640443, 3233442989, 3988292384, 2596254646, 62317068, 1957810842, 3939845945, 2647816111, 81470997, 1943803523, 3814918930, 2489596804, 225274430, 2053790376, 3826175755, 2466906013, 167816743, 2097651377, 4027552580, 2265490386, 503444072, 1762050814, 4150417245, 2154129355, 426522225, 1852507879, 4275313526, 2312317920, 282753626, 1742555852, 4189708143, 2394877945, 397917763, 1622183637, 3604390888, 2714866558, 953729732, 1340076626, 3518719985, 2797360999, 1068828381, 1219638859, 3624741850, 2936675148, 906185462, 1090812512, 3747672003, 2825379669, 829329135, 1181335161, 3412177804, 3160834842, 628085408, 1382605366, 3423369109, 3138078467, 570562233, 1426400815, 3317316542, 2998733608, 733239954, 1555261956, 3268935591, 3050360625, 752459403, 1541320221, 2607071920, 3965973030, 1969922972, 40735498, 2617837225, 3943577151, 1913087877, 83908371, 2512341634, 3803740692, 2075208622, 213261112, 2463272603, 3855990285, 2094854071, 198958881, 2262029012, 4057260610, 1759359992, 534414190, 2176718541, 4139329115, 1873836001, 414664567, 2282248934, 4279200368, 1711684554, 285281116, 2405801727, 4167216745, 1634467795, 376229701, 2685067896, 3608007406, 1308918612, 956543938, 2808555105, 3495958263, 1231636301, 1047427035, 2932959818, 3654703836, 1088359270, 936918000, 2847714899, 3736837829, 1202900863, 817233897, 3183342108, 3401237130, 1404277552, 615818150, 3134207493, 3453421203, 1423857449, 601450431, 3009837614, 3294710456, 1567103746, 711928724, 3020668471, 3272380065, 1510334235, 755167117]
Zlib.crc_table.should == [
0, 1996959894, 3993919788, 2567524794,
124634137, 1886057615, 3915621685, 2657392035,
249268274, 2044508324, 3772115230, 2547177864,
162941995, 2125561021, 3887607047, 2428444049,
498536548, 1789927666, 4089016648, 2227061214,
450548861, 1843258603, 4107580753, 2211677639,
325883990, 1684777152, 4251122042, 2321926636,
335633487, 1661365465, 4195302755, 2366115317,
997073096, 1281953886, 3579855332, 2724688242,
1006888145, 1258607687, 3524101629, 2768942443,
901097722, 1119000684, 3686517206, 2898065728,
853044451, 1172266101, 3705015759, 2882616665,
651767980, 1373503546, 3369554304, 3218104598,
565507253, 1454621731, 3485111705, 3099436303,
671266974, 1594198024, 3322730930, 2970347812,
795835527, 1483230225, 3244367275, 3060149565,
1994146192, 31158534, 2563907772, 4023717930,
1907459465, 112637215, 2680153253, 3904427059,
2013776290, 251722036, 2517215374, 3775830040,
2137656763, 141376813, 2439277719, 3865271297,
1802195444, 476864866, 2238001368, 4066508878,
1812370925, 453092731, 2181625025, 4111451223,
1706088902, 314042704, 2344532202, 4240017532,
1658658271, 366619977, 2362670323, 4224994405,
1303535960, 984961486, 2747007092, 3569037538,
1256170817, 1037604311, 2765210733, 3554079995,
1131014506, 879679996, 2909243462, 3663771856,
1141124467, 855842277, 2852801631, 3708648649,
1342533948, 654459306, 3188396048, 3373015174,
1466479909, 544179635, 3110523913, 3462522015,
1591671054, 702138776, 2966460450, 3352799412,
1504918807, 783551873, 3082640443, 3233442989,
3988292384, 2596254646, 62317068, 1957810842,
3939845945, 2647816111, 81470997, 1943803523,
3814918930, 2489596804, 225274430, 2053790376,
3826175755, 2466906013, 167816743, 2097651377,
4027552580, 2265490386, 503444072, 1762050814,
4150417245, 2154129355, 426522225, 1852507879,
4275313526, 2312317920, 282753626, 1742555852,
4189708143, 2394877945, 397917763, 1622183637,
3604390888, 2714866558, 953729732, 1340076626,
3518719985, 2797360999, 1068828381, 1219638859,
3624741850, 2936675148, 906185462, 1090812512,
3747672003, 2825379669, 829329135, 1181335161,
3412177804, 3160834842, 628085408, 1382605366,
3423369109, 3138078467, 570562233, 1426400815,
3317316542, 2998733608, 733239954, 1555261956,
3268935591, 3050360625, 752459403, 1541320221,
2607071920, 3965973030, 1969922972, 40735498,
2617837225, 3943577151, 1913087877, 83908371,
2512341634, 3803740692, 2075208622, 213261112,
2463272603, 3855990285, 2094854071, 198958881,
2262029012, 4057260610, 1759359992, 534414190,
2176718541, 4139329115, 1873836001, 414664567,
2282248934, 4279200368, 1711684554, 285281116,
2405801727, 4167216745, 1634467795, 376229701,
2685067896, 3608007406, 1308918612, 956543938,
2808555105, 3495958263, 1231636301, 1047427035,
2932959818, 3654703836, 1088359270, 936918000,
2847714899, 3736837829, 1202900863, 817233897,
3183342108, 3401237130, 1404277552, 615818150,
3134207493, 3453421203, 1423857449, 601450431,
3009837614, 3294710456, 1567103746, 711928724,
3020668471, 3272380065, 1510334235, 755167117,
]
end
end

Просмотреть файл

@ -2,11 +2,23 @@ require File.expand_path('../spec_helper', __FILE__)
load_extension("boolean")
describe "CApiFalseSpecs" do
describe "CApiBooleanSpecs" do
before :each do
@b = CApiBooleanSpecs.new
end
describe "a true value from Ruby" do
it "is truthy in C" do
@b.is_true(true).should == 1
end
end
describe "a true value from Qtrue" do
it "is truthy in C" do
@b.is_true(@b.q_true).should == 1
end
end
describe "a false value from Ruby" do
it "is falsey in C" do
@b.is_true(false).should == 2

Просмотреть файл

@ -2,7 +2,7 @@
#include "rubyspec.h"
#include "ruby/io.h"
#include <fcntl.h>
#if HAVE_UNISTD_H
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
@ -145,13 +145,13 @@ VALUE io_spec_rb_io_wait_readable(VALUE self, VALUE io, VALUE read_p) {
wait_bool ret;
if (set_non_blocking(fd) == -1)
rb_sys_fail(0);
rb_sys_fail("set_non_blocking failed");
if(RTEST(read_p)) {
rb_ivar_set(self, rb_intern("@write_data"), Qtrue);
if(read(fd, buf, RB_IO_WAIT_READABLE_BUF) != -1) {
return Qnil;
}
rb_ivar_set(self, rb_intern("@write_data"), Qtrue);
}
ret = rb_io_wait_readable(fd);

Просмотреть файл

@ -183,6 +183,18 @@ VALUE kernel_spec_rb_rescue2(int argc, VALUE *args, VALUE self) {
}
#endif
#ifdef HAVE_RB_PROTECT
static VALUE kernel_spec_rb_protect_yield(VALUE self, VALUE obj, VALUE ary) {
int status = 0;
VALUE res = rb_protect(rb_yield, obj, &status);
rb_ary_store(ary, 0, INT2NUM(23));
if (status) {
rb_jump_tag(status);
}
return res;
}
#endif
#ifdef HAVE_RB_SYS_FAIL
VALUE kernel_spec_rb_sys_fail(VALUE self, VALUE msg) {
errno = 1;
@ -217,6 +229,21 @@ VALUE kernel_spec_rb_warn(VALUE self, VALUE msg) {
static VALUE kernel_spec_rb_yield(VALUE self, VALUE obj) {
return rb_yield(obj);
}
static int kernel_cb(const void *a, const void *b) {
rb_yield(Qtrue);
return 0;
}
static VALUE kernel_indirected(int (*compar)(const void *, const void *)) {
int bob[] = { 1, 1, 2, 3, 5, 8, 13 };
qsort(bob, 7, sizeof(int), compar);
return Qfalse;
}
static VALUE kernel_spec_rb_yield_indirected(VALUE self, VALUE obj) {
return kernel_indirected(kernel_cb);
}
#endif
#ifdef HAVE_RB_YIELD_SPLAT
@ -338,6 +365,10 @@ void Init_kernel_spec(void) {
rb_define_method(cls, "rb_rescue2", kernel_spec_rb_rescue2, -1);
#endif
#ifdef HAVE_RB_PROTECT
rb_define_method(cls, "rb_protect_yield", kernel_spec_rb_protect_yield, 2);
#endif
#ifdef HAVE_RB_CATCH
rb_define_method(cls, "rb_catch", kernel_spec_rb_catch, 2);
#endif
@ -360,6 +391,7 @@ void Init_kernel_spec(void) {
#ifdef HAVE_RB_YIELD
rb_define_method(cls, "rb_yield", kernel_spec_rb_yield, 1);
rb_define_method(cls, "rb_yield_indirected", kernel_spec_rb_yield_indirected, 1);
#endif
#ifdef HAVE_RB_YIELD_VALUES

Просмотреть файл

@ -366,6 +366,7 @@
#define HAVE_RB_YIELD_VALUES 1
#define HAVE_RB_FUNCALL3 1
#define HAVE_RB_FUNCALL_WITH_BLOCK 1
#define HAVE_RB_PROTECT 1
/* GC */
#define HAVE_RB_GC_REGISTER_ADDRESS 1

Просмотреть файл

@ -259,18 +259,18 @@ describe "C-API IO function" do
it "raises and IOError if passed a closed stream" do
@r_io.close
lambda { @o.rb_io_wait_readable(@r_io, false) }.should raise_error(IOError)
lambda {
@o.rb_io_wait_readable(@r_io, false)
}.should raise_error(IOError)
end
it "blocks until the io is readable and returns true" do
@o.instance_variable_set :@write_data, false
thr = Thread.new do
sleep 0.1 until @o.instance_variable_get(:@write_data)
Thread.pass until @o.instance_variable_get(:@write_data)
@w_io.write "rb_io_wait_readable"
end
Thread.pass until thr.alive?
@o.rb_io_wait_readable(@r_io, true).should be_true
@o.instance_variable_get(:@read_data).should == "rb_io_wait_re"
@ -284,7 +284,7 @@ describe "C-API IO function" do
start = false
thr = Thread.new do
start = true
sleep 0.5
sleep 0.05
@w_io.write "rb_io_wait_readable"
end

Просмотреть файл

@ -184,6 +184,18 @@ describe "C-API Kernel function" do
it "raises LocalJumpError when no block is given" do
lambda { @s.rb_yield(1) }.should raise_error(LocalJumpError)
end
it "rb_yield to a block that breaks does not raise an error" do
@s.rb_yield(1) { break }.should == nil
end
it "rb_yield to a block that breaks with a value returns the value" do
@s.rb_yield(1) { break 73 }.should == 73
end
it "rb_yield through a callback to a block that breaks with a value returns the value" do
@s.rb_yield_indirected(1) { break 73 }.should == 73
end
end
describe "rb_yield_values" do
@ -218,6 +230,36 @@ describe "C-API Kernel function" do
end
end
describe "rb_protect" do
it "will run a function with an argument" do
proof = [] # Hold proof of work performed after the yield.
res = @s.rb_protect_yield(7, proof) { |x| x + 1 }
res.should == 8
proof[0].should == 23
end
it "will allow cleanup code to run after break" do
proof = [] # Hold proof of work performed after the yield.
@s.rb_protect_yield(7, proof) { |x| break }
proof[0].should == 23
end
it "will allow cleanup code to run after break with value" do
proof = [] # Hold proof of work performed after the yield.
res = @s.rb_protect_yield(7, proof) { |x| break x + 1 }
res.should == 8
proof[0].should == 23
end
it "will allow cleanup code to run after a raise" do
proof = [] # Hold proof of work performed after the yield.
lambda do
@s.rb_protect_yield(7, proof) { |x| raise NameError}
end.should raise_error(NameError)
proof[0].should == 23
end
end
describe "rb_rescue" do
before :each do
@proc = lambda { |x| x }

Просмотреть файл

@ -2,8 +2,6 @@ require File.expand_path('../../../spec_helper', __FILE__)
$extmk = false
require 'rbconfig'
require 'fileutils'
require 'tmpdir'
OBJDIR ||= File.expand_path("../../../ext/#{RUBY_NAME}/#{RUBY_VERSION}", __FILE__)
mkdir_p(OBJDIR)
@ -83,15 +81,13 @@ def compile_extension(name)
ldshared = RbConfig::CONFIG["LDSHARED"]
ldshared += " #{RbConfig::CONFIG["ARCH_FLAG"]}" if RbConfig::CONFIG["ARCH_FLAG"]
libs = RbConfig::CONFIG["LIBRUBYARG_SHARED"]
libs += " " if libs
libs += RbConfig::CONFIG["LIBS"]
libs = RbConfig::CONFIG["LIBS"]
dldflags = "#{RbConfig::CONFIG["LDFLAGS"]} #{RbConfig::CONFIG["DLDFLAGS"]} #{RbConfig::CONFIG["EXTDLDFLAGS"]}"
dldflags.sub!(/-Wl,-soname,\S+/, '')
dldflags.sub!(/\$\(DEFFILE\)/, '')
if /mswin/ =~ RUBY_PLATFORM
dldflags.sub!("$(LIBPATH)", RbConfig::CONFIG["LIBPATHFLAG"] % path)
libs += RbConfig::CONFIG["LIBRUBY"]
outflag = RbConfig::CONFIG["OUTFLAG"]
link_cmd = "#{ldshared} #{outflag}#{lib} #{obj} #{libs} -link #{dldflags} /export:Init_#{ext}"
@ -114,29 +110,36 @@ ensure
end
def compile_truffleruby_extconf_make(name, path, objdir)
ext = "#{name}_spec"
file = "#{ext}.c"
source = "#{path}/#{file}"
lib_target = "#{objdir}/#{ext}.#{RbConfig::CONFIG['DLEXT']}"
temp_dir = Dir.mktmpdir
ext = "#{name}_spec"
file = "#{ext}.c"
source = "#{path}/#{ext}.c"
lib = "#{objdir}/#{ext}.#{RbConfig::CONFIG['DLEXT']}"
# Copy needed source files to tmpdir
tmpdir = tmp("cext_#{name}")
Dir.mkdir tmpdir
begin
copy = "#{temp_dir}/#{file}"
FileUtils.cp "#{path}/rubyspec.h", temp_dir
FileUtils.cp "#{path}/truffleruby.h", temp_dir
FileUtils.cp source, copy
extconf_src = "require 'mkmf'\n" +
"create_makefile('#{ext}', '#{temp_dir}')"
File.write("#{temp_dir}/extconf.rb", extconf_src)
Dir.chdir(temp_dir) do
system "#{RbConfig.ruby} extconf.rb"
system "make" # run make in temp dir
FileUtils.cp "#{ext}.su", lib_target # copy to .su file to library dir
FileUtils.cp "#{ext}.bc", objdir # copy to .bc file to library dir
["rubyspec.h", "truffleruby.h", "#{ext}.c"].each do |file|
cp "#{path}/#{file}", "#{tmpdir}/#{file}"
end
Dir.chdir(tmpdir) do
required = require 'mkmf'
# Reinitialize mkmf if already required
init_mkmf unless required
create_makefile(ext, tmpdir)
system "make"
copy_exts = RbConfig::CONFIG.values_at('OBJEXT', 'DLEXT')
Dir.glob("*.{#{copy_exts.join(',')}}") do |file|
cp file, "#{objdir}/#{file}"
end
end
ensure
FileUtils.remove_entry temp_dir
rm_r tmpdir
end
lib_target
lib
end
def load_extension(name)

Просмотреть файл

@ -1,21 +0,0 @@
require File.expand_path('../spec_helper', __FILE__)
load_extension("boolean")
describe "CApiTrueSpecs" do
before :each do
@b = CApiBooleanSpecs.new
end
describe "a true value from Ruby" do
it "is truthy in C" do
@b.is_true(true).should == 1
end
end
describe "a true value from Qtrue" do
it "is truthy in C" do
@b.is_true(@b.q_true).should == 1
end
end
end