Skip to content

Commit f01379b

Browse files
committed
[GR-18163] Coerce to String for BasicSocket#send and support buffer for UDPSocket#recvfrom_nonblock (#2209)
PullRequest: truffleruby/2338
2 parents 0a89ebc + d76b1b5 commit f01379b

File tree

5 files changed

+19
-7
lines changed

5 files changed

+19
-7
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ Compatibility:
3636
* Make rand work with exclusive range with Float (#1506, @gogainda)
3737
* Fixed `String#dump`'s formatting of escaped unicode characters (#2217, @meganniu).
3838
* Switched to the io-console C extension from C ruby for better performance and compatibility in `irb`.
39+
* Coerce the message to a `String` for `BasicSocket#send` (#2209, @HoneyryderChuck).
40+
* Support buffer argument for `UDPSocket#recvfrom_nonblock` (#2209, @HoneyryderChuck).
3941

4042
Performance:
4143

lib/truffle/socket/basic_socket.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ def getpeername
121121
end
122122

123123
def send(message, flags, dest_sockaddr = nil)
124+
message = StringValue(message)
124125
bytes = message.bytesize
125126
bytes_sent = 0
126127

@@ -153,8 +154,6 @@ def send(message, flags, dest_sockaddr = nil)
153154
end
154155

155156
private def internal_recv(bytes_to_read, flags, buffer, exception)
156-
raise ArgumentError, 'buffer argument not yet supported' if buffer
157-
158157
Truffle::Socket::Foreign.memory_pointer(bytes_to_read) do |buf|
159158
n_bytes = Truffle::Socket::Foreign.recv(Primitive.io_fd(self), buf, bytes_to_read, flags)
160159

@@ -166,7 +165,8 @@ def send(message, flags, dest_sockaddr = nil)
166165
end
167166
end
168167

169-
return buf.read_string(n_bytes)
168+
str = buf.read_string(n_bytes)
169+
buffer ? buffer.replace(str) : str
170170
end
171171
end
172172

lib/truffle/socket/ip_socket.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ def peeraddr(reverse_lookup=nil)
3939
Truffle::Socket.address_info(:getpeername, self, reverse_lookup)
4040
end
4141

42-
private def internal_recvfrom(maxlen, flags, exception)
42+
private def internal_recvfrom(maxlen, flags, buffer, exception)
4343
message, addr = internal_recvmsg(maxlen, flags, nil, false, exception)
4444

4545
return message if message == :wait_readable
@@ -58,11 +58,13 @@ def peeraddr(reverse_lookup=nil)
5858
end
5959
end
6060

61+
message = buffer.replace(message) if buffer
62+
6163
[message, [aname, addr.ip_port, hostname, addr.ip_address]]
6264
end
6365

6466
def recvfrom(maxlen, flags = 0)
6567
flags = 0 if flags.nil?
66-
internal_recvfrom(maxlen, flags, true)
68+
internal_recvfrom(maxlen, flags, nil, true)
6769
end
6870
end

lib/truffle/socket/udp_socket.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,12 @@ def send(message, flags, host = nil, port = nil)
7373
super(message, flags, addr)
7474
end
7575

76-
def recvfrom_nonblock(maxlen, flags = 0, exception: true)
76+
def recvfrom_nonblock(maxlen, flags = 0, buffer = nil, exception: true)
7777
fcntl(Fcntl::F_SETFL, Fcntl::O_NONBLOCK)
7878

7979
flags = 0 if flags.nil?
8080

81-
internal_recvfrom(maxlen, flags | Socket::MSG_DONTWAIT, exception)
81+
internal_recvfrom(maxlen, flags | Socket::MSG_DONTWAIT, buffer, exception)
8282
end
8383

8484
def inspect

spec/ruby/library/socket/basicsocket/send_spec.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,14 @@
9999
@server.close
100100
end
101101

102+
describe 'with an object implementing #to_str' do
103+
it 'returns the amount of sent bytes' do
104+
data = mock('message')
105+
data.should_receive(:to_str).and_return('hello')
106+
@client.send(data, 0, @server.getsockname).should == 5
107+
end
108+
end
109+
102110
describe 'without a destination address' do
103111
it "raises #{SocketSpecs.dest_addr_req_error}" do
104112
-> { @client.send('hello', 0) }.should raise_error(SocketSpecs.dest_addr_req_error)

0 commit comments

Comments
 (0)